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

StackOverflow https://stackoverflow.com/questions/649454

  •  19-08-2019
  •  | 
  •  

質問

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

ie NewColor =(R1 + R2)/ 2、(G1 + G2)/ 2、(B1 + B2)/ 2

EDIT1:すべての回答に感謝します。現在のニーズでは、同じ色の濃淡である色のペアのみを扱っているので、それらの平均化はうまくいくと思います。ただし、仮定が真実であり、この手法が将来役に立つことを確認するために、ラボスペースに変換してみます。

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

色平均化手法の視覚的比較

役に立ちましたか?

解決

この質問への回答をご覧ください。

基本的に、色を Labスペースと呼ばれるものに変換し、その色を見つけます。そのスペースの平均。

ラボ空間は、互いに近い点が人間に似ている点である色を表現する方法です。

他のヒント

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

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

これに似ています:

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

この方法が効率的である理由を説明する素晴らしいビデオです: https://www.youtube.com/watch?v = LKnqECcg6Gw

HSLカラースペースで平均化すると、より良い結果が得られる可能性があります。

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

alt text

赤-マスタード-緑のものはugいですが、補間は十分に合理的です。

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

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

さらに、通常遭遇するRGB値は線形光に比例しません。それらは<!> quot; encoded <!> quot;です。非線形関数(ガンマ)を使用します。また、(ビデオアプリケーションでは主に)<!> quot; black <!> quot;の値がはゼロではありませんが、ゼロからのオフセットで、通常は8ビット値の場合は16です。そして<!> quot; white <!> quot; 255ではなく235です。sRGBとRec.709はRGBプライマリを共有しますが、ガンマ関数は異なります。

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

次に、<!> quot; decode <!> quot;元のガンマ関数の逆を実行することにより、ガンマ。 (1つの答えは、値を2乗することを提案しました。これは、ガンマデコードの近似です。)これで、一部の色空間で線形光RGB値が得られます。この時点で、その色空間からラボ空間に変換できます。 RGBからLabへのほとんどの変換は、XYZと呼ばれる中間色空間を通過します。

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

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

(ラボ空間は、標準CIE XYZ空間の知覚的に均一なワープを作成する試みとして1976年に開発されました。(Luvも別の試みでした。)わずかに異なる(1 <!> quot; JND <!> quot;)は、2つの色で同じ距離になります。Labの2つの色の間の距離は「デルタE」として知られています。距離式はdE76と呼ばれるようになりました。 https://en.wikipedia.org/wiki/Color_difference)

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

これはあなたを近づけますが、単に<!> quot; color <!> quot;は、物理量ではなく人間の知覚であり、信頼性の高い特性評価が難しいことで有名です。ラボは、知覚的に均一であるという点で実際にはそれほどうまくいきませんでした。そこで、Labを修正するのではなく、別のワープが組み込まれた新しい複雑なDelta-E関数DE94を提案しました。それは優れていましたが、完璧ではなかったため、2000年に別の提案が出ました:DE2000。また、より良いが完璧ではありません。詳細については、上記のWikiページを参照してください。

DE2000が十分ではない(または複雑すぎる!)場合は、 Labよりも知覚的に均一であると主張されているICtCp

私は、arntjwからの答えは正しい方向に進み、ダンWが述べたように対数アンダーレイを認識していると思います。ただし、適切な幾何平均はsqrt((C1 ^ 2 + C2 ^ 2)/ 2)ではありません、ただしsqrt(C1 * C2)。したがって、平均色は次のようになります。

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

結果の色は、予想どおりになります。高次のルートを使用してより多くの色に一般化し、コンポーネントに指数を追加して各色に重みを付けることができます。

実際にはもっと簡単な方法があります。

  • 画像を1pxごとに縮小します。

    1pxの色は、スケーリングしたものの平均色です

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top