OpenCVにおける画質評価関数とその性能評価

この記事は[OpenCV Advent Calendar 2024](https://qiita.com/advent-calendar/2024/opencv)の24日目の記事です．

# はじめに
何らかの画像処理を行った後は，その性能を評価するために画質評価がよく行われます．
画像のPSNRだったりSSIMを計測するのが代表的な事例です．

ここでは，OpenCVで使える画質評価関数の紹介とその性能自体を評価します．
* PSNRのスコア，SSIMのスコアではなくて，PSNRやSSIMが持つスコアがどれだけいいスコアなのかの性能です．

この内容は，人間の画質評価指標と客観画質評価指標に関する関連する内容です．
同じアドベントカレンダー内の下記記事は，圧縮率と客観画質評価指標に関する関連する内容です．
* [OpenCVで使える画像圧縮フォーマットの比較](https://qiita.com/fukushima1981/items/512c908c5882032b8198)

合わせて理解すると，圧縮率と人間の見た目の評価である主観評価との関係が理解できるようになります．

# 画質評価
画質評価は，画像が持つ見栄えなどをスコア化します．主に下記2通りの評価があります．
* 客観評価（PSNR，SSIM，MS-SSIMなど）
* 主観評価（人による評価．MOSによる5段階評価など）

客観評価手法は，画像が与えられればその良し悪しを表すスコアが出る方法で，劣化前（きれいな画像）と処理後の画像（概ね劣化画像）との比較からスコアを出すフルリファレンス指標と入力画像1枚からスコアを計算するノーリファレンス指標があります．
* フルリファレンスの代表的な指標はPSNRやSSIMです．
* ノーリファレンスの代表的な方法は，BRISQUEやNIQEがあります．

主観評価手法は，画像を人間が点数付けします．ルールは様々あるのですが，人間が100段階で点数をつけたり，左右の画像を比較して，左が正解100点として，右は何点ですか？などです．

最終的に画質を決めるのは人間の目であるため，指標としては主観評価指標を使いたいのですが，人を集めてアンケートを取り，いちいちスコアを算出するのはあまりにも大変です．そのため，客観評価指標を主観評価指標の代替として使います．

つまり，客観評価指標がどれくらい主観評価指標を代替できているか？は重要な情報です．
このようなの目安を見たときに，よく使われているPSNRはあまり性能が高くなく，SSIMのほうが相関より相関していると言われており，人間の感覚的に良い画像出力をするためにはSSIMスコアを高めたほうが良いとされています．
言い換えれば，PSNRが上がったとしても人間の目から見たときに画質が必ずしも上がっていることが保証できるとはいいがたいです．

そのため，新たな客観評価指標を構築するために，様々な画像処理結果とその主観評価スコアのデータベースが作られており，より人間の感覚に近いスコアを出す新しい客観評価指標が提案されています．

# 主観評価と客観評価の相関係数
客観評価指標が主観評価指標とどれくらい相関しているかを計測するために[相関係数](https://ja.wikipedia.org/wiki/%E7%9B%B8%E9%96%A2%E4%BF%82%E6%95%B0)が用いられます．

主に下記相関係数が用いられており，客観評価指標と主観評価指標が線形関係であれば積率相関係数を用い，非線形関係であれば順位相関が用いられます．

* 積率相関係数：[ピアソン（Peason）](https://ja.wikipedia.org/wiki/%E3%83%94%E3%82%A2%E3%82%BD%E3%83%B3%E3%81%AE%E7%A9%8D%E7%8E%87%E7%9B%B8%E9%96%A2%E4%BF%82%E6%95%B0)
* 順位相関係数：[スピアマン（Spearman）](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%94%E3%82%A2%E3%83%9E%E3%83%B3%E3%81%AE%E9%A0%86%E4%BD%8D%E7%9B%B8%E9%96%A2%E4%BF%82%E6%95%B0)，[ケンドール（Kendall）](https://ja.wikipedia.org/wiki/%E3%82%B1%E3%83%B3%E3%83%89%E3%83%BC%E3%83%AB%E3%81%AE%E9%A0%86%E4%BD%8D%E7%9B%B8%E9%96%A2%E4%BF%82%E6%95%B0)

式の詳細は割愛しますが，以下に概略を記載します．
* ピアソンの相関係数は，データの共分散と標準偏差から求められます．
* 順位相関は，データを順位変換（rank transforom）した後，ピアソンの相関係数と同じような計算します．
    * 順位変換は，データをソートした順位に値を変換することで，順位を用いることで非線形な値の変化を線形な順位の変化に変えて相関係数を出せます．

# OpenCVで使える客観評価指標
OpenCVで使える客観評価指標はあまり多くの候補がありませんが下記４が使えます．
* PSNR（MSE）
* SSIM
* GMSD
* BRISQUE （ノーリファレンス指標）

PSNRはcoreモジュールのみで使え，その他は，追加モジュール群であるcontribを一緒にコンパイルして，qualityモジュールで使えます．
またMSEも使えますが，PSNRがMSEのlogを取った値であるためそもそも等価な指標です．

```cpp
#include <opencv2/core.hpp>
cv::PSNR(src1, src2);
```

```cpp
#include <opencv2/quality.hpp>
cv::Ptr<cv::quality::QualityPSNR> psnr;
Scalar retp = psnr->compute(src, ref, dst);
cv::Ptr<cv::quality::QualitySSIM> ssim;
Scalar rets = ssim->compute(src, ref, dst);
cv::Ptr<cv::quality::QualityGMSD> gmsd;
Scalar retg = gmsd->compute(src, ref, dst);
cv::Ptr<cv::quality::QualityBRISQUE> brisque;
Scalar retb = brisque->compute(src);
```
他にも，この[チュートリアル](
https://docs.opencv.org/4.x/d5/dc4/tutorial_video_input_psnr_ssim.html#autotoc_md242)にSSIMの実装が示されています．

それぞれの手法の元論文は下記になります．

* [SSIM](https://ieeexplore.ieee.org/document/1284395): Z. Wang, A. C. Bovik, H. R. Sheikh and E. P. Simoncelli, "Image quality assessment: From error visibility to structural similarity," IEEE Transactions on Image Processing, vol. 13, no. 4, pp. 600-612, Apr. 2004. 
* [GMSD](https://ieeexplore.ieee.org/document/6678238): W. Xue, L. Zhang, X. Mou and A. C. Bovik, "Gradient Magnitude Similarity Deviation: A Highly Efficient Perceptual Image Quality Index," IEEE Transactions on Image Processing, vol. 23, no. 2, pp. 684-695, Feb. 2014.
* [BRISQUE](https://ieeexplore.ieee.org/document/6272356): Mittal, A., A. K. Moorthy, and A. C. Bovik. "No-Reference Image Quality Assessment in the Spatial Domain," IEEE Transactions on Image Processing, vol. 21, no. 12, pp. 4695–4708, Dec. 2012.

# 各客観評価指標の性能評価実験
ここでは，各手法の人間の決めたスコア（主観評価）と各手法が出す客観評価の相関で性能を評価します．

相関を出すには，様々な画像圧縮方法の主観評価値のデータベースである[CID22](https://cloudinary.com/labs/cid22)を用いました．
* 入力画像49枚
* JPEG，JPEG2000, JPEG-XL,WebP, AVIF, HEIFの様々な圧縮率・オプションで合計4291点の劣化画像
* 解像度 512x512

客観評価手法として，OpenCVによる関数で実装されているものと，実装されていない代表的な評価指標を用いました．
なお，PSNRはRGBチャネルすべてを計測したもの（PSNR rgb）とY信号に変換したもの（PSNR Y）を用意しています．その他，1チャネル用の方法にはY信号で計測するようにしています．

## 相関スコア
以下に結果の相関スコアの表を示します．

メトリクスGMSDはそこそこ高い人の主観との相関値がそれなりに高いことが分かります．
* 積率相関（PROCC）で3位
* 順位相関（SROCC）で2番

ButteraugliやSSIMULACRA2は，符号化劣化用に作られた比較的新しい手法ですが，GMSDは符号化特化ではなく，汎用的な歪み計測用に作られており，ぼけやノイズ等でもそれなりに性能が高いことが検証されています．
（ButteraugliやSSIMULACRA2，VMAFは符号化歪み以外で用いられることはあまりないですが，検証されていないだけで性能は良いかどうかはわかりません）

|method              |PROCC | SROCC|備考|
|---                 |---   | ---  | ---|
|PSNR rgb            | 0.482| 0.478|OpenCV RGB入力|
|PSNR Y              | 0.635| 0.656|OpenCV Y入力|
|SSIM Y              | 0.781| 0.790|OpenCV Y入力|
|GMSD Y              | 0.796| *0.833*|OpenCV Y入力|
|BRISQUE*             | 0.240| 0.267|OpenCV ノーリファレンス|
|NIQE*                | 0.110| 0.210|メジャーなノーリファレンス|
|MS-SSIM             | 0.763| 0.775|SSIMマルチスケール拡張．いいとは限らない|
|PSNR-HSV            | 0.763| 0.800|8x8ブロック周波数をみる符号化特化スコア|
|VIFp Y              | 0.781| 0.798|SSIMの翌年登場．VMAFのベーススコア|
|VMAF                | 0.763| 0.795|ビデオの圧縮スコアのメジャーなもの|
|Butteraugli (p=0.5) | *0.808*| 0.820|Google推奨の符号化スコア|
|SSIMULACRA2         | **0.876**| **0.887**|このデータセットチームのスコア|

*がついているメトリクスはノーリファレンス型です．

## 散布図
スコアを算出したときの散布図を示します．
横軸が主観評価スコアで，縦軸が客観評価スコアです．Y=Zの直線になっていれば，人間の評価と画像のみから計算で出したスコアが完全一致していることになります．

* 圧縮専用のButteraugliやSSIMULACRA2はかなり高く相関しており，Y=Xの形が見えています．
* GMSDもいい線いってます．
* PSNRはバラバラで，SSIMはスコアが低いときはあまりうまく表現できていないのが見て取れます．

散布図は下記順序で並んでいます．

|   |1        | 2     |3          |4          |
|---|---      | ---   | ---       | ---       |  
|1  | PSNR rgb| PSNR Y|SSIM Y     |GMSD Y     |
|2  | BRISQUE*| NIQE* |MS-SSIM    |PSNR-HSV   |
|3  | VIFp Y  | VMAF  |Butteraugli|SSIMULACRA2|

傾きが反転しているものもありますが，正負の符号に意味はないためスコアの値は絶対値を示しています．

![PROCCp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67908/499ccf8d-6aa0-3bdd-d74f-3bc7bb034f9d.png)
**相関係数**

![SROCCp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67908/ad8e7fe1-9c59-c20a-8604-07c81c8045ae.png)
**順位相関係数**


# まとめ
OpenCVで使える画質評価指標を説明しました．
画像圧縮のデータセットでその表性評価をするとGMSDがそれなりに高いことが分かりました．

画像圧縮以外にも，ぼけ，ノイズ，デノイジング，超解像などそれぞれ様々なデータベースがあり，指標はそれぞれに得意・不得意があります．

「とりあえずPSNR」
「とりあえずSSIM」
「とりあえず生ビール」

にちょっとだけGMSDも追加してみてもいいかもしれません．

明日は，@hon_no_mushiの「OpenCV Advent Calendar 2024まとめ」です！