首页 > 解决方案 > 在图像处理中验证去噪功能的最佳测量方法是什么?信噪比似乎让我失望

问题描述

我正在使用BrainWeb一个模拟数据集来处理正常的大脑 MR 图像。我想验证MyDenoise调用包denoise_nl_means的函数。skimage.restoration为此,我从 BrainWeb 下载了两组图像,一张具有0%噪声和0%强度非均匀性的原始图像,以及具有相同选项但9%噪声和40%强度非均匀性的噪声图像。而且,我根据以下不推荐使用的版本计算信噪比 (SNR)scipy.stats

def signaltonoise(a, axis=0, ddof=0):
    a = np.asanyarray(a)
    m = a.mean(axis)
    sd = a.std(axis=axis, ddof=ddof)
    return np.where(sd == 0, 0, m/sd)

我假设,在去噪之后,我们应该有更高的 SNR,这始终是正确的。但是,与原始图像相比,噪声图像中的 SNR 更高。我想这是因为图像的总平均值比标准差增加得更显着。因此,似乎 SNR 不能很好地衡量我的去噪图像是否更接近原始图像,因为噪声图像已经比原始图像具有更高的 SNR。我想知道是否有更好的测量方法来验证图像中的去噪功能。

这是我的结果: 在此处输入图像描述

Original image SNR: 1.23
Noisy image SNR: 1.41
Denoised image SNR: 1.44

谢谢你。

标签: pythonimage-processingnoise-reduction

解决方案


这不是您计算 SNR 的方式。

核心概念是,对于任何给定的图像,您都不知道什么是噪声,什么是信号。如果我们这样做了,去噪就不会有问题了。因此,不可能从一张图像中测量噪声水平(可以估计它,但我们无法计算它)。

解决方案是使用无噪声图像。这是基本事实,是降噪操作的目标。因此,我们可以通过将任何一张图像与该基本事实进行比较来估计噪声,不同之处在于噪声:

noise = image - ground_truth

您现在可以计算均方误差 (MSE):

mse = np.mean(noise**2)

或信噪比:

snr = np.mean(ground_truth) / np.mean(noise)

(请注意,这是信噪比的许多可能不同定义之一,通常我们使用信号的功率而不是它们的平均值,并且通常以 dB 为单位进行测量。)

一般来说,MSE 是谈论去噪误差的一种非常好的方法。您会看到该领域的大多数科学论文另外使用峰值信噪比 (PSNR),这只是 MSE 的缩放和对数映射。因此,两者都使用是没有意义的。

您还可以查看平均绝对误差 (MAE),它对误差较大的单个像素更敏感。


推荐阅读