微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

什么是 Sobel 算子?

如何解决什么是 Sobel 算子?

我在 Python 中尝试了 5 种不同的 Sobel 运算符实现,其中一种是我自己实现的,结果完全不同。

我的问题与 this one 类似,但我仍然不明白与其他实现的区别。

Sobel 算子的定义是否有任何一致意见,它是否总是与“图像梯度”同义?

即使是 Sobel 内核的定义也因源而异,根据维基百科是 .gcno,但根据其他来源是 [[1,-1],[2,-2],[1,-1]]

这是我尝试不同技术的代码

[[-1,1],[-2,2],[-1,1]]

enter image description here

解决方法

Sobel 算子估计导数。

用于估计水平导数的 Sobel 算子的正确定义是:

  | 1  0 -1 |
  | 2  0 -2 | / 8
  | 1  0 -1 |

除以 8 对获得正确的幅度很重要。人们经常忽略它,因为他们不关心实际的导数,他们关心比较同一图像不同位置的梯度。将所有内容乘以 8 没有任何区别,因此省略 /8 会使事情变得简单。

您将在某些地方看到用反号定义的内核。这些是通过相关而不是卷积应用内核的情况(其不同之处在于内核的镜像),例如 OpenCV 的情况。这也可能是人们在不理解内容的情况下复制内容的情况,从而导致带有错误符号的渐变。

但话又说回来,Sobel 算子主要用于获得梯度幅度(水平和垂直导数的平方和的平方根)。在这种情况下,反转符号不再重要。


请注意,np.gradient(img) 相当于使用 [1,-1]/2 进行卷积。这是估计导数的另一种方法。 Sobel 在垂直方向添加了正则化(==平滑)。


如果您使用更有意义的测试图像,您将更好地理解每个实现。例如,尝试使用中间带有白色方块的黑色图像。您将能够比较估计梯度的强度、它们的方向(我假设某些库使用不同的 x 轴和 y 轴定义),并且您将能够看到正则化的效果。

,

根据维基百科,它是 [[1,-1],[2,-2],[1,1]] 但根据其他来源,它是 [[-1,1],[-2,2],[-1,1]]

两者都用于检测垂直边缘。不同之处在于这些内核如何标记“左”和“右”边缘。

为简单起见,让我们考虑一维示例,并让数组为

[0,255,255]

那么如果我们使用填充来计算

  • 内核 [2,-2] 给出了 [0,-510,0]
  • 内核 [-2,2] 给出了 [0,510,0]

如您所见,值的突然增加被第一个内核标记为值,第二个内核标记为值。请注意,只有当您需要区分左右边缘时才相关,当您只想找到垂直边缘时,您可以使用上述 2 个中的任何一个,然后获得绝对值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。