Categories: OpenCV画像処理

画像のMSE(最小二乗誤差)の測定 カラー画像版(Python+OpenCV)

本日は画像品質を評価する評価指標の一つであるMSE(Mean Squared Error: 最小二乗誤差)を紹介し、画像のMSEを計算するプログラムを紹介したいと思います。

前回グレースケール画像でMSEを算出したので、今回はカラー画像を対象に、各チャネルごとのMSEを算したいと思います。

MSE(Mean Squared Error: 最小二乗誤差)

最小二乗誤差は、正解値と評価したい値の差の二乗から計算される評価指標です。もし、評価したい対象と正解が完全に一致する場合、MSEは0となります。

MSEは以下の式で計算されます。

画像処理であればNは画像のピクセル数が対応します。以下に4画素の画像でMSEを計算する場合の計算例を示します。

MSEは単なる画素値の差の二乗をベースとした指標のため、人間の視覚的な感覚と、劣化具合が必ずしも一致しないという問題はありますが、非常に簡単に計算することが可能です。

以下で、MSEを計算するプログラムを見ていきます。

画像のMSE測定プログラム(Python+OpenCV)

ソースコード全体

動作環境:OpenCV 4.5.5

確認のためにNumpyとOpenCVの双方で結果を算出しています。OpenCVにはMSEを算出するための関数が既に用意されているので、OpenCVを使うのが基本的には楽だと思います。

入力データとしては、以下の画像を用いました。

gt_imageがGroundTruthの画像(正解画像)であり、noisy_imageがノイズが付与された画像となります。画像には全チャネルにガウシアンノイズを付与しています。ガウシアンノイズに関してはこちらの記事を参照してください。

実行結果

1) ノイズレベル σ=30

■ 正解画像

■ ノイズ画像

■ MSE測定結果

MSE Numpy (blue): 898.2626652892562
MSE Numpy (green): 829.8355785123968
MSE Numpy (red): 811.0753305785124
MSE OpenCV (blue): 898.2626652892562
MSE OpenCV (green): 829.8355785123968
MSE OpenCV (red): 811.0753305785124

NumpyとOpenCVで測定結果が一致することがわかりました。

2) ノイズレベル σ=100

■ 正解画像

■ ノイズ画像

■ MSE測定結果

MSE Numpy (blue): 6451.726900826447
MSE Numpy (green): 6042.388987603305
MSE Numpy (red): 5820.100599173554
MSE OpenCV (blue): 6451.726900826447
MSE OpenCV (green): 6042.388987603306
MSE OpenCV (red): 5820.100599173554

ノイズを大きくするとMSEの値も大きくなることがわかります。

まとめ

今回はMSEを用いて画像を評価する方法を紹介しました。次回はMSEを使った評価指標であるPSNRを紹介したいと思います。

Haruoka