Noise Estimation / Noise Measurement in Image

Royi picture Royi · Mar 14, 2010 · Viewed 19.6k times · Source

I want to estimate the noise in an image.

Let's assume the model of an Image + White Noise. Now I want to estimate the Noise Variance.

My method is to calculate the Local Variance (3*3 up to 21*21 Blocks) of the image and then find areas where the Local Variance is fairly constant (By calculating the Local Variance of the Local Variance Matrix). I assume those areas are "Flat" hence the Variance is almost "Pure" noise.

Yet I don't get constant results.

Is there a better way?

Thanks.

P.S. I can't assume anything about the Image but the independent noise (Which isn't true for real image yet let's assume it).

Answer

user2398029 picture user2398029 · Aug 21, 2014

You can use the following method to estimate the noise variance (this implementation works for grayscale images only):

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

Reference: J. Immerkær, “Fast Noise Variance Estimation”, Computer Vision and Image Understanding, Vol. 64, No. 2, pp. 300-302, Sep. 1996 [PDF]