開発じたばた日誌

前へ●●●次へ
じたばた日誌目次へ戻る
TSUCHY Softへ戻る


TYOTTO JPEG突入編

 GIFで気をよくした私は何も知らないままJPEGのデコードをやってみるかと思いました。 私にも高校生時代のような、根気のいる苦しい計算ができるじゃないか。まだやれる。 しかし、JPEGは行く手に何重もの罠を待ちかまえ、私を待っていました。

 苦労話の前にJPEGがいかなるものか、うまく言えないけれど解説してみましょう。 私の参考書には、音を圧縮するときの例が書いてありました。 たとえばサインウェーブを時間を細かく区切ってサンプリングしたとします。 サンプリングしたデータから元の波形を得るには、細かくサンプリングするほど正確に得られます。 しかしデータ量はどんどん増えていきます。

 ところがサインウェーブを表すときは、振幅、周波数、位相の三つの情報があれば完全にわかるのです。 たった三つの情報で、どんなに細かくサンプリングした時系列のデータより正確に知ることができるのです。

 つまりここで現実の世界から周波数の世界への変換が重要だとわかるのです。 私はとても面白いと思いました。スペクトル解析のためのフーリエ変換が画像の圧縮に役に立つのです。 フーリエ変換と画像の圧縮を結びつけた人はすごいですね。 (JPEGではDCT(拡散コサイン変換)という変換を使っています)

 画像を例にとって見ましょう。JPEGでは画像を8x8ドット単位で扱います。 8x8ドットの元の画像をDCT変換すると、周波数変換された8x8ドットのデータになります。 左上は低周波成分で重要なデータです。右下は高周波成分で、小さな値が多くそれほど重要ではありません。 この時点ではデータの圧縮はされていません。

 高周波成分は元々の画像に与える影響が少なく、ゼロにされます。ここでデータの圧縮(というかデータを捨てる処理) が起こります。 なんて乱暴なことをと思うかもしれませんが、JPEG画像を見れば問題ないことが納得できると思います。 ここで面白いのは、高周波成分をどんどんゼロにしていくと、復元した画像のシャープさがどんどん無くなっていくことです。 これは理屈からすれば当然なのですが、周波数の世界での周波数の高い部分は現実の世界の画像のシャープさに結びついている なんて面白いなぁと感心してしまいます。

 この段階でかなりデータが小さくなりますが、さらにハフマン符号と、ランレングス(連続したゼロを圧縮する)方法で もう一段階の圧縮がかかります。このような涙ぐましい努力により圧縮率90%などという驚異的な成果が出るのです。