为啥matlab中的psnr函数为被柯西噪声破坏的图像返回负值?

Posted

技术标签:

【中文标题】为啥matlab中的psnr函数为被柯西噪声破坏的图像返回负值?【英文标题】:Why psnr function in matlab returns a negative value for an image corrupted with Cauchy noise?为什么matlab中的psnr函数为被柯西噪声破坏的图像返回负值? 【发布时间】:2021-12-20 14:56:24 【问题描述】:

我已经编写了以下 matlab 代码来生成被柯西噪声破坏的噪声图像,但是当我使用 matlab 中的 psnr 函数计算噪声图像的 psnr 值时,它返回一个负值,而根据我已经实现的论文结果,256 x 256 和 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函数一定不能返回负值但我找不到我的代码返回的原因一个负面的。 @路易斯·门多 它可能是负面的,因为它以分贝为单位,正如我的回答中所解释的那样。 psnr 函数以这种方式产生输出。如果您想要线性单位的结果,请使用10^(PSNR_noisy/10) 非常感谢,但使用 10^(PSNR_noisy/10),我得到 psnr 的值 0.0018,这仍然不是真的,因为根据论文,被柯西噪声 0.02 破坏的摄影师图像的 psnr 值必须是大约 19 岁。出于这个原因,我确信代码有问题,但我找不到它。 @路易斯·门多 不确定我是否能提供更多帮助,但“0.02 柯西噪声”究竟是什么意思? 0.02 是如何解释的? 【参考方案1】:

psnr 函数以decibels(即对数单位)输出信噪比。这是声明in the documentation(但我认为应该更清楚地指出,也许在描述部分)。此外,快速查看psnr 的代码可以确认输出以分贝为单位:

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

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

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

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

【讨论】:

【参考方案2】:

作为Luis Mendo nicely stated,您无法计算从柯西分布中提取的噪声的功率。这是因为分布没有均值或方差。您可以从此分布中获得无限大(或小)的值。由于缺乏均值和方差,它作为图像的噪声模型没有意义。但是,如果我们在应用噪声后对图像的值进行钳位,那么我们将能够合理地计算统计数据。

这是 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/

【讨论】:

@Cris Luengo 非常感谢您的有用回答。现在噪声图像的 psnr 值为 19,但是当我计算去噪图像的 psnr 值时,我收到 17,这是不正确的,因为我的论文实现产生的去噪图像与论文及其 psnr 值完全相同必须在 28 岁左右。如果您有时间也能帮我解决这个问题,我将不胜感激。我在一个新问题中写了这个问题:***.com/questions/69880822/…

以上是关于为啥matlab中的psnr函数为被柯西噪声破坏的图像返回负值?的主要内容,如果未能解决你的问题,请参考以下文章

我用matlab中的imnoise函数给图像加椒盐噪声为啥产生的噪声不是黑白的?

毕设题目:Matlab图像去噪

毕设题目:Matlab图像去噪

关于matlab里的PSNR问题

opencv-9-图像噪声以及评估指标 PSNR 与SSIM

matlab实现PSNR