Y = 0.29900×R + 0.58700×G + 0.11400×B Cb = −0.16874×R − 0.33126×G + 0.50000×B Cr = 0.50000×R − 0.41869×G − 0.081×Bグレースケールでは画像成分が1なのでこのステップは省略します。Yは輝度 成分でグレースケールと同様で、また他の2つの軸は色情報になります。この 変換を行う理由は、輝度成分と色差成分では人間にとって感じ方が異な るため情報の削り方(後述の量子化テーブル、等)を変えることで効果 的な圧縮が期待できるためです。
ちなみに MPEG ではさらに進めて色差信号は画素数まで落したりします。たとえ ば輝度成分4(四角の四方)に対して色差成分を1つ(四角の中心)づつ、とか。 これが 4:2:0 という情報型式です(詳細略)。
…ではわけわかんないかもしんないです。まず、画像も所詮はコンピュータ内で はビットの列なわけで、それをずらずらっと並べたら波とかと同じデータ列です。 そして、それを波として取り扱うといろいろ嬉しいことがあるわけです。
それで、時間軸を周波数軸に変換する、ということを直感的に説明すると;例え ば、音というのは波なわけで、単音の場合はきれいなサインカーブを描いている はずです。で、その場合は、周波数と振幅さえわかれば、わざわざプロットした グラフ(コンピュータの中では点の集まり)をデータとして保持しておかなくて も、再現可能なわけです。つまり(図はいい加減ですが);
** ** ** ** * * * * * * * * * * * * * * * * * * * * * * * * * ** ** ** **のようなデータ(波)は
* * *********************************************のようなグラフとは(取り敢えず必要な?)情報としては等しいということです。 そうすると、ある場合には保持すべき情報量がぐっと削減できる、というわけで す。
でも実際には(たいていの周期的情報は)ろいろな周波数の波の重なりとして表 現されているわけで、その場合は周波数変換後
* * * * * * * ********************************************* * *のようになっているわけで、周波数変換すると情報量が減る、という ことは必ずしもあてはまらないわけです。
ところが、画像のように相関性が高い信号は、これを周波数成分に変換した時、 低周波成分にエネルギー(特徴)が集中し、また低周波成分が視覚 的にも重要な役割を果たすことが知られていて、DCT符号化はこの性質をのち の量子化と組み合わせて利用しています。
ここで、上に述べた人間の視覚の性質を利用しているわけです。量子化によっ て逆変換後の画像には画質の歪みが生じますが、量子化テーブルを適切にえら ぶことで人間の目には気にならない程度に押えることが可能です。 特に自然画像においては高次の周波数成分の係数を切り捨てることで画質を保 持しつつデータサイズを小さくできます。極端な話、すべての値が1の量子化 テーブルを用いれば画質の品質を最高に保てますが JPEG データサイズはかな り大きくなります。つまり、このテーブルをいじることで、圧縮率を調整でき るわけです。
"AAAAAAABBBBBBBBBCCCCCCCCBBBBBB"という文字列があったとしましょう。これはそのまま持っていると30文字(バ イト)ですが、よく見るとAが7つ、Bが9つ、Cが8つ、またBが6つ並んでいる ので、
A7B9C8B6と表しても情報量は同じ(再現可能)です。こうすると8文字で表現できるので 4/15 にデータが圧縮できたことになります。ただし、これは運のいい場合(?) で、同じものが連続してないと圧縮できないことに注意してください。
とはいえ JPEG では前節での量子化の結果高次の周波数成分は0になることが多 いので、これを「0が??個並んでいる」と記録すればデータ量を減らす、すな わち圧縮できることになります。この時、下図にあるようにジグザグに並びをみ る(ジグザグスキャン)ことにより、表の右下に多いことが期待される高次の成 分の0の並びをまとめてカウントすることができ、より大きな圧縮率が期待でき ます。
ハフマン符号化とは、出現頻度の多いものに少ないデータ(ビット) 長の符号を割り当てることで、全体のデータ量を少なくすることを試みるもの です。この場合、1文字=1バイト、のような関係はなりたたないことに注意 してください。ちなみにモールス符号も同じ発想ですが、モールス符号は事前 に調査した一般的な文書における頻度で固定的にアルファベットに符号を割り ふっています。ハフマン符号化は一般的にはその対象となるデータ列をまず調 べて、適した符号化を行います。さらに、単に頻度の高いものに短い符号を割 りふるだけでは、符号の切れ目が区別できない場合もありますが、その問題も 解消できる仕組みを提供しています。
例えば、
AAAAAABBCDDEEEEEFという文書の中で使われているA〜Fの文字(ここではたまたま同じ文字を連続さ せて並べていますが、ランダムに並んでいても同様です)を「出現頻度の多いも のを少ないビット数の符号で表す」ことを考えます。1つの案としては 以下のようなものが考えられます。
文字 | 出現頻度 | 符号案 | ビット数 |
A | 6 | 0 | 1 |
E | 5 | 1 | 1 |
B | 2 | 10 | 2 |
D | 2 | 11 | 2 |
C | 1 | 100 | 3 |
F | 1 | 101 | 3 |
でも、この案の符号体系には問題があって、例えば "100" という 3ビットは、1,0,0 で EAA なのか、10,0 で BA なのか、100 全体で C なのかの区別ができないです。
ハフマン法ではハフマン木というものを使って符号系を作り、上の問題を解決し ています。アルゴリズムは以下の通りです。
出現頻度 (6)(5)(2)(2)(1)(1) データ A E B D C F
(2) / \ 出現頻度 (6)(5)(2)(2)(1)(1) データ A E B D C F
(6) / \ (4) (2) / \ / \ 出現頻度 (6)(5)(2)(2)(1)(1) データ A E B D C F
(17) / \ / (6) / / \ (11) (4) (2) / \ / \ / \ 出現頻度 (6)(5)(2)(2)(1)(1) データ A E B D C F 符号 00 01 100 101 110 111 ビット合計 12 10 6 6 3 3 = 40あるいは、以下のようなものでもOKです。
(17) / \ / (11) / / \ / / (6) / / / \ / / (4) (2) / / / \ / \ 出現頻度 (6)(5)(2)(2)(1)(1) データ A E B D C F 符号 0 10 1100 1101 1110 1111 ビット合計 6 10 8 8 4 4 = 40さらに、以下のようなものでもOKです。かなり自由度があることが わかると思います。
(17) /\ /(11) / /\ / / (6) / / / \ / / / (4) / / / / \ / / / / (2) / / / / / \ 出現頻度 (6)(5)(2)(2)(1)(1) データ A E B D C F 符号 0 10 110 1110 11110 11111 ビット合計 6 10 6 8 5 5 = 40
00 00 00 00 00 00 100 100 110 101 101 01 01 01 01 01 111となります。いずれの符号系(テーブル)にしても、符号化後は40ビット=5 バイトとなります。もとは17文字=17バイトのデータだったわけで、約3割 に圧縮出来たことになります。
とはいえ、機軸技術である(離散)ウェーブレット変換 (DWT) を非常に簡単に 端折っていうと、画像=2次元情報を、分離型フィルタの考えに基づく1次元の (高周波/低周波)2分割フィルタバンクを繰り返して使用して2次元DWT を実 行します。つまり、画像を
Low,Low High,Low Low,High High,High
と4分割します。すると、LL が基本的な画像の特徴(エネルギー)を保持して います(原画の画質を維持している)ので、極端な話、ここだけデータをもって いれば元の画像はだいたい復元できることになります。このLL領域についてさら に2次元 DWT を行って…というステージを繰り返していくと、階層的に画像を 分解して、かつ、重要度の高い部分から先におくることが出来る、というわけで す。JPEG 2000ではデフォルト5ステージです。