估计图像的信噪比



我正在尝试对图像进行降噪。我想知道它是否通过查看SNR值来降噪。现在,如何在 Python 中估计图像的 SNR?

SNR 以不同的方式定义,但我想对于您的应用程序,它的确切定义并不重要。通常,它是信号强度和噪声强度的比率。"强度"在这里是故意含糊不清的,通常使用信号和噪声的功率,但幅度也是可行的。

让我们假设SNR是图像信号的功率除以噪声信号的功率。噪声的力量只是它的变化。您正在比较去噪前后的图像,因此信号的功率可能不会改变。我们可以忽略它并将其设置为 1。现在我们的信噪比被简单地定义为1/var(noise).

因此,您需要做的是估计噪声方差,并在去噪之前和之后进行比较。您希望看到这种差异下降(随着SNR的增加(。

一般来说,如果人们不知道没有噪点的图像是什么样子,那么估计图像的噪声方差并不容易。您可以将嘈杂的图像视为

image = noiseless_image + noise.

因此,图像的方差是噪声的方差+无噪声图像的方差。如果你不知道后者,你就无法得到前者。

但是有技巧。如果您愿意为比较的每个图像做一些手动工作,最简单的方法是勾勒出一个平坦的背景区域(通常一小块天空区域就可以了(。非常重要的是,该区域的强度没有自然变化。现在只需计算此区域内像素的方差。

为此,已经发布了几种全自动方法。我知道J. Immerkær的一个:"快速噪声方差估计",计算机视觉和图像理解64(2(:300-302,1996。DIPlib 库(我是作者(有一个实现。你可以从Python使用它,如下所示:

var = dip.EstimateNoiseVariance(img)

(img库中的图像对象、Numpy 数组或任何其他公开缓冲区的对象(。但是,由于尚未正式发布具有 Python 绑定的库版本,因此如果要使用此实现,则必须自己获取和编译库。但考虑到这是一种非常简单的方法,您可以考虑自己实现它。

下面是该方法的伪代码:

mask = gradient magnitude of img
Apply Gaussian smoothing (sigma = 3) to mask
If the image has more than one channel:
mask = max over the channels
Compute the Otsu threshold value for mask
mask = pixels where mask < threshold
error = discrete Laplace of in: apply convolution with [1,-2,1;-2,4,-2;1,-2,1]
MSE = the mean square value of the pixels in error that fall within mask, on a per-channel basis
If the image has more than one channel:
MSE = mean over MSE values for each channel
variance = MSE / 36

最新更新