MATLAB编程 利用Hough变换检测圆

MATLAB代码下载:利用Hough变换检测圆.docx-专业指导文档类资源-CSDN下载利用Hough变换检测圆,可以设置要检测圆的个数,最小尺寸。更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/k1ttyLove/59458826

        最近,我学习了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个圆:

  • 12
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘟噜猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值