JPEG2000実習 PSNR編 (ImageMagickの登場)

本日のお題:レイヤーをPSNRで指定して、ImageMagickで検査しましょう


さて、今日から、中級編です。初級編は単に変換をしてきたのですが、中級編では変換後のファイルを検査して、変換をコントロールしていきましょう。すでに、「OpenJPEGを使って変換できるもんね」という方が対象です。まだ、よく分からない方は、http://d.hatena.ne.jp/denshikA/20100602からスタートしてみてください。


これまで説明してきたとおり、OpenJPEGのレイヤー指定は、こんな感じでしたね。

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

通常、OpenJPEGにおいてレイヤーは圧縮率(ビットレートと言っても同じですね*1。)で指定します。


ところが、もうひとつ方法がありまして、そちらをご紹介します。この方法は、日本の大規模電子化プロジェクトで、少しだけ役に立つでしょう。(正確には、役に立った、という過去形かもしれませんね)


もうひとつの方法は、PSNRで指定することができます。


早速、OpenJPEGを使って、以下の変換をしてみてください。

C:\image_to_j2k.exe -i C:\test.tif -o C:\p30.jp2 -q 30

こんな感じで、93KBくらいの画像ができましたね。


「-q 30」というのは、「PSNRが30のレイヤーを作ってください」という意味ですので、本当かどうか確認してみましょう。



ImageMagickというとても優秀なソフトがあります。
http://ja.wikipedia.org/wiki/ImageMagick


今回はそれを使って、PSNRの測定をしてみましょう。


準備(Winじゃない人は、自分のOSっぽいところを追っかけてください)

http://www.imagemagick.org/script/binary-releases.php#windowsへ行きましょう。


通常なら、ImageMagick-6.6.2-4-Q8-windows-static.exeをDownloadすれば良いでしょう。


最後に、普通のインストールしてください。


途中で何か聞いてくるはずなのですが、最低でも、以下の「Add application derectory to your system path」というところだけチェックしてみてください。

これをチェックしたら、PC壊れちゃう、なんてことはないはずです。でも、何事も自己責任でお願いしますね。


さて、準備ができたところで、コマンドプロンプトを開いて、

compare.exe -metric PSNR C:\test.tif C:\p30.jp2 difference.png

とやってみましょう。しばらく待つと、そっけなく*2

という感じで、「PSNRは29.9364だったよ」と教えてくれます。PSNRを30に指定していたので、まぁ、許容範囲ではないですか?


同様に、PSNRが31、32、33、34、35で変換して、測定してみましょう。

C:\image_to_j2k.exe -i C:\test.tif -o C:\p31.jp2 -q 31
C:\image_to_j2k.exe -i C:\test.tif -o C:\p32.jp2 -q 32
C:\image_to_j2k.exe -i C:\test.tif -o C:\p33.jp2 -q 33
C:\image_to_j2k.exe -i C:\test.tif -o C:\p34.jp2 -q 34
C:\image_to_j2k.exe -i C:\test.tif -o C:\p35.jp2 -q 35

という変換は、もう説明いらないですね。


順番に、PSNR測定をして、確かめて見ましょう。

compare.exe -metric PSNR C:\test.tif C:\p31.jp2 difference.png

ということで、31.0746なので、まぁ、許容範囲ですね。


次に、

compare.exe -metric PSNR C:\test.tif C:\p32.jp2 difference.png

ということで、32.2417なので、ちょっと厳しいですね。


次に、

compare.exe -metric PSNR C:\test.tif C:\p33.jp2 difference.png

ということで、33.1396ですか。アメリカなら許されそうですが、日本だと、ちょっとガミガミ言われそうですね。


次に、

compare.exe -metric PSNR C:\test.tif C:\p34.jp2 difference.png

ということで、34.1050。ふむむむ、どうしましょ。


最後に、

compare.exe -metric PSNR C:\test.tif C:\p35.jp2 difference.png

ということで、35.1693。あちゃー。


というわけで、まとめると、

狙いのPSNR実際のPSNR誤差(%)
3029.93640.2%
3131.07460.2%
3232.24170.8%
3333.13960.4%
3434.10500.3%
3535.16930.5%

こんな感じでありまして、PSNRの許容範囲が1%くらい許されるなら、OpenJPEGでOKでしょう。もし、許容範囲が厳しいなら、少し改造したり、工夫したりする必要がありますね。


そして、もし仮に、「PSNRが30、31、32、33、34、35のレイヤーで構成されたJP2を作成せよ」という指示があった場合、

C:\image_to_j2k.exe -i C:\test.tif -o C:\aaaaaa.jp2 -q 30,31,32,33,34,35

というのでOKですね。


突然ですが、これまでの理解を確認する小テストです。

C:\image_to_j2k.exe -i C:\test.tif -o C:\aaaaaa.jp2 -q 30,31,32,33,34,35
C:\image_to_j2k.exe -i C:\test.tif -o C:\p35.jp2 -q 35

この2つの変換でできるファイルは、サイズがほとんど同じなはずですね。なぜでしょうか?


正解は、こちら。
http://denshika.cc/jp2-psnr.php

*1:http://d.hatena.ne.jp/denshikA/20100610参照

*2:無口だけど、計算はちゃんとしてますので、信頼できます