查找图像中椭圆轮廓的快速随机hough变换
查找图像中椭圆轮廓的快速随机hough变换
图像中椭圆轮廓的查找在视频监控等领域有着广泛的应用,经典hough变换给我们提供了一种查找各种图形轮廓的方法,特别是在直线查找方面具有非常高的精确度。但是由于经典hough变换的基本原理是将图像空间转换到参数空间,所以对于椭圆这种参数较多的图形轮廓来说计算量较大,实时性有所降低。
随机hough变换是经典hough变换的一个变型,这种算法在查找直线、圆以及椭圆等方法都具有较高的鲁棒性。从Range的角度来看,随机hough变换的本质就是一种基于可更新模板的模板匹配方法。下图是一张Range基于这种方法检测行人头部的效果。

下面对随机hough进行一个简单的介绍:
随机hough变换是经典hough变换的盖然论变型。被广泛应用到圆弧等图形(线、圆、椭圆等)的检测中。Hough变换的基本思想是对图像上的潜在圆弧采用一种投票机制,最后算法通过检查最高的投票分数来确定具有最高分圆弧的存在。随机hough变换和经典hough的不同在于通过分析几何性质避免把时间浪费在给每个非零像素投票的过程上。因此,有效地改进了处理时间并且减少了所需要的存储空间。
产生背景
虽然hough变换被广泛应用到图形检测上,但它主要有两点不足:(1) 对于图像上的每个非零像素,不管是不是要查找的形状的参数都会在投票过程中被累加;(2) 累加器数组(或者hough空间)以一种启发方式定义。要想计算的精度越好,就需要定义越高的参数空间。这两点往往使得系统需要较大的存储开销,而且影响系统的实时性。
实现
圆弧可以完全由它上面的一定数量的点来决定,和HT比起来,RHT正是利用了这个优势。例如,两点决定一条直线,一个椭圆或圆可由三点确定。为了阐述RHT的思想,我们可以想象下一个椭圆的确定过程:1) 由随机选择的点进行椭圆拟合;2) 更新累加器数组以及相应的匹配度;3) 输出那些大于预定义阈值的椭圆。
椭圆拟合
定义椭圆的一般公式为:a(x − p)2 + 2b(x − p)(y − q) + c(y − q)2 + 1 = 0,约束条件:ac − b2 > 0。
但是要确定一个椭圆我们仅需要三个点。
RHT由在椭圆上随机选择三个点开始,设为X1,X2和X3。第一步是找到这三个点处的切线,可以通过对其相邻像素的一个小窗口进行最小二乘拟合一条直线来找到该点处的切线;
第二步是要找出这些切线的交叉点,这点很容易做到。设交叉点为T12和T23,设两条线段X1X2以及X2X3的中点分别是M12和M23。然后椭圆的中心就是T12M12和T23M23的交点。
假设上步求出的椭圆中心坐标为(X0,Y0),设x’=x-x0,y’=y-y0,那么椭圆方程为:
ax'2 + 2bx'y' + cy'2 = 1。现在,我们可以通过带入X1,X2和X3的坐标来解方程求出参数a、b和c。
累加
椭圆参数被计算出来后,累加器数组就可以相应的更新了。和经典的hough变换不同,RHT没有维护一个"grid of buckets"作为累加器数组。它首先计算新检测到得椭圆和已保存在累加器数组中的椭圆的相似度。可以采用不同计算标准来计算相似度。一旦相似度超出了预定义的门限值,就用这两个椭圆的平均来替换掉累加器数组中的椭圆,同时将它的score加1。.
终止
一旦某个候选椭圆的score超过了门限值,这个椭圆就是一个被检测出的椭圆。将其从图像和累加器数组中删除,以便该算法更快的找到其他椭圆。当算法循环数目达到最大值或者所有椭圆都被检测出时,算法停止。
伪代码
while (we find ellipses OR not reached the maximum epoch) {
for(a fixed number of iterations) {
Find a potential ellipse.
if(the ellipse is similar to an ellipse in the accumulator)
Replace the one in the accumulator with the average of two ellipses and add 1 to the score;
else
Insert the ellipse into an empty position in the accumulator with a score of 1;
}
Select the ellipse with the best score and save it in a best ellipse table;
Elliminate the pixels of the best ellipse from the image;
Empty the accumulator;
}
随机hough和经典的hough有些不同,如果你不了解经典hough可以参考下《hough变换原理》一文,这里不再赘述。
相关参考
1.http://blog.csdn.net/icerain_3321/article/details/1665280
2. D.H. Ballard, "Generalizing the Hough Transform to Detect Arbitrary Shapes", Pattern Recognition, Vol.13, No.2, p.111-122, 1981
3. L. Xu, E. Oja, and P. Kultanan, "A new curve detection method: Randomized Hough transform (RHT)", Pattern Recog. Lett. 11, 1990, 331-338.
4. S. Inverso, “Ellipse Detection Using Randomized Hough Transform”, www.saminverso.com/res/vision/EllipseDetectionOld.pdf, May 20, 2002
查找图像中椭圆轮廓的快速随机hough变换的更多相关文章
- OpenCV探索之路(十一):轮廓查找和多边形包围轮廓
Canny一类的边缘检测算法可以根据像素之间的差异,检测出轮廓边界的像素,但它没有将轮廓作为一个整体.所以要将轮廓提起出来,就必须将这些边缘像素组装成轮廓. OpenCV中有一个很强大的函数,它可以从 ...
- OpenCV学习笔记(12)——OpenCV中的轮廓
什么是轮廓 找轮廓.绘制轮廓等 1.什么是轮廓 轮廓可看做将连续的点(连着边界)连在一起的曲线,具有相同的颜色和灰度.轮廓在形态分析和物体的检测和识别中很有用. 为了更加准确,要使用二值化图像.在寻找 ...
- Opencv中的轮廓(不全)
1.初识轮廓 为了准确,要使用二值化图像.在寻找轮廓之前,要进行阈值化处理,或者Canny边界检测. 查找轮廓的函数会修改原始图像.如果你在找到轮廓之后还想使用原始图像的话,你应该将原始图像存储到其他 ...
- C#使用OpenCV剪切图像中的圆形和矩形
前言 本文主要介绍如何使用OpenCV剪切图像中的圆形和矩形. 准备工作 首先创建一个Wpf项目--WpfOpenCV,这里版本使用Framework4.7.2. 然后使用Nuget搜索[Emgu.C ...
- 访问图像中的像素[OpenCV 笔记16]
再更一发好久没更过的OpenCV,不过其实写到这个部分对计算机视觉算法有所了解的应该可以做到用什么查什么了,所以后面可能会更的慢一点吧,既然开了新坑,还是机器学习更有研究价值吧... 图像在内存中的存 ...
- C#快速随机按行读取大型文本文件
原文:C#快速随机按行读取大型文本文件 下面是我实现的一个数据文件随机读取类,可以随机读取大型文本文件的某一行.在我机器上对一个130MB的文本文件,读取第200000的速度从传统做法的400ms提高 ...
- opencv 删除二值化图像中面积较小的连通域
对于上图的二值化图像,要去除左下角和右上角的噪点,方法:使用opencv去掉黑色面积较小的连通域. 代码 CvSeq* contour = NULL; double minarea = 100.0; ...
- opencv 替换图像中的一部分
首先选取图像中的Roi区域,然后对Roi区域进行赋值,那么原图像相应的区域也跟着变化了: dst = src.clone(); cv::Mat Roi(dst, cv::Rect(x, y, cut_ ...
- 机器学习进阶-图像金字塔与轮廓检测-轮廓检测 1.cv2.cvtColor(图像颜色转换) 2.cv2.findContours(找出图像的轮廓) 3.cv2.drawContours(画出图像轮廓) 4.cv2.contourArea(轮廓面积) 5.cv2.arcLength(轮廓周长) 6.cv2.aprroxPloyDP(获得轮廓近似) 7.cv2.boudingrect(外接圆)..
1. cv2.cvtcolor(img, cv2.COLOR_BGR2GRAY) # 将彩色图转换为灰度图 参数说明: img表示输入的图片, cv2.COLOR_BGR2GRAY表示颜色的变换形式 ...
随机推荐
- web.xml配置整理
虽然是做web开发,但是web中的很多配置有的时候却不是很清楚,只是知道怎么配置,于是就把在网上看到各种关于web.xml的东西整理一下: web.xml中url-pattern的3种写法 1完全匹配 ...
- Excel中批量把数字类型转换为文本类型
客户给的excel文件中的内容全部是数值类型,这些我们要当成文本存入到数据库,所以需要把所有的数值转换为文本,但是直接通过修改单元格属性来修改的话会变成科学技数法,还有一种方法是在数值得前面加个英文的 ...
- 【BZOJ2724】[Violet 6]蒲公英 分块+二分
[BZOJ2724][Violet 6]蒲公英 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n ...
- 电路分析三------KCL,KVL,VCR方程
1.2b方程 2.举例 举例2
- 九度OJ 1251:序列分割 (DFS)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:166 解决:34 题目描述: 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值 比如{3,2,4,3,6} 可以分成{ ...
- 经典的css reset代码 (reset.css)
<style> html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, ...
- ElasticSearch(三十)基于scoll+bulk+索引别名实现零停机重建索引
1.为什么要重建索引? 总结,一个type下的mapping中的filed不能被修改,所以如果需要修改,则需要重建索引 2.怎么zero time重建索引? 一个field的设置是不能被修改的,如果要 ...
- Js编写的菜单树
只需要提供这种JSON格式就ok了 其他的都可以直接引用这个代码进去 var testMenu=[ { "name": "一级菜单", "submen ...
- C#实例,熟练使用泛型数组等,课程选择小软件
CourseItem.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
- 【thrift】初识thrift
Reference:http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/ http://jacksongblack.blog.51c ...