如何检测图像中的边缘并创建遮罩(matlab)

如何检测图像中的边缘并创建遮罩(matlab),matlab,image-processing,edge-detection,noise-reduction,Matlab,Image Processing,Edge Detection,Noise Reduction,我正在尝试做一项任务,但有两个问题。首先,我必须拍摄一张图像,然后检测表面的边缘 这是原始图像: 结果是: 然而,我得到了这个: 我使用了一个非常简单的代码: filter=[1 2 1;0 0 0;-1 -2 -1]; image=imread('boat.jpg'); image_edge=filter2(filter,image); imshow(image_edge); 正如你所看到的,这很容易,但我没有相同的图像。我的过滤器错了吗 第二个问题是下一个问题:我不知道如何创建mix

我正在尝试做一项任务,但有两个问题。首先,我必须拍摄一张图像,然后检测表面的边缘

这是原始图像:

结果是:

然而,我得到了这个:

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

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两次。 检查页面,查看垂直和水平边缘上的conv2示例

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

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

检查不同类型的边缘过滤器。

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

Sobel_x = [1 0 -1; 2 0 -2; 1 0 -1];
还要注意的是,还有许多其他更好的检测器,比如精明的检测器。我强烈建议你去看看


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

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)
sobel的结果是:

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


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

过滤器是否同时提取垂直和水平边?因为filter2使用cov2函数并提取垂直和水平边,所以您需要在代码中使用cov2两次。@Thomas,对不起。下次我会试着正确地做。谢谢,谢谢你的回答。我将尝试这些方法。你好@cifz,我有一个问题。当我用平方根“G=sqrt(G_x.^2,G_y.^2)”计算梯度时,Matlab说输入太多了。我猜,错误在于两个输入之间的逗号,对吗?它会是一个“+”吗?我做到了,结果令人满意。非常感谢你的回答,非常有帮助。是的,很抱歉,我脑子里有其他语言的组合+我累了,导致了打字错误!我正在编辑这个东西。编辑:现在它被更正了。谢谢你指点out@user3137463记住接受/投票给你最满意的答案(它不一定是我的!),因为它将帮助有类似问题的人轻松找到解决方案!