(转载)找圆算法((HoughCircles)总结与优化
Opencv内部提供了一个基于Hough变换理论的找圆算法,HoughCircle与一般的拟合圆算法比起来,各有优势:优势:HoughCircle对噪声点不怎么敏感,并且可以在同一个图中找出多个圆;反观拟合圆算法,单纯的拟合结果容易受噪声点的影响,且不支持一个输入中找多个圆
缺点:原始的Hough变换找圆,计算量很大,而且如果对查找圆的半径不加控制,不但运算量巨大,而且精度也不足,在输入噪声点不多的情况下,找圆效果远不如拟合找圆;为了提高找圆精度,相比拟合法,需要提供更多的参数加以控制,参数要求比较严格,且总体稳定性不佳
OpenCV内的HoughCircles对基础的Hough变换找圆做了一定的优化来提高速度,它不再是在参数空间画出一个完整的圆来进行投票,而只是计算轮廓点处的梯度向量,然后根据搜索的半径R在该梯度方向距离轮廓点距离R的两边各投一点,最后根据投票结果图确定圆心位置,其示意图如图1
图1是比较理想的情况,轮廓点1-6的梯度方向都经过了点7,因此都给点7投了一票,点7得分最高,也正是我们所要找的圆心;同时由此可以看出基于参数空间投票法来确定圆心,8-12点就算有投票,但由于投票太散,对整个投票结果也几乎不存在干扰,因而其天生抗干扰能力要比拟合法好
不过在这种思想优化下,也存在致命的缺陷,如图2:
实际情况是该点算出的梯度方向其实总是有误差的,有时因为图像原因或结构原因,偏差甚至超过30度;图2中由于梯度方向不精确,7点基本没有获得投票,反而不如ABC点。因此实际使用中HoughCircle的效果并没有想象中的理想,情况往往如下列所述:
(参与投票的轮廓点如图3的右图,噪点非常多,比想要查找的轮廓本身还多,而且断断续续的,显然这种情况拟合法不适用)
1、半径范围限定不好时,如图3,可能找到的圆非常多且杂乱无章

2、在此情况下,如果只输出一个圆(Opencv的HoughCircle会默认按照投票结果的累加值排序),最好的圆是这样的,竟然差这么多
3、假设我们找的东西的半径我们是知道的,变化不大(+-8%),现在限定下半径。。。找出的排的靠前的圆是这样的;再看下默认最好的圆。。。

半径好像接近了一点,还是好坑爹啊。。。
4、常规来说,使用该函数的时候,为避免找到太多的几乎重合的圆,找圆的最小距离都设在一个比较合理的值(比如大于半径1/5),这样在找多个圆的时候,就不会找出太多重合的圆了;不过这里我试下不限制最小距离,如下,默认排序下得分最高的几个圆如左图:

貌似默认最好的圆并没有任何改善
很多初次使用该函数的看到这,或许就就觉得HoughCircles效果不咋地。。。本人刚开始使用时也感觉Opencv提供的这个算法太不稳定了,只能对某一个图调出相对好一点的效果,换一个图或者只改动其中某一个参数,找出来的圆就不知道跑哪去了,而且变化太大了
。。。
观察细心的可能发现了,第4步中的左图找出的众多圆其实已经比前面找出的圆靠谱很多了,而且这么多圆必定有一个圆就是我想要找的圆,只是按照投票分数排序下,最好的圆偏差较大。
但究其算法优化本身,轮廓梯度定位出来的圆心投票本来精度就低(如图2),自然找出来的圆会有很多是错误的,但如果轮廓点足够多,找出的正确的圆必定也是存在的,只是按照票数方法来评价可能排序会比较靠后,但毕竟也是出现了的;此处只需做个小小的优化,改下评价方法,优化下排序,结果就很接近了
这是经过优化排序方法后找出的最好的圆
找出来的圆中与实际轮廓重合度最高的圆一般就是我们要找的圆;因此我们可以通过HoughCircles来找出一批差不多的圆(如步骤4),然后画出这些圆,和实际轮廓比对一下,按实际重合像素的总数排序,这时分数最高的圆就如上面的结果图!HoughCircles优化一下还是很给力的!
附件为本算法优化源码,有兴趣的可以一起来进一步优化(qq:970117454)http://files.cnblogs.com/files/jsxyhelu/ExtendHoughCircle.zip
(转载)找圆算法((HoughCircles)总结与优化的更多相关文章
- 转载-找圆算法((HoughCircles)总结与优化-霍夫变换
原文链接: http://www.opencv.org.cn/forum.php?mod=viewthread&tid=34096 找圆算法((HoughCircles)总结与优化 Ope ...
- 找圆算法((HoughCircles)总结与优化
http://www.opencv.org.cn/forum.php?mod=viewthread&tid=34096 Opencv内部提供了一个基于Hough变换理论的找圆算法,Hough ...
- OpenCV图像处理中“找圆技术”的使用
一.为什么"找圆" 圆是基本图形的一种,更为重要的是,自然情况下采集的图像,很少大量存在"圆":但凡存在的,大都是人工的,那么就必然代表特定的意义,从而 ...
- 聊聊找AI算法岗工作
https://blog.csdn.net/weixin_42137700/article/details/81628028 首先,本文不是为了增加大家的焦虑感,而是站在一名学生的角度聊聊找AI算法岗 ...
- AI 启蒙-无人售货机智能找零算法
人的理想志向往往和他的能力成正比. --约翰逊-- AI 启蒙-无人售货机智能找零算法 [问题区] 你现在是一家无人售货机生产公司的高级程序员,技术经理叫你实现无人售货机智能找零钱的算法,具体需求 ...
- 转载:GBDT算法梳理
学习内容: 前向分布算法 负梯度拟合 损失函数 回归 二分类,多分类 正则化 优缺点 sklearn参数 应用场景 转自:https://zhuanlan.zhihu.com/p/58105824 G ...
- Bresenham直线算法与画圆算法
在我们内部开发使用的一个工具中,我们需要几乎从 0 开始实现一个高效的二维图像渲染引擎.比较幸运的是,我们只需要画直线.圆以及矩形,其中比较复杂的是画直线和圆.画直线和圆已经有非常多的成熟的算法了,我 ...
- 计算机图形学(二)输出图元_6_OpenGL曲线函数_2_中点画圆算法
中点画圆算法 如同光栅画线算法,我们在每一个步中以单位间隔取样并确定离指定圆近期的像素位置.对于给定半径r和屏幕中心(xc,yc),能够先使用算法计算圆心在坐标原点(0, 0)的圆的像素 ...
- (转载)FM 算法
(转载)FM算法 https://zhuanlan.zhihu.com/p/33184179
随机推荐
- 腾讯云CMQ消息队列在Windows环境下的使用
版权声明:本文由李少华原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/100 来源:腾云阁 https://www.qclo ...
- Dockerfile分享之SSH Server
版权声明:本文由姚俊刚原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/84 来源:腾云阁 https://www.qclou ...
- 【BZOJ1818】[Cqoi2010]内部白点 扫描线+树状数组
[BZOJ1818][Cqoi2010]内部白点 Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟,所有内部白点同时变 ...
- jvm的内存模型
转自:https://www.cnblogs.com/dingyingsi/p/3760447.html 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互, ...
- javaWeb项目springMVC框架下利用ITextpdf 工具打印PDF文件的方法(打印表单、插入图片)
方法一:打印PDF表单以及在PDF中加入图片 需要的资料: jar包:iTextAsian.jar ,itext-2.1.7.jar: 源码: public static void main(Stri ...
- 详探TextRange对象--查找与选择(转载)
TextRange对象是动态HTML(DHTML)的高级特性,使用它可以实现很多和文本有关的任务,例如搜索和选择文本.文本范围让您可以选择性的将字符.单词和句子从文档中挑选出来.TextRange对象 ...
- 2014年web页面上的3D新产品介绍
地图对于数据的可视化展现有独到的显示方式,首先是底图.地图提供了一个定位的蓝图,让用例数据可以有参考的背景,因此底图通常是线画矢量图或者影像图.互联网上提供这种服务的基本以Google风格,也就是Ti ...
- Python开发【模块】:PyMySQL
PyMySQL 1.安装 [root@localhost ~]# pip install PyMySQL 2.初识 创建数据表结构: mysql> CREATE TABLE `users` ( ...
- MongoDB: 原子性和事务
在MongoDB中, 文档级别的的写操作是原子性的, 甚至是在对某个文档的操作中修改其多个内嵌的子文档, 也是原子性的. 在一个写操作同时修改多个文档的情况, 对其中单独的某个文档而言是原子的, 但是 ...
- mysql float 浮点型
定点数类型 DEC等同于DECIMAL 浮点类型:FLOAT DOUBLE 作用:存储薪资.身高.体重.体质参数等 m,d 都是设置宽度 =============================== ...