RGBをグレースケール/強度に変換する


128

RGBからグレースケールに変換する場合、チャネルR、G、Bに特定の重みを適用する必要があると言われています。これらの重みは、0.2989、0.5870、0.1140です。

その理由は、これらの3つの色に対する人間の知覚/感受性が異なるためだと言われています。これらはNTSC信号の計算に使用される値であるとも言われます。

しかし、ウェブ上でこれについての適切なリファレンスは見つかりませんでした。これらの値のソースは何ですか?

これらの以前の質問も参照してください:ここここ


26
はい、そうです。私はいつもRGB値のプログラミングをしています。これらの計算に「実世界」の値を適用することは、アプリにその価値を認めたい場合に非常に重要です。
Neil N

1
多くのプログラマーは「間違った」グレースケール画像を気にして計算しないかもしれませんが、私はそうしています。
ypnos 2009年

6
私はそれがコーディングに関連していることに同意します-あなたがグラフィックをコーディングしているなら、興味深く関連性のある問題に挑戦してください。自分で答えを知りたい場合は+1
Cruachan

6
RGB プログラミングに関連しています。これは、日付文字列の解析と同様にプログラミングに関連しています。テキスト「true」をブール値に変換する。
Neil N

回答:


87

質問の具体的な番号はCCIR 601からのものです(以下のWikipediaのリンクを参照)。

RGB->グレースケールをわずかに異なる数値/異なる方法で変換する場合、通常の照明条件下の通常のコンピューター画面ではほとんど違いが見られません-試してみてください。

一般的な色に関するリンクがいくつかあります。

ウィキペディアルマ

Bruce Lindbloomの優れたWebサイト

Colin Ware著の本、「Information Visualization」の色に関する第4章、isbn 1-55860-819-2; books.google.comの Wareへのこの長いリンク は、機能する場合と機能しない場合があります

cambridgeincolor:優れた、よく書かれた「手順よりも概念を強調する視覚指向のアプローチを使用してデジタル写真を取得、解釈、処理する方法に関するチュートリアル」

「リニア」対「ノンリニア」RGBに遭遇した場合は、これについての古いメモの一部をここに示します。繰り返しますが、実際にはそれほど大きな違いはありません。


RGB-> ^ gamma-> Y-> L *

カラーサイエンスでは、html rgb(10%、20%、30%)のような一般的なRGB値は、「非線形」またはガンマ補正済みと呼ば ます。「線形」値は次のように定義されます

Rlin = R^gamma,  Glin = G^gamma,  Blin = B^gamma

多くのPCではガンマは2.2です。通常のRGBは、R 'G' B '(R' = Rlin ^(1 / gamma))(純粋主義者の舌クリック)と書かれることもありますが、ここでは 'をドロップします。

CRTディスプレイの明るさはRGBlin = RGB ^ガンマに比例するため、CRTの50%グレーはかなり暗い:.5 ^ 2.2 =最大輝度の22%。(LCDディスプレイはより複雑です。さらに、一部のグラフィックスカードはガンマを補正します。)

L*RGBから呼び出された明度の測定値を取得するには、まずRGBを255で除算して計算します

Y = .2126 * R^gamma + .7152 * G^gamma + .0722 * B^gamma

これはYXYZ色空間にあります。色の「輝度」の尺度です。(実際の数式は正確にはx ^ gammaではありませんが、近いです。最初のパスではx ^ gammaを使用してください。)

最後に、

L* = 116 * Y ^ 1/3 - 16

「...知覚の均一性を目指しており、人間の明るさの知覚と密接に一致しています。」- ウィキペディアラボの色空間


8
Y = 0.2126 * R + 0.7152 * G + 0.0722 * B -ウィキペディア(en.wikipedia.org/wiki/Grayscale
iamantony


9

rgbをグレースケールに変換するcのコードをいくつか示します。RGBからグレースケールへの変換に使用される実際の重み付けは、0.3R + 0.6G + 0.11Bです。これらの重みは絶対に重要ではないので、それらで遊ぶことができます。私はそれらを0.25R + 0.5G + 0.25Bにしました。少し暗い画像になります。

注:次のコードは、xRGB 32ビットピクセル形式を想定しています

unsigned int *pntrBWImage=(unsigned int*)..data pointer..;  //assumes 4*width*height bytes with 32 bits i.e. 4 bytes per pixel
unsigned int fourBytes;
        unsigned char r,g,b;
        for (int index=0;index<width*height;index++)
        {
            fourBytes=pntrBWImage[index];//caches 4 bytes at a time
            r=(fourBytes>>16);
            g=(fourBytes>>8);
            b=fourBytes;

            I_Out[index] = (r >>2)+ (g>>1) + (b>>2); //This runs in 0.00065s on my pc and produces slightly darker results
            //I_Out[index]=((unsigned int)(r+g+b))/3;     //This runs in 0.0011s on my pc and produces a pure average
        }

2
0.3 0.6 0.11は1に追加されません。ウィキペディアは0.30 0.59 0.11を提案しているようです。
damix911 2013年

確かに、しかしそれらが1に追加されない唯一の結果は、強度のごくわずかな変化です。提案された0.25、0.5、0.25の方法は1に加算されますが、加算されなくても問題ありません。これは最適化であるため、わずかな精度を放棄することは妥当なトレードオフです。
twerdster

2
@twerdsterどちらの係数セットも正しくありません。.3、.6、.11は古いNTSC標準であり、sRGB / Rec709ではありません(これは、Webおよびほとんどのコンピューターが使用しているものです)。そして、0.25、0.5、0.25は妥当なトレードオフではありません。Bは輝度の7%にすぎません。間違っているのは347%です。sRGB / r709の係数(線形化後):Rlin * 0.2126 + Glin * 0.7152 + Blin * 0.0722 = Yこれらのスペクトル重み付けは、人間のスペクトル知覚に基づいています。便宜上、必要な数だけを詰め込むことはできず、正確であることが望まれます。sRGBを線形化してから、正しい係数を適用する必要があります。
Myndex

除算が高すぎる状況にある場合、シフトと加算を伴う単一の乗算を使用する近似は次のとおり 0.11111111 * ((G + (G<<1) + R) <<1) + B)です。これは同等です(2*R+6*G+B) / 9)0.222 R + 0.666 G + 0.111 B。生産に入る前に、さまざまなテストケースの正確な式と比較してください。
ToolmakerSteve


6

これに関する情報についてはカラーFAQをチェックしてください。これらの値は、ディスプレイで使用するRGB値の標準化に基づいています。実際、Color FAQによると、使用している値は最新のモニターではなく、元のNTSC標準で使用されている値であるため、古くなっています。


3

これらの値のソースは何ですか?

投稿された係数の「ソース」はNTSC仕様であり、Rec601テレビの特性確認できます。

「究極の情報源」は、人間の色知覚に関するCIE 1931年頃の実験です。人間の視覚のスペクトル応答は均一ではありません。実験により、知覚に基づく三刺激値の重み付けが行われました。L、M、およびSコーン1は、「赤」、「緑」、および「青」(それぞれ)として識別される光の波長に敏感であり、三刺激の原色がそこから導き出されます。2

sRGB(およびRec709)の線形光3スペクトル重み付けは次のとおりです。

R lin * 0.2126 + G lin * 0.7152 + B lin * 0.0722 = Y

これらは、コンピュータ・モニターを表すことを意図されたsRGB色空間とREC709、(sRGB表)又はHDTVモニタ(REC709)に特異的であり、そしてためのITU文書に詳述されてREC709ともBT.2380-2(2018分の10)

脚注 (1)コーンは、網膜の色を検出する細胞です。
(2)ただし、選択された三刺激波長は、各コーンタイプの「ピーク」ではありません。代わりに、三刺激値は、特定のコーンタイプを他より大幅に刺激するように選択されます(刺激の分離)。
(3)係数を適用する前に、sRGB値を線形化する必要があります。これについては、こちらの別の回答で説明します。



-4

このすべてが本当に必要な場合、人間の知覚とCRT対LCDは変化しますが、RGB強度は変化しません。L = (R + G + B)/3新しいRGBをL、L、Lに設定してください。


3
R、G、Bの3つの原色すべてを単純に平均すると、それらは知覚的に等しいものとして扱われますが、これは人間の視覚システムには当てはまりません。
Bill Feth
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.