前面几次的内容,包括基础知识介绍和综合训练,基本上都是围绕着霍夫变换检测直线来进行展开的。那么这次我要来探讨霍夫变换检测圆。话不多说,首先我们来简要地看看霍夫变换检测圆是什么原理。
霍夫变换检测圆的原理及其实现
前面的学习,让我对霍夫变换有了这样一种理解-----实际上就是坐标变换,是一种数学上的变换,然后再转换到参数坐标系进行讨论,最终确定待检测圆(或者其他形状)的数学方程,那么圆在直角坐标系中的数学表达式我相信小学生都知道:
R^2 = (X - a)^2 + (Y - b)^2
我们看到了这个式子是比较复杂的,我首先要明确目标,这个式子的参数有三个:R、a、b,我们实际上是要根据已知的X,Y来将上述未知的三个参数求出来,可想而知,我们要是用上面这个式子就麻烦了,三个参数在一个式子中混为一谈,所以,我们要找另外的数学表达式,这样我们自然而然想到一般要使用的坐标系---极坐标系,在极坐标系下,圆的数学表达式如下:
X0 = X + R * cos(Theta)
Y0 = Y + R * sin(Theta)
这样,三个参数就成功分离了两个X0、Y0,此处若我们给定检测的R,再利用Theta的有界性,我们就可以得到一组合适的X0,Y0,R,于是圆就找到了!
类似于霍夫变换直线检测,这里我们也定义一个累加器,但是与直线检测不同的是,直线检测参数是二维的,而圆的参数是三维的,于是,我们可以定义一个三维的累加器,实现代码(关键函数)如下: