【opencv-python】霍夫圆检测_python霍夫变换识别同心圆-程序员宅基地

技术标签: python  opencv  pyopencv  

霍夫变换检测直线的原理是利用累加器找到最大的 ( ρ , θ ) (ρ,θ) (ρ,θ)数对,如文章所述。圆形的数学表达式为 ( x − x c e n t e r ) 2 + ( y − y c e n t e r ) 2 = r 2 (x-x_{center})^2+(y-y_{center})^2=r^2 (xxcenter)2+(yycenter)2=r2,其中 ( x c e n t e r , y c e n t e r ) (x_{center},y_{center}) xcenter,ycenter为圆心坐标, r r r为圆的直径。因此可知一个圆需要 x c e n t e r , y c e n t e r , r x_{center},y_{center},r xcenter,ycenter,r三个参数确定,如果采用霍夫直线相同的原理,则需要围绕被探测点对全域点进行搜索,进而获取可能的圆心坐标,然后再通过圆心坐标计算该点相对应的半径,构成 ( x c e n t e r , y c e n t e r , r ) (x_{center},y_{center},r) (xcenter,ycenter,r)数对,再利用累加方法对下一些像素点进行相同处操作,最后看哪个数对位置中的累加出的数值最大,即代表过这一簇点的圆。但是这种操作的计算量过大,效率比较低。于是H.K.YUEN等大神提出了一种优化算法,利用边缘点的梯度法向为路径进行圆心点搜索,可以大大缩小圆心点搜索范围,提高效率。

在opencv-python中,我们使用函数cv2.HoughCircles函数来解决圆识别问题,函数说明如下图所示:
在这里插入图片描述
每个参数的含义如下图所示:

  • image:8位待处理灰度图像;
  • circles:输出被检测到的圆,以三元素浮点型向量表示 ( x , y , r a d i u s ) (x,y,radius) (x,y,radius)
  • method:探测方法。当前的实现是用的CV_HOUGH_GRADIENT方法;
  • dp:累加器分辨率与图像分辨率的反比。例如,如果dp=1,累加器的分辨率与输入图像相同。如果dp=2,则累加器的宽度和高度为原来的一半;
  • minDist:检测到的圆中心之间的最小距离。如果参数太小,除了一个真实的圆外,还可能错误地检测到多个相邻圆,如果太大可能会错过一些圆;
  • param1:第一个特定参数。对于CV_HOUGH_GRADIENT方法,它是传递给Canny()边缘检测器的两个阈值中较高的阈值(较低的阈值小两倍);
  • param2:第二个特定参数。对于CV_HOUGH_GRADIENT方法,它是检测阶段圆心的累加器阈值。它越小,可能检测到的假圆越多(因为满足累加器上限的条件变多了)。与累加器最大数值结果代表的圆将被首先返回。
  • minRadius:最小圆半径;
  • maxRadius:最大圆半径。

基于上文所述,霍夫圆检测的效果进行测试,待处理原图如下图所示:
在这里插入图片描述
处理代码如下所示:

img = cv2.imread('singlecircle.jpg',0)
img = cv2.medianBlur(img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,minDist=20,param1=50,param2=30,minRadius=0,maxRadius=0)
print('circles1:', circles)
circles = np.uint16(np.around(circles))
print('circles2:', circles)

for i in circles[0,:]:
    # draw the outer circle
    cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
    # draw the center of the circle
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)

运行结果如下:
在这里插入图片描述
此时我们发现程序显示了很多圆形,并非是我们想要的结果,此时我们调整霍夫变换函数的参数,调整“minDist=20”为“minDist=100”,之后程序的运行效果为:

在这里插入图片描述
肉眼可见效果明显好了很多。从函数功能定义来看,输出circle变量应该包含形如 ( x c e n t e r , y c e n t e r , r ) (x_{center},y_{center},r) (xcenter,ycenter,r)形式的数对,我们将circle变量内容打印出来,如下图所示:
在这里插入图片描述
此处,我们可以思考一下,为什么圆心坐标最后都是.5的形式呢?当然,我们也可以通过改变其他参数的形式去达到只识别一个圆的目的,比如我们将"param2=30"修改为"param2=100"效果如下:
在这里插入图片描述
对于多个圆,我们也可以通过cv2.HoughCircles()函数进行识别,被处理原图如下图所示:
在这里插入图片描述
程序运行结束后效果如下图所示:
在这里插入图片描述
可见效果比较明显,但还没有达到比较规整的效果,通过调整函数中的参数可以实现我们想要的识别效果。在参数中,dp参数值得深入分析,其与累加器分辨率成反比,如果dp=1,累加器属正常状态,如果dp=2,则按照2倍执行累加,所以dp值越大,累加器累加速度越快,因此在上限阈值以上的被检测圆数量也就越多。为了测试,我们将dp调整为2,其他参数保持不变,观察函数的执行效果:

在这里插入图片描述可见检测出来的圆多了好多。我们再看一个实例,如下图所示:
在这里插入图片描述
在这里插入图片描述
如果我想把这两张图片的圆孔对应中心对应位置匹配起来,我需要先对圆环进行检测并获取圆环中心位置,经过霍夫圆变换,程序执行效果如下图所示:
在这里插入图片描述

实现上述功能需要对霍夫圆变换函数参数进行精确调整,我所采用的参数如下所示:

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1, minDist=30, param1=10,param2=20,minRadius=10,maxRadius=15)

整个图片的尺寸比较小,shape只有(217,309),所以最小圆心间距、最小半径等参数也要做合理适配。然后参数和图像之间的关联性较高,也就是说这一组参数如果适用于这张图像,很难适应其他图像,比如对同一目标的右视相机拍摄图像,如果还用这一组参数,识别效果如下图所示:
在这里插入图片描述
可见有些圆形是没法很好的识别出来,因此还是需要再对参数进行调优,更改参数如下:

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1, minDist=25, param1=10,param2=20,minRadius=9,maxRadius=15)#LL

修改参数之后识别效果为:
在这里插入图片描述
欢迎大家在评论区留言评论,感谢大家的关注!
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/huangzhe0701/article/details/120845899

智能推荐

树莓派4B从0开始配置到使用vim编辑器输出helloworld!_vim输出hello world-程序员宅基地

文章浏览阅读658次。树莓派:初始账号:pi初始密码:raspberry2.登录:2.1.HDMI线,HDMI显示屏:直接连就行了2.2串口登录:2.3:SSH登录①树莓派连上WIFI:②固定树莓派的IP地址:2.4远程桌面(xrdp界面)登录:3.VIM编辑器更新①将国外的镜像源更新为国内的镜像源(树莓派的镜像源默认是国外的):在终端输入命令sudo nano /etc/apt/sources.list进入文件后,将第一行的国外镜像源注释掉(第一行默认官网更新),在文件内容最后添加添_vim输出hello world

GPU的并行运算与CUDA的简介-程序员宅基地

文章浏览阅读1k次。一:GPU 编程技术的发展历程及现状1.冯诺依曼计算机架构的瓶颈 曾经,几乎所有的处理器都是以冯诺依曼计算机架构为基础的。该系统架构简单来说就是处理器从存储器中不断取指,解码,执行。但如今这种系统架构遇到了瓶颈:内存的读写速度跟不上 CPU 时钟频率。具有此特征的系统被称为内存受限型系统,目前的绝大多数计算机系统都属于此类型。为了解决此问题,传统解决..._模型数据放到cuda里就是gpu运算了吗

Materials Studio 2021新版本发布|达索系统_materials studio 更新 pcohp-程序员宅基地

文章浏览阅读2.6k次。Materials Studio 2021增加一系列面向产品研发的新功能,进一步扩展了在热门研究领域的应用能力,包括在新功能材料和能源材料方面。Materials Studio 新功能新模块FlexTS,FlexTS为DMol3和DFTB+提供了在势能面上找到固定点的任务功能,使计算反应路径和与化学反应相关的能垒成为可能。Materials Studio Collection基于Pipeline Pilot新增的系列protocols,采用PhaseField计算硬质材料的硬化和晶粒生长。用户可在Mater_materials studio 更新 pcohp

QEMU使用virtio磁盘(Ubuntu/windows)_qemu 挂载iso驱动-程序员宅基地

文章浏览阅读3.9k次。环境宿主环境:windows 10 proQEMU版本:3.1客户机:windows2003virtio是一种半虚拟化技术,window2003安装盘不带驱动程序,所以首先采用IDE方式安装windows2003操作系统,然后从本地址下载virtio的windows驱动程序光盘iso文件,驱动程序的安装思路是创建一个临时virtio磁盘加载到windows2003(否则无法安装驱..._qemu 挂载iso驱动

linux修改文件内容-程序员宅基地

本文介绍了在Linux环境下修改文件内容的方法,包括进入文件、查找要修改的内容、编辑完成后的操作,以及保存修改和退出编辑的指令。

计算机二级vf9.0版,VFP9.0SP2中的MY组件帮助译文(二)-程序员宅基地

文章浏览阅读294次。运行时刻类分层IntelliSense 是一件事情;它的另外一件任务是,当你运行代码时,真的要有 My 命名空间在工作。儘管把一个类叫做My,把它的成员叫做App、 Computer、 Data等等,看上去轻而易举, 可My 实在做得比那多得多。就像IntelliSense,它是数据驱动的(实际上,用的是相同的 My 表格)。My 类其实是 MyBase的一个子类,就像 Computer、 Use..._vfmy

随便推点

Open3D 大规模点云水平面校准_点云 地面水平校正-程序员宅基地

文章浏览阅读80次。在预处理后,我们可以使用 RANSAC(Random Sample Consensus)算法来估计点云所在的水平面。而在处理大规模点云时,准确地估计点云所在的水平面是一个关键的步骤。本文将介绍如何使用 Open3D 库进行大规模点云水平面校准,并提供相应的源代码示例。通过预处理和 RANSAC 算法,我们能够准确地估计点云所在的水平面,并可视化结果。接下来,我们需要对点云进行预处理,以便更好地估计水平面。安装完成后,我们可以导入必要的库并加载点云数据。现在,我们已经得到了估计的水平面点云。_点云 地面水平校正

【MySQL事务_2_事务提交与回滚】_mysql事务提交后回滚-程序员宅基地

文章浏览阅读1.4k次。回滚操作指的是当我们事务提交失败的时候,就需要我们将数据回滚到失败前的时间段。比如,delete一张表,忘加限制条件,整张表没了。误操作后,能快速回滚数据是非常重要的。对t_act进行提交和回滚操作。_mysql事务提交后回滚

AD9910模块(F1调试完成)_ad9910发射一会关闭一会-程序员宅基地

文章浏览阅读455次。AD9910 stm32f103zet6_ad9910发射一会关闭一会

php案例纠错,PHP编程之纠错篇-程序员宅基地

文章浏览阅读169次。最近一段时间,凭借其功能强大,简单易用的特点被越来越多的人们所喜爱和接受,成为目前最为流行的脚本编程语言之一。本文将结合用户在使用PHP过程中经常容易出现的问题,包括语法错误,程序运行错误以及逻辑错误等展开详细的介绍,希望能够对那些目前正在学习PHP语言的用户有所帮助。此外,本文还将会在文章的结束部分对PHP编程过程中应当注意的各种事项加以汇总,供读者参考。PHP脚本语言所具有一个显著的特点就是能..._php开发一款纠错系统

计算机中三维地址的引用,Excel 公式位置的引用(三维地址引用)-程序员宅基地

文章浏览阅读4k次。Excel 公式位置的引用(三维地址引用)一个引用位置代表工作表上的一个或者一组单元格,引用位置告诉Excel在哪些单元格中查找公式中要用的数值。通过使用引用位置,我们可以在一个公式中使用工作表上不同部分的数据,也可以在几个公式中使用同一个单元格中的数值。我们也可以引用同一个工作簿上其它工作表中的单元格,或者引用其它工作簿,也可以引用其他应用程序中的数据。引用其他工作簿中的单元格称为外部引用。引用..._手机版wps怎么计算时所引用的单元格地址就必须使用三维地址“[工作簿名]工作

终于把所有的Python库,都整理出来啦!_python通过vpi获取wiki内容-程序员宅基地

文章浏览阅读427次,点赞2次,收藏9次。花了一点时间收集了 Python 中 1000 + 的库,包括内置库、第三方库,总体可以分为 14 大类,对于每个库的用途,我都作了下简单的说明,大家可以点赞,收藏起来,有需要的时候,使用 Ctrl+F 来搜索即可。1. 数据处理Chardet字符编码探测器,可以自动检测文本、网页、xml的编码。colorama主要用来给文本添加各种颜色,并且非常简单易用。Prettytable主要用于在终端或浏览器端构建格式化的输出。difflib,[Python]标准库,计算文本差异Leve_python通过vpi获取wiki内容

推荐文章

热门文章

相关标签