RGBからグレースケールに変換する場合、チャネルR、G、Bに特定の重みを適用する必要があると言われています。これらの重みは、0.2989、0.5870、0.1140です。
その理由は、これらの3つの色に対する人間の知覚/感受性が異なるためだと言われています。これらはNTSC信号の計算に使用される値であるとも言われます。
しかし、ウェブ上でこれについての適切なリファレンスは見つかりませんでした。これらの値のソースは何ですか?
RGBからグレースケールに変換する場合、チャネルR、G、Bに特定の重みを適用する必要があると言われています。これらの重みは、0.2989、0.5870、0.1140です。
その理由は、これらの3つの色に対する人間の知覚/感受性が異なるためだと言われています。これらはNTSC信号の計算に使用される値であるとも言われます。
しかし、ウェブ上でこれについての適切なリファレンスは見つかりませんでした。これらの値のソースは何ですか?
回答:
質問の具体的な番号はCCIR 601からのものです(以下のWikipediaのリンクを参照)。
RGB->グレースケールをわずかに異なる数値/異なる方法で変換する場合、通常の照明条件下の通常のコンピューター画面ではほとんど違いが見られません-試してみてください。
一般的な色に関するリンクがいくつかあります。
ウィキペディアルマ
Bruce Lindbloomの優れたWebサイト
Colin Ware著の本、「Information Visualization」の色に関する第4章、isbn 1-55860-819-2; books.google.comの Wareへのこの長いリンク は、機能する場合と機能しない場合があります
cambridgeincolor:優れた、よく書かれた「手順よりも概念を強調する視覚指向のアプローチを使用してデジタル写真を取得、解釈、処理する方法に関するチュートリアル」
「リニア」対「ノンリニア」RGBに遭遇した場合は、これについての古いメモの一部をここに示します。繰り返しますが、実際にはそれほど大きな違いはありません。
カラーサイエンスでは、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
これはY
XYZ色空間にあります。色の「輝度」の尺度です。(実際の数式は正確にはx ^ gammaではありませんが、近いです。最初のパスではx ^ gammaを使用してください。)
最後に、
L* = 116 * Y ^ 1/3 - 16
「...知覚の均一性を目指しており、人間の明るさの知覚と密接に一致しています。」- ウィキペディアラボの色空間
この出版物が以前の同様の質問への回答で参照されていることがわかりました。それは非常に役に立ちます:
http://cadik.posvete.cz/color_to_gray_evaluation/
結果が異なるグレースケール画像を生成するさまざまな方法の「トン」を示しています。
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
}
0.11111111 * ((G + (G<<1) + R) <<1) + B)
です。これは同等です(2*R+6*G+B) / 9)
か0.222 R + 0.666 G + 0.111 B
。生産に入る前に、さまざまなテストケースの正確な式と比較してください。
これらの数値(または同様の数値)がどのように導出されたかについての論文は次のとおりです。
これに関する情報についてはカラーFAQをチェックしてください。これらの値は、ディスプレイで使用するRGB値の標準化に基づいています。実際、Color FAQによると、使用している値は最新のモニターではなく、元のNTSC標準で使用されている値であるため、古くなっています。
これらの値のソースは何ですか?
投稿された係数の「ソース」はNTSC仕様であり、Rec601とテレビの特性で確認できます。
「究極の情報源」は、人間の色知覚に関するCIE 1931年頃の実験です。人間の視覚のスペクトル応答は均一ではありません。実験により、知覚に基づく三刺激値の重み付けが行われました。L、M、およびSコーン1は、「赤」、「緑」、および「青」(それぞれ)として識別される光の波長に敏感であり、三刺激の原色がそこから導き出されます。2
sRGB(およびRec709)の線形光3スペクトル重み付けは次のとおりです。
これらは、コンピュータ・モニターを表すことを意図されたsRGB色空間とREC709、(sRGB表)又はHDTVモニタ(REC709)に特異的であり、そしてためのITU文書に詳述されてREC709ともBT.2380-2(2018分の10)
脚注
(1)コーンは、網膜の色を検出する細胞です。
(2)ただし、選択された三刺激波長は、各コーンタイプの「ピーク」ではありません。代わりに、三刺激値は、特定のコーンタイプを他より大幅に刺激するように選択されます(刺激の分離)。
(3)係数を適用する前に、sRGB値を線形化する必要があります。これについては、こちらの別の回答で説明します。
このすべてが本当に必要な場合、人間の知覚とCRT対LCDは変化しますが、RGB強度は変化しません。L = (R + G + B)/3
新しいRGBをL、L、Lに設定してください。