验证图像处理中的去噪功能的最佳度量是什么?信噪比似乎让我失望
What is the best measurement for validating a denoising function in Image processing? Signal to Noise ratio seems to fail me
我正在使用 BrainWeb 正常大脑 MR 图像的模拟数据集。我想验证调用 skimage.restoration
包的 denoise_nl_means
的 MyDenoise
函数。为此,我从 BrainWeb 下载了两组图像,一张 原始 图像带有 0% 噪声和 0% 强度不均匀,以及具有相同选项但 9% 噪声和 40%[= 的 噪声 图像35=] 强度不均匀。而且,我根据 scipy.stats
的弃用版本计算 信噪比 (SNR) 如下:
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。我想知道是否有更好的测量方法来验证图像中的去噪功能。
这是我的结果:
Original image SNR: 1.23
Noisy image SNR: 1.41
Denoised image SNR: 1.44
谢谢。
这不是您计算 SNR 的方式。
核心概念是,对于任何一张给定的图像,你不知道什么是噪声什么是信号。如果我们这样做了,去噪就不是问题了。因此,无法从一张图像测量噪声水平(可以估计,但我们无法计算)。
解决方案是使用 noise-free 图像。这是ground truth,去噪操作的objective。因此,我们可以通过将任何一张图像与这个基本事实进行比较来估计噪声,不同之处在于噪声:
noise = image - ground_truth
您现在可以计算均方误差 (MSE):
mse = np.mean(noise**2)
或信噪比:
snr = np.mean(ground_truth) / np.mean(noise)
(请注意,这是信噪比的许多可能的不同定义之一,我们通常使用信号的功率而不是它们的均值,并且通常以 dB 为单位进行测量。)
总的来说,MSE 是一个非常好的谈论去噪错误的方法。您会看到该领域的大多数科学论文另外使用峰值信噪比 (PSNR),这只是 MSE 的缩放和对数映射。因此两者都用是没有意义的。
也可以看平均绝对误差(MAE),它对误差较大的单个像素比较敏感。
我正在使用 BrainWeb 正常大脑 MR 图像的模拟数据集。我想验证调用 skimage.restoration
包的 denoise_nl_means
的 MyDenoise
函数。为此,我从 BrainWeb 下载了两组图像,一张 原始 图像带有 0% 噪声和 0% 强度不均匀,以及具有相同选项但 9% 噪声和 40%[= 的 噪声 图像35=] 强度不均匀。而且,我根据 scipy.stats
的弃用版本计算 信噪比 (SNR) 如下:
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。我想知道是否有更好的测量方法来验证图像中的去噪功能。
这是我的结果:
Original image SNR: 1.23
Noisy image SNR: 1.41
Denoised image SNR: 1.44
谢谢。
这不是您计算 SNR 的方式。
核心概念是,对于任何一张给定的图像,你不知道什么是噪声什么是信号。如果我们这样做了,去噪就不是问题了。因此,无法从一张图像测量噪声水平(可以估计,但我们无法计算)。
解决方案是使用 noise-free 图像。这是ground truth,去噪操作的objective。因此,我们可以通过将任何一张图像与这个基本事实进行比较来估计噪声,不同之处在于噪声:
noise = image - ground_truth
您现在可以计算均方误差 (MSE):
mse = np.mean(noise**2)
或信噪比:
snr = np.mean(ground_truth) / np.mean(noise)
(请注意,这是信噪比的许多可能的不同定义之一,我们通常使用信号的功率而不是它们的均值,并且通常以 dB 为单位进行测量。)
总的来说,MSE 是一个非常好的谈论去噪错误的方法。您会看到该领域的大多数科学论文另外使用峰值信噪比 (PSNR),这只是 MSE 的缩放和对数映射。因此两者都用是没有意义的。
也可以看平均绝对误差(MAE),它对误差较大的单个像素比较敏感。