SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

JPEGを散歩する

【第2回】人間の特性を生かした色表現


  • このエントリーをはてなブックマークに追加

 第1回の節「デバイスに対して色を伝える」で、NTSCやJPEGは「輝度+色差」表現をする、と述べました。3原色の値とは異なった表現を行うのは、人間に対しては色情報の劣化を感じさせずに情報を減らそうという意図があるからです。劣化を感じさせないためには、人間が色を感知する際の特性を利用します。

  • このエントリーをはてなブックマークに追加

一歩踏み込んだ色表現

 第1回は、色とはそもそも何か? そして、色を表現するための方法を紹介しました。今回はもう一歩踏み込んで、人間の特性を考慮することで効率的に色を表現できないだろうか? という点について考えてみたいと思います。

輝度+色差での表現

 前回にも述べましたが、人間は「L・M・S錐体(すいたい)」という3種類の錐体センサの出力をブラックボックス(色として認識されるまでの情報の伝達内容や変換の仕組み)を通して、大脳で色として知覚します。センサ自体は光の波長に応じてその出力が決まりますが、大脳の中の色の認知としては、「白⇔黒」「赤⇔緑」「青⇔黄」の3種類として扱われていると考えられています。これは、NCSやオストワルト表色系の軸にもなっています(正確には、色の認知に関しては3色説、反対色説、段階説など諸説があり、まだ解明されたわけではないようです)。中でも白⇔黒は「輝度」と呼ばれ、ほかの「色差」と呼ばれる赤⇔緑、青⇔黄よりも高感度に知覚されるようです。

 図1は、輝度成分と色差成分(YCbCr)に分離した後、輝度成分(Y)のみにガウスぼかし(半径4ピクセル)をかけて再構成したもの(左)と、色差成分(Cb, Cr)のみに同じくガウスぼかしをかけて再構成したもの(右)の比較です。輝度成分(Y)をぼかした写真の方が全体にぼやけて見え、劣化の度合いが大きいことが分かると思います。

図1:色差成分の変化には鈍い

 人間やサル以外の哺乳類の多くが錐体を2種類しか持っていないことや、人間のL・M・Sの3種類ある錐体のうち、MとLでは非常に近い反応(分光吸感度)を示すことからも、進化上、色差の知覚は輝度と比べて後から発達してきたものと考えられます。

 色差の方が鈍い、という現象は、「色同化」現象にも同様に見ることができます。

色同化

 色同化とは、「色は隣接する色の影響を受けて見え方が変化する」という現象で、繰り返しのあるパターンで生じます。例えば、緑色のネットに入れられたミカンとオレンジ色のネットに入れられたミカンでは、オレンジ色のネットに入れられたミカンの方がより美味しそうに見えます。これは、ミカンの色が赤みを持ったように見えるためです(図2)。

図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)。

図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)。間引き方が多いほどデータ量は当然減りますが、そこは画質とのトレードオフになります。

図4:色差成分の間引き方(左は「4:2:2」、右は「4:1:1」)

 ちなみに、NTSCのコンポジットでは「YUV」という信号(YCbCrとの違いはスケーリングの大きさ)のU軸およびV軸を33度回転させた「YIQ」という信号を用いています。これは、色差をさらに肌色系の信号(I)と寒色系の信号(Q)の表現に変換することによって、人間にはより区別のつきにくいQ信号の帯域幅を減らすというものです。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
色表現のそのほかの可能性

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
JPEGを散歩する連載記事一覧
この記事の著者

藤原 剛(フジワラ タケシ)

34歳。株式会社ビー・ユー・ジー熱血社員。名刺の肩書きはファームウェア職人。^^組込みではブートローダやOSポーティング、デバイスドライバあたりが好み。CPUではSHやMIPSよりARMやPowerPCが好き。WindowsやMac等の高級OSでは、デバイスドライバやソフトのチューニングが好き。最近は自社製...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3750 2009/03/26 17:54

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング