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ドライブの直下に置いてみてください。

j2k_to_image.exe 直

Cドライブ直下は、こんな感じになってますかね?


念のため、説明しておきますと、例えばTIFFJPEGからJP2(JPEG2000)を作ることをエンコードと呼び、そのツールをエンコーダーと呼ぶます(おそらく)。なので、これまで頻繁に登場している「image_to_j2k.exe」はエンコーダーです。その逆で、JP2ファイルをTIFFJPEGに変換することをデコードと呼び、そのツールをデコーダーと呼ぶます(おそらく)。今回は、そのデコーダーのご紹介です。


つぎに、前回説明したように、「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(エル)の後ろに、取り出したいレイヤー数を指定します。

C:\j2k_to_image.exe -i C:\aaaaaa.jp2 -o C:\1L.tif -l 1


すると、こんな感じで、できあがりました。


確認のため、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
129.9364
231.0746
332.2417
433.1396
534.1050
635.1693

となりますので、前回(http://d.hatena.ne.jp/denshikA/20100611)の数値と同じですね。


というわけで、以下の二つのことがはっきりしました。

  1. OpenJPEGPSNR指定のJP2変換を行うと、ちゃんと、各レイヤーに指定のPSNRができているようです
  2. レイヤーは番号が大きくなるほど、画質が良くなるように並んでいるようです(ここ重要*1


ちなみに、今回は、レイヤーが6個しかなかったのですが、「-l 7」とやってみたらどうなるのでしょうか?隠れキャラみたいなレイヤーが突然出現してくるのでしょうか?簡単な実験なので、皆さんが、実際に試してみてください。何かおもしろいことが起きたら、メールください。

*1:すでに何回か説明していますように、JPEG2000での「レイヤー」というのは、PhotoShopとかの「レイヤー」とは意味が違って、6レイヤーだからと言って、6枚の画像があるわけではありません。なので、-lで指定するレイヤー数というのは、「何番目のレイヤー」という意味ではなく、http://denshika.cc/jp2-psnr.phpの末尾で示した同心円の、中心から数えて何番目の輪まで表示するのか、ということです。デコーダーのレイヤー指定というのは、この同心円のうち表示する「半径」を指定する、と思ってください。