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)。我应该使用什么命令?

4

2 回答 2

3

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

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

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

查看此页面以了解不同类型的边缘过滤器。

于 2013-12-26T20:55:05.377 回答
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 的结果是:

在此处输入图像描述

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

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

于 2013-12-26T21:13:42.283 回答