【问题标题】:Compute gradient vector field of an image计算图像的梯度向量场
【发布时间】:2012-05-12 02:44:50
【问题描述】:

我想读入一张图片——一张圆的图片,并计算该图片的梯度向量场(即均匀指向圆并垂直于圆的向量)。我的逻辑有点让我失望,但我有:

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 中。我该怎么做?

【问题讨论】:

  • 你能发布 littlecircle.png 吗?

标签: image matlab image-processing


【解决方案1】:

您在代码中犯了一个错误(除此之外,它工作正常)。您应该替换以下内容:

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 转换为 double,因为 imshow 无法正确显示(需要 uint8)。根据您的图像尺寸,您可能需要放大以查看渐变矢量。

您可以看到叠加在图像上的矢量放大区域,如下所示:

更高质量的图像位于http://i.stack.imgur.com/fQbwI.jpg

【讨论】:

  • 感谢您的回复。但是我认为我没有充分解释这个问题。在我的代码中生成的梯度向量以及您的代码不是由图像中的圆圈引起的梯度向量。产生的梯度场应该指向外面并且垂直于圆。所以你看我不只是想让 u = x,而是 u = 图像域在 x 方向上的梯度。
  • 如果你运行这段代码清除所有; im = imread('littlecircle.png'); im = im(:,:,1);我 = 双(我); [nr,nc]=尺寸(im); [dx,dy] = 梯度(im);颤动(dx,dy);在您喜欢的任何图像上,您都会看到我所追求的(看看箭袋图的样子)。虽然在这里我只是返回一个标量场的颤抖图。但是,我想返回实际的向量场并稍后在我的程序中使用该向量场。
  • 我不确定你想做什么。在我发布的代码中,向量 do 从圆圈向外指向(我附上了放大的屏幕截图)。当然,由于您有一个计算例程可以在离散空间(图像)中计算 grad,因此由于量化,矢量不能绝对垂直于圆,即不要期望看到“完美”的 grad 矢量,就好像对 a 进行分析计算一样给定数学圈。
  • 另一个关于向量场的说明。 gradient(im) 确实返回一个向量场。例如,在 [dx,dy] = gradient(im) 中,dx 和 dy 是与 im 具有相同维度的矩阵。例如,如果 im 是 200x300,那么 dx,dy 也是如此。这些表示每个点的 grad 向量的 x 和 y 分量。因此,对于图像中的点(123,245),那里的梯度向量为v=[dx(123,245),dy(123,245)];当然,由于您想使用向量 field,您还需要基本空间的坐标,即 x,y 矩阵。
  • 好的,我看到了问题。您发布的图像是 rgb,而代码仅适用于灰度图像。因此,您应该使用以下方法对其进行转换:im=rgb2gray(imread('littlecircle.png')),它工作正常。
猜你喜欢
  • 2015-07-16
  • 1970-01-01
  • 2020-09-12
  • 2016-11-27
  • 2014-04-02
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多