如何检测图像中的边缘,并创建一个蒙版(matlab)

时间:2013-12-26 19:30:20

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

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

这是原始图片:

the original image

这就是结果:

the result

然而,我得到了这个:

actual result

我使用的代码非常简单:

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

2 个答案:

答案 0 :(得分:3)

是你的滤镜提取垂直和水平边缘?因为filter2使用cov2函数并提取垂直和水平边缘,所以需要在代码中使用cov2两次。 在垂直和水平边缘检查{strong> conv2 示例的this页面。

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

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

检查此page是否有不同类型的边缘过滤器。

答案 1 :(得分: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);

在获得G_x和G_y的情况下,在您的情况下使用Sobel_x和Sobel_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)

和索贝尔的结果是:

enter image description here

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

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