图像中添加和测量SNR之间的差异

时间:2016-02-14 22:19:21

标签: image matlab image-processing noise

我试图根据以下步骤在matlab中为图像添加5dB的噪声

SNR = 5;
Im = double(Io) / 255;
vm = var(Im(:)) / 10^(SNR/10);
I_my_noisy = imnoise(Im, 'gaussian', 0, vm);

但是当我使用matlab命令测量SNR时

[peaksnr,snr] = psnr(I_my_noisy, Im)

我的SNR等于10。 那么,我的代码有什么问题?为什么结果与我的添加dB不同?

1 个答案:

答案 0 :(得分:0)

如果你这样做:

Error = I_my_noisy - Im;
SNR = 10*log10(var(Im(:))/var(Error(:)));

您将获得您在开始时设置的SNR。问题是,它与您使用psnr计算的SNR不同。不同之处在于函数psnr测量SNR的方式。

如果您看到psnr的源代码,您会看到以下两行:

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

在您的情况下,immse(A,ref)相当于var(Error(:)),因为噪音是高斯的,均值为零。但mean(ref(:).^2)var(Im(:))不同,因为Im没有零均值,因此此操作不等于方差。

这就是为什么你没有得到你期望的价值。

修改

无论如何,SNR的正确形式是在psnr函数中测量的形式,因为SNR测量信号和噪声之间的功率比,并且计算它的方式是mean(ref(:).^2)