首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图像中的噪声估计/噪声测量

图像中的噪声估计/噪声测量
EN

Stack Overflow用户
提问于 2010-03-14 07:32:02
回答 3查看 22.4K关注 0票数 24

我想要估计图像中的噪声。

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

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

然而,我并没有得到恒定的结果。

有没有更好的方法?

谢谢。

附注:我不能假设任何关于图像的东西,除了独立的噪声(对于真实的图像,这不是真的,让我们假设它)。

EN

回答 3

Stack Overflow用户

发布于 2014-08-22 05:18:19

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

代码语言:javascript
复制
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]

票数 24
EN

Stack Overflow用户

发布于 2010-03-14 21:09:58

从噪声中识别信号的问题并不容易。根据你的问题,第一次尝试是描述二阶统计量:众所周知,自然图像具有-by定义的像素到像素的相关性,而不存在于白噪声中。

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

以下是一些启动函数:

代码语言:javascript
复制
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来了解更多细节。

票数 6
EN

Stack Overflow用户

发布于 2018-06-27 06:13:11

Scikit Image有一个非常好用的估计西格玛函数:

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

它也适用于彩色图像,您只需设置multichannel=Trueaverage_sigmas=True

代码语言:javascript
复制
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)

数字越高,噪声越低。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2440504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档