图像中添加和测量的 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)
我正在尝试按照以下步骤在 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)