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)计算数组 X 和 Y 之间的均方误差 (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 損失です。