马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
最近在WWW.mathwrok.com上下了一些很多经典的程序,仔细阅读发现好多计算PSNR的方法不同,结果不同,还有好多IEEE上的文章用PSNR计算的也不对,
这里总结一下,希望以后大家发表文章请用正确的方法计算PSNR,否则欺人欺己。
一下是两种一般使用的计算PSNR的方法:
Q = 255;
MSE = sum(sum((img_spiht-Orig_I).^2))/nRow / nColumn;
fprintf('The psnr performance is %.2f dB\n', 10*log10(Q*Q/MSE));
还有一种:
[m,n]=size(im1);
A=double(im1);
B=double(im2);
% sum1=m.*n.*max(max(A.^2));
sum1=m.*n.*255.*255;
sum2=sum(sum((A-B).^2));
if sum2==0
error('两幅图像完全一样');
y=200;
else
y=10*log10(sum1/sum2);
end
细看一样
比较一下
将第一种分开
pa1
ay
Q = 255;
fprintf('----------- PSNR analysis ----------------\n');
(pa1-ay).^2
sum((pa1-ay).^2)
MSE1 = sum(sum((pa1-ay).^2))/nRow / nColumn;
fprintf('The psnr performance is %.4f dB\n', 10*log10(Q*Q/MSE1));
出现结果:
pa1 =
255 255
0 0
ay =
153 103
195 138
----------- PSNR analysis ----------------
ans =
255 255
0 0
ans =
255 255
MSE1 =127.5
The psnr performance is 27.0757 dB
而第二种方法
结果:psnr=4.58
分析:首先第一种方法是错的,因为pa1,ay是uint8型,所以当值大于255,小于0(当然这里不会)默认为255和0上面很明显有两255
这里只需在计算前加两句:
pa1=double(pa1);
ay=double(ay);
将矩阵转换成double型就行了
尤其提醒那些大师,请注意细节,不然会害很多人的!这里点名批评Amir Said and William A. Pearlman, "A New Fast and Efficient Image Codec Based on Set Partitioning in Hierarchical Trees," % IEEE Transactions on Circuits and Systems for Video Technology, vol. 6, pp. 243-250, June 1996.
程序下载http://www.mathworks.com/matlabcentral/fileexchange/4808-spiht
当然现在敢把源程序放网上大家来评价的专家很少了,还是可贵的,但请注意细节,你连这都错了,你的算法还有意义吗?
好了,正确程序,希望大家以后用这个,可能有错,如有发现,请告知我(xhclsl@163.com)
function y=psnr(im1,im2)
%------------------------计算峰值信噪比程序———————————————-----
% ininput ------ im1 : the original image matrix
% im2 : the modified image matrix
% output ------ y : the PSNR between the input images
%------------------------NOTES---------------------------------------------
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if (size(im1))~=(size(im2))
error('错误:两个输入图象的大小不一致');
end
[m,n]=size(im1);
A=double(im1);
B=double(im2);
% sum1=m.*n.*max(max(A.^2));
sum1=m.*n.*255.*255;
sum2=sum(sum((A-B).^2));
if sum2==0
error('两幅图像完全一样');
y=200;
else
y=10*log10(sum1/sum2);
end |