索贝尔梯度角分辨率
Sobel Gradient Angle Resolution
当在 X 和 Y 方向上对图像应用 Sobel 算子并根据生成的 X/Y 向量计算角度 (atan2
) 时,我似乎得到了 45 度步长的梯度方向。 Sobel 是否只能以 45 度步长产生 8 个方向,或者我应该得到精确的角度还是可能是舍入误差?
我对这里提到的 Gx
和 Gy
使用 sobel 卷积 https://en.wikipedia.org/wiki/Sobel_operator
是的,使用分类 Sobel 运算符。让我们尝试了解您在这里做什么:
检测垂直线的 Sobel 算子如下所示:
[-1 0 1
-2 0 2
-1 0 1]
如果你将它应用到一个像素(把它放在像素的顶部,并使用相邻像素中的值,然后将所有内容相加),只有当右边的像素有不同的值作为左侧的像素。如果是这种情况,则表示存在垂直边缘。
以下是 45 度 Sobel 算子:
[-2 -1 0
-1 0 1
0 1 2]
如果你了解垂直的工作原理,这应该很容易理解。当此矩阵的对角线具有不同的值时,将出现最大值,因此边缘为 45 度。
在继续之前,请注意@ImanolLuengo 在评论中提到的一件事: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 运算符,但您可以组成任何内核来完成您想要的工作。
当在 X 和 Y 方向上对图像应用 Sobel 算子并根据生成的 X/Y 向量计算角度 (atan2
) 时,我似乎得到了 45 度步长的梯度方向。 Sobel 是否只能以 45 度步长产生 8 个方向,或者我应该得到精确的角度还是可能是舍入误差?
我对这里提到的 Gx
和 Gy
使用 sobel 卷积 https://en.wikipedia.org/wiki/Sobel_operator
是的,使用分类 Sobel 运算符。让我们尝试了解您在这里做什么:
检测垂直线的 Sobel 算子如下所示:
[-1 0 1
-2 0 2
-1 0 1]
如果你将它应用到一个像素(把它放在像素的顶部,并使用相邻像素中的值,然后将所有内容相加),只有当右边的像素有不同的值作为左侧的像素。如果是这种情况,则表示存在垂直边缘。
以下是 45 度 Sobel 算子:
[-2 -1 0
-1 0 1
0 1 2]
如果你了解垂直的工作原理,这应该很容易理解。当此矩阵的对角线具有不同的值时,将出现最大值,因此边缘为 45 度。
在继续之前,请注意@ImanolLuengo 在评论中提到的一件事: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 运算符,但您可以组成任何内核来完成您想要的工作。