Subscribed unsubscribe Subscribe Subscribe

豪鬼メモ

一瞬千撃

ImageMagickのビット深度と画質劣化 その2

ImageMagick量子化ビット深度について以前の記事で述べたが、そこで16ビットと32ビットの挙動が同じだったことが疑問だったので、もう少し調べてみた。結論としては、-gammaオペレータが32ビットに対応していないのが原因である。代わりに-levelオペレータのガンマパラメータを使うと、16ビットと32ビットで違いが出るようになる。


今回は、以下のようなコマンドを実行して量子化誤差の影響を見てみる。-levelオペレータで第3引数を指定するとガンマ補正が行える。さらに今回はガンマ256まで調べて限界を探ってみる。

convert 
  -size 48x1024 -colorspace RGB 'gradient:#000000-#ffffff' -rotate 90
  -level "0%,100%,0.5" -level "0%,100%,2.0"
  result.tif

8ビットの結果、ガンマ2からバンディングが視認できる。
f:id:fridaynight:20160215211107j:plain

16ビットの結果。ガンマ4からバンディングが視認できる。
f:id:fridaynight:20160215211144j:plain

32ビットの結果。ガンマ7からバンディングが視認できる。
f:id:fridaynight:20160215211231j:plain

64ビットの結果。ガンマ256でもバンディングは視認できない。
f:id:fridaynight:20160215211749j:plain

HDRI有効化かつ16ビットの結果。ガンマ32までは耐えるがそれ以降でバンディングが発生する。
f:id:fridaynight:20160215212030j:plain

HDRI有効化かつ32ビットの結果。ガンマ256でもバンディングは視認できない。
f:id:fridaynight:20160215211919j:plain

HDRI有効化かつ64ビットの結果。ガンマ256でもバンディングは視認できない。
f:id:fridaynight:20160215212051j:plain

パフォーマンスも改めて計測してみた。3000x2000の16ビットTIFF画像を読み込んでレベル補正を2回かける処理と、その結果の16ビットTIFFJPEGに変換する処理の時間を別個に測った。10回の試行の最短時間である。

設定 レベル補正 JPEG変換
8ビット 1.597秒 0.493秒
16ビット 1.824秒 0.479秒
32ビット 2.108秒 0.524秒
64ビット 2.812秒 0.983秒
HDRI有効化16ビット 2.067秒 0.730秒
HDRI有効化32ビット 2.450秒 0.975秒
HDRI有効化64ビット 2.988秒 1.140秒

前回の記事ではHDRI有効の16ビットが有望であると書いたが、HDRI無効の32ビットもなかなかバランスがいい。パフォーマンスの低下が微々たるものである割には、レタッチ耐性がガンマ4相当からガンマ8相当に大きく向上するのだから。ただし、オペレータによっては32ビットモードがサポートされないっぽいので、注意が必要である。というか、レタッチ耐性の面でもパフォーマンスの面でもHDRI有効化16ビットの方が優れているので、可能であればこっちを使うべきことには変わりない。

ところで、多くのデジカメのRAWファイルのビット深度は12ビットで、一部ハイエンド機は14ビットである。DxoMarkによるとオリンパスE-M10のダイナミックレンジは12.3EVで、ソニーα7のダイナミックレンジは14.2EVということなので、それぞれRAWファイルのビット数は必要十分なものだろう。で、たかだか12ビットなり14ビットなりの精度で量子化されて誤差を含んでいるデータを処理するにあたって、しかも最終出力が8ビット深度のJPEGであるのに、レタッチソフト内での16ビットと32ビットの誤差の違いを論じることにそれほど意味があるのか。多くの場合は意味がない。しかし、ガンマ補正2以上の補正を何回か行うのであれば、32ビットモードを使うのは有用で、これはありえない話ではない。それ以上の補正を行うHDR写真の領域ではやはりHDRIを有効化すべきところだ。その場合でもHDRI有効化16ビットで十分だろう。