Matlab:关于梯度的一阶导数边缘检测

时间:2015-04-19 18:15:02

标签: matlab image-processing edge-detection sobel

我正在编写一个程序,要求用户在 Prewitt Sobel 图像过滤器之间进行选择检测图像对象的边缘。我必须使用他们的过滤器模板,而不是edge函数。用户还会告诉他是否要检测“水平”,“垂直”或“对角线”边缘。我的问题是理论问题,而不是编程问题。

在我的笔记中,我有计算每个像素的渐变幅度,它通常近似为sqrt(Gx^2 + Gy^2),其中Gx是垂直导数,Gy横向导数。但是如果我只计算水平边缘,Gx的值是多少?如果我只是在寻找垂直边缘,那么Gy的值是什么?

我自己无法猜到。

1 个答案:

答案 0 :(得分:3)

这非常简单。您关心的是使用蒙版执行图像过滤,其中每个蒙版都是衍生过滤器。使用这种方法,knedlsepp是正确的,因为这样做只会找到关于给定方向的偏导数。您可以指定一个遮罩来检测水平边,另一个遮罩指示垂直边。

Gx代表垂直边缘响应,使用垂直导数滤镜,Gy代表水平边缘响应,使用水平导数滤波器。要获得响应,您可以拍摄图像并使用任何蒙版的2D卷积对其进行过滤。

接下来,您将将两个响应组合以获得总体幅度响应。但是,edge会在引擎盖下执行大量噪声清理,并执行阈值处理以获得最终响应。简单地计算幅度并不是edge所做的完整故事。

在任何情况下,为了检测水平边缘,Prewitt面罩看起来像这样:

Gy_prewitt = 

-1    -1   -1
 0     0    0
 1     1    1

使用上述掩码执行过滤可找到水平边缘响应,或Gy

要查找垂直边缘响应或Gx,您只需转置上述掩码并找到过滤器响应,所以:

Gx_prewitt =

     -1     0    1
     -1     0    1
     -1     0    1

Sobel面罩与Prewitt面罩略有不同。掩模的中心行(对于垂直)或列(对于水平)的中心行更夸张,并且加权两倍。水平掩码是:

Gy_sobel =

-1   -2   -1
 0    0    0
 1    2    1

同样,Sobel的垂直掩模定义为:

Gx_sobel =

 -1     0    1
 -2     0    2
 -1     0    1

重要的是要注意掩码中所有系数的总和等于零,实际上是实际中看到的任何边缘检测掩码的属性。

现在,要确定整体边缘响应,您可以对每个水平Gy和垂直Gx进行过滤响应,并对每个相应像素应用幅度运算:

out = sqrt(Gx.^2 + Gy.^2);

如果你想更直观地解释为什么Sobel面具与Prewitt略有不同,我建议你看一下这篇文章。如果你不能使用内置的卷积方法,它提供了一个非常好的解释以及如何自己实现过滤操作的好图表:

http://blog.saush.com/2011/04/20/edge-detection-with-the-sobel-operator-in-ruby/

这是图表:

基本上,对于要在图像中过滤的每个像素,提取3 x 3邻域并在邻域中的像素和所需的滤镜之间执行加权和。在这种情况下,这将是Sobel垂直边缘检测器。

祝你好运!