画質評価指標の完全ガイド - SSIM, PSNR, VMAF の違いと使い分け
画質評価指標とは - なぜ客観的な品質測定が必要なのか
画像や映像の品質を評価する方法は、大きく主観評価と客観評価に分かれます。主観評価は人間の被験者に画像を見せてスコアを付けてもらう方法 (MOS: Mean Opinion Score) ですが、時間とコストがかかり、再現性にも課題があります。そこで、数学的なアルゴリズムで品質を数値化する客観評価指標が開発されてきました。
客観評価指標は、圧縮パイプラインの自動化において不可欠な役割を果たします。例えば、画像配信サービスで数百万枚の画像を最適な品質で圧縮する場合、1 枚ずつ人間が確認することは現実的ではありません。SSIM や VMAF などの指標を使えば、品質の閾値を設定して自動的に圧縮パラメータを調整できます。
代表的な客観評価指標には以下のものがあります。
- PSNR (Peak Signal-to-Noise Ratio): 最も古典的な指標。計算が高速だが人間の知覚との相関が低い
- SSIM (Structural Similarity Index): 人間の視覚特性を考慮した構造的類似度。Web 画像の品質管理で広く使用
- VMAF (Video Multimethod Assessment Fusion): Netflix が開発した機械学習ベースの指標。映像品質評価のデファクトスタンダード
これらの指標はいずれも「参照画像 (原画)」と「評価画像 (圧縮後)」を比較する Full-Reference 型です。参照画像がない場合に使う No-Reference 型 (BRISQUE、NIQE など) も存在しますが、精度は Full-Reference 型に劣ります。
PSNR の計算原理と限界 - ピクセル単位の誤差測定
PSNR (ピーク信号対雑音比) は、原画と圧縮画像のピクセル値の差 (誤差) を測定する最もシンプルな指標です。計算式は以下のとおりです。
PSNR = 10 * log10(MAX^2 / MSE)
ここで MAX はピクセル値の最大値 (8 bit 画像なら 255)、MSE は平均二乗誤差 (Mean Squared Error) です。MSE は全ピクセルの差の二乗の平均値として計算されます。PSNR の単位はデシベル (dB) で、値が大きいほど品質が高いことを意味します。
一般的な PSNR の目安:
- 40 dB 以上: 原画とほぼ区別がつかない高品質
- 30-40 dB: 実用上十分な品質。Web 画像では 32-38 dB が一般的
- 20-30 dB: 劣化が視認できるレベル
- 20 dB 以下: 明らかに品質が低い
PSNR の最大の問題点は、人間の視覚特性を考慮していないことです。例えば、画像全体に均一なノイズを加えた場合と、エッジ部分にだけ強いノイズを加えた場合で、MSE が同じでも人間の知覚する品質は大きく異なります。テクスチャの多い領域のノイズは目立ちにくく、平坦な領域のノイズは目立ちやすいという特性を PSNR は捉えられません。
それでも PSNR が今なお使われる理由は、計算コストの低さと解釈の容易さにあります。大量の画像を高速にスクリーニングする用途や、同一コーデック内でのパラメータ比較には十分実用的です。Python では skimage.metrics.peak_signal_noise_ratio で簡単に計算できます。
SSIM の仕組み - 人間の視覚特性に基づく構造的類似度
SSIM (Structural Similarity Index) は 2004 年に Wang らによって提案された指標で、人間の視覚系が画像の構造的情報を重視するという知見に基づいています。PSNR がピクセル単位の誤差を測定するのに対し、SSIM は輝度 (luminance)、コントラスト (contrast)、構造 (structure) の 3 つの要素を独立に評価し、それらを統合します。
3 つの比較要素:
- 輝度比較 l(x,y): 2 つの画像パッチの平均輝度を比較。全体的な明るさの違いを評価
- コントラスト比較 c(x,y): 標準偏差を比較。局所的なコントラストの違いを評価
- 構造比較 s(x,y): 正規化した信号間の相関係数。パターンの類似性を評価
最終的な SSIM は SSIM(x,y) = l(x,y)^α * c(x,y)^β * s(x,y)^γ で計算されます (通常 α=β=γ=1)。値の範囲は -1 から 1 で、1 が完全一致を意味します。実用上は 0.95 以上であれば人間が劣化を知覚しにくいとされています。
SSIM は 11x11 のガウシアンウィンドウをスライドさせながら局所的に計算し、全画像の平均を取ります。この局所計算により、画像の異なる領域での品質変動を捉えることができます。派生指標として、マルチスケールで評価する MS-SSIM があり、異なる視距離での品質をより正確に反映します。
実装面では、ImageMagick の compare -metric SSIM、Python の skimage.metrics.structural_similarity、FFmpeg の ssim フィルタなど、多くのツールが SSIM をサポートしています。CI/CD パイプラインに組み込んで、画像変換後の品質を自動チェックする用途に最適です。
VMAF の革新性 - 機械学習で人間の知覚を再現する
VMAF (Video Multimethod Assessment Fusion) は Netflix が 2016 年に公開した画質評価指標で、機械学習を用いて複数の基本指標を統合し、人間の主観評価 (MOS) との相関を最大化するよう訓練されています。映像ストリーミングの品質制御において業界標準となっており、YouTube や Disney+ など多くのサービスが採用しています。
VMAF の構成要素:
- VIF (Visual Information Fidelity): 自然画像統計モデルに基づく情報忠実度。4 つのスケールで計算
- DLM (Detail Loss Metric): ディテールの損失を測定。エッジやテクスチャの劣化を検出
- Motion (動き情報): フレーム間の動きの大きさ。動きが大きいシーンでは劣化が知覚されにくい
これらの特徴量を SVM (Support Vector Machine) で統合し、0-100 のスコアを出力します。93 以上が「優秀」、80-93 が「良好」、60-80 が「許容範囲」とされています。Netflix は自社コンテンツのエンコードで VMAF 93 以上を品質基準としています。
VMAF の強みは、コンテンツの種類 (アニメ、実写、スポーツなど) に応じたモデルを使い分けられる点です。vmaf_v0.6.1 が汎用モデル、vmaf_4k_v0.6.1 が 4K コンテンツ向けモデルとして提供されています。また、電話画面での視聴を想定した vmaf_phone モデルもあります。
静止画への適用も可能で、libvmaf ライブラリを FFmpeg 経由で利用できます。コマンド例: ffmpeg -i original.png -i compressed.png -lavfi libvmaf -f null -。ただし、VMAF は本来映像向けに設計されているため、静止画では SSIM や MS-SSIM の方が適切な場合もあります。
指標の比較と使い分け - 用途別の最適な選択
3 つの指標にはそれぞれ得意・不得意があり、用途に応じた使い分けが重要です。以下に主要な比較軸を整理します。
計算速度: PSNR が最も高速で、1,920 × 1,080の画像ペアを数ミリ秒で処理できます。SSIM は PSNR の 3-5 倍程度の時間がかかりますが、それでも十分高速です。VMAF は最も計算コストが高く、SSIM の 10-50 倍の時間を要します。大量の画像を処理するバッチパイプラインでは、この速度差が無視できません。
人間の知覚との相関: 学術研究のメタ分析によると、主観評価 (MOS) との相関係数は PSNR が 0.7-0.8、SSIM が 0.85-0.92、VMAF が 0.93-0.96 程度です。VMAF が最も人間の知覚に近い評価を返しますが、静止画に限定すると SSIM との差は縮まります。
推奨する使い分け:
- Web 画像の品質管理: SSIM を推奨。計算速度と精度のバランスが良く、CI/CD への組み込みが容易。閾値は 0.95 以上を目安に設定
- 映像エンコードの品質制御: VMAF を推奨。動きやシーンチェンジを考慮した評価が可能。閾値は 93 以上
- 高速スクリーニング: PSNR を推奨。大量画像の一次フィルタリングに使用し、閾値以下のものだけ SSIM で再評価
- 研究・論文: 複数指標を併記するのが慣例。PSNR と SSIM は必須、VMAF も加えると説得力が増す
実務では単一の指標に頼らず、複数の指標を組み合わせて判断することが推奨されます。例えば、SSIM が高くても PSNR が極端に低い場合は、局所的に深刻な劣化が発生している可能性があります。
実装例 - Python と FFmpeg で画質評価を自動化する
画質評価を開発ワークフローに組み込む具体的な実装方法を紹介します。Python と FFmpeg を使った自動化パイプラインは、画像配信サービスや CI/CD での品質ゲートとして活用できます。
Python (scikit-image) での SSIM 計算:
from skimage.metrics import structural_similarity as ssimfrom skimage.metrics import peak_signal_noise_ratio as psnrimport cv2original = cv2.imread('original.png')compressed = cv2.imread('compressed.png')ssim_score = ssim(original, compressed, channel_axis=2)psnr_score = psnr(original, compressed)
FFmpeg での VMAF 計算:
ffmpeg -i original.png -i compressed.png -lavfi "libvmaf=model=version=vmaf_v0.6.1:log_fmt=json:log_path=vmaf.json" -f null -
CI/CD パイプラインでの品質ゲート実装例として、GitHub Actions で画像変換後に SSIM を計測し、閾値を下回った場合にビルドを失敗させる構成が効果的です。具体的には、sharp や imagemin で画像を変換した後、Python スクリプトで SSIM を計算し、0.95 未満の画像があればエラーを返します。
バッチ処理での最適化: 大量の画像を処理する場合、まず PSNR で高速にスクリーニングし (閾値 35 dB 以下を抽出)、該当画像のみ SSIM で詳細評価する 2 段階方式が効率的です。これにより、全画像に SSIM を適用する場合と比較して処理時間を 60-80% 削減できます。
また、dssim (SSIM の差分版) は Rust で実装されており、Python の scikit-image より 5-10 倍高速に動作します。大規模な画像パイプラインでは dssim の利用を検討してください。コマンドライン: dssim original.png compressed.png で 0 (同一) から 1+ (大きな差異) のスコアが出力されます。