声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2280|回复: 4

[图像处理] 一点关于PSNR容易错的提醒

[复制链接]
发表于 2009-12-17 17:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

评分

2

查看全部评分

回复
分享到:

使用道具 举报

发表于 2009-12-23 19:58 | 显示全部楼层

回复 楼主 xhclsl 的帖子

楼主是原创帖子吗?如果是原创的话,还可以多给些积分奖励的。
 楼主| 发表于 2009-12-26 09:46 | 显示全部楼层
当然是原创了,本人第一次发帖,只是这种小问题太误人了。
发表于 2012-4-7 21:04 | 显示全部楼层
怎么我这个程序一直说Function definitions are not permitted at the prompt or in scripts.
发表于 2012-4-8 01:58 | 显示全部楼层
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-29 08:42 , Processed in 0.065807 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表