查找图像中椭圆轮廓的快速随机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变换的更多相关文章

  1. OpenCV探索之路(十一):轮廓查找和多边形包围轮廓

    Canny一类的边缘检测算法可以根据像素之间的差异,检测出轮廓边界的像素,但它没有将轮廓作为一个整体.所以要将轮廓提起出来,就必须将这些边缘像素组装成轮廓. OpenCV中有一个很强大的函数,它可以从 ...

  2. OpenCV学习笔记(12)——OpenCV中的轮廓

    什么是轮廓 找轮廓.绘制轮廓等 1.什么是轮廓 轮廓可看做将连续的点(连着边界)连在一起的曲线,具有相同的颜色和灰度.轮廓在形态分析和物体的检测和识别中很有用. 为了更加准确,要使用二值化图像.在寻找 ...

  3. Opencv中的轮廓(不全)

    1.初识轮廓 为了准确,要使用二值化图像.在寻找轮廓之前,要进行阈值化处理,或者Canny边界检测. 查找轮廓的函数会修改原始图像.如果你在找到轮廓之后还想使用原始图像的话,你应该将原始图像存储到其他 ...

  4. C#使用OpenCV剪切图像中的圆形和矩形

    前言 本文主要介绍如何使用OpenCV剪切图像中的圆形和矩形. 准备工作 首先创建一个Wpf项目--WpfOpenCV,这里版本使用Framework4.7.2. 然后使用Nuget搜索[Emgu.C ...

  5. 访问图像中的像素[OpenCV 笔记16]

    再更一发好久没更过的OpenCV,不过其实写到这个部分对计算机视觉算法有所了解的应该可以做到用什么查什么了,所以后面可能会更的慢一点吧,既然开了新坑,还是机器学习更有研究价值吧... 图像在内存中的存 ...

  6. C#快速随机按行读取大型文本文件

    原文:C#快速随机按行读取大型文本文件 下面是我实现的一个数据文件随机读取类,可以随机读取大型文本文件的某一行.在我机器上对一个130MB的文本文件,读取第200000的速度从传统做法的400ms提高 ...

  7. opencv 删除二值化图像中面积较小的连通域

    对于上图的二值化图像,要去除左下角和右上角的噪点,方法:使用opencv去掉黑色面积较小的连通域. 代码 CvSeq* contour = NULL; double minarea = 100.0; ...

  8. opencv 替换图像中的一部分

    首先选取图像中的Roi区域,然后对Roi区域进行赋值,那么原图像相应的区域也跟着变化了: dst = src.clone(); cv::Mat Roi(dst, cv::Rect(x, y, cut_ ...

  9. 机器学习进阶-图像金字塔与轮廓检测-轮廓检测 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表示颜色的变换形式 ...

随机推荐

  1. SWD下载调试填坑,SWD连接丢失问题解决

    野火SWD下载器,设置好以后,第一次下载成功,莫名其妙丢失连接,发现在复位状态可以连接(惊奇) 网络上搜索到把Boot0和Boot1置高,就可以把程序下载到RAM里, 能下载以后就好办了,把程序里SW ...

  2. 替换jar包内指定的文件

    用Java jar 工具来替换. ① jar uvf test.jar test.class 把test.class 直接添加到jar包的根目录,也就是替换到根目录文件. ②jar uvf test. ...

  3. 【BZOJ2322】[BeiJing2011]梦想封印 高斯消元求线性基+DFS+set

    [BZOJ2322][BeiJing2011]梦想封印 Description 渐渐地,Magic Land上的人们对那座岛屿上的各种现象有了深入的了解. 为了分析一种奇特的称为梦想封印(Fantas ...

  4. 【BZOJ3784】树上的路径 点分治序+ST表

    [BZOJ3784]树上的路径 Description 给定一个N个结点的树,结点用正整数1..N编号.每条边有一个正整数权值.用d(a,b)表示从结点a到结点b路边上经过边的权值.其中要求a< ...

  5. 九度OJ 1184:二叉树遍历 (二叉树)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3515 解决:1400 题目描述: 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储). 例如如下的 ...

  6. opengl绘制图片

    #include <GL/glew.h>#include <glut.h>#include "FreeImage.h"#include <stdio. ...

  7. Linux服务器上的tomcat中部署web项目

    首先了解一下下面几个概念,讲得不太准确:1.JVMJVM是class以及jar(实际上就是很多个class压缩在一起)的运行环境,特征就是java和javaw命令,通过这两个命令,你可以执行class ...

  8. leetcode 900. RLE Iterator

    Write an iterator that iterates through a run-length encoded sequence. The iterator is initialized b ...

  9. js小的小马克

    ajax前后端配合,马克一下,方便查询 jquery开头和取得相应id的值 $(document).ready(function(){ $("#sj").click(functio ...

  10. 1.SVN

    1.SVN安装 SVN服务器端VisualSVN Server(64位OS必须装64位VisualSVN-Server,默认端口是443). 就像建立数据库一样,需要先在svn服务器VisualSVN ...