有没有办法在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代表列
答案 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