2010-03-13 41 views
8

Je souhaite estimer le bruit dans une image.Estimation du bruit/mesure du bruit dans l'image

Supposons le modèle d'un bruit Image + White. Maintenant, je veux estimer la variance du bruit. Ma méthode consiste à calculer la variance locale (blocs 3 * 3 à 21 * 21) de l'image, puis à rechercher les zones où la variance locale est assez constante (en calculant la variance locale de la matrice de variance locale). Je suppose que ces zones sont "plates", donc la Variance est presque un bruit "pur".

Pourtant, je n'obtiens pas de résultats constants.

Y a-t-il un meilleur moyen?

Merci.

P.S. Je ne peux pas supposer quoi que ce soit à propos de l'image mais du bruit indépendant (ce qui n'est pas vrai pour l'image réelle mais supposons-le).

Répondre

3

Le problème de la caractérisation du signal par le bruit n'est pas facile. D'après votre question, un premier essai consisterait à caractériser les statistiques du second ordre: on sait que les images naturelles ont des corrélations pixel à pixel qui, par définition, ne sont pas présentes dans le bruit blanc.

Dans l'espace de Fourier, la corrélation correspond au spectre d'énergie. On sait que pour les images naturelles, il diminue de 1/f^2. Pour quantifier le bruit, je recommande donc de calculer le coefficient de corrélation du spectre de votre image avec les deux hypotèses (flat et 1/f^2), de sorte que vous extrayez le coefficient.

Certaines fonctions pour vous démarrer:

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 

Je recommande this wonderful paper pour plus de détails.

+0

Pour rendre les choses plus claires, Disons que j'ai une matrice d'images - I. Dans la syntaxe Matlab j'écrire: NoisyImage = I + 5 * randn (taille (I)); Maintenant, je veux estimer la variance du bruit - 25 (En supposant pas de bruit à I). Maintenant, la méthode devrait être fiable avec beaucoup plus petits facteurs (variance) du bruit et plus tard pour estimer à un certain degré le niveau de bruit d'une image pratique (Avec le modèle de bruit indépendant) Merci. P.S. Pourriez-vous me pointer où devrais-je le chercher à l'article? Connaissez-vous d'autres personnes? – Royi

+0

Voulez-vous donner une référence complète du papier? Le lien que vous avez fourni est maintenant mort. THX. – user1735003

+0

@ user1735003 Peut-être que c'est ce papier: http://redwood.berkeley.edu/w/images/6/69/08-atick-nc-1992.pdf (juste l'hypothèse de l'URL de lien mort) –

4

Vous pouvez utiliser la méthode suivante pour estimer la variance du bruit (cette implémentation fonctionne pour les images en niveaux de gris uniquement):

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 

Référence: J. Immerkær, « Fast Noise Estimation de la variance », vision par ordinateur et compréhension de l'image Vol. . 64, n ° 2, pp 300-302, septembre 1996 [PDF]

+0

Merci. Je vais essayer. – Royi