JPEG2000実習 各レイヤーのPSNR確認編 (JP2デコーダーの登場)
本日のお題:本当に指定したPSNRでレイヤーができているのか、検査しましょう
さて、前回から、中級編が開始しています。初級編は単に変換をしてきたのですが、中級編では変換後のファイルを検査して、変換をコントロールしていく予定です。すでに、「OpenJPEGを使って変換できるもんね」という方が対象です。まだ、よく分からない方は、http://d.hatena.ne.jp/denshikA/20100602からスタートしてみてください。
前回の復習ですが、もし仮に、「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でしたね。もし忘れてしまった方は、http://d.hatena.ne.jp/denshikA/20100611で復習してから進んでください。
でも、これで本当に指定したPSNRでレイヤーができるのでしょうか?
他人の話を鵜呑みにしてはいけません。いつでも、自分で確かめてみましょう。
さっそくツールをご紹介しましょう。以下のデコーダーをダウンロードして、いつものごとく、Cドライブの直下に置いてみてください。
Cドライブ直下は、こんな感じになってますかね?
念のため、説明しておきますと、例えばTIFFやJPEGからJP2(JPEG2000)を作ることをエンコードと呼び、そのツールをエンコーダーと呼ぶます(おそらく)。なので、これまで頻繁に登場している「image_to_j2k.exe」はエンコーダーです。その逆で、JP2ファイルをTIFFやJPEGに変換することをデコードと呼び、そのツールをデコーダーと呼ぶます(おそらく)。今回は、そのデコーダーのご紹介です。
つぎに、前回説明したように、「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
こんな感じで、188KBのJP2ができましたね。
では、まず、1つだけレイヤーを取り出して、それをTIFFに変換してみましょう。OpenJPEGのデコーダーでは、-iの後ろにJP2ファイル、-oの後ろに変換後のファイル、-l(エル)の後ろに、取り出したいレイヤー数を指定します。
すると、こんな感じで、できあがりました。
確認のため、PSNRを測定してみましょう。
compare.exe -metric PSNR C:\test.tif C:\1L.tif difference.png
という感じで、PSNRは、29.9364とおしえてくれました。前回の話を思い出してみると、これは、PSNRを30に狙ったレイヤーですね。
同様に、2レイヤー、3レイヤー、4レイヤー、5レイヤー、6レイヤーと繰り返してみましょう。まず、レイヤーの取り出して、
C:\j2k_to_image.exe -i C:\aaaaaa.jp2 -o C:\2L.tif -l 2
C:\j2k_to_image.exe -i C:\aaaaaa.jp2 -o C:\3L.tif -l 3
C:\j2k_to_image.exe -i C:\aaaaaa.jp2 -o C:\4L.tif -l 4
C:\j2k_to_image.exe -i C:\aaaaaa.jp2 -o C:\5L.tif -l 5
C:\j2k_to_image.exe -i C:\aaaaaa.jp2 -o C:\6L.tif -l 6
次に、PSNRを測定します。
compare.exe -metric PSNR C:\test.tif C:\2L.tif difference.png
compare.exe -metric PSNR C:\test.tif C:\3L.tif difference.png
compare.exe -metric PSNR C:\test.tif C:\4L.tif difference.png
compare.exe -metric PSNR C:\test.tif C:\5L.tif difference.png
compare.exe -metric PSNR C:\test.tif C:\6L.tif difference.png
結果をまとめると、
レイヤー 実際のPSNR 1 29.9364 2 31.0746 3 32.2417 4 33.1396 5 34.1050 6 35.1693
となりますので、前回(http://d.hatena.ne.jp/denshikA/20100611)の数値と同じですね。
というわけで、以下の二つのことがはっきりしました。
ちなみに、今回は、レイヤーが6個しかなかったのですが、「-l 7」とやってみたらどうなるのでしょうか?隠れキャラみたいなレイヤーが突然出現してくるのでしょうか?簡単な実験なので、皆さんが、実際に試してみてください。何かおもしろいことが起きたら、メールください。
*1:すでに何回か説明していますように、JPEG2000での「レイヤー」というのは、PhotoShopとかの「レイヤー」とは意味が違って、6レイヤーだからと言って、6枚の画像があるわけではありません。なので、-lで指定するレイヤー数というのは、「何番目のレイヤー」という意味ではなく、http://denshika.cc/jp2-psnr.phpの末尾で示した同心円の、中心から数えて何番目の輪まで表示するのか、ということです。デコーダーのレイヤー指定というのは、この同心円のうち表示する「半径」を指定する、と思ってください。