JPEG2000実習 ロスレス/ロッシー編 その1

本日のお題:ロスレス/ロッシー境界線


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


いきなり、コマンドプロンプトを開いて、OpenJPEGで以下の変換をしてみましょう。

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


前回(http://d.hatena.ne.jp/denshikA/20100604)説明したとおり、「-r 1」というのは、「1/1に圧縮する」ということなので、つまり、直訳すると「圧縮しないでね」という意味になりそうですね。


結果を見てみると、

という感じで、予想に反して、おおよそ1/5(≒ 10,672 ÷ 1,950)に圧縮されちゃってますね。おかしいですね?


次に、圧縮率を2から6まで変化させて、

とやってみると、結果が

ですので、「1/2に圧縮」「1/3に圧縮」「1/4に圧縮」「1/5に圧縮」すると、同じサイズのファイルになり、「1/6に圧縮」すると少し小さいファイルができますね。


なんでこんなことになるのか、というところを見て行きましょう。


JPEG2000における圧縮には、ロスレス/ロッシー境界線というものがあります。


ロスレス(Lossless)というのは、ロス(画像情報をうしなっちゃうこと)がレス(ないこと)なので、JP2変換した後でも、元の画像に戻すことができます。(なので、別名、可逆変換とも呼ばれます。)


一方、ロッシー(Lossy)というのは、ロス(画像情報をうしなっちゃうこと)しちゃいます、ということなので、JP2変換した後、元の画像に戻すことはできません。(なので、別名、不可逆変換とも呼ばれます。)


そして、ロスレスなのか、それとも、ロッシーなのか、ということは、圧縮率の問題だと思ってください*2


圧縮率がある範囲内であれば、ロスレスだけれども、ある範囲を超えるとロッシーになってしまうわけです。


今回の実験の場合、おおよそ「1/5に圧縮」と「1/6に圧縮」の間に、ロスレス/ロッシー境界線があるようです。つまり、「1/5に圧縮」で圧縮した画像は、ロスレスだけれども、「1/6に圧縮」で圧縮した画像は、ロッシーですよ。


そして、下図のように、ロスレス/ロッシー境界線のロスレス側は、圧縮率の設定を変えようが何しようが、一定のファイルサイズ(一定の圧縮率)となります。すでにロスレスなのに、それ以上圧縮率を下げても意味ありませんよ、ということらしいです。


(ここから重要)
なので、「-r 1」というのは、額面どおりに受け取ると「1/1に圧縮する」ということなのでですが、その本当の意味は、「ロスレスのレイヤーを入れてください*3」という指示なのです。なぜなら、圧縮率の設定が1なら、必ずロスレス/ロッシー境界線のロスレス側に来るからですね。



(おまけ)
ちなみに、OpenJPEGでは、「-r」の指定を省略すると、「-r 1」が指定されたのと同じ取扱いになりますので、前々回に例示した「C:\image_to_j2k.exe -i C:\test.tif -o C:\out.jp2」という変換は、「C:\image_to_j2k.exe -i C:\test.tif -o C:\out.jp2 -r 1」ということであり、「ロスレスのレイヤーを1つだけ含むJP2を作ってください」ということになります。

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

*2:本当は違いますので、次回、訂正しますが、とりあえず、今日のところは、圧縮率の問題だとしておきましょう。

*3:レイヤーについては、前回をご覧ください。