找圆算法((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)
    注:如果编译通过,但运行时崩溃,通常原因是库版本不对!一般OpenCV官方给出的库版本分x86,x64,而每个平台下又有vc10,vc11,vc12,分别对应VS2010,VS2012,VS2013;其下还分debug版和release版,必须严格与编译环境和使用的配置相对应,否则会在运行过程中出错,且非常不好排查原因
     另该优化目前只能做到减少HoughCirlcles找错圆且错的比较离谱的几率,但无法真正提高精度,找出来的圆与实际圆稍有偏差还是有可能的;若需要高精度定位,建议采用该方法做粗定位,采用拟合圆做精定位(类似各商业算法中的环形区域找圆)








 

最终优化结果.jpg (60.1 KB, 下载次数: 545)

最终优化结果

最终优化结果

原图.jpg (42.22 KB, 下载次数: 1146)

 

测试原图

测试原图

ExtendHoughCircle.cpp

 

13.8 KB, 下载次数: 12474

 

ExtendHoughCircle.h

 

965 Bytes, 下载次数: 6399

 

Main.cpp

 

547 Bytes, 下载次数: 5117

相关推荐
资料名称:《常用算法程序集(C语言描述) 第三版 (PDF高清电子书+附书源码打包)》<br>出版社:清华大学出版社<br>作者:徐士良<br>资料格式:PDF<br>文件大小:6.29MB<br>语言:简体中文<br>资料说明:<br>【下载说明】<br>国内算法教材中少见的一本优秀书籍。这里我把此经典书籍《常用算法程序集(C语言描述)》第三版电子书和附书源代码打包提供给大家下载,以飨读者。其中电子书为PDF格式,清晰度极高;源代码为.c文件打包。<br><br>【内容提要】<br>本书针对工程中常用的行之有效的算法而编写,其主要内容包括多项式的计算、复数运算、随机数的产生、矩阵运算、矩阵特征值与特征向量的计算、线性代数方程组的求解、非线性方程与方程组的求解、插值与逼近、数值积分、常微分方程组的求解、数据处理、极值问题的求解、数学变换与滤波、特殊函数的计算、排序和查。 书中所有算法均用C语言描述,并存放在一张光盘上。 本书可供广大科研人员、工程技术人员以及管理工作者阅读使用,也可作为高等院校师生的参考书。<br><br>【前言摘要】<br>本书的前身是由清华大学出版社出版的《C常用算法程序集(第二版)》,该书(第二版)颇受读者欢迎。但在该书中没有具体的算法函数程序,所有的算法函数程序均存放在一张软盘上,读者需要具体阅读算法程序时感到很不方便。为了解决这个问题,本书除了进行重新组织和修订,并且将所有的算法程序在书中列出,方便读者查阅,同时为了使用方便,也提供了一张装有所有程序的光盘。<br>本书有以下几个特点:<br>(1)书中除收集了传统的算法外,还根据作者的工作经验和近年来数值计算的发展,选取了一些新的、实用的算法。可以说,书中各章几乎都有一些新的算法。<br>(2)书中所有的算法程序都经过认真的调试。<br>(3)本书提供给读者的不仅是一本书稿,还有一张配书光盘,读者可以方便地使用书中的每一个算法程序。<br>(4)书中收集的算法都是行之有效的,基本可以满足解决工程中各种实际问题的需要。<br>在配书光盘中,按章存放了书中所有的算法函数程序以及例子中的主函数程序。其中在目录CHX中存放了第X章中所有的函数程序(X为章号),同时也存放了该章算法函数需要调用的其他章中的一些函数程序。算法函数程序的文件名为“X函数名.c”,例子中相应的主函数程序的文件名为“X函数名0.c(第一个例子)”或“X函数名1。c(第二个例子)”。<br>限于作者水平,书中难免有不足和不妥之处,恳请读者批评指正。<br><br>【目录信息】<br>第1章 多项式的计算<br>1.1 一维多项式求值<br>1.2 一维多项式多组求值<br>1.3 二维多项式求值<br>1.4 复系数多项式求值<br>1.5 多项式相乘<br>1.6 复系数多项式相乘<br>1.7 多项式相除<br>1.8 复系数多项式相除<br>第2章 复数运算<br>2.1 复数乘法<br>2.2 负数除法<br>2.3 复数乘幂<br>2.4 复数的n次方根<br>2.5 复数指数<br>2.6 复数对数<br>2.7 复数正弦<br>2.8 复数余弦<br>第3章 随机数的产生<br>3.1 产生0到1之间均匀分布的一个随机数<br>3.2 产生0到1之间均匀分布的随机数序列<br>3.3 产生任意区间内均匀分布的一个随机整数<br>3.4 产生任意区间内均匀分布的随机整数序列<br>3.5 产生任意均值与方差的正态分布的一个随机数<br>3.6 产生任意均值与方差的正态分布的随机数序列<br>第4章 矩阵运算<br>4.1 实矩阵相乘<br>4.2 复矩阵相乘<br>4.3 一般实矩阵求逆<br>4.4 一般复矩阵求逆<br>4.5 对称正定矩阵的求逆<br>4.6 托伯利兹矩阵求逆的特兰持方法<br>4.7 求一般行列式的值<br>4.8 求矩阵的值<br>4.9 对称正定矩阵的乔里斯基分解与列式求值<br>4.10 矩阵的三角分解<br>4.11 一般实矩阵的QR分解<br>4.12 一般实矩阵的奇异值分解<br>4.13 求广义逆的奇异值分解法<br>第5章 矩阵特征值与特征向量的计算<br>5.1 约化对称矩阵为对称三对角阵的豪斯荷尔德变换法<br>5.2 求对称三对角阵的全部特征值与特征向量<br>5.3 约化一般实矩阵为赫申伯格矩阵的初等相似变换法<br>5.4 求赫身伯格矩阵全部特征的QR方法<br>5.5 求实对称矩阵特征值与特征向量的雅可比法<br>5.6 求实对称矩阵特征值与特征向量的雅可比过关法<br>第6章 线性代数方程组的求解<br>6.1 求解实系数方程组的全选主元高斯消去法<br>6.2 求解实系数方程组的全选主元高斯-约当消去法<br>6.3 求解复系数方程组的全选主元高斯消去法<br>6.4 求解复系数方程组的全选主元高斯-约当消去法<br>6.5 求解三对角线方程组的追赶法<br>6.6 求解一般带型方程组<br>6.7 求解对称方程组的分解法<br>6.8 求解对称正定方程组的平方根法<br>6.9 求解大型系数方程组<br>6.10 求解托伯利兹方程组的列文逊方法<br>6.11 高斯-塞德尔失代法<br>6.12 求解对称正定方程组的共岿梯度法<br>6.13 求解线性最小二乘文体的豪斯伯尔德变换法<br>6.14 求解线性最小二乘问题的广义逆法<br>6.15 求解病态方程组<br>第7章 非线性方程与方程组的求解<br>7.1 求非线性方程一个实根的对分法<br>7.2 求非线性方程一个实根的牛顿法<br>7.3 求非线性方程一个实根的埃特金矢代法<br>7.4 求非线性方程一个实根的连分法<br>7.5 求实系数代数方程全部的QR方法<br>7.6 求实系数方程全部的牛顿下山法<br>7.7 求复系数方程的全部根牛顿下山法<br>7.8 求非线性方程组一组实根的梯度法<br>7.9 求非线性方程组一组实根的拟牛顿法<br>7.10 求非线性方程组最小二乘解的广义逆法<br>7.11 求非线性方程一个实根的蒙特卡洛法<br>7.12 求实函数或复函数方程一个复根的蒙特卡洛法<br>7.13 求非线性方程组一组实根的蒙特卡洛法<br>第8章 插值与逼近<br>8.1 一元全区间插值<br>8.2 一元三点插值<br>8.3 连分式插值<br>8.4 埃尔米特插值<br>8.5 特金逐步插值<br>8.6 光滑插值<br>8.7 第一种边界条件的三次样条函数插值<br>8.8 第二种边界条件的三次样条函数插值<br>8.9 ??三种边界条件的三次样条函数插值<br>8.10 二元三点插值<br>8.11 二元全区间插值<br>8.12 最小二乘曲线拟合<br>8.13 切比雪夫曲线拟合<br>8.14 最佳一致逼近的里米兹方法<br>8.15 矩形域的最小二乘曲线拟合<br>第9章 数值积分<br>9.1 变补长梯形求积法<br>9.2 变步长辛卜生求积法<br>9.3 自适应梯形求积法<br>9.4 龙贝格求积法<br>9.5 计算一维积分的连分式法<br>9.6 高振荡函数求积法<br>9.7 勒让德-高斯求积法<br>9.8 拉盖尔-高斯求积法<br>9.9 埃尔米特-高斯求积法<br>9.10 切比雪夫求积法<br>9.11 计算一维积分的蒙特卡洛法<br>9.12 变步长辛卜生二重积分方法<br>9.13 计算多重积分的高斯方法<br>9.14 计算二重积分的连分方式<br>9.15 计算多重积分的蒙特卡洛法<br>第10章 常微分方程组的求解<br>10.1 全区间积分的定步长欧拉方法<br>10.2 积分一步的变步长欧拉方法<br>10.3 全区间积分维梯方法<br>10.4 全区间积分的定步长龙格-库塔方法<br>10.5 积分一步的变步长龙格-库塔方法<br>10.6 积分一步的变步长基尔方法<br>10.7 全区间积分的变步长默森方法<br>10.8 积分一步的连分方式<br>10.9 全区间积分的双边法<br>10.10 全区间积分的阿当姆斯预报校正法<br>10.11 全区间积分的哈明方法<br>10.12 积分一步的特雷纳方法<br>10.13 积分刚性方程组的吉尔方法<br>10.14 二阶微分方程边值问题的数值解法<br>第11章 数据处理<br>11.1 随机样本分析<br>11.2 一元线性回归分析<br>11.3 多元线性回归分析<br>11.4 逐步回归分析<br>11.5 半对数数据相关<br>11.6 对数数据相关<br>第12章 极值问题的求解<br>12.1 一维极值连分式法<br>12.1 n维维极值连分式法<br>12.3 不等式约束线性规划问<br>12.4 求n维极值的单行条优法<br>12.5 求约束条件下n维极值的复形调优法<br>第13章 数学变换与滤波<br>13.1 傅立叶级数逼近<br>13.2 快速傅立叶变换<br>13.3 快速袄什变换<br>13.4 五点三次平滑<br>13.5 离散随机线性系统的卡尔曼滤波<br>13.6 α-β-γ滤波<br>第14章 特殊函数的计算<br>14.1 伽马函数<br>14.2 不完全伽马函数<br>14.3 误差函数<br>14.4 第一类整数阶贝塞尔函数<br>14.5 第二类整数阶贝塞尔函数<br>14.6 变形第一类整数阶贝塞尔函数<br>14.7 变形第二类整数阶贝塞尔函数<br>14.8 不完全贝塞尔函数<br>14.9 正态分布函数<br>14.10 t-分布函数<br>14.11 χ-分布函数<br>14.12 F-分布函数<br>14.13 正弦积分<br>14.14 余弦积分<br>14.15 指数积分<br>14.16 第一类椭积分<br>14.17 第二类椭积分<br>第15章 排序<br>15.1 冒泡排序<br>15.2 快速排序<br>15.3 希尔排序<br>15.4 堆排序<br>15.5 结构排序<br>15.6 磁盘文件排序<br>15.7 捉扑分类<br>第16章 查<br>16.1 结构体数组的顺序查<br>16.2 磁盘随机文本文件对分查<br>16.3 有序数组的对分查<br>16.4 按关键字成员有序的结构体数组的对分查<br>16.5 按关键字有序的磁盘随机文本文件的对分查<br>16.6 磁盘随机文本文件的字符串匹配<br>参考文献<br>链接地址:http://www.netyi.net/training/0f60ffac-7cd1-4691-a3ac-375656bd6157
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页