【问题标题】:Sobel Gradient Angle Resolution索贝尔梯度角分辨率
【发布时间】:2017-04-29 12:50:27
【问题描述】:

当将 Sobel 算子应用于 X 和 Y 方向的图像并从生成的 X/Y 向量计算角度 (atan2) 时,我似乎得到了 45 度步长的梯度方向。 Sobel 是否只能以 45 度的步长产生 8 个方向,或者我应该得到精确的角度还是可能是舍入误差?

我对这里提到的GxGy 使用sobel 卷积https://en.wikipedia.org/wiki/Sobel_operator

【问题讨论】:

  • Sobel 算子只会得到一个角度的梯度方向,而不是几个角度。你能展示一个 MCVE 吗?
  • 抱歉,描述的不够充分。我正在计算 X 和 Y 的 sobel。更新的问题。
  • 您仍然没有显示任何可以重现您的声明的代码。 Sobel,如果在浮动定位图像上计算,不应该给你这样的 45 度离散化。我猜你有整数舍入错误,但很难说没有看到任何代码。
  • @ImanolLuengo 从技术上讲是的,确实如此,它将主要增强这 8 个方向。我正在写一个答案
  • 如果您只使用 GxGy 而不是对角 Sobel 运算符,并且您正在按照 Imanol 的建议使用 atan2(Gx/Gy),那么您可能遇到浮点/整数问题

标签: image-processing sobel


【解决方案1】:

是的,使用分类 Sobel 运算符。让我们试着理解你在这里做什么:

检测垂直线的 Sobel 算子如下所示:

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

如果你把它应用到一个像素上(把它放在像素的顶部,并使用相邻像素中的值,然后把所有的值相加),如果右边的像素有不同的值,它只会有一个非零值作为左侧的像素。如果是这种情况,则表示存在垂直边缘。

以下是 45 度 Sobel 算子:

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

如果您了解垂直的工作原理,这应该很容易理解。当该矩阵的对角线具有不同的值时,将出现最大值,即 45 度边。

在继续之前,让我们注意 @ImanolLuengo 在 cmets 中提到的一件事:45 度 Sobel 算子实际上会看到 30 度斜率,它只会给它一个更小的值。它会增强它。如果你愿意,你可以自己测试一下。

现在,使用 3x3 矩阵,您可以看到要获得 30 度边缘将非常困难,主要是因为我们使用的内核是谨慎且小 (3x3) 的事实不允许我们创建一个可以增强其他角度的鸟巢。

但是,使用与 Sobel 算子相同的逻辑,我们可以想出一个更大的内核,它可以增强任意角度。

例如下面的内核大多会增强 30 度:

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

这是“手动近似的 kenrel,因为正如您在 Sobel 中指出的那样,某些内核元素的数字比其他的大。这个数字的规则是:在您想要检测的边缘方向上的值更高,并且在那些实际上通过内核中心的那些中具有更高的价值。

这不会是一个 Sobel 算子,但您可以组成任何可以完成您想要的工作的内核。

【讨论】:

  • 我认为 op 意味着计算 atan2(Gy, Gx),分别是 GxGy sobel 水平和垂直过滤器。
  • 这是我从 从结果 X/Y 向量计算角度所理解的,至少哈哈。
  • @ImanolLuengo 可能是,他稍后添加了 Gx Gy 信息 >.默认情况下我假设他使用那些
猜你喜欢
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多