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を使って、以下の変換をしてみてください。
こんな感じで、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 誤差(%) 30 29.9364 0.2% 31 31.0746 0.2% 32 32.2417 0.8% 33 33.1396 0.4% 34 34.1050 0.3% 35 35.1693 0.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:無口だけど、計算はちゃんとしてますので、信頼できます