Hough变换检测圆
我们在之前利用Hough变换实现了直线的检测,因为两个特征(k,b)或者(theta,r)就能确定一条直线,所以我们的Hough空间是二维的。一个圆由3个特征组成,分别是圆心的横坐标,纵坐标,以及圆的半径,因此我们的Hough空间是三维的。
圆的方程:(x-a)^2 + (y-b)^2 = r^2
过一点(x0,y0),a,b,r的关系就是:(x0-a)^2 + (y0-b)^2 = r^2
因此,我们的Hough空间[a是横坐标,b是纵坐标,r是竖坐标]
我们要用一个二重循环去填充Hough空间
跟直线检测一样,我们现在是在三维数组里找局部最大值,确定圆的(x,y,r)
听完之后是不是觉得方法很简单,跟检测直线没什么区别,也用不到极坐标。
但是,三维累加器中会产生许多噪声并且使得结果不稳定的稀疏分布!
因此,由Hough梯度法来改进这个算法。
Hough梯度法
- 利用canny检测提取边缘
- 对每一个边缘点,我们可以计算出梯度[其实就是圆心和边缘点连线方向]
- 计算出梯度后,我们就可以得到一条垂直于该点切线的直线,我们就有一个二维数组H,用来填充这条直线上所有点
- H中出现频率最高的肯定就是圆心
- 对于得到的圆心中的每一个,计算那些边缘点到该圆心的距离,若某个距离很充分出现次数足够,就可以认为这是一个合格的圆
//Hough变换检测圆
#include "cv.h"
#include "highgui.h"
#include "mat

本文介绍了如何运用Hough变换进行圆的检测,重点讲解了从圆的数学方程出发构建三维Hough空间,通过二重循环填充空间寻找局部最大值来确定圆心和半径的过程。还提到了Hough梯度法作为改进算法,结合Canny边缘检测和梯度计算来减少噪声,提高检测准确性。
最低0.47元/天 解锁文章
587

被折叠的 条评论
为什么被折叠?



