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

Difference between add and measured SNR in image

我正在尝试按照以下步骤在 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 不同?

如果你这样做:

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)