ブロックノイズのできるわけ(1)

 予告通り、ブロックノイズの発生するわけについて書いてみます。
 自分の理解が正しいのかどうか甚だ心許ないですが。

 間違いや、こう説明したほうがわかりやすいよ、というアイディアなどございましたら、どしどしお寄せくださいませ。


 さて、MPEG-2やJPEGでは、下記のように、ブロックノイズと呼ばれる現象が発生する場合があります。


モザイクのような小さな四角が現れています


 これは、圧縮に起因する現象です。
 MPEG-2やJPEGでは、画像を小さなブロック(8×8ピクセルなど)に分割した上で、ブロックごとに画像を「ぼかす」、つまりデータを間引いて圧縮します。 ブロックごとにデータを間引く処理をします。この結果、ブロック全体が「ぼける」ことになります。(「ぼかす」という表現をすると「ぼかしの処理を入れる」というように誤解される可能性があるため、修正しました)
 このとき隣接するブロックで「ぼけ」の度合いが異なるため、ブロックの境目がくっきり見えてしまうことがあるのです。


 では、具体的には、画像をブロックに分割して圧縮、というのはどうやるのかと言うと、次の通りです(大まかなイメージですので、全然正確ではありません)。


1. 画像を8×8ピクセルのブロックに分割し、それぞれのブロックを「ある64枚の8×8ピクセル画像を重ね合わせる」ことで表現する

 つまり、「Aという画像を200枚、Bという画像を150枚、Cという画像を140枚...」という具合です。
 この結果、200, 150, 140... という感じで1ブロックにつき64個の数字が出てきます。

 この64枚の画像がどんなものなのか、本当にこの64枚を重ね合わせることで画像が表現できるのか、ということがやや疑問ですが、その点はまた後で出てくるので、ここではそういうものだと思うことにしましょう。


2. 64個の数字をそれぞれ決まった数で割り算して、小数点以下を切り捨てたものを順番に並べる

 1番目の数字は8で割る、2番目の数字は16で割る、というように、何で割るのかはあらかじめ決まっています(割る数は正の整数です)。

 割り算をすることで数字が小さくなるので、ここでデータ量が減ります。

 また、自分より大きい数で割って小数点以下を切り捨てると、もれなく0になることも重要です。
 実は、64個の数字の後ろのほうは、割り算の結果が0になることが多くなるように仕組まれているのです。


3. 順番に並べた数字を更に短くする

 例えば、"0000000"という部分は、0が7個並んでいるので、"0"と"7"の2つの数字さえあれば表せます。
 具体的にどのような方式で表すのかはともかく、7文字よりは短くすることができるわけです。


 上記三段階は、きちんとした言葉で言うなら、それぞれ「離散コサイン変換」「量子化」「符号化」に対応します。
 この中身にもう少し詳しく立ち入らないと、ブロックノイズが発生する仕組みには迫れないので、次回はそれぞれについて(やや)詳しく書いてみることにします。