web-dev-qa-db-ja.com

線形グラデーションを定義する2つの色を平均化する最良の方法は何ですか?

RGB値で定義された2つの色がある場合、赤、緑、青の値を平均し、それらを組み合わせて、2つの色の視覚的な平均のように見える3番目の色を定義できますか?

つまり、NewColor =(R1 + R2)/ 2、(G1 + G2)/ 2、(B1 + B2)/ 2

EDIT1:すべての応答をありがとう。私の現在のニーズでは、同じ色の濃淡である色のペアのみを扱っているので、それらを平均しても機能すると思います。ただし、想定が正しいことと、この手法が将来的に役立つことを確認するために、Lab Spaceに変換してみます。

EDIT2:ここに私の結果FWIWがあります。 Color1とColor2は私の2色で、中央の2列はそれぞれL a b空間での平均とRGBの平均の結果です。この場合、2つの色の間に大きな違いはないため、平均化手法の出力の違いはわずかです。

visual comparison of color averaging techniques

40
eft

この質問 への回答を見てください。

基本的に、色を Lab space と呼ばれるものに変換し、その空間での平均を求めます。

ラボスペースとは、色を表現する方法の1つで、互いに近い点は、人間にとっては互いに似ている点です。

24

いくつかの答えは、Lab色空間への変換を提案しています。これは、おそらく、より複雑な色操作のための良いアプローチです。

ただし、2つの色の平均を取得する簡単な方法が必要な場合は、RGB空間でこれを行うことができます。注意が必要なのは、平均化する前にRGB値を二乗し、結果の根をとる必要があるということです。 (単純に平均を取ると、結果が暗くなりすぎる傾向があります。)

このような:

NewColor = sqrt((R1^2+R2^2)/2),sqrt((G1^2+G2^2)/2),sqrt((B1^2+B2^2)/2)

この方法が効率的である理由を説明する素晴らしいvidを以下に示します。 https://www.youtube.com/watch?v=LKnqECcg6Gw

26
arntjw

コンポーネントの単純な平均を取ることが知覚の観点から「最良」であるかどうかはわかりません(心理学者にとっては疑問のように聞こえます)が、ここでは単純なコンポーネント平均を使用した例をいくつか示します。

alt text

赤いマスタードグリーンは醜いですが、補間は十分妥当なようです。

6
user41871

HSL色空間 で平均すると、より良い結果が得られる場合があります。

6
eugensk

はい。このように2つの色を平均化できます。これは、OpenGLが色をブレンドするために使用するアプローチです(たとえば、遠くのオブジェクトをレンダリングするためのミップマップを作成したり、50%の透明なテクスチャをレンダリングしたりする場合)。高速でシンプルで、多くの状況で「十分」に機能します。ただし、これは完全に現実的ではなく、写真品質の画像にはおそらく使用されません。

4
Cybis

これはきつい。まず、RGB値のセットは色を定義しません。それらは、sRGB、Rec.709、Rec.2020、Adobe RGB(1998)など、参照する原色(色空間)に照らして解釈する必要があります。

さらに、通常遭遇するRGB値は線形光に比例しません。非線形関数(ガンマ)を使用して「エンコード」されます。また、(ビデオアプリケーションではほとんどの場合) "黒"の値はゼロではなく、ゼロからオフセットされます。通常、8ビット値の場合は16です。 「白」は255ではなく235です。sRGBとRec.709はRGB原色を共有しますが、ガンマ関数は異なります。

色空間変換は、黒がゼロになるように黒のオフセットを削除することから始まります。ガンマ関数にブレークポイントがある場合(sRGBやRec.709のように)、「白」が1.0になるようにRGB値を注意深くスケーリングする必要があります。

次に、元のガンマ関数の逆を行うことにより、ガンマを「デコード」します。 (1つの答えは、ガンマデコードの近似値である値を二乗することを提案しました。)これで、いくつかの色空間に線形光のRGB値があります。この時点で、その色空間からラボ空間に変換できます。 RGBからLabへのほとんどの変換は、XYZと呼ばれる中間色空間を通過します。

ネストされた関数呼び出しとしてのステップ:

Lab = XYZ2Lab(RGB2XYZ(gamma_decode(offset_and_scale(RGB)、gammaFunction)、RGB色空間))

(Labスペースは、標準のCIE XYZスペースの知覚的に均一なワーピングを作成する試みとして1976年に開発されました。(Luvは別の試みです。)アイデアは、ちょうど2つの色の間のユークリッド(直線)距離-著しく異なる(1 "JND")は、どの2色でも同じ距離になります。Labの2色間の距離は、「delta-E」として知られています。単純なデルタユークリッド距離の式は、dE76と呼ばれるようになりました。参照 https://en.wikipedia.org/wiki/Color_difference

あなたの場合、2つのLabカラーを平均して新しいLabカラーを取得し、すべての変換を逆にして、選択したカラースペースのRGBに戻すことができます。

「色」は物理的な量ではなく人間の知覚であり、信頼性の高い特徴付けが困難であることが悪名高いため、これで近づくことができますが保証はされません。ラボは実際には知覚的に均一であるためにうまく機能しませんでした。したがって、Labを修正するのではなく、別のワープが組み込まれた、より複雑なDelta-E関数を提案しました。DE94です。それは優れていたが、完璧ではなかったため、2000年に別の提案が出された。DE2000である。また、完璧ではありません。詳細については、上記のWikiページを参照してください。

DE2000が十分でない(または複雑すぎる)場合は、Labよりも知覚的に均一であると主張されている ICtCp と呼ばれるLabの代替案を確認することができます。

3
user1539094

Dan Wによって言及されたように、arntjwからの答えは正しい方向に進み、対数アンダーレイを認識します。ただし、適切な幾何平均はsqrt((C1 ^ 2 + C2 ^ 2)/ 2)ではなく、sqrtです(C1 * C2)。したがって、平均色は次のようになります。

NewColor = sqrt(R1*R2),sqrt(G1*G2),sqrt(B1*B2)

結果の色は、期待したものに近くなります。より高次の根を使用してより多くの色に一般化し、そのコンポーネントに指数を追加することで各色に重みを付けることができます。

1
lenov