> 文档中心 > MATLAB编程 利用Hough变换检测圆

MATLAB编程 利用Hough变换检测圆

MATLAB代码下载:利用Hough变换检测圆.docx-专业指导文档类资源-CSDN下载

        最近,我学习了Hough变换,先介绍一下Hough变换:Hough变换(Hough Transform)是检测图像中直线和曲线的一种方法,其核心思想是建立一种电线对偶关系,将图像从图像空间变换到参数空间,确定曲线的参数,进而确定图像中的曲线。

        利用Hough变换原理最基本的是检测直线,因为截距式直线方程有两个参数k和b,利用Hough变换到参数空间只有两层循环,代码实现较为简单,执行时间也较短。

        然而,圆的方程可不止两个参数,包括圆心点的坐标(a,b)和半径r,利用Hough变换到参数空间就要有多层循环。从图像空间的一个点对应参数空间的一个三维向量(a,b,r),在参数空间确定三维向量的个数的大小排列,取其中前几个参数向量,用其参数在图像空间刻画复现圆,这就实现了Hough检测圆。

        编程思路:

(1)首先读取一张图片,并且将其进行边缘检测,我用的是canny边缘检测。

(2)然后,先准备好一会儿要用到的数学模型,一个a_max(纵坐标最大值),b_max(横坐标最大值),r_max(半径最大值),circle_num(要检测出圆的个数),yuzhi(阈值,此变量用于避免图像空间中的多个圆重复表示参数空间的一组参数a,b,r),A(a_max,b_max,r_max)(参数空间三维数组,用于存储该组参数对应多少点,即同一个圆上有几个点),max1(存储A数组中值最大的a参数值),max2(存储A数组中值最大的b参数值),max3(存储A数组中值最大的r参数值)。

(3)然后对整个边缘检测结果图片进行双层for循环遍历,判断此点灰度值是否大于0,这一步是用来找到图像边缘(白色像素)。然后将该点变换到参数空间,即用极坐标方程组表示此点的(a,b,r);a,b是圆心坐标,r是半径。在代码实现中,要多次利用for循环,循环变量是theta(范围从1到360度)和半径r(r的范围是自定义的最小值到r_max),在带入方程之前要对theta变量变为用pi表示的数值,即做theta/180*pi的操作。经过两层循环,就有了该点(a,b,r)参数值,再对(a,b)变量进行筛选,(a,b)表示圆心坐标,所以此点一般情况下要落在图像范围内。筛选之后对应的A数组的值加1。经过对所有点进行此操作,得到的参数空间A数组就是我们所需要的。

(4)然后对A数组进行三层循环遍历,找到前circle_num个最大值,并且将其三个参数a,b,r分别存储到max1,max2,max3数组中。

(5)这样,我们就得到了参数空间的circle_num个圆的参数,现在我们要将这些参数在图像空间中复原。还是利用圆的极坐标方程表示出x,y。然后用plot函数进行展示x和y的关系。

这样,就得到了图像空间中的圆,实现了Hough变换检测圆。

检测结果:(可以检测任意多个圆,通过修改代码中的circle_num的值,值越大等待时间越久。此外,不同的圆设置了不同的颜色以及圆的线条宽度)

 检测7个圆: 检测20个圆: