我已经编写了以下matlab代码来生成被柯西噪声破坏的有噪图像,但当我在matlab中使用psnr函数计算有噪图像的psnr值时,它返回负值,而根据我已经实现的论文,大小为256乘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)
正如Luis Mendo很好地指出的,你无法计算从柯西分布中获得的噪声的功率。这是因为分布没有均值或方差。您可以从该分布中获得无限大(或无限小(的值。由于缺乏均值和方差,它作为图像的噪声模型是没有意义的。然而,如果我们在应用噪声后钳制图像的值,那么我们将能够合理地计算统计数据。
这是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/
psnr
函数输出以分贝为单位的信噪比(即对数单位(。这在文件中有说明(但我认为应该更清楚地指出,也许在描述部分(。此外,快速查看psnr
的代码可以确认输出是以分贝为单位的:
peaksnr = 10*log10(peakval.^2/err);
snr = 10*log10(mean(ref(:).^2)/err);
因此,结果可能是负的,这意味着噪声功率大于信号功率。
然而,请注意,噪声功率的概念不能应用于柯西分布。所以我不确定在这种情况下使用psnr
是否有意义。