グレースケールへの変換
実用的には、R,G,Bの単純平均を使うことで問題ないことのようです。 また、L*a*b* や HSVなどの、輝度、明度を使うことも有効だと思います。
1.出力について
モニタに表示することや印刷などの「出力」については、R=G=B がグレーを表すことで間違いないようです。 次に示す、どのグレースケール化の方法も、結果は R=G=B です。
2.単純平均
R` <- (R+G+B) / 3 G` <- (R+G+B) / 3 B` <- (R+G+B) / 3
3.加重平均(1)
「色について」「色」「10.グレースケール」の例では、次のように演算しています。 R = G = B = (306・R + 601・G + 116・B) / 1024 これは、除算をシフトで行うつもりで変形したもので、 R = G = B = (0.896・R + 1.76・G + 0.34・B) / 3 と、加重平均を取っています。 NTSC の輝度信号の算出がこのように生成されると言うことのようです。
4.加重平均(2)
Wikipedia の「コンポーネント映像信号」には、輝度 Y を求める式として、次の2つの計算式が記されています。
- Y = 0.299・R + 0.587・G + 0.114・B
- Y = 0.2126・R + 0.7152・G + 0.0722・B
最初の式は、 Y = 0.299・R + 0.587・G + 0.114・B ≒ (0.896・R + 1.76・G + 0.34・B) / 3 で、「加重平均(1)」です。
2つ目の式は、HDTVでの輝度信号 Y の生成に基づくものと記されていました。 Y = (0.6378・R + 2.1456・G + 0.2166・B) / 3 の、加重平均です。
5.比較
通常は単純平均で特に問題はないように思います。

6.加重平均の副次的な効果
同じ値をセットして作った原色の帯は、加重平均の場合は形が残ります。

7.各計算方法の傾向
RGBのRとBを0.5に固定し、Gだけを変化させて図示してみます。ここではRGBの各要素は、0-1 です。

- R<-0.5
- B<-0.5
- x<-seq(0,1,by=0.01)
- yn<-array(dim=length(x))
- y0<-array(dim=length(x))
- y1<-array(dim=length(x))
- L<-array(dim=length(x))
- V<-array(dim=length(x))
- i<-1
- for(G in x){
- yn[i]<-(R+G+B)/3
- y0[i]<-0.299*R + 0.587*G + 0.114*B
- y1[i]<-0.2126*R + 0.7152*G + 0.0722*B
- c <- hex2RGB(rgb(R,G,B))
- lab<-as(c,"LAB");
- L[i]<-lab©coords[1]/100
- hsv<-as(c,"HSV")
- V[i]<-hsv©coords[3]
- i<-i+1
- }
- plot(x,yn,type="l",ylim=c(0,1),xlab="G",ylab="明るさ")
- lines(x,y0,type="l",col=2)
- lines(x,y1,type="l",col=3)
- lines(x,L,type="l",col=4)
- lines(x,V,type="l",col=5)
- title(main="RGB=(0.5,G,0.5)の明るさ")
- legend(0,y=1,c("単純平均","NTSC係数","HDTV係数","LabのL","HSVのV"),c(1,2,3,4,5))
|
|