cwebpコマンドの-psnrオプションの罠と-qrangeがやってくる!


cwebpの品質-q ≠ 人間にとっての画質

WebP画像への変換を行うcwebpコマンドには、仕上がり画質の目標値を指定できる-psnrオプションがあります。

いわゆる品質(-qパラメーター)はデータ圧縮処理上の品質であって、-q 75が人間の知覚にとって75点の品質を意味するとは限りません。むしろ画像の内容によってバラつきが出ます。

その問題を解消する手段として``は「-psnr いいじゃん!」と思ったのですが、

cwebpコマンドには目標PSNRから品質を決めてくれる-psnrオプションがある - Qiita

結果として-psnrオプションは実用できませんでした…

PSNRの弱点

PSNRはシンプルな計算式ゆえ、結果が直観的ではないことがあります。

MSE/PSNR vs SSIM の比較画像紹介 - Qiita

弱点が露呈したのは次のように大部分を背景が占める画像でした。

例えば風景写真について-psnrを35、40、45、50と変化させても違和感はありませんが、

指輪の物撮り写真を同様に変換するとすごく「荒い!」と感じる結果になります。

これは変化の少ない背景が「差異の少なさを荒稼ぎ」してしまうため、認知的な特徴である指輪部分にしわ寄せが来て差異を過小評価してしまうからです。

PSNR40と言えばそこそこきれいな画質を期待しますが、品質パラメーター-q 20の方がきれいなくらいなので、-psnr 40に実際に適用された-qパラメーターはかなり低い(10未満?)はずです。

最低品質を指定したい → -qrangeでできるようになりそう

この問題を回避するひとつの方法として、品質-qの最低値を指定できるようになればなぁ…と考えていたら、最新のコードで-qrangeパラメーターが追加されていました!

  printf("  -qrange <min> <max> .... specifies the permissible quality range\n"
         "                           (default: 0 100)\n");

-psnrオプションには処理時間が長いという弱点もありますが、-qrangeパラメーターがリリースされたら

cwebp -psnr 42 -qrange 40 95 -o output.webp input.jpg

みたいな使い方がベストになるかもしれません。楽しみ!