为什么Sobel运算符看起来像那样?
computer-vision
edge-detection
image-processing
5
0

对于图像导数计算,Sobel运算符看起来是这样的:

[-1 0 1]
[-2 0 2]
[-1 0 1]

我不太了解两件事,

1.为什么中心像素为0 ?我不能只使用下面的运算符,

[-1 1]
[-1 1]
[-1 1]

2.为什么中心行是其他行的2倍?

我搜索了我的问题,没有找到任何可以说服我的答案。请帮我。

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

编辑通过阅读Sobel自己写的一篇有趣的文章,可以找到Sobel操作员采用这种方式的真正原因。我对本文的快速阅读表明,Sobel的想法是通过平均水平,垂直和对角中心差来获得对梯度的改进估计。现在,当您将渐变分为垂直和水平分量时,对角线中心差都包含在其中,而垂直和水平中心线差仅包含在其中。两个避免重复计算对角线,因此对角线应具有垂直和水平方向的权重的一半。实际权重1和2刚好适合定点算术(并且实际上包括16的比例因子)。

我大多同意@mbrenon的观点,但有几点很难在评论中提出。

首先,在计算机视觉中,“大多数情况下,我们只是尝试操作员”方法浪费时间,与可能实现的结果相比,效果不佳。 (也就是说,我也喜欢尝试。)

的确,使用[-1 0 1]一个很好的理由是它将导数估计值以像素为中心。但是,另一个很好的理由是,它是中心差异公式,并且您可以通过数学方式证明,与[-1 1]相比,它的真实导数估算值具有更低的误差。

[1 2 1]用于过滤噪声,如mbrenon所说。这些特定数字运作良好的原因是它们是高斯近似值,这是唯一不引入伪像的滤波器(尽管从Sobel的文章来看,这似乎是巧合)。现在,如果要减少噪声并找到水平导数,则需要在垂直方向上进行滤波,以最小化导数估计。将transpose([1 2 1])[-1 0 1]卷积得到Sobel运算符。即:

[1]            [-1 0 1]
[2]*[-1 0 1] = [-2 0 2]
[1]            [-1 0 1]
收藏
评论

在计算机视觉中,通常没有完美,通用的方法来做某事。大多数情况下,我们只是尝试操作员,查看其结果并检查它们是否符合我们的需求。梯度计算也是如此:Sobel运算符是计算图像梯度的多种方法之一,这已证明其在许多用例中的用处。

实际上,我们可以想到的更简单的梯度运算符甚至比您上面建议的更简单:

[-1 1]

尽管它很简单,但是该运算符还有一个问题:使用它时,您要计算两个位置之间而不是一个位置的梯度。如果将其应用于2个像素(x,y)(x+1,y) ,是否已计算位置(x,y)(x+1,y)的渐变?实际上,您所计算的是位置(x+0.5,y)处的渐变,使用半像素并不是很方便。这就是为什么我们在中间添加零:

[-1 0 1]

将其应用于像素(x-1,y)(x,y)(x+1,y)显然会为您提供中心像素(x,y)的渐变。

这个也可以看成是两个[-1 1]滤镜的卷积: [-1 1 0]用于计算像素左侧位置(x-0.5,y)处的渐变,以及[0 -1 1]计算像素右侧的梯度。

现在,此滤波器仍然有另一个缺点:它对噪声非常敏感。这就是为什么我们决定不将其应用于单行像素,而是应用于三行:这允许在这三行上获得平均渐变,这将减轻可能的噪声:

[-1 0 1]
[-1 0 1]
[-1 0 1]

但是,这往往会使事情平均化得太多:当应用于某一特定行时,我们失去了构成该特定行的细节的很多内容。为了解决这个问题,我们希望对中间行给予更多的权重,这将使我们能够通过考虑在前一行和后一行中发生的情况来消除可能的噪音,但仍保留该行的特异性。这就是Sobel过滤器的原因:

[-1 0 1]
[-2 0 2]
[-1 0 1]

篡改系数可能会导致其他梯度运算符,例如Scharr运算符,它对中间行的权重增加了一点

[-3  0 3 ]
[-10 0 10]
[-3  0 3 ]

这也有数学上的原因,例如这些过滤器的可分离性 ……但我更喜欢将其视为实验发现,事实证明该实验具有有趣的数学特性,因为我认为实验是计算机视觉的核心。只要您的想像力满足您的需求,便是创造新事物的极限。

收藏
评论

对于2D图像,您需要一个遮罩。说这个面具是:

[ a11 a12 a13; 
  a21 a22 a23;
  a31 a32 a33 ]

Df_x(沿x的渐变)应通过旋转90o从Df_y(沿y的渐变)生成,即蒙版应为:

[ a11 a12 a11; 
  a21 a22 a21;
  a31 a32 a31 ]

现在,如果我们要减去中间像素前面的信号(这就是离散-减法的区别),我们想为减法的两面分配相同的权重,即我们的遮罩变为:

[  a11 a12 a11; 
   a21 a22 a21;
  -a11 -a12 -a11 ]

接下来,权重的总和应为零,因为当我们拥有一个平滑的图像(例如,所有255个)时,我们希望其响应为零,即:

[  a11 a12 a11; 
   a21 -2a21 a21;
  -a31 -a12 -a31 ]

在图像平滑的情况下,我们希望沿X轴的微分产生零,即:

[  a11 a12 a11; 
   0 0 0;
  -a31 -a12 -a31 ]

最后,如果我们进行归一化,我们得到:

[  1 A 1; 
   0 0 0;
  -1 -A -1 ]

您可以将A设置为实验所需的任何值。原始系数为2的原始Sobel滤波器。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号