本次将主要给大家讲解如何利用OpenCV4中的霍夫圆检测算法的理论知识和具体实现。如果想听详细讲解,请通过下方B站链接进入B站进行观看:
https://www.bilibili.com/video/BV1Qy4y1Y7BB
算法原理
1.对于一个给定点(x_1,y_1) ,可以在三维直角坐标系中,绘出所有通过它的圆,最终将得到一条三维的曲线。
2.对图像中所有的点进行上述操作。如果两个不同点进行上述操作后得到的曲线在空间 a - b - r 相交, 即它们有一组公共的(a, b, r),这就意味着它们在同一个圆上。
3.越多曲线交于一点,也就意味着这个交点表示的圆由更多的点组成。我们可以设置一个阈值,来决定多少条曲线交于一点我们才认为检测到了一个圆。
4.霍夫圆变换要做的就是追踪图像中每个点对应曲线间的交点。如果交于一点曲线的数量超过了阈值, 那么可以认为这个交点所代表的参数(a, b, r)在原图像中为一个圆。
具体实现
估计圆心
1.Canny 边缘检测,得到边缘检测的二值图
2.原始图执行一次 Sobel 算子,计算出所有像素的邻域梯度值
3.初始化圆心空间 N(a,b),并令所有的 N(a,b)=0
4.遍历 Canny 边缘二值图中的所有非零像素点,沿着梯度方向 ( 切线的垂直方向 )画线,将线段经过的所有累加器中的点 (a,b) 的N(a,b) += 1 5.统计排序 N(a,b),得到可能的圆心(N(a,b) 越大,越有可能是圆心)
估计半径
1.计算 Canny 图中所有非 0 点距离圆心的距离。
2.距离从小到大排序,根据阈值选取合适的可能半径。
3.初始化半径空间 r, N(r)=0。
4.遍历 Canny 图中的非 0 点,N( 距离 )+=1。5.统计得到可能的半径值(N(r) 越大,说明这个距离值出现次数越多,越有可能是半径值)。
核心代码
了解更多关于《计算机视觉与图形学》相关知识,请关注公众号:
下载我们视频中代码和相关讲义,请在公众号回复:计算机视觉课程资料