2016-02-06 23 views
5

Sto trovando il gradiente di un'immagine. Per ora sto semplicemente usando un'immagine 5 x 5. Sono più interessato a trovare la direzione del gradiente, ma non sto ottenendo i risultati manualmente sulla carta perché li ottengo usando la funzione MATLAB imgradient. Si prega di fare riferimento alle seguenti immagini per saperne di più sulle immagini di input e sul filtro Sobel che viene utilizzato qui per trovare il gradiente di un'immagine. Uno dei 3 x 3 dell'operatore di Sobel qui utilizzato è quello che vengo utilizzando la funzioneCome si interpreta l'orientamento del gradiente quando si utilizza l'imager in MATLAB?

f1 = fspecial('sobel'); 

e l'altro è ottenuto semplicemente trasposizione della f1.

Si prega di notare che sto cercando di trovare la direzione di un solo pixel qui che è arrotondato dal colore rosso. Qui nei primi due casi il mio risultato corrisponde a quello che ottengo usando la funzione imgradient ma nel terzo caso lo imgradient dà -135 gradi mentre sto ottenendo che sia -45. Per favore aiutami a trovare l'errore.

Case one and case two

Case three (Mismatch in results)

Inoltre si prega di spiegare come interpretare i seguenti direzioni gradiente come mostrato nell'immagine follwing.

enter image description here

risposta

5

I suoi calcoli sono corretti, ma è altamente raccomandato che si non si utilizzare la definizione atan(y/x) perché questo calcolo non è consapevole del quadrante che l'angolo del gradiente risiede in. Facendo atan(y/x) con i tuoi componenti riporterebbero erroneamente l'angolo di -45 gradi quando ciò non è corretto. Dovresti invece usare atan2.

Ora gli interni di imgradient sono piuttosto semplici. Vorrei sottolineare che l'angolo riportato da imgradient presuppone che la coordinata aumenti dal basso verso l'alto. Inoltre, imgradient dovrebbe riportare l'angolo di orientamento che punta alla massima velocità di cambiamento. Nel caso delle immagini, questo punta nella direzione in cui passiamo dai pixel scuri ai pixel chiari.

Prima una chiamata a imgradientxy è chiamato e una chiamata a fspecial('sobel') è fatto se si fornisce la bandiera sobel-imgradient. In realtà, questa porzione di imgradientxy è ciò che è importante da ricordare (a partire dalla riga 75: MATLAB R2015a):

case 'sobel' 
    h = -fspecial('sobel'); %// Align mask correctly along the x- and y- axes 
    Gx = imfilter(I,h','replicate'); %' 
    if nargout > 1 
     Gy = imfilter(I,h,'replicate'); 
    end 

Si noti che il negativo dell'uscita di fspecial viene eseguita così come il commento fornito al quella linea. Questo per garantire che la maschera per rilevare i bordi orizzontali (ad esempio Gy) sia y-down (come è comunemente noto in computer grafica). In particolare, l'origine dell'immagine è nell'angolo in alto a sinistra e non in basso a sinistra.

Questa è una rappresentazione grafica di come il sistema di coordinate è disposto in y down:

Fonte: Wikipedia - Rotation Matrix

Come tale, quando trovare l'orientamento v'è un requisito aggiuntivo per garantire che l'angolo dell'orientamento del gradiente sia rispetto al sistema di coordinate y-up che è quello a cui siamo abituati. Pertanto, quando si trova l'angolo di orientamento del gradiente, è necessario negare la coordinata prima di calcolare l'angolo in modo che l'angolo sia rispetto alla convenzione standard.

Perseguire la definizione del gradiente che si cerca è il sistema convenzionale della coordinata y che aumenta dal basso verso l'alto. La negazione è obbligatorio e in effetti se si esamina il codice sorgente per imgradient, questo è esattamente ciò che viene fatto alla linea 127 del codice (versione R2015a):

Gdir = atan2(-Gy,Gx)*180/pi; %// Radians to degrees 

Si può chiedere se stessi perché c'è un è necessario annullare la maschera e annullare nuovamente la coordinata dopo aver trovato l'orientamento. Il motivo è perché la maschera modificata è necessaria per catturare correttamente la grandezza del gradiente e quindi annulliamo la maschera una volta e troviamo la magnitudine del gradiente e quindi annulliamo la coordinatacosì da poter trovare l'angolo rispetto alla coordinata convenzionale sistema.

Nel suo caso, dato che Gx = 765 e Gy = -765, sostituendo queste quantità nei rendimenti equazione:

>> Gy = 765; 
>> Gx = -765; 
>> Gdir = atan2(-Gy,Gx)*180/pi 

Gdir = 

    -135 

Ciò ha senso perché la direzione del gradiente corrisponde alla direzione verso la massima velocità di variazione. -135 gradi significa che stiamo puntando verso sud-ovest, il che ha senso mentre procediamo dai pixel scuri ai pixel chiari.

Ora se si consulta la terza immagine di esempio, gli angoli riportati da imgradient sono effettivamente corretti. Basta tracciare una linea dall'area scura all'area chiara e vedere quale angolo esso fa con l'asse x dove è allineato con le colonne che aumentano verso destra. Il primo angolo di +90 gradi ha senso quando ci muoviamo dal basso verso l'alto per seguire l'area scura e la luce. Questa è una situazione simile con la situazione in cui l'immagine è invertita. La terza situazione è quella che abbiamo visto prima e la quarta situazione è semplicemente la terza situazione ruotata di 180 gradi e così naturalmente l'angolo di orientamento da scuro a chiaro è ora di +45 gradi rispetto a -135 gradi in precedenza.

+0

grazie mille !! Splendidamente spiegato !! –

+0

@NavdeepSony nessun problema :) Sono felice di aver aiutato. In bocca al lupo! – rayryeng

+0

Mi sto confondendo su Gdir. Penso che Gdir sia la direzione del cambiamento di massima intensità e il bordo sia sempre ortogonale ad esso. Ho ragione? Quando uso 'gx = [- 1 0 1; -2 0 2; -1 0 1] e gy = [- 1 -2 -1; 0 0 0; 1 2 1] 'tutte le mie risposte sono compatibili con l'imagerio ma non sono in grado di interpretare i risultati. Ad esempio per il caso 1: sto ricevendo 'Gdir = 90' che è una linea che risiede su y (y-down) e penso che stia mostrando un cambiamento di intensità. Per il caso 2: 'Gdir = -90', mostrando il cambiamento di intensità verso l'alto ma nel caso 3:' Gdir = -135' che è l'angolo a cui il bordo è presente. Qual è il problema? –