python - 在图像处理中验证去噪功能的最佳测量方法是什么?信噪比似乎让我失望
问题描述
我正在使用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
谢谢你。
解决方案
这不是您计算 SNR 的方式。
核心概念是,对于任何给定的图像,您都不知道什么是噪声,什么是信号。如果我们这样做了,去噪就不会有问题了。因此,不可能从一张图像中测量噪声水平(可以估计它,但我们无法计算它)。
解决方案是使用无噪声图像。这是基本事实,是降噪操作的目标。因此,我们可以通过将任何一张图像与该基本事实进行比较来估计噪声,不同之处在于噪声:
noise = image - ground_truth
您现在可以计算均方误差 (MSE):
mse = np.mean(noise**2)
或信噪比:
snr = np.mean(ground_truth) / np.mean(noise)
(请注意,这是信噪比的许多可能不同定义之一,通常我们使用信号的功率而不是它们的平均值,并且通常以 dB 为单位进行测量。)
一般来说,MSE 是谈论去噪误差的一种非常好的方法。您会看到该领域的大多数科学论文另外使用峰值信噪比 (PSNR),这只是 MSE 的缩放和对数映射。因此,两者都使用是没有意义的。
您还可以查看平均绝对误差 (MAE),它对误差较大的单个像素更敏感。
推荐阅读
- docker - Docker Gremlin 客户端无法连接到 gremlin 服务器?
- javascript - 这个 API 设计模式有名字吗?
- javascript - 使用 java 脚本将 onclick 添加到按钮
- ios - 使用 Windows 从 Iphone 6 上的应用中心测试 iOS 应用程序
- matplotlib - 在循环中自定义绘图标签
- ruby-on-rails - Ruby 安装问题 - gem 可执行文件将无法运行
- javascript - 将 JavaScript getElementById 转换为 PHP
- python - Pyspark AnalysisException Py4JJavaError on transformation withColumn()
- javascript - 如何在函数中使用时间间隔?
- xml - 如何从第二个 XML 文件中更新数据以创建表