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 からのものです (ウィキペディアの記事を参照)。
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 ディスプレイはより複雑です。さらに、一部のグラフィックス カードはガンマを補正します。)
RGB から呼び出された明るさの測定値を取得するにはL*
、まず RGB を 255 で割り、計算します。
Y = .2126 * R^gamma + .7152 * G^gamma + .0722 * B^gamma
これはY
XYZ 色空間にあります。それは色の「輝度」の尺度です。(実際の数式は正確には x^gamma ではありませんが、近似値です。最初のパスでは x^gamma を使用してください。)
ついに、
L* = 116 * Y ^ 1/3 - 16
「... 知覚の均一性を目指し、[そして] 人間の明るさの知覚と密接に一致します。」-- ウィキペディアラボの色空間
この出版物は、以前の同様の質問への回答で参照されていることがわかりました。これは非常に役に立ち、ページにはいくつかのサンプル画像があります。
カラーからグレースケールへの画像変換の知覚的評価、 Martin Čadík、Computer Graphics Forum、Vol 27、2008
この出版物は、さまざまな結果のグレースケール画像を生成するための他のいくつかの方法を探っています。
興味深いことに、入力に応じてそれぞれのパフォーマンスが他のものよりも優れていたり悪かったりするため、普遍的に最適な変換方法はないと結論付けています。
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
}
これについては、カラーFAQを確認してください。これらの値は、ディスプレイで使用するRGB値の標準化に基づいています。実際、Color FAQによると、使用している値は、最新のモニターではなく、元のNTSC標準に使用されている値であるため、古くなっています。
これらの値は人によって異なり、特に色弱者の場合は異なります。