【问题标题】:Noise Estimation / Noise Measurement in Image图像中的噪声估计/噪声测量
【发布时间】:2011-01-27 06:49:38
【问题描述】:

我想估计图像中的噪声。

让我们假设一个图像 + 白噪声的模型。 现在我想估计噪声方差。

我的方法是计算图像的局部方差(3*3 到 21*21 块),然后找到局部方差相当恒定的区域(通过计算局部方差矩阵的局部方差)。 我假设这些区域是“平坦的”,因此方差几乎是“纯”噪声。

但我没有得到持续的结果。

有没有更好的办法?

谢谢。

附: 除了独立的噪声,我不能假设任何关于图像的事情(这对于真实图像来说是不正确的,但让我们假设它)。

【问题讨论】:

    标签: image-processing estimation noise


    【解决方案1】:

    您可以使用以下方法来估计噪声方差(此实现仅适用于灰度图像):

    def estimate_noise(I):
    
      H, W = I.shape
    
      M = [[1, -2, 1],
           [-2, 4, -2],
           [1, -2, 1]]
    
      sigma = np.sum(np.sum(np.absolute(convolve2d(I, M))))
      sigma = sigma * math.sqrt(0.5 * math.pi) / (6 * (W-2) * (H-2))
    
      return sigma
    

    参考:J. Immerkær,“快速噪声方差估计”,计算机视觉和图像理解,卷。 64,第 2 期,第 300-302 页,1996 年 9 月 [PDF]

    【讨论】:

    • 谢谢。我会试一试的。
    • 这确实有效!如果你得到 sigma > 10.0,那么你有一个嘈杂的图像,否则 - 不是。此外,为了使其也适用于彩色图像,只需将它们转换为灰度,如下所示:import cv2img = cv2.imread(img_path)img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)noise = estimate_noise(img_gray)
    • 别忘了import math、import numpy as np 和from scipy.signal import convolve2d ;)
    • 另外提供的 PDF 链接不起作用 - 请改用:sciencedirect.com/science/article/pii/S1077314296900600
    • "sigma" 这个值是什么意思??我们应该高还是低??如果我们使用数码单反相机,是否可以在没有任何噪音的情况下拍摄图像???? @tsveti_iko
    【解决方案2】:

    从噪声中表征信号的问题并不容易。根据您的问题,第一次尝试是描述二阶统计数据:已知自然图像具有像素到像素的相关性,根据定义,白噪声中不存在这些相关性。

    在傅立叶空间中,相关性对应于能谱。众所周知,对于自然图像,它会减少 1/f^2 。因此,为了量化噪声,我建议使用两个假设(平坦和 1/f^2)计算图像光谱的相关系数,以便提取系数。

    一些启动你的功能:

    import numpy
    def get_grids(N_X, N_Y):
        from numpy import mgrid
        return mgrid[-1:1:1j*N_X, -1:1:1j*N_Y]
    
    def frequency_radius(fx, fy):
        R2 = fx**2 + fy**2
        (N_X, N_Y) = fx.shape
        R2[N_X/2, N_Y/2]= numpy.inf
    
        return numpy.sqrt(R2)
    
    def enveloppe_color(fx, fy, alpha=1.0):
        # 0.0, 0.5, 1.0, 2.0 are resp. white, pink, red, brown noise
        # (see http://en.wikipedia.org/wiki/1/f_noise )
        # enveloppe
        return 1. / frequency_radius(fx, fy)**alpha #
    
    import scipy
    image = scipy.lena()
    N_X, N_Y = image.shape
    fx, fy = get_grids(N_X, N_Y)
    pink_spectrum = enveloppe_color(fx, fy)
    
    from scipy.fftpack import fft2
    power_spectrum = numpy.abs(fft2(image))**2
    

    我推荐this wonderful paper了解更多详情。

    【讨论】:

    • 为了让事情更清楚,假设我有一个图像矩阵 - I。在 Matlab 语法中我会写:NoisyImage = I + 5 * randn(size(I));现在,我想估计噪声的方差 - 25(假设 I 处没有噪声)。现在,该方法应该是可靠的,噪声因子(方差)要小得多,然后在某种程度上估计实际图像的噪声水平(使用独立噪声模型)谢谢。附言你能指出我应该在哪里寻找它吗?你认识其他人吗?
    • 您愿意提供论文的完整参考吗?您提供的链接现在已失效。谢谢。
    • @user1735003 也许是这篇论文:redwood.berkeley.edu/w/images/6/69/08-atick-nc-1992.pdf(只是来自死链接 url 的假设)
    【解决方案3】:

    Scikit Image 有一个很好的估计 sigma 函数:

    http://scikit-image.org/docs/dev/api/skimage.restoration.html#skimage.restoration.estimate_sigma

    它也适用于彩色图像,您只需要设置multichannel=True 和average_sigmas=True:

    import cv2
    from skimage.restoration import estimate_sigma
    
    def estimate_noise(image_path):
        img = cv2.imread(image_path)
        return estimate_sigma(img, multichannel=True, average_sigmas=True)
    

    高数字意味着低噪音。

    【讨论】:

    • 您好,确实有基于小波(HH 的幂的中位数)的 Donoho 方法。我可能会在 MATLAB 中添加它的实现。谢谢。
    猜你喜欢
    • 2012-02-16
    • 2011-10-18
    • 2019-11-29
    • 2014-10-25
    • 2023-04-05
    • 2022-01-27
    • 2012-01-04
    • 1970-01-01
    相关资源
    最近更新 更多