2012-05-02 20 views
16

Chcę odczytać obraz - obrazek koła i obliczyć gradientowe pole wektorowe tego obrazu (tj. Wektory wskazujące równomiernie i normalnie na okrąg). Moja logika zawodzi mnie trochę, ale mam:Oblicz gradientowe pole wektorowe obrazu

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) 

gdybym po prostu nie wyżej, mam pole wektorowe, ale to jest po prostu gradient pustej siatki (czyli tylko pola wektorowego gradientu y = x). Co faktycznie chcę jest użycie

[dx,dy] = gradient(im); 

do wykrywania krawędzi okręgu na obrazie, a następnie obliczyć pole wektorowe gradientu ze względu na kole w obrazie. oczywiście, przypisanie u = x i v = y da mi tylko pole wektorowe linii prostej - tak w zasadzie chcę osadzić gradient obrazu w wektorach u i v. Jak to zrobić?

my result

image that i am getting error with

+0

można zakładać littlecircle.png? –

Odpowiedz

13

Zrobiłeś błąd w kodzie (innego niż, że to działa dobrze). należy wymienić następujące:

u = dx; 
v = dy; 

nie

u = x; 
v = y; 

Współpracuje z this obrazu jak urok!

EDIT: Jeśli chcesz super nałożyć wektory na obrazie, a następnie wykonaj następujące czynności:

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) 

Zauważ, że nie przekonwertować im podwoić, ponieważ nie wydaje się poprawnie imshow (wymaga uint8). W zależności od wymiarów obrazu możesz powiększyć widok, aby zobaczyć wektory gradacji.

można zobaczyć powiększony obszar wektorów nałożony na obraz poniżej:

Gradient vectors of a circle in an image

Lepsza jakość obrazu jest na http://i.stack.imgur.com/fQbwI.jpg

+0

Dziękuję za odpowiedź. Myślę jednak, że nie wyjaśniłem wystarczająco dokładnie problemu. Wektory gradientowe, które są tworzone w moim kodzie, a także twój kod nie są wektorami gradientu spowodowanymi przez okrąg w obrazie. Wytworzone pole gradientu powinno być skierowane na zewnątrz i normalnie do okręgu. więc widzisz, że nie chcę po prostu mieć u = x, ale raczej u = gradient domeny obrazu w kierunku x. – brucezepplin

+0

po uruchomieniu tego kodu: wyczyść wszystkie; im = imread ('littlecircle.png'); im = im (:,:, 1); im = double (im); [nr, nc] = rozmiar (im); [dx, dy] = gradient (im); kołczan (dx, dy); na dowolnym obrazie, który lubisz, zobaczysz, co jestem po (spójrz na to, jak wygląda kołczan). chociaż tutaj po prostu zwracam kołczan z pola skalarnego. Chciałbym jednak zwrócić rzeczywiste pole wektorowe i użyć pola wektorowego później w moim programie. – brucezepplin

+0

Nie jestem pewien, co chcesz zrobić. W kodzie napisałem, że wektory * do * wskazują na zewnątrz od koła (dołączyłem powiększony zrzut ekranu).Oczywiście, ponieważ masz procedurę obliczeniową, która oblicza grad w oddzielnej przestrzeni (obrazie), wektory nie mogą być absolutnie normalne dla koła z powodu kwantyzacji, tj. Nie oczekuj, że zobaczą "doskonałe" gradowe wektory, tak jakby były obliczone analitycznie dla podane koło matematyczne. – Jorge