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