索贝尔角度分辨率

时间:2016-12-14 08:57:18

标签: image-processing sobel

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

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

1 个答案:

答案 0 :(得分: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在评论中提到的一件事:45度Sobel算子实际上会看到30度的斜率,它只会给它一个较小的值。它会减少它。如果您愿意,可以自己测试。

现在,使用3x3矩阵,您可以看到它很难获得30度的优势,主要是因为我们使用的内核是谨慎的,小的(3x3)不允许我们创造一个增强其他角度的kenrel。

然而,使用与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操作员,但你可以组成任何能完成你想要的工作的内核。