2012-05-02 172 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