JPEGエンコーダの画質評価を行う
画像フォーマットとして現在最も一般に普及しているのはJPEGと言えるでしょう。他にもPNG, TIFF, GIF辺りは古くから使われていますし、最近ではHEIF(HEIC)やWebMといった新しいフォーマットも登場しています。それでも、対応機器・ソフトウェアの数を考えると、やはりJPEGが最もスタンダードな画像形式と言えるでしょう。
そんなJPEGですが、非可逆圧縮方式で画像データを記録するため、データ量は抑えられますが画質は劣化します。画像ファイルを小さくするために圧縮率を高めると、画質はさらに劣化します。といった特徴は比較的広く知られていますが、その劣化の程度がどの位なのか定量的に評価を行ってみました。
評価方法
元画像に対してどれだけ劣化したかを評価するために、今回は指標としてPSNR(Peak Signal to Noise Ratio)を使います。オーディオなどでは、S/N比, SNR(Signal to Noise Ratio)として知られている指標と同じようなものですが、少し違います。頭にPが付いている通り信号はピーク値を採用します。画像の場合は、信号とはすなわち各ピクセルの情報であり、width*heightで表されるピクセル数の信号が存在するわけです。要するに、モノラルオーディオなら1chだけ、ステレオオーディオなら左右の2chだけですが、画像の場合は普通に数百万画素あるので、そのうち最も強度の強いピクセル(≒最も明るいピクセル)を代表として計算に使うわけです。
以前、当ブログでGoogle製のJPEGエンコーダGuetzliを検証した際は、差分の最大値などで評価していました。
wave.hatenablog.com
が、画像処理系の論文などではPSNRで評価していることが多いようなので、今回はPSNRで評価することにします。
評価用マスタ画像
ffmpegで映像のテストソースを生成できますが、その1フレーム目を今回の画質評価用のマスタ画像として使います。解像度は1920x1080(Full HD)とし、ffmpegが出力する時点で非可逆圧縮されたくないので、マスタ画像はPNGで生成しています。
お手元の環境で追試する場合は、以下のコマンドで今回使用した評価用マスタ画像と同じ画像を生成可能です。
ffmpeg -f lavfi -i testsrc=rate=30:size=1920x1080 -frames 1 MASTER_FRAME.png
検証
- Photoshopで評価用マスタ画像(PNG)を読み込み、JPEG形式で保存する際の画質(quality)パラメータ(0-12)毎に出力されたJPEG画像のPSNRを測定
- ImageMagickで評価用マスタ画像(PNG)を読み込み、-qualityオプション指定値(0-100)毎に出力されたJPEG画像のPSNRを測定
PSNR測定結果
縦軸左にPSNR、縦軸右にJPEGファイルサイズ、横軸に画質パラメータとしてグラフにプロットすると以下の通り。
Photoshop
- [ベースライン(標準)]の場合
- [ベースライン(最適化)]の場合
画質パラメータが同じなら、[ベースライン(標準)]と[ベースライン(最適化)]でPSNRは完全一致*2しています。つまり、[ベースライン(最適化)]は[ベースライン(標準)]と完全に同じ画質を維持しながら、ファイルサイズが削減できるようです。保存に要する時間も体感ではほぼ差が無いので、[ベースライン(最適化)]を常用すればいいでしょう。
画質パラメータ6と7の間でPSNRが33.3865から43.797へと10dB以上も大きく変化しています。画質パラメータ6以下はPSNRが酷く、目視しても明らかに汚い(目に見える盛大なブロックノイズ、エッジ周辺が汚い、諧調が階段状)ため、実用に向かない品質*3と判断して良いでしょう。Web掲載用などデータボリュームに対する配慮が必要な用途では、画質パラメータ7~12の間で、所望するファイルサイズと画質のバランスを取ることになるでしょう。画質最優先なら画質パラメータ12(PSNR=55.7154)で固定でしょう。
ImageMagick
qualityオプション89と90の間でPSNRが33.5123から51.884へと18db以上も大きく変化しています。qualityオプション1~89はPSNRが酷く、目視しても明らかに汚いため、Photoshopの画質パラメータ6以下同様に多くの場面で実用に耐えない品質と判断して良いでしょう。Web掲載用などデータボリュームに対する配慮が必要な用途では、画質パラメータ0*4または90~100の間で、所望するファイルサイズと画質のバランスを取ることになるでしょう。画質最優先なら画質パラメータ100(PSNR=55.9062)ですが、99でもPSNRは55.8383でPhotoshopの最高品質(画質パラメータ12)よりも高いPSNRを維持しています。98ではPSNRは55.6558となりPhotoshopの最高品質よりは極僅かに劣ります(普通に目視しても違いは判りませんが)。
Photoshop/ImageMagickの画質パラメータとPSNRの比較
Photoshopは0~12の13段階、ImageMagickは1~100の100段階の画質パラメータが存在します。そこで、Photoshopの画質パラメータMで得られる画質(PSNR)に近いImageMagickのquality値Nの関係をプロットしてみるすると以下の通り。
Photoshopの品質パラメータ7(PSNR=43.797)~9(PSNR=50.3957)に近いPSNRとなるImageMagickのquality値はありません。このため、このレンジのPSNRの画質のJPEGを作りたいならPhotoshopでしか作れないことになります。それ以上に高画質なPSNRの場合は、ImageMagickの方がより小さなファイルサイズを実現できていますし、前述の通りImageMagickのquality 99や100はPhotoshopの最高画質パラメータ12を凌駕するPSNRを実現できていますので、PhotoshopでJPEGをエンコードする意義は無さそうです。
まとめ
- 最高画質のJPEG出力をしたければ、PhotoshopではなくImageMagickでquality100
- 高画質のJPEG出力をしたければ、PhotoshopでもImageMagickでもどちらでも
- ただし、同程度の画質(PSNR)であればImageMagickの方がファイルサイズはたぶん小さい
- 中画質のJPEG出力をしたければ、Photoshopの品質パラメータ7~9でしか出力できないPSNRのレンジがある
- PhotoshopでJPEG出力する場合、[ベースライン(標準)]を積極的に選択する理由は無く、[ベースライン(最適化)]を選択すれば完全に同一の画質でファイルサイズを小さくできる
- ただし、極端に高解像度な画像や極端に貧弱な(古い)マシンの場合は保存時間がかかるかもしれない
※1パターンの画像でしか評価を行っていないため、異なる画像では結果が異なる可能性があります。
雑記
以下は主観ですが、静止画のPSNRの値そのものについては概ね以下のように感じられました。
個人的にはImageMagickでquality指定をしないでJPEG出力することが多く、JPEG画像を加工する場合には劣化をできるだけ防ぐためにquality 100を指定していることもあります。このようにして出力されたJPEGはよほど細部を凝視しない限り、劣化は気づきません。ここで改めてImageMagickのデフォルトのqualityはどうなっているのか確認してみると、入力画像の画質を推定できればその値が使われ、そうでなければ92とあります。
The default is to use the estimated quality of your input image if it can be determined, otherwise 92.
Command-line Options @ ImageMagick
私が自前で生成した画像であれば、非圧縮またはLightroomやPhotoshopの最高画質のJPEGを扱っていることが殆どなので、結果的にはImageMagickのquality 92以上の品質でJPEG出力されていると考えられます。今回の評価用マスタ画像でいうと、PSNRが概ね53以上ということになります。
で、それが解って何なのだという話ですが、映像の場合はどうなのかという点を調査したいのです。パラメータを変えてエンコードした映像の品質について、「PSNRがXだから、JPEGのqualityをYにしたときと同じような劣化だね」という評価につなげるべく、事前調査としてJPEGの各Quality毎のPSNRを調べてみたのです。というわけで、H.264やH.265などの各種エンコーダの場合についても同様の評価を実施する予定です。
以上。