web-dev-qa-db-ja.com

実際の色の混合のように機能する色混合のアルゴリズムはありますか?

RGBカラーの一般的な混合は、絵画のカラーの混合とは非常に異なり、顔料の混合ではなく光の混合です。

例えば:

Blue (0,0,255) + Yellow (255,255,0) = Grey (128,128,128)

(青+黄=緑である必要があります)

実際の色を混ぜるように機能する、色を混ぜるための既知のアルゴリズムはありますか?


私のアプローチ

私はすでに以下を試しました:

両方の色をHSVに変換と混合色相(彩度から計算された係数を乗算)、および彩度チャネルと値チャネルの単純平均。次に、両方の色から平均輝度を計算し、結果の色をこの輝度に一致するように調整しました。これはかなりうまくいきましたが、色相の混合は時々間違っていました。 g .:

Red (Hue 0°) + Blue (Hue 240°) = Green (Hue 120°)

色相の値を360°シフトする必要がある場合があることを理解しました(色相間の差が180°より大きい場合)。

Red (Hue 360°) + Blue (Hue 240°) = Magenta/Fuchsia (Hue 300°)

しかし、このシフトはあまり良くありませんでした、例えば:

Cyan (Hue 179°) + Red (Hue 0°) = Hue 89.5°
Cyan (Hue 181°) + Red (Hue 0°) --> shifting is performed (the difference is greater than 180°)
Cyan (Hue 181°) + Red (Hue 360°) = Hue 270.5°

(色相179 +赤)と(色相181 +赤)では、2つの完全に異なる色になります。


次にCIEラボの色空間を試しました(Photoshopの場合と同様)。これは、人間が色を認識する方法に近づくように設計されています。

対応する2つのチャネルごとに単純な平均のみを使用しましたが、結果は満足のいくものではありませんでした。たとえば、青(98、-16、93)と黄色(30、 68、-112)。これらの係数はPhotoshopから取得されました。

たぶん私が平均とは異なる操作を使用した場合、それはうまくいくかもしれませんが、私には何がわかりません。


CMYKも機能しませんでした、結果はRGBまたはLABと同じです。


自明な加法でも減法でもないこれらの色空間のいずれかでの色の混合は自然な結果をもたらすようです。


実用的な実装

Krita –絵画調ミキサー

ラスターグラフィックエディターKritaには、ある時点でよりリアルなカラーミキシングの実用的な実装がありました。 http://commit-digest.org/issues/2007-08-12/ (Painterlyミキサープラグイン)

彼らは、顔料の挙動を記述するクベルカとムンクの方程式を使用して特別な技術を実装する最初のパブリックアプリケーションであると言います。

Kritaのカラーミキシングのビデオは次のとおりです: https://www.youtube.com/watch?v=lyLPZDVdQiQ

FiftyThreeによる論文

iOSのPaperアプリでの色のブレンドに関する記事FiftyThree によって開発されました。彼らは、その地域でどのように革新と実験を行っているかを説明し、緑となる青と黄色の混合のサンプルも提供します。ただし、実際のプロセスやアルゴリズムは実際には説明されていません。

引用:

「最初は、適切なブレンドアルゴリズムを探すために、さまざまな色空間(RGB、HSV、HSL、次にCieLAB、CieLUV)を補間してみました。結果は期待外れでした」とChen氏は言います。 「私たちは赤と黄色がオレンジになるか、赤と青が紫になるはずだと知っていますが、どの色空間を使ってもこれらの色に到達する方法はありません。エンジニアリングの公理があります。うまくいくかもしれません。さて、私たちは今、可能な限り最も簡単なアプローチを試みましたが、彼らは少しも正しく感じていませんでした。」

Kritaと同じように、PaperはKubelka-Munkモデルを実装しています:

[...] Kubelka-Munkモデルには、各RGBカラーの反射と吸収の値を含め、各カラーに少なくとも6つの値がありました。 「画面上の色の見え方は3次元で表現できますが、実際には6次元空間で色の混合が起こっています」と、FiftyThreeの共同創設者兼CEOのGeorg Petschniggは説明します。 Kubelka-Munkの論文により、チームは美的問題を数学的なフレームワークに変換することができました。 [...]

このすべての情報から、Kubelka-Munkモデルに基づいた実装は前向きであり、より現実に近い結果を提供できると思われます。

複雑なプロセスのように見えますが、このようなものを実装する方法については、まだ十分な情報がありません。


関連する質問

これらの質問は、この問題の後に投稿されたもので、すべて同じものに関連しています。

実際に答えを持っている人はいません。


その他の関連リンクとリソース

57
Tom Pažourek

正解答えは「いいえ」です。これは、「現実世界での色の混合」が実際に機能する方法のモデル正解動作がないためです。 FARは複雑すぎて条件付きであり、学校で学んだ単純な赤青黄のようなものとはまったく異なります(実際には、すべての化学と多くの物理学と生物学で解決する必要があります)。

ただし、単純な答えは次のとおりです。はい、加算混合ではなく減算混合を使用します。

小学校で学んだ色の混合は、減法混色(非常に単純化)の形式である顔料の組み合わせに基づいています。それは、私たちが一緒に追加する色が多いほど、各顔料が少し多くの光を差し引くため、色が暗くなります。

一方、ほとんどすべてのコンピューターのカラースキームは、(非常に単純化して)光の波の組み合わせに基づいているという点でadditiveであり、各色が少しだけ光を加えるため、明るくなります。

RGB +スキームは、米国のほとんどの小学校(RBY-)で学習した減法スキームを相加的に補完するものです。ただし、それらは完全には一致せず、それらの間で変換するのが難しい場合があります(現在調査中...)


OK、RGBの加法的な組み合わせから減法的な組み合わせに切り替えるだけの場合は、次の逆ベイズン式を使用して2つの色を組み合わせることができます。

NewColor.R = (Color1.R * Color2.R)/255
NewColor.G = (Color1.G * Color2.G)/255
NewColor.B = (Color1.B * Color2.B)/255

クロマチックポールの違い(GからY、次にGに戻す)の調整は、はるかに困難です...


これにより問題例の黒が生成されることが指摘されており、技術的にはこれが真の減算システムに適していますが、より希釈/減算システムが必要な場合は、代わりにこれを試すことができます。

NewColor.R = 255 - SQRT(((255-Color1.R)^2 + (255-Color2.R)^2)/2)
NewColor.G = 255 - SQRT(((255-Color1.G)^2 + (255-Color2.G)^2)/2)
NewColor.B = 255 - SQRT(((255-Color1.B)^2 + (255-Color2.B)^2)/2)

これにより、黒の代わりに濃い灰色が生成されます。しかし、黄色などを近づけるには、カラースキームの極配置の問題を修正する必要があります。

24
RBarryYoung

色を組み合わせるには2つの方法があります。

  1. 加法混合 (RGBのように)

  2. 減算混合 (CMYKのように)

したがって、減法混色では結果は期待どおりですが、青はなく、シアンがあります。

黄+シアン=緑

一般に、減法混色は白から「取り去る」(フィルタリング)だけで、加法混色は黒から追加されます。 (減法の基本色は加法の逆です:赤->シアン、緑->マゼンタ、青->黄色)

したがって、フィルターを適用する白い画面から始める場合:

min(白(255,255,255)、黄色(255,255,0)、シアン(0,255,255))=緑(0,255,0)

5
Peter Parker

Kritaに現実的な方法で色を混ぜるコードがあります: https://projects.kde.org/projects/calligra/repository/revisions/master/show/krita/plugins/extensions/painterlyframework

光源ファイルを含むコードはGPLv2 +であることに注意してください。 RGBから波長に変換し、合成を行い、元に戻すことができます。

2
Boudewijn Rempt

色合いを組み合わせる際の問題は、2つの角度を加算して2で割ることによって行うことだと思います。お気づきのように、結果は意味をなさないことがよくあります。角度を単位円上のデカルト座標に変換し、それらを平均して、結果の点の角度を見つける(マグニチュードを無視して)方がいいと思います。

1

RGBカラーの減法混色を行う1つの方法は、最初にRGBカラーを分光反射率曲線に変換することです。変換はかなり簡単で、一度行ったら、反射率曲線の真の減算混合を実行し、結果をRGBに変換し直すことができます。別の同様の質問があります: stackoverflow.com/questions/10254022/ 。このプロセスについて詳しく説明します。

1
Scott Burns

RGB値の反転の計算が機能するかどうか疑問に思います。ライトの減算なので、技術的には減算部分は簡単な計算で計算できます。

たとえば、シアン+イエロー

シアン= 0x00ffffイエロー= 0xffff00

それらの反転は0xff0000と0x0000ffであり、赤と青の光を完全に吸収しました。それらの1:1の混合物は、赤と青の光の半分を吸収する必要があります(混合物の残りの半分はまだ一部の赤と青の光を反射できるため)。これは(0xff0000 + 0x00ffff)/ 2 = 0x7f007fと一致します。今度は0xffffffから値を引くと、緑色の0x80ff80ができます。

1
frankli