如何在matlab中找到均方误差

时间:2010-09-11 19:24:54

标签: matlab

有没有办法在2个图像A,B(比如)的真实颜色256 * 256 * 3之间找到matlab中的均方误差?矩阵的数学公式表示M1和M2在

之下
mean sq err=1/n*n { summation (square[M1(i,j)-M2(i,j)])}

其中i代表行,j代表列

4 个答案:

答案 0 :(得分:22)

好吧,开始写作!一次只吃一个编程大象(即使是最小的大象)!

我们如何形成两幅图像的差异?首先,将它们转换为双打,以防它们是uint8图像,这是常见的。做吧!试试吧!学习编写matlab代码,然后分段编写,这样你就可以按照自己的方式进行操作。

首先,您还没有告诉我们这是否是所有三个频道的MSE。你的公式说我们应该为每个红色,绿色和蓝色通道建立不同的MSE。

double(M1) - double(M2)

现在,你将如何形成每个差异的平方?使用。^运算符。

(double(M1) - double(M2)).^2

接下来,均方误差意味着我们取所有行和列的均值。一个简单的方法是使用mean函数。此调用采用行的平均值。

mean((double(M1) - double(M2)).^2,2)

下一个采用平均值列。

mean(mean((double(M1) - double(M2)).^2,2),1)

结果将是1x1x3向量。使用重塑功能将其转换为1x3矢量。 (挤压功能也有帮助。)将它们全部打包成一行,我们得到了这个......

MSE = reshape(mean(mean((double(M1) - double(M2)).^2,2),1),[1,3]);

如果这对你来说看起来很复杂,那么你最好把它分成几行,并附有评论,提醒你以后做了什么。

但关键是,你在matlab中创建一个操作,将其分解为可管理的部分。

编辑:

在许多情况下,人们想要RMSE(均方根误差),其单位与原始数字相同。它只是MSE的平方根。

答案 1 :(得分:4)

每个通道的均方误差:

R1 = M1(:,:,1);
G1 = M1(:,:,2);
B1 = M1(:,:,3);

R2 = M2(:,:,1);
G2 = M2(:,:,2);
B2 = M2(:,:,3);

dR = int32(R1) - int32(R2);
dG = int32(G1) - int32(G2);
dB = int32(B1) - int32(B2);

mseR = mean(dR(:).^2);
mseG = mean(dG(:).^2);
mseB = mean(dB(:).^2);

如果这是图像配准算法的一部分,您可能想要取消平方项:

R1 = M1(:,:,1);
G1 = M1(:,:,2);
B1 = M1(:,:,3);

R2 = M2(:,:,1);
G2 = M2(:,:,2);
B2 = M2(:,:,3);

dR = int32(R1) - int32(R2);
dG = int32(G1) - int32(G2);
dB = int32(B1) - int32(B2);

errR = sum(abs(dR(:))); % 32bits sufficient for sum of 256x256 uint8 img.
errG = sum(abs(dG(:)));
errB = sum(abs(dB(:)));

sumErr = errR + errG + errB;

为了获得更高的性能,您可能还需要考虑转换为单个频道并进行空间下采样,尽管其效果取决于图像内容。

答案 2 :(得分:3)

% MSE & PSNR for a grayscale image (cameraman.tif) & its filtered versions
clear
clc
im=imread('cameraman.tif');
im=im2double(im);
h1=1/9*ones(3,3);
imf1=imfilter(im,h1,'replicate');% 'corr'
h2=1/25*ones(5,5);
imf2=imfilter(im,h2,'replicate');% 'corr'

MSE1=mean(mean((im-imf1).^2));
MSE2=mean(mean((im-imf2).^2));
MaxI=1;% the maximum possible pixel value of the images.
PSNR1=10*log10((MaxI^2)/MSE1);
PSNR2=10*log10((MaxI^2)/MSE2);

答案 3 :(得分:1)

a % your array1
b %your array2

m1=0;

for i=1:N
     m1=m1+(actual_effort(i)-Esti_effort1(i))^2;

end

RMSE1=sqrt((1/N)*m1); 
disp('Root Mean Square Error for Equation1=')
RMSE1