论文阅读——椭圆检测 2016 Fast ellipse detection based on three point algorithm with edge angle information

    这篇文章是论文审稿人推荐的,出版社为《International Journal of Control Automation & Systems》是4区的SCI,论文整体看着美观,结果也可以。(2018年7月2日我已经向这个文章的4个作者发送了需求邮件,希望能够提供数据或者可执行文件,其通讯作者回复了我,因其第一作者早已毕业,实验室没有存储这个结果,因此无法提供这个文章的数据,所以,自己动手丰衣足食。)因无法向原作者索要到源码与数据集对应的数据,所以只能是通过阅读文献来理解其思想,并总结其优缺点。

〇 摘要部分

    许多传统椭圆检测算法使用5个点实现椭圆检测,但是在候选边缘的随机选择需要大量的冗余计算。为了搜索具有最小点数的椭圆,本文使用椭圆的标准和微分方程,仅使用三个点即可拟合出一个椭圆,每个点都应该具有位置和方向角(Sobel计算方向)信息。

    本文算法核心的计算步骤如下:①划分边缘,将边缘点划分为8组;②使用聚类来找出几个椭圆参数空间中的突出候选;

    看完摘要,我产生了几个问题:

    (1)三个点是如何拟合椭圆的,与5点拟合椭圆的精度差异如何;

    (2)如何划分边缘点;

    (3)如何聚类得到椭圆。

一 介绍

    椭圆检测算法介绍部分主要就是从三个部分进行说明:应用,相关研究,算法的提出。本文提出椭圆检测目前的需求是快速准确计算,这个快速要求达到实时性,椭圆算法逐渐转向嵌入式开发。

    应用:面部检测、头部姿态估计、嘴部跟踪、机器人导航、眼睛/虹膜跟踪。

   相关研究:论文介绍不多,详细部分参考之前的博客《A fast and robust ellipse detector based on top-down least-square fitting》

    算法流程与基于边缘连接的算法十分相似,参考下面目录即可了解算法流程。这里说下论文的主要创新点:

    (1)我们生成了8个方向的圆弧,并将三点法应用到弧段上。传统的三点算法估计从点到点计算来估计中心点,而我们使用弧段到弧段计算来减少计算时间。

    (2)在计算和评估椭圆中心点之前,使用一个新的代数约束来预先检查三个潜在的选择点,这个代数约束使用了椭圆的微分方程。在这个处理过程下,复杂背景下的候选弧段的范围可以大幅度减少。

    根据作者说的创新点,我又产生了新的疑问:

    (4)点到点估计和弧段到弧段的估计差距是什么;

    (5)怎么进行预先检查,为什么会可以大幅度减少候选弧段的范围。

二 弧段检测

    首先使用自适应Canny检测边缘,每个边缘点由以下三个元素组成。然后根据每个边缘点的方向角将每个边缘归类到8组方向中,然后在每组中提取出相连的弧段,也就是连接边缘点。最终得到8个方向的边缘线组。


    这里需要注意的参数有:提取的弧段长度小于Th_length=6的将会被丢弃。

    个人认为,在椭圆检测中,应该尽可能少的去分割弧段,大量的弧段分割会导致出现多个虚假椭圆,而这些虚假椭圆可能也恰好满足验证。虽然这种分割方法给弧段组合添加了许多便利,但是也增加许多错误椭圆的风险。除此之外,椭圆检测的难度不是去检测完整椭圆,而是残缺椭圆和小椭圆,残缺椭圆不多说,小椭圆会因为噪声问题被分割多段,如果此时再这个8个方向上进行进一步分割,很容易导致这些边缘被认为是噪声边缘而被扔掉,导致召回率Recall变低。

三 弧段分类

    作者选择3个不同组的弧段作为一个候选组合。作者认为越紧凑的弧段误差越大,例如,1,2组弧段被认为举例较近。因此一共有16种组合,这些组合如下所示。

(1,3,5) (1,3,6) (1,3,7) (1,4,6) (1,4,7) (1,5,7) 
(2,4,6) (2,4,7) (2,4,8) (2,5,7) (2,5,8) (2,6,8)
(3,5,7) (3,5,8) (3,6,8) (4,6,8)

3.1 象限约束

很显然,这16组的每一组都有个象限(象限只有4个,上述的8组指的是方向不是象限)不存在弧段。如下图所示,假设选择出一个弧段组合,这个组合对应的组标签为(1,4,6)。如果这个组合属于同一个椭圆则,相对于其他弧段是最高的,相对于其他弧段是最左的,是最下方的,基于这些可以判断组合是否有效。对于另一种例子,因为其不属于这16组的任何一组,因此这种组合被抛弃。


    象限约束可以快速的丢弃掉大量的无用弧段组合,理论上,只要目标出现超过一半,就会存在一个三元组组合,然后就可以拟合这个组合得到最终的椭圆参数。

3.2 代数约束

    常规的椭圆拟合只是使用了边缘点的像素信息,而这个文章又使用了梯度信息。则得到下述等式方程组。5个参数,3个点可以构造6个等式,即3个点即可以进行拟合出未知参数A,B,C,D,E。进而可以求出椭圆的中心点坐标(中心点推导细节看论文)。


    每个组合都可以抽出3个点拟合出中心点,随机抽出一部分点进行拟合,可以得到一组中心点,理论上,同一个椭圆的中心点应该重合在一起,下图(b)(c)(d)图都是具有误差的组合,很明显,越不可能是一个椭圆的组合,中心点分布越发散。论文使用方差作为发散程度的衡量,大于设定的阈值0.3则认为这个组合不可能来自同一个椭圆。


四 椭圆检测

    虽然前面两个条件(象限约束和代数约束)可以减少大部分假边和弧段,剩下的弧段仍然存在一些错误弧段和噪声边缘。因此,这节提出了一种通过引入几何中心计算和中心坐标的均值偏移聚类来找到更突出和更强的边和弧的方法。

4.1 几何中心

    作者使用椭圆的几何性质来使用三个点去估计椭圆中心点,作者证明的性质就是:椭圆上任意两点的中点与其切线交点的连线过椭圆中心点。其中使用了三个点对应的梯度(猜测是用Sobel估计的),最后推导出中心点公式(个人觉得这个公式有个小问题,应该为,如果有人需要推导的话我再完整的推导下)。


    这里我有点不明白的地方就是,三个点因为误差的存在不可能同时交于同一个点,实际上可能会出来三个交点,采用之前的拟合方法同样也能得到中心点,为什么要这样处理(可能是在研究过程中发现这个性质,但舍不得放弃,所以放上去吧,而且这个方法计算速度肯定比拟合的方法要快得多)。

4.2 中心点估计

    尽管边缘点的位置在图像中具有高可靠性,但是边缘点对应的方向可能会包含一些误差,则此时几何中心将转移到理论中心点附近。如果使用严格的几何中心,三个交点应该彼此重合。一个弧段组合理论上会得到个候选中心点,这些中心点会呈现一种分布。实际上,高密度区域就是对应的中心点,因此采用一个聚类算法能够找到一个正确椭圆。

    作者使用mean-shift算法来得到局部密度最大区域,进而去估计中心点。下图就是聚类的一个例子,一个弧段组合产生一个中心点,根据前面的椭圆几何性质计算出多个中心点,图(b)。图(c)就是使用mean-shift得到的聚类中心点,最终得到估计的椭圆。


    其中细节的处理方式文章没写,但是主体原理是很清楚,真实椭圆中心点附近会产生大量的候选中心点,最后采用mean-shift的方法获得局部密度最大(mean-shift是经典的算法,opencv等库函数都有实现,这里不细讲了),这个聚类思想我认为非常好,但正如我前面说的,我认为椭圆检测最大的难点在于如何组合属于同一个椭圆的弧段,而在前面的弧段检测过程中,很多可以连接在一起的弧段被分割开,导致弧段变多,增加组合难度。而且,论文使用了点的梯度信息,实际上边缘点的梯度精度误差很大,是否真的能够起到提高精度的作用,我就不清楚了(多点拟合时候可能会有帮助,毕竟整体上是大致正确的,这个需要我实际进行测试)。

4.3 椭圆拟合

    椭圆拟合是采用RANSAC方法得到。椭圆拟合算法也不少,这里不细说。由于少量的高可靠性的边缘点被使用,迭代次数非常小,并且处理时间可以被最小化(我认为这里应该不存在少量点拟合问题,我实际做实验时,一个弧段就好几十个边缘点),但是对于逼近这种问题,确实会出现少量点拟合问题,毕竟一个弧段用一组直线段表示,一个直线段就2个点。RANSAC具体拟合方法,后期有机会针对椭圆拟合单独说明。

    拟合出椭圆之后,还要看边缘图上有多少个边缘点落在这个椭圆上,如果属于当前椭圆的边缘点个数与椭圆周长的比值小于设定阈值(0.45),则认为这个椭圆是虚假椭圆。

    至此,椭圆检测算法的主体思想分析完事。下面针对实验分析问题。

五 实验

    验证准则,数据集都是公开的,都是类似的处理方式,这里只看实验结果。实验结果相对可以,对于Fornaciari仍然有所差距,这两个算法相差不大。我觉得原因就在于其将本来很显然属于同一个椭圆的弧段分割的太多了,导致丢失结果或者产生较多虚假椭圆。

    关于实验结果数据,我发现同一个算法,同一个数据集,衡量精度结果都不一样,我实在想不通这点,有可能是部分图片用于调参,剩下的用于测试,调参的图片选择都不相同,所以每个人的结果也不一样(我个人猜测的,论文这些细节也没写)。


    我们看下实际结果,结果可以接受,但是很显然,这个算法对于小椭圆的处理效果不理想,很大关系与前面的弧段检测有关。


六 总结(个人想法)

    关于椭圆检测这个领域,虽然算是较冷的方向,但是我觉得在高精度工业领域还是有很大的应用的,如果从工业研究的角度考虑,主要要解决的是其计算效率的问题,Hough变换在工业中非常经典,其在DSP上的移植效果也非常好,主要原因就在其具有很强的并行性,尽管计算多,但是我可以采用流水线并行的方式去解决。相反,基于边缘链接的这些算法,尽管其表现良好,但是其并行性不强,移植难度大。所以,如果能将这类算法设计成具有高度并行性,一定有很大的价值。

    从学术的角度分析,椭圆检测目前大部分还是基于几何性质来进行的,使用机器学习或深度学习可能也能解决,但我觉得纯网络效果肯定不如这些算法,神经网络像是一种模糊的识别,而这些算法都是基于椭圆的几何性质,具有很强的检测目的。但是,在弧段组合部分,可以考虑使用机器学习算法,弧段组合这部分,模糊的想法很多,可以一试。

    挖掘新的几何性质去检测椭圆我觉得意义不大而且很难,重点要定位在如何去组合椭圆,即组合属于同一个椭圆的弧段,如果解决了这个问题,那么这个领域也快成熟了。

    针对具体问题的椭圆检测大部分算法效果都已经很好了,对于简单的工业问题,很轻松就可以直接拿来用。目前还在研究椭圆的原因,就是希望其能够适应各种复杂环境,想办法把各种经验信息融合在算法中,成为一个完美的算法。

    这篇文章就分析到这里,如果有谁想复现这个文章,欢迎一起讨论(代码就是要不到,蓝瘦T^T)。

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV是一个开源的计算机视觉库,提供了很多强大的图像处理和计算机视觉算法。肤色检测是其中的一个常用功能,可以用于人脸识别、人体姿态识别等领域。而椭圆检测则是肤色检测中常用的一种方法,通过在HSV颜色空间中设定一个范围,筛选出肤色区域,并通过椭圆拟合来得到肤色区域的轮廓。 具体实现方法可以分为以下几步: 1. 将图像转换为HSV颜色空间; 2. 设定肤色范围,筛选出肤色区域; 3. 对肤色区域进行形态学处理,去除噪点; 4. 通过椭圆拟合得到肤色区域的轮廓。 以下是一些参考代码,供您参考: ``` import cv2 import numpy as np # 读入图像 img = cv2.imread('test.jpg') # 转换为HSV颜色空间 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 设定肤色范围 lower_skin = np.array([0, 20, 70], dtype=np.uint8) upper_skin = np.array([20, 255, 255], dtype=np.uint8) # 筛选出肤色区域 mask = cv2.inRange(hsv, lower_skin, upper_skin) # 形态学处理 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) mask = cv2.erode(mask, kernel, iterations=1) mask = cv2.dilate(mask, kernel, iterations=2) mask = cv2.erode(mask, kernel, iterations=1) # 椭圆拟合 contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for cnt in contours: if len(cnt) > 5: ellipse = cv2.fitEllipse(cnt) cv2.ellipse(img, ellipse, (0, 255, 0), 2) # 显示结果 cv2.imshow('result', img) cv2.waitKey(0) cv2.destroyAllWindows() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值