画像処理における画質評価指標MSE(平均二乗誤差)

1. MSEの基本定義

MSEの正式名称は「Mean Square Error」、中国語で平均二乗誤差を意味し、画質を測る指標の一つです。計算原理は、実際の値と予測値の差を 2 乗し、合計してから平均することです。式は次のとおりです:
ここに画像の説明を挿入
ここで、M は画像 I の合計ピクセル数、N は合計ピクセル数です。画像Kでは MSE 値が小さいほど、画像はより類似しますMSE を計算するには 4 つの方法があります。

方法 1 : RGB 画像の 3 つのチャネルの各チャネルの MSE 値を計算し、平均値を計算します。

方法 2 : matlab の組み込み関数 immse() を直接使用します (この関数はすべてのイメージをグレースケール イメージとして扱うことに注意してください)

方法 3 : 画像の寸法を決定します。3 次元の場合は RGB 画像で MSE を求め、2 次元の場合はグレースケール画像で MSE を求めます。

方法 4 : 方法 3 と同じ、MSE を正規化する

2 つ目、MATLAB は MSE を実現します

1. 方法 1: rgbMSE.m

function msevalue = rgbMSE(image1,image2)
% image1和image2大小相等
row=size(image1,1); % 图像的长
col=size(image1,2); % 图像的宽
image1=double(image1);
image2=double(image2);
MSE_R=double(zeros(row,col));
MSE_G=double(zeros(row,col));
MSE_B=double(zeros(row,col));
image1_R=image1(:,:,1);  % R通道
image1_G=image1(:,:,2);  % G通道
image1_B=image1(:,:,3);  % B通道
image2_R=image2(:,:,1);
image2_G=image2(:,:,2);
image2_B=image2(:,:,3);
% 计算RGB图像三个通道每个通道的MSE值再求平均值
for i=1:row
    for j=1:col
        MSE_R(i,j)=(image1_R(i,j)-image2_R(i,j))^2;
        MSE_G(i,j)=(image1_G(i,j)-image2_G(i,j))^2;
        MSE_B(i,j)=(image1_B(i,j)-image2_B(i,j))^2;
    end
end
MSE_RGB=sum(MSE_R(:))+sum(MSE_G(:))+sum(MSE_B(:)); % 将RGB三个通道计算的MSE值相加,注意(:)的用法
msevalue=MSE_RGB/(row*col); % 求出三个通道的平均MSE值
end 

2. 方法 2: greyMSE.m

function msevalue = grayMSE(image1,image2)
% image1和image2大小相等
row=size(image1,1); % 图像的长
col=size(image1,2); % 图像的宽
image1=double(image1);
image2=double(image2);
msevalue=sum(sum((image1-image2).^2))/(row*col);
end

3. 方法 3: rgbgrayMSE.m

function msevalue = rgbgrayMSE(image1,image2)
% image1和image2大小相等
row=size(image1,1); % 图像的长
col=size(image1,2); % 图像的宽

% 一定要注意转为double类型
image1=double(image1);
image2=double(image2);

dim=length(size(image1));% 图像的维度
if dim==2    % 灰度图像只有二维,彩色图像有三维
    sum_mse=sum(sum((image1-image2).^2));% 两次使用sum()函数,第一次使用sum将每行值相加,第二次使用sum将每行值的和再次相加
else
    sum_mse=sum(sum(sum((image1-image2).^2)));% 三次使用sum()函数,第一次使用sum将每行值相加,第二次使用sum将每行值的和再次相加,第三次使用sum将每个通道值的和再次相加
end
msevalue=sum_mse/(row*col);
end

4. 方法 4: NMSE.m

function nmsevalue = NMSE(image1,image2)
% 在归一化MSE时,使用不到图像的长和宽,因为约分相消
% image1和image2大小相等
% row=size(image1,1); % 图像的长
% col=size(image1,2); % 图像的宽

% 一定要注意转为double类型
image1=double(image1);
image2=double(image2);

dim=length(size(image1));% 图像的维度

if dim==2    % 灰度图像只有二维,彩色图像有三维
    sum_mse1=sum(sum((image1-image2).^2));% 两次使用sum()函数,第一次使用sum将每行值相加,第二次使用sum将每行值的和再次相加
    sum_mse2=sum(sum(image1.^2));
else
    sum_mse1=sum(sum(sum((image1-image2).^2)));% 三次使用sum()函数,第一次使用sum将每行值相加,第二次使用sum将每行值的和再次相加,第三次使用sum将每个通道值的和再次相加
    sum_mse2=sum(sum(sum(image1.^2)));
end
nmsevalue=sum_mse1/sum_mse2;
end

5. メイン関数 main.m

clc;clear;close all;
rgbimage=imread('boy.jpg');
attack_rgbimage=imnoise(rgbimage,'salt & pepper',0.01);
figure(1),
subplot(121),imshow(rgbimage);
title('原始图像');
subplot(122),imshow(attack_rgbimage);
title('噪声攻击图像');

grayimage=rgb2gray(imread('boy.jpg'));
attack_grayimage=imnoise(grayimage,'salt & pepper',0.01);
figure(2),
subplot(121),imshow(grayimage);
title('原始图像');
subplot(122),imshow(attack_grayimage);
title('噪声攻击图像');
% =============rgbMSE.m============= %
msevalue1 = rgbMSE(rgbimage,attack_rgbimage);
disp('RGB图像的均方误差:');
disp(msevalue1);
% =============immse============= %
msevalue2 = immse(rgbimage,attack_rgbimage);% immse函数为matlab内置函数,err = immse(X,Y)计算数组 XY 之间的均方误差 (MSE).其将所有图像当成灰度图像处理
disp('matlab函数的均方误差:');
disp(msevalue2);
% =============grayMSE.m============= %
msevalue3 = grayMSE(grayimage,attack_grayimage);
disp('灰度图像的均方误差:');
disp(msevalue3);
% =============rgbgrayMSE.m============= %
msevalue4 = rgbMSE(rgbimage,attack_rgbimage);
disp('RGB图像的均方误差:');
disp(msevalue4);

msevalue5 = grayMSE(grayimage,attack_grayimage);
disp('灰度图像的均方误差:');
disp(msevalue5);
% =============NMSE.m============= %
nmsevalue1 = NMSE(rgbimage,attack_rgbimage);
disp('RGB图像的归一化均方误差:');
disp(nmsevalue1);

nmsevalue2 = NMSE(grayimage,attack_grayimage);
disp('灰度图像的归一化均方误差:');
disp(nmsevalue2);

3. 結果分析の実現

1. 結果の出力

RGB画像:
ここに画像の説明を挿入
対応するグレースケール画像:
ここに画像の説明を挿入
さまざまな方法で出力されたMSE値:
ここに画像の説明を挿入
2. 結果分析

1. メイン関数 main.m ファイルを実行するたびに、出力される MSE 値がわずかに異なることに注意してください。上下のグラフを比較できます。
ここに画像の説明を挿入
2. ソルトアンドペッパーノイズのパラメータのみを議論するため、メイン関数 main.m ファイルのソルトアンドペッパーノイズの分散を0.001に変更し、分散 0.01 で上記で取得した MSE 結果と比較できます。得られた MSE が大幅に小さくなっていることがわかり、画質が向上していることがわかります。

ここに画像の説明を挿入
3. matlab の組み込み関数 immse を使用して計算されたグレースケール画像 MSE は、独自の方法で計算されたグレースケール画像 MSE よりも大きくなります。

4. 基本的に、方法 3 は方法 1 と方法 2 を組み合わせたものです。

PS: MSE は、機械学習で一般的に使用される L2 損失です。

おすすめ

転載: blog.csdn.net/qq_44111805/article/details/127705262