我正在尝试执行任务,但有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)。我应该使用什么命令?
答案 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)
和索贝尔的结果是:
我确信你可以做得更好,这只是一个几乎随机的阈值来显示结果。
阈值越高,您将要分类为边缘的特征越精细。