一、MSE基本定义
MSE全称为“Mean Square Error”,中文意思即为均方误差,是衡量图像质量的指标之一。计算原理为真实值与预测值的差值的平方然后求和再平均,公式如下:

其中, M为图像I的像素总数,N为图像K的像素总数。MSE值越小,说明图像越相似。计算MSE有四种方法:
方法一:计算RGB图像三个通道每个通道的MSE值再求平均值
方法二:直接使用matlab的内置函数immse()(注意该函数将所有图像当成灰度图像处理)
方法三:判断图像的维度,若是三维即为RGB图像求其MSE,若是二维即为灰度图像求其MSE
方法四:同方法三,对MSE进行归一化处理
二、matlab实现MSE
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:rowfor j=1:colMSE_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、方法二:grayMSE.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、方法三: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将每行值的和再次相加
elsesum_mse=sum(sum(sum((image1-image2).^2)));% 三次使用sum()函数,第一次使用sum将每行值相加,第二次使用sum将每行值的和再次相加,第三次使用sum将每个通道值的和再次相加
end
msevalue=sum_mse/(row*col);
end
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));
elsesum_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);
三、实现结果分析
1、输出结果
RGB图像:

对应灰度图像:

各种方法输出的MSE值:

2、结果分析
1、注意每次运行主函数main.m文件,输出的MSE值都会有细微差别,可以对比上下两张图。

2、仅以椒盐噪声的参数为讨论,我们将主函数main.m文件椒盐噪声的方差改为0.001,可以与上方得到方差为0.01的MSE结果进行对比,可以看出得到的MSE要小很多,表示图像质量更好。

3、利用matlab的内置函数immse计算的灰度图像MSE比我们自己写的方法计算的灰度图像MSE要大一些。
4、本质上,方法三是方法一和方法二的结合体。
PS:MSE是我们机器学习中常使用的L2 损失
![已解决OSError: [WinError 6] 句柄无效。](https://img-blog.csdnimg.cn/a74f7d5d03234f7c8a635562034442a0.gif#pic_center)
![解决OSError: [Errno 98] Address already in use问题](https://img-blog.csdnimg.cn/445ad01aebb2478bb010a8093049ce42.png)

![报错OSError: [Errno 22] Invalid argument 的一种解决方法](https://img-blog.csdnimg.cn/412bf4cd5a204d69a52c7900d271e640.png)
![OSError[Errno 48]:Address already in use解决方法](https://img-blog.csdnimg.cn/20191227152238731.png)


![出现Python OSError: [Errno 22] Invalid argument的来龙去脉](https://img-blog.csdnimg.cn/d4cba45bc5cb463cbd7cd75ca32edee4.bmp?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5r-A5Yqo55qE5YWU5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![彻底解决 OSError: [WinError 127] 找不到指定的程序。](https://img-blog.csdnimg.cn/20210916145000755.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAa2sxMjNr,size_20,color_FFFFFF,t_70,g_se,x_16)

![OSError: [Errno 22] Invalid argument错误解决方案](https://img-blog.csdnimg.cn/feba1470f86d40fba4f664e61aab177a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Yqg5rK55bCP6JCM5YWU,size_20,color_FFFFFF,t_70,g_se,x_16)
![OSError: [Errno 22] Invalid argument问题解决](https://img-blog.csdnimg.cn/20200403111734408.png)

![OSError: [WinError 1455] 解决方案](https://img-blog.csdnimg.cn/3a67c6efe22d43df9cf8b90f38064cd5.png)
![Python文件操作错误:OSError: [Errno 22] Invalid argument(关于Windows下文件名中的敏感字符)](https://img-blog.csdnimg.cn/f2da28ea0a0049db886f6fdcaad3fdb3.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWWFZMTM4MTYu,size_20,color_FFFFFF,t_70,g_se,x_16)

