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
みたいな使い方がベストになるかもしれません。楽しみ!