一歩踏み込んだ色表現
第1回は、色とはそもそも何か? そして、色を表現するための方法を紹介しました。今回はもう一歩踏み込んで、人間の特性を考慮することで効率的に色を表現できないだろうか? という点について考えてみたいと思います。
輝度+色差での表現
前回にも述べましたが、人間は「L・M・S錐体(すいたい)」という3種類の錐体センサの出力をブラックボックス(色として認識されるまでの情報の伝達内容や変換の仕組み)を通して、大脳で色として知覚します。センサ自体は光の波長に応じてその出力が決まりますが、大脳の中の色の認知としては、「白⇔黒」「赤⇔緑」「青⇔黄」の3種類として扱われていると考えられています。これは、NCSやオストワルト表色系の軸にもなっています(正確には、色の認知に関しては3色説、反対色説、段階説など諸説があり、まだ解明されたわけではないようです)。中でも白⇔黒は「輝度」と呼ばれ、ほかの「色差」と呼ばれる赤⇔緑、青⇔黄よりも高感度に知覚されるようです。
図1は、輝度成分と色差成分(YCbCr)に分離した後、輝度成分(Y)のみにガウスぼかし(半径4ピクセル)をかけて再構成したもの(左)と、色差成分(Cb, Cr)のみに同じくガウスぼかしをかけて再構成したもの(右)の比較です。輝度成分(Y)をぼかした写真の方が全体にぼやけて見え、劣化の度合いが大きいことが分かると思います。
人間やサル以外の哺乳類の多くが錐体を2種類しか持っていないことや、人間のL・M・Sの3種類ある錐体のうち、MとLでは非常に近い反応(分光吸感度)を示すことからも、進化上、色差の知覚は輝度と比べて後から発達してきたものと考えられます。
色差の方が鈍い、という現象は、「色同化」現象にも同様に見ることができます。
色同化
色同化とは、「色は隣接する色の影響を受けて見え方が変化する」という現象で、繰り返しのあるパターンで生じます。例えば、緑色のネットに入れられたミカンとオレンジ色のネットに入れられたミカンでは、オレンジ色のネットに入れられたミカンの方がより美味しそうに見えます。これは、ミカンの色が赤みを持ったように見えるためです(図2)。
色同化が起きても、ネットの形やミカンの模様が異なるようには見えません。これは、輝度情報(白⇔黒)に比べて、色差情報(赤⇔緑、青⇔黄)の空間解像度が低いことを示しています。このようなことから、RGB表現ではデータ量を減らそうとする場合、RGBをそれぞれ均等に減らさないと色が変わってしまうのに対し、「輝度+色差」表現では高感度の輝度は変えずに色差成分のみを減らすことが可能になり、結果として劣化を抑えたままデータ量を減らすことが可能になります。
YCbCrの決め方
具体的に、JPEGにおける変換処理を調べてみましょう。JPEG(正確にはJFIF〔JPEG File Interchange Format〕)で用いられているYCbCrは、Yが輝度を表し、CbとCrが色差を表します。もともとはITU-R BT.601という規格で、次のように定義されています(0≦R≦1、0≦G≦1、0≦B≦1)。
Y = 0.299 * R + 0.587 * G + 0.114 * B ( 0≦Y≦1 ) Cb = -0.169 * R - 0.331 * G + 0.500 * B (-0.5≦Cb≦0.5) Cr = 0.500 * R - 0.419 * G - 0.081 * B (-0.5≦Cr≦0.5)
Yの各係数は、人間の特性上RGBの各色(赤・緑・青)の輝度に貢献する度合いが異なるというところから決められています。ここで言うRGBとは通常sRGBの原色を指しますが、実はJPEG(JFIF)でははっきりとしたRGB表色系の規定はなかったりします(Exifはあります)。仮に、RGBの3分の1ずつを輝度成分として変換した場合と比べてみましょう(図3)。
左右の図を比べて、色から受ける明るさ(輝度)をグレースケールで表したときに、人間の感覚により近いのは右側の図ではないでしょうか。
CbとCrの係数は、輝度を除いたものとして表現します。
B-Y = B - (0.299 * R + 0.587 * G + 0.114 * B) = -0.299 * R - 0.587 * G + 0.886 * B R-Y = R - (0.299 * R + 0.587 * G + 0.114 * B) = 0.701 * R - 0.587 * G - 0.114 * B
そして、振幅がYと同じになるようにスケーリングを行います。
(B-Y)/(0.886*2) = -0.169 * R - 0.331 * G + 0.500 * B = Cb (-0.5≦Cb≦0.5) (R-Y)/(0.701*2) = 0.500 * R - 0.419 * G - 0.081 * B = Cr (-0.5≦Cr≦0.5)
これが、CbおよびCrとなります。コード上はYが0~255の範囲、CbとCrは-128~127の範囲にスケーリングされ、CbとCrは+128のオフセットを付加して表現されます。
しかし、このままではRGB 3バイトで表していたものをYCbCr 3バイトに変換しただけで、データサイズは圧縮されていません。そこで、JPEGでは空間的に色差情報を“間引く”ことによってデータ量を減らすという手段をとります。Yが4つに対して、Cbが2つ、Crが2つのものを「4:2:2」と言います。間引き方にはほかにも「4:1:1」などがあります(図4)。間引き方が多いほどデータ量は当然減りますが、そこは画質とのトレードオフになります。
ちなみに、NTSCのコンポジットでは「YUV」という信号(YCbCrとの違いはスケーリングの大きさ)のU軸およびV軸を33度回転させた「YIQ」という信号を用いています。これは、色差をさらに肌色系の信号(I)と寒色系の信号(Q)の表現に変換することによって、人間にはより区別のつきにくいQ信号の帯域幅を減らすというものです。