2012-05-02 15 views
16

Voglio leggere in un'immagine - un'immagine di un cerchio e calcolare il campo del vettore di sfumatura di quell'immagine (cioè i vettori che indicano uniformemente e normalmente al cerchio). La mia logica mi sta venendo a mancare un po ', ma ho:Campo di vettore del gradiente di calcolo di un'immagine

clear all; 
im = im2double(imread('littlecircle.png')); 
im = double(im); 
[nr,nc]=size(im); 
[dx,dy] = gradient(im); 
[x y] = meshgrid(1:nc,1:nr); 
u = x; 
v = y; 
quiver(x,y,u,v) 

se dovessi semplicemente fare quanto sopra, ho un campo vettoriale, ma è semplicemente il gradiente di una maglia vuoto (cioè solo un campo vettoriale del gradiente y = x). Quello che in realtà voglio è quello di utilizzare

[dx,dy] = gradient(im); 

per rilevare i bordi del cerchio nell'immagine, e quindi calcolare il campo vettoriale gradiente a causa del cerchio nell'immagine. ovviamente, l'assegnazione di u = x e v = y mi darà solo il campo vettoriale di una linea retta - quindi basicamente, voglio incorporare il gradiente dell'immagine nei vettori uev. Come faccio a fare questo?

my result

image that i am getting error with

+0

Puoi pubblicare littlecircle.png? –

risposta

13

Avete fatto un errore nel codice (diverso da quello, funziona benissimo). È necessario sostituire la seguente:

u = dx; 
v = dy; 

non

u = x; 
v = y; 

Funziona con this immagine come un fascino!

EDIT: Se si vuole super-imporre i vettori sull'immagine, quindi effettuare le seguenti operazioni:

clear all; 
im = imread('littlecircle.png'); 
[nr,nc]=size(im); 
[dx,dy] = gradient(double(im)); 
[x y] = meshgrid(1:nc,1:nr); 
u = dx; 
v = dy; 
imshow(im); 
hold on 
quiver(x,y,u,v) 

Si noti che io non convertire l'im al doppio, in quanto non sembra correttamente con imshow (ha bisogno di uint8). A seconda delle dimensioni dell'immagine, potresti voler ingrandire per vedere i vettori grad.

Potete vedere una ingrandito nella zona dei vettori sovrapposti sull'immagine, di seguito:

Gradient vectors of a circle in an image

migliore qualità delle immagini è a http://i.stack.imgur.com/fQbwI.jpg

+0

Grazie per la risposta. Comunque penso di non aver spiegato il problema abbastanza a fondo. i vettori di gradiente prodotti nel mio codice e anche il codice non sono i vettori di gradiente causati dal cerchio nell'immagine. Il campo del gradiente prodotto dovrebbe essere rivolto verso l'esterno e normale al cerchio. così vedi che non voglio semplicemente u = x, ma u = il gradiente del dominio dell'immagine nella direzione x. – brucezepplin

+0

se si esegue questo codice cancella tutto; im = imread ('littlecircle.png'); im = im (:,:, 1); im = double (im); [nr, nc] = dimensione (im); [dx, dy] = gradient (im); faretra (dx, dy); su qualsiasi immagine che ti piace, vedrai cosa sto cercando (guarda come appare la trama della faretra). anche se qui sto semplicemente restituendo un quiverplot di un campo scalare. Vorrei comunque restituire il campo vettoriale reale e utilizzare il campo vettoriale più avanti nel mio programma. – brucezepplin

+0

Non sono sicuro di cosa vuoi fare. Nel codice ho postato i vettori * do * puntano verso l'esterno dal cerchio (ho allegato uno screenshot ingrandito).Naturalmente, dato che hai una routine computazionale che calcola il grad in uno spazio discreto (immagine) i vettori non possono essere assolutamente normali al cerchio a causa della quantizzazione, cioè non aspettarti di vedere i vettori di gradi "perfetti" come se fossero analiticamente calcolati per un dato un cerchio matematico. – Jorge