2010-03-13 13 views
8

Voglio valutare il rumore in un'immagine.Valutazione del rumore/misurazione del rumore nell'immagine

Supponiamo che il modello di un'immagine + rumore bianco. Ora voglio valutare la variazione del rumore.

Il mio metodo consiste nel calcolare la varianza locale (da 3 * 3 fino a 21 * 21 blocchi) dell'immagine e quindi trovare le aree in cui la varianza locale è abbastanza costante (Calcolando la varianza locale della matrice di varianza locale). Presumo che quelle aree siano "piatte", quindi la varianza è quasi un rumore "puro".

Eppure non ottengo risultati costanti.

C'è un modo migliore?

Grazie.

P.S. Non posso dare per scontato nulla sull'immagine ma il rumore indipendente (che non è vero per l'immagine reale, supponiamo che sia così).

risposta

3

Il problema di caratterizzare il segnale dal rumore non è facile. Dalla tua domanda, una prima prova sarebbe quella di caratterizzare le statistiche del secondo ordine: le immagini naturali hanno correlazioni da pixel a pixel che, per definizione, non sono presenti nel rumore bianco.

Nello spazio di Fourier la correlazione corrisponde allo spettro di energia. È noto che per le immagini naturali, diminuisce come 1/f^2. Per quantificare il rumore, consiglierei quindi di calcolare il coefficiente di correlazione dello spettro della tua immagine con entrambe le ipotesi (piatta e 1/f^2), in modo da estrarre il coefficiente.

Alcune funzioni per avviare in su:

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 

raccomando this wonderful paper per maggiori dettagli.

+0

Per rendere le cose più chiare, diciamo che ho una matrice immagine - I. Nella sintassi di Matlab vorrei scrivere: NoisyImage = I + 5 * randn (dimensioni (I)); Ora, voglio stimare la variazione del rumore - 25 (Supponendo che non ci sia rumore a I). Ora, il metodo dovrebbe essere affidabile con fattori molto più piccoli (varianza) del rumore e in seguito stimare in una certa misura il livello di rumore di un'immagine pratica (Con il modello di rumore indipendente) Grazie. P.S. Potrebbe indicarmi dove dovrei cercarlo nell'articolo? Conosci altri? – Royi

+0

Ti piacerebbe dare un riferimento completo della carta? Il link che hai fornito è ora morto. Grazie. – user1735003

+0

@ user1735003 Forse è questo documento: http://redwood.berkeley.edu/w/images/6/69/08-atick-nc-1992.pdf (solo l'ipotesi dall'URL linkato) –

4

È possibile utilizzare il seguente metodo per stimare la varianza del rumore (questa implementazione funziona solo per le immagini in scala di grigi):

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 

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

+0

Grazie. Farò un tentativo. – Royi

Problemi correlati