JPEG2000実習 レイヤー編

本日のお題:JPEG 2000の「レイヤー」は、「領地の分け前」のことなんです。


前回(http://d.hatena.ne.jp/denshikA/20100602)、JPEG2000の変換について、実習できる環境をご紹介しました。ご自分で変換してみると、よりよく理解できるはずなので、時間の許す限り、やってみてください。*1


前にJPEG 2000についてお話した時(http://d.hatena.ne.jp/denshikA/20091014)、

今回は、レイヤーに注目してみたのですが、レイヤーというのは、名称が良くない。レイヤーと聞くと、

こんなものを連想してしまいます。ところが、JPEG 2000で言うところのレイヤーというのは、こういう「物理的な積み重ね」ではなくて、「切れば切るほど、画質が鮮明になっていく特殊な金太郎飴」みたいなものです。なので、レイヤーという言葉にダマされないようにしてください。

と書きました。


実際、いろいろな方とJPEG 2000についてお話していると、多くの方が、レイヤーのところで誤解をされています。*2


なので、今日は、スパッと、実習をしてみることで、すっきりさせておきたいと思います。


まずは、コマンドプロンプトを開いて、OpenJPEGで以下の3つの変換をしてみましょう。

C:\image_to_j2k.exe -i C:\test.tif -o C:\10.jp2 -r 10


C:\image_to_j2k.exe -i C:\test.tif -o C:\20.jp2 -r 20


C:\image_to_j2k.exe -i C:\test.tif -o C:\50.jp2 -r 50

前回と異なるのは、末尾に「-r 10」「-r 20」「-r 50」というのが付いている点です。


「-r 10」というのは、「元のファイルを、10分の1に圧縮してください」、
「-r 20」というのは、「元のファイルを、20分の1に圧縮してください」、
「-r 50」というのは、「元のファイルを、50分の1に圧縮してください」、
ということです。


実際に、結果を見てみましょう。

このように、
元のTIFFが、10MB(10,672KB)くらいの大きさですが、
「-r 10」の10.jp2は、1MB(1,042KB)ですし、
「-r 20」の20.jp2は、0.5MB(533KB)ですし、
「-r 50」の50.jp2は、0.2MB(214KB)ですね。
ちゃんと、10分の1、20分の1、50分の1になってますね。


では、本丸へ向かいましょう。レイヤーを作成してみます。


OpenJPEGでレイヤーを作成するときは、「-r 50,20,10」という感じで、それぞれのレイヤーの圧縮率を並べていけば良いんです。この例だと、3つ数字を並べているので、3つのレイヤーができます。OpenJPEGのルールとして、数字が大きい順*3に並べてください。


では、早速、コマンドプロンプトで、以下のように変換してみてください。

C:\image_to_j2k.exe -i C:\test.tif -o C:\aaa.jp2 -r 50,20,10


結果として、こうなりましたよね?


ここからが重要です。


ファイルサイズに注目してください。


通常、「レイヤー」と聞くと、そのレイヤー数だけ、画像があるものだと思います。なので、「-r 50,20,10」という感じで3レイヤーを作成すると、「-r 50」の画像と、「-r 20」の画像と、「-r 10」の画像が組み合わされるので、

0.2MB + 0.5MB + 1.0MB = 1.7MB

となると思っちゃいませんか?少なくとも、JPEG2000に初めて出会った時の私は、そうじゃないか、と思っちゃいました。


しかし、結果からすると、そうなってませんね。aaa.jp2のファイルサイズは、1,045KBですので、約1MBです。圧縮率としては、10分の1で、「-r 10」の結果とほぼ同じです。


中身の細かい話は抜きにして、おおよそ、こんな感じで理解してください。


JPEG 2000のレイヤー付き画像というのは、こんな感じになっていて、

別に、3レイヤーだからと言って、3つの画像があるわけでなく、一番大きな画像「-r 10」の領地内に、「-r 20」が自分の領地を分けてもらって、さらにその分けてもらった領地内に「-r 50」が自分の領地を分けてもらう、という感じです。


そして、

この図のように、「-r 50」の領地だけ表示させることもできますし、「-r 20」の領地だけ表示させることもできますよ、という仕組みです。


さらに、

こんな感じの「領地の分け前」を思い浮かべれば、「-r 10」でレイヤー1つでも、「-r 50,20,10」でレイヤーが3つでも、ほとんどファイルサイズが変わらない、という謎は、納得できませんか?


なので、(論点を明確にするため)極端な結論として、JPEG 2000では、レイヤーが1つだろうが、10,000あろうが、ファイルサイズは大して変わらないんです。レイヤー数が多ければ多いほど、(同心円状の)領地分割が細かい、というだけです。

*1:でも、実際にやらなくても、わかるようにお話していきますので、ご安心を。

*2:最近のJPEG 2000を採用している大型プロジェクトの仕様書にも、「おそらくレイヤーに関して勘違いしているんだろうな」と思われる箇所があります。

*3:つまり、圧縮率が高く、ファイルサイズが小さくなる順