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.
grazie mille !! Splendidamente spiegato !! –
@NavdeepSony nessun problema :) Sono felice di aver aiutato. In bocca al lupo! – rayryeng
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? –