OpenCV 边缘检测
Canny算子
Canny 边缘检测算子,其算法步骤大体如下:
1) 用高斯滤波器对输入图像做平滑处理 (大小为 的高斯核)
2) 计算图像的梯度强度和角度方向 ( 和 方向上的卷积核)
角度方向近似为四个可能值,即 0, 45, 90, 135
3) 对图像的梯度强度进行非极大抑制
可看做边缘细化:只有候选边缘点被保留,其余的点被移除
4) 利用双阈值检测和连接边缘
若候选边缘点大于上阈值,则被保留;小于下阈值,则被舍弃;处于二者之间,须视其所连接的像素点,大于上阈值则被保留,反之舍弃
OpenCV 中, 函数如下:
一般上阈值 / 下阈值= 2 ~ 3
默认 ,表示图像梯度强度的计算采用近似形式;若为 ,则表示采用更精确的形式。
Sobel算子
假定输入图像矩阵为 ,卷积核大小为 ,则水平一阶导数 和垂直一阶导数 分别为:
输出的图像矩阵 为:
OpenCV 中,Sobel 函数如下:
和 表示阶数,一般取 0 或 1,但不超过 2; = 1,表示计算结果不缩放; = 0,表示计算结果无增量。
Laplace算子
索贝尔算子 (Sobel) 和拉普拉斯算子 (Laplace) 都是用来对图像进行边缘检测的,不同之处在于,前者是求一阶导,后者是求二阶导。
OpenCV 中对应的函数为 Laplacian
Scharr算子
当卷积核大小为 时,使用 卷积核来计算并不是很精确,此时常用 卷积核来代替,如下:
而 函数,本质上就是令 且使用 卷积核的 函数。
对于 函数,要求 和 都 >= 0 且 ,假如 和 都设为 1,则会抛出异常。
因此,对于 和 函数,通常各自求其 和 方向的导数,然后通过加权来进行边缘检测。
参考代码
参考
[OpenCV 之 边缘检测]https://www.cnblogs.com/xinxue/p/5348743.html
[OpenCV3编程入门读书笔记5-边缘检测]https://www.cnblogs.com/justkong/p/7297836.html
领取专属 10元无门槛券
私享最新 技术干货