本日は画像品質を評価する評価指標の一つである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を紹介したいと思います。