JPEGはいかにして圧縮を実現しているのか。
有名な音の話を考えてみましょう。
MDがあんなちっこいディスクにどうやってCDと同じ時間分のデータをぶちこんでいるかご存知ですか?また流行りのMP3は音質はCDとほとんど同じ状態のままにどうやって音楽データをWAVEの状態から比べて11分の1程度という圧縮率をたたき出しているのかご存知でしょうか?
どちらも人間の耳には聞こえないような音や聞こえにくい音をカットすることでその分のデータを減らしているのだそうです(それだけじゃないが)。人間の耳で聞こえる音の周波数はある程度の範囲に限られているわけで、それを消しちゃえばデータも減るってのは自然の考えな気がしますね。
さて、JPEGもこれと同じ考えでの圧縮を行います。画像が劣化した場合にあまり人が気にしないようなところは劣化が激しくても(=データの損失が多くても)それほど人が感じる画質には影響がないから、そういった領域のデータを減らせばいいということですね。その画像が劣化した場合にあまり人が気にしないようなところとして、高周波領域がそのような領域に当てはまるということが広く知られています。
さて、音での高周波領域ならものすごい高い音なんだろうな、と想像がつきますが、画像の高周波領域とはどのようなところなのでしょうか。
まず例としてグレースケールの画像を想像してみてください。この画像上のある点から右側にに向かって各ピクセルを見ていき、これを線グラフにしたときに、そのグラフの線の波の振動が細かいとそこは高周波であるといえます。この波がなだらかで大きい波だったら低周波です。つまり(グレースケールなら)輝度値が激しく変化しているところは高周波、変化の少ないところは低周波ってわけです。なお周波数成分はDCT(離散コサイン変換)という計算をすると算出できます、が、ここでそんな話を詳細にすることにあまり意味を感じないので省略。
ここで戻って考えてみると、ごちゃごちゃしたところが多少変化してても気がつきにくいけれど、のぺーっとしたところに変化があったら気がつきやすいというのは当然のような気がしますね。風景写真のような自然画像の場合は極端な変化のあるところは少ないだろうから低周波成分に重きをおいて考えるということも言えると思います。逆にアニメ調の画像だとベタ塗りすることが多いのでエッジがいっぱいありますよね、エッジはデータ的には急激な変化となるのでJPEGでは必要のないデータってことで消し去られるので、そういった画像でJPEGに変換すると劣化が目立つということになります。
で、周波数成分にわけたデータを、高周波成分はでっかい値で、低周波成分は小さい値で割ります。(ここでどんな値で割るかが画質とファイルサイズに大きく影響を及ぼします。)かなり大きい値で割ったところは値がゼロになってしまいます。特に高周波領域ではゼロだらけになる可能性が高いです。そこで、割った後の値を低い周波数から高い周波数に順に並べて、0になったところは0がいくつあったよ、という情報に直します(これをランレングス法と呼びます)。「00000000000」という情報より「0が11」と言ったほうが短いのは明らかですよね。
後は以上の工程でできあがったデータを効率良く並べていくだけです。この並べていくときにたくさんあるデータは少ない符号数で、少ないデータはたくさんの符号数で表すようにする等してできあがったデータをできるかぎり少ないデータに直してファイルに書きこんでいけばおっけ~です。
JPEGの超基本的圧縮の仕組みを書いてみました。ここまで読んでなんとなくわかって満足された方やもっと細かいところまで知りたくなったという人がいたりしたら幸いです。もっと細かいところまで知りたければ私の恩師がデジタル信号処理の本を出版するので買ってください。私も少し手伝っています。でも、いつどこの会社から何というタイトルで出るのかは知りません。以上、宣伝でした。