为什么Matlab的psnr函数计算柯西噪声污染图像时返回负值
问题原因及解决方法
你遇到的PSNR为负的核心原因是生成的噪声图像像素值超出了归一化图像的合法范围[0,1]:柯西分布属于重尾分布,两个正态分布的比值r1./r2会大概率出现绝对值极大的离群值,直接叠加到原图上后会产生大量远小于0或远大于1的无效像素,这些异常值会大幅拉高均方误差MSE,最终导致PSNR计算结果为负,和论文结果不符。
修正步骤
- 给叠加噪声后的图像加像素值截断逻辑,将数值限制在[0,1]的合法范围内,匹配实际成像的像素取值规则,符合图像处理论文的通用预处理逻辑
- 归一化double类图像的峰值默认是1,Matlab内置
psnr函数的动态范围参数无需额外调整
修正后代码
refimg = im2double(imread('cameraman.png')); % 原始图像 img_height = size(refimg,1); img_width = size(refimg,2); refimg = refimg(1:img_height,1:img_width); rng(0); r1 = random('Normal',0, 1,[img_height img_width]); r2 = random('Normal',0, 1,[img_height img_width]); n = 0.02; % 噪声强度 u0 = refimg + n.*(r1./r2); % 新增截断逻辑,限制像素值在合法范围 u0 = max(min(u0, 1), 0); figure(1); imshow(u0); PSNR_noisy = psnr(refimg,u0)
运行修正后的代码,得到的PSNR值就会和论文给出的19左右的结果匹配。
内容的提问来源于stack exchange,提问作者eli
相关产品推荐
相关产品推荐

