图像中相加信噪比和测量信噪比之间的差异



我正在尝试按照以下步骤向 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)

我得到的信噪比等于 10。那么,我的代码中有什么问题呢?为什么结果与我的添加 dB 不同?

如果你这样做:

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

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

如果你看到 psnr 的源代码,你会看到这 2 行:

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,因为SNR测量信号和噪声之间的功率比,计算方式是mean(ref(:).^2)

最新更新