为什么 matlab 中的 psnr 函数 returns 对于被柯西噪声损坏的图像是负值?

Why psnr function in matlab returns a negative value for an image corrupted with Cauchy noise?

我已经编写了以下 matlab 代码来生成被柯西噪声破坏的噪声图像,但是当我在 matlab 中使用 psnr 函数计算噪声图像的 psnr 值时,它 returns 是一个负值,而根据我已经实现了结果的论文,尺寸为256 x 256和Cauchy噪声为0.02的摄影师测试图像的psnr值必须在19左右。如果有人能帮助我解决这个问题,我将不胜感激。

refimg = im2double(imread('cameraman.png')); % original image
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; % the noise level
u0 = refimg + n.*(r1./r2);

figure(1); imshow(u0);

PSNR_noisy = psnr(refimg,u0)

psnr function outputs the signal-to-noise ratio in decibels (that is, logarithtmic units). This is stated in the documentation(不过我觉得应该写的更清楚,也许在描述部分)。此外,快速查看 psnr 的代码可以确认输出以分贝为单位:

peaksnr = 10*log10(peakval.^2/err);

snr = 10*log10(mean(ref(:).^2)/err);

因此结果可能为负,意味着噪声功率大于信号功率。

但是请注意,噪声功率的概念不能应用于柯西分布。所以我不确定在这种情况下使用 psnr 是否有意义。

由于 ,您无法计算从柯西分布中获取的噪声的功率。这是因为分布没有均值或方差。您可以从此分布中获得无限大(或小)的值。由于缺少均值和方差,它作为图像的噪声模型没有意义。然而,如果我们在应用噪声后钳制图像的值,那么我们将能够明智地计算统计数据。

这是 OP 的代码,经过稍微简化和修改以在添加噪声后将图像值限制在 [0,1] 范围内:

refimg = im2double(imread('cameraman.tif')); % original image
sz = size(refimg);
rng(0);
r1 = randn(sz); % (using randn because I don't have the statistics toolbox)
r2 = randn(sz);
n = 0.02; % the noise level
u0 = refimg + n.*(r1./r2);
u0 = min(u0,1); % clamp large values to 1
u0 = max(u0,0); % clamp small values to 0
PSNR_noisy = psnr(u0,refimg)

现在的输出是 19.1419。


请注意,函数 psnr 需要参考图像作为第二个输入,即使在这种情况下开关不会影响输出。


请在这里阅读我对使用 PSNR 的看法:https://www.crisluengo.net/archives/490/