文章目录
一、Sobel 算子
1.1、什么是 Sobel 算子
- 图像边缘检测重要算子之一。
- 与梯度密不可分。
目的:边缘检测
本质:梯度运算
1.2、原理
在图像的 x 轴方向和 y 轴方向,都进行梯度计算。
在 x 方向:
当目标(P5点)左右两列差别特别大的时候,目标点的值会很大,说明该点为边界。
在 y 方向:
在图像的每一点,结合以上两个结果求出:
G = G x 2 + G y 2 G=\sqrt{G_{x}^{2}+G_{y}^{2} } G=Gx2+Gy2
统计极大值所在的位置,就是图像的边缘。
1.3、过程中的问题
目标像素点求得的值小于0或者大于255怎么办?
OpenCV 默认的是截断操作,即小于 0 按 0 算,大于 255 按 255 算。
但是这种处理方法并不合适。
对于小于 0 的应该取绝对值,大于 255 的可按 255 算。
1.4、OpenCV 实操
利用 OpenCV 进行 sobel 边缘检测的API是:
Sobel_x_or_y = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
参数:
-
src:传入的图像
-
ddepth: 图像的深度
-
dx和dy: 指求导的阶数,0表示这个方向上没有求导,取值为0、1。
-
ksize: 是Sobel算子的大小,即卷积核的大小,必须为奇数1、3、5、7,默认为3。
注意:如果ksize=-1,就演变成为3x3的Scharr算子。
-
scale:缩放导数的比例常数,默认情况为没有伸缩系数。
-
borderType:图像边界的模式,默认值为cv2.BORDER_DEFAULT。
注意: 当内核大小为3时, 以上 Sobel 内核可能产生比较明显的误差, 为解决这一问题,我们使用 Scharr 函数,但该函数仅作用于大小为3的内核。该函数的运算与 Sobel 函数一样快,但结果却更加精确。
S c h a r r 函数的卷积核 = [ − 3 0 + 3 − 10 0 + 10