查找图像中椭圆轮廓的快速随机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表示颜色的变换形式 ...
随机推荐
- docker笔记一
docker概念介绍: docker 是一个装在linux上的普通的软件.利用docker的命令,可以创建一个带有linux操作系统的镜像文件,docker命令运行这个带的linux操作系的镜像文件, ...
- 《Java线程池》:任务拒绝策略
在没有分析线程池原理之前先来分析下为什么有任务拒绝的情况发生. 这里先假设一个前提:线程池有一个任务队列,用于缓存所有待处理的任务,正在处理的任务将从任务队列中移除.因此在任务队列长度有限的情况下就会 ...
- 【python】-- pymsql 操作MySQL
pymysql 对MySQL数据库进行简单数据操作python模块主要是:MySQLdb.pymsql,MySQLdb模块主要用于python2.X,而python3.X则使用pymsql,pymys ...
- 我的Android进阶之旅------>Android关于Log的一个简单封装
android.util.Log类,可以方便地用于在编码调试过程中打印日志.但是在发布后的产品中,如果有太多的日志打印,则会严重地影响性能.对android.util.Log类做一个简单的封装,当产品 ...
- PAT 1061. 判断题(15)
判断题的评判很简单,本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分. 输入格式: 输入在第一行给出两个不超过100的正整数N和M,分别是学生人数和判断题数量.第二行给出M个不超过5的正 ...
- 蓝屏代码stop:0X000000EA(0X85E286B8,0X8635F210,0XF7A53CBC,0X00000001)
你这是显卡驱动问题,我把蓝屏代码都给你,以后在出现蓝屏自己看看行了. 1.0x0000000A:IRQL_NOT_LESS_OR_EQUAL ◆错误分析:主要是由问题的驱动程序.有缺陷或不兼容的硬件与 ...
- python基础13 ---函数模块3(正则表达式)
正则表达式 一.正则表达式的本质 1.正则表达式的本质(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的 ...
- HackerRank - flipping-the-matrix 【数学】
题意 一个矩阵中 每一行 每一列 都可以倒置 在不断进行倒置后 求 左上的那个 N * N 矩阵 的和 最大为多少 思路 M = 2 * N 通过 倒置特性 我们可以发现,最左上的那个矩阵 第 [I] ...
- LintCode:链表操作(合并与反转)
描述: (1)翻转一个链表 样例 给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null ********************** ...
- STM32 JTDO JREST复用为普通IO
一.开启AFIO的时钟(必须保证先打开AFIO,否则无效) RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 二.禁用JTAG,使能SWD GP ...