2012-05-02 213 views
16

我想讀取圖像 - 圓形圖片,並計算該圖像的梯度矢量場(即矢量均勻地指向圓的法線方向)。我的邏輯是沒有了我一下,但我有:計算圖像的梯度矢量場

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) 

如果我根本就上述情況,我得到一個矢量場,但它僅僅是一個空的網格的梯度(即只是一個矢量場的梯度y = x)。我真正想要的是使用

[dx,dy] = gradient(im); 

檢測圖像中的圓的邊緣,然後計算梯度矢量場,由於圖像中的圓。顯然,賦值u = x和v = y只會給我一個直線的向量場 - 所以基本上,我想將圖像的梯度嵌入向量u和v中。我該怎麼做?

my result

image that i am getting error with

+0

您可以發佈littlecircle.png? –

回答

13

您已在代碼中的錯誤(除此之外,它工作正常)。此時應更換如下:

u = dx; 
v = dy; 

u = x; 
v = y; 

它與像一個魅力this形象!

編輯: 如果你想超強加在圖像上的載體,然後執行以下操作:

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) 

請注意,我沒有轉換的IM翻一番,因爲它不會正確地顯示imshow(需要uint8)。根據您的圖片尺寸,您可能需要放大才能看到漸變矢量。

你可以看到疊加在圖像上的矢量的面積縮小,如下:

Gradient vectors of a circle in an image

更優質的圖像是在http://i.stack.imgur.com/fQbwI.jpg

+0

謝謝你的回覆。不過,我認爲我沒有足夠透徹地解釋問題。在我的代碼中生成的漸變向量以及您的代碼不是由圖像中的圓引起的漸變向量。產生的梯度場應該向外指向並且與圓圈垂直。所以你看到我不只是想要u = x,而是u =圖像域在x方向上的梯度。 – brucezepplin

+0

如果您運行此代碼 清除所有; im = imread('littlecircle.png'); im = im(:,:,1); im = double(im); [nr,nc] = size(im); [dx,dy] =漸變(im); 顫抖(dx,dy); 在你喜歡的任何圖像上,你會看到我所追求的(看看顫抖情節的樣子)。儘管在這裏我只是返回一個標量場的顫動圖。然而,我想返回實際的矢量場,並稍後在我的程序中使用矢量場。 – brucezepplin

+0

我不確定你想要做什麼。在代碼中,我向圈子發佈了向量* do *指向的點(我附加了一個放大的截圖)。當然,由於你有一個計算程序來計算離散空間(圖像)中的灰度,所以矢量由於量化而不能完全正交於圓圈,即不期望看到「完美」的灰度矢量,就像分析計算出的給定數學圈。 – Jorge