2012-10-28 14 views
8

Come si può trovare la media, lo std dev e il gradiente dall'integrale dell'immagine? Data un'immagine come segue:Integrale immagine di calcolo

summed area table and normal table of numbers

Come mostrato nella figura precedente, per trovare la somma delle parti evidenziate, sum = C+A-B-D.
Quindi abbiamo sum = 22.

Come posso procedere prossimo al fine di trovare:

  • Mean
  • Std
  • Gradient
+2

Non capisco la tua domanda. Puoi migliorarlo? – ArtemStorozhuk

+0

Vuoi trovare _mean_, _std dev_ e _gradient_ di alcune parti dell'immagine (ROI)? – ArtemStorozhuk

+0

Voglio trovare media, dev dev e gradiente di tutta l'immagine. – Mzk

risposta

2

C+A-B-D ti dà la somma dei livelli di grigio nella zona delimitata da A, B, C, D, quindi, per ottenere il mezzo basta che lo si divida per l'area della zona:

mean = (C+A-B-D)/4 

Per ottenere lo sviluppo, è necessario calcolare la somma di quadrato tabella di area (utilizzando cv::integral è possibile passare ulteriori parametri per ottenere la somma dei quadrati). Citando wikipedia, la deviazione standard è uguale alla radice quadrata di (la media dei quadrati meno il quadrato della media). Quindi, supponendo A 'B', C 'D' i valori della tua tavolo quadrato zona:

dev = sqrt((C'+A'-B'-D')/4 - (mean*mean)) 

Così Computing media e dev utilizzando l'immagine integrale è molto veloce utilizzando immagini integrali, soprattutto se si desidera calcolare tali quantità in posizioni casuali e su dimensioni casuali di patch di immagini.

Per quanto riguarda il gradiente, è più complesso. Sei sicuro di non voler utilizzare l'operatore sobel?

+0

Hai detto che la media di calcolo e lo sviluppo utilizzando l'immagine integrale sono veloci soprattutto in base alla posizione o alla dimensione casuale. Quindi vuoi dire che è più lento applicare sull'intera immagine? L'operatore di Sobel è veloce? – Mzk

+0

per calcolare il gradiente, sobel è veloce con un'attenta implementazione (convoluzione nel dominio della frequenza). Se devi ottenere valori medi per ogni pixel per un vicinato a dimensione fissa, usare un boxFilter può essere una buona idea, forse più veloce ma non ne sono sicuro. a mio parere sarà questione di millisecondi. Ma tu non ottieni il dev in questo modo. L'immagine integrale è una buona opzione quando è richiesta la velocità – remi

+0

@remi Sei sicuro che la formula sia corretta? almeno per il valore medio? non è vero (C + A-B-D)/4? – maximus

3

Se C + A-B-C è la somma di tutti i livelli di grigio nella zona, allora la media non è

mean = C+A-B-D/4 

ma

mean = C+A-B-D/K 

dove K è il numero di graylevels nella zona.

Inoltre,

dev = sqrt(C'+A'-B'-D'/4 - (mean*mean)) 

non è lo stdev, perché

dev = sqrt((1/N)*sum_N (x_i - u)^2) 

dell'equazione qui è equivalente a

dev = sqrt((1/N)*sum_N ((x_i)^2) - u^2) 

tali equazioni non sono equivalenti.

+0

Bello. Grazie @ jmch. – Mzk

+0

In realtà, come ho dimostrato nella mia risposta, remi era sulla strada giusta per ricavare la formula della deviazione standard, ma si è imbattuto nel fattore medio. – xperroni

2

Ciò che jmch non ha detto è, se sqrt(C'+A'-B'-D'/K - (mean*mean)) non è il modo in cui si calcola la deviazione standard dall'immagine integrale, quindi come lo si fa?

Prima di tutto, passiamo al codice Python/numpy, in modo da ottenere un minimo di coerenza delle annotazioni ed è più semplice controllare le espressioni. Dato un campione serie X, dire:

X = array([random() * 10.0 for i in range(0, 9)]) 

La uncorrected sample standard deviation di X può essere definito come:

std = (sum((X - mean(X)) ** 2)/len(X)) ** 0.5 # 1 

Applicando la binomial theorem-(X - mean(X)) ** 2 otteniamo:

std = (sum(X ** 2 - X * 2 * mean(X) + mean(X) ** 2)/len(X)) ** 0.5 # 2 

Data la identities di l'operazione di somma, possiamo fare:

std = ((sum(X ** 2) - 2 * mean(X) * sum(X) + len(X) * mean(X) ** 2)/len(X)) ** 0.5 # 3 

Se facciamo S = sum(X), S2 = sum(X ** 2), M = mean(X) e N = len(X) otteniamo:

std = ((S2 - 2 * M * S + N * M ** 2)/N) ** 0.5 # 4 

Ora, per un'immagine I e due immagini integrali P e P2 calcolata I (dove P2 è l'immagine integrale per pixel quadrato valori), sappiamo che, date le quattro coordinate del bordo A = (i0, j0), B = (i0, j1), C = (i1, j0) e D = (i1, j1), i valori di S, S2, M e N può essere calcolato per la gamma I[A:D] come:

S = P[A] + P[D] - P[B] - P[C] 

S2 = P2[A] + P2[D] - P2[B] - P2[C] 

N = (i1 - i0) * (j1 - j0) 

M = S/N 

che possono poi essere applicato all'equazione (4) sopra ottiene la deviazione standard della gamma I[A:D].

Edit: Non è del tutto necessario, ma dato che M = S/N possiamo applicare le seguenti sostituzioni e semplificazioni all'equazione (4):

std = ((S2 - 2 * M * S + N * M ** 2)/N) ** 0.5 

std = ((S2 - 2 * (S/N) * S + N * (S/N) ** 2)/N) ** 0.5 

std = ((S2 - 2 * ((S ** 2)/N) + (S ** 2/N))/N) ** 0.5 

std = ((S2 - ((S ** 2)/N))/N) ** 0.5 

std = (S2/N - (S/N) ** 2) ** 0.5 # 5 

che è abbastanza vicino per l'equazione remi ha dato, in realtà.