【问题标题】:How to detect edges in a image, and create a mask (matlab)如何检测图像中的边缘并创建掩码(matlab)
【发布时间】:2013-12-26 19:30:20
【问题描述】:

我正在尝试执行一项任务,但有 2 个问题。第一个,我必须拍一张图像,然后检测表面上的边缘。

这是原图:

这就是结果:

但是,我得到了这个:

我正在使用一个非常简单的代码:

filter=[1 2 1;0 0 0;-1 -2 -1];
image=imread('boat.jpg');
image_edge=filter2(filter,image);
imshow(image_edge);

如您所见,这很容易,但我没有相同的图像。我的过滤器有问题吗?

第二个问题是下一个:我不知道如何创建 miximg 系数矩阵,mask(x,y)。该矩阵必须基于边缘创建(平坦区域的值为 1,边缘逐渐减小到 0)。我应该使用什么命令?

【问题讨论】:

  • 您的过滤器是否同时提取垂直和水平边缘?因为 filter2 使用 cov2 函数并提取垂直和水平边缘,所以您需要在代码中使用 cov2 两次。
  • @Thomas,对不起。下次我会尝试正确地做到这一点。谢谢。

标签: matlab image-processing edge-detection noise-reduction


【解决方案1】:

您的过滤器是否同时提取垂直和水平边缘?因为 filter2 使用 cov2 函数并提取垂直和水平边缘,您需要在代码中使用 cov2 两次。 检查this 页面以获取垂直和水平边缘上的 conv2 示例。

您也可以在 MATLAB 中尝试 edge 命令,尽管它适用于强度图像:

I = imread('boat.jpg');
BW1 = edge(I,'prewitt');  % or any other filters supported
imshow(BW1);

查看page 了解不同种类的边缘过滤器。

【讨论】:

  • 感谢您的回答。我会尝试这些方法。
【解决方案2】:

NKN 确实明白了这一点,我唯一要指出的是,您在 y 方向使用 sobel 内核,如果您想有效地在 x 轴上执行边缘检测,内核是

Sobel_x = [1 0 -1; 2 0 -2; 1 0 -1];

还请注意,还有许多其他更好的检测器,例如 Canny 检测器。我强烈建议你看看它。


关于你的第二个问题,我不确定你在问什么,但看起来你想要一个标准化的梯度幅度矩阵。 要得到它,你必须首先(惊喜!)计算梯度矩阵:

G=sqrt(G_x.^2 + G_y.^2);

在您的情况下,将图像与 Sobel_x 和 Sobel_y 卷积获得 G_x 和 G_y 的位置。该矩阵将包含您正在检测边缘的图像的每个像素的梯度幅度。

然后要得到区间 [0,1] 内的东西,您只需对矩阵进行归一化:

G = G/max(G(:));

在这种情况下,你会得到与你想要的相反的结果(接近 1 意味着像素可能是边缘的一部分),所以你可以简单地做 G = 1-G。


编辑:

还请注意,要获得看起来不错的二进制结果,您需要对梯度幅度矩阵进行阈值处理。

例如,在进行 1-G 之前,我在 G 上尝试了 0.15 的阈值。

G = G>0.15;
G = 1-G
imshow(G)

sobel 的结果是:

我相信你可以做得更好,这只是一个几乎随机的阈值来显示结果。

阈值越高,分类为边缘的特征就越精细。

【讨论】:

  • 你好@cifz,我有一个问题。当我用平方根“G=sqrt(G_x.^2, G_y.^2)”计算梯度时,Matlab 说 输入太多。我想,错误在于两个输入之间的逗号,对吧?会是一个“+”,不是吗?我做到了,结果令人满意。非常感谢您的回答,非常有帮助。
  • 是的,对不起,我脑子里有其他语言的组合+我很累导致错字!我正在编辑这件事。编辑:现在更正了。谢谢指出
  • @user3137463 记得接受/投票最让你满意的答案(它不是我的!),因为它将帮助有类似问题的人轻松找到解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 2011-05-02
  • 2010-12-01
  • 2018-09-15
  • 2017-11-07
相关资源
最近更新 更多