这篇论文全名叫Effective ellipse detection method in limited-performance embedded system for aerospace application,一种适用于航天应用的高性能嵌入式椭圆检测方法。这篇论文发表在Advances in Mechanical Engineering 是4区的SCI。这篇论文主要是将椭圆检测应用于航天,针对航天问题专门做的椭圆检测,下面对其进行进一步分析。
这次阅读,主要是分析其与传统方法不一样的地方,即分析这篇论文针对航天部分主要改进了那些地方,其他常见的方法不具体细说,查阅之前论文即可读明白
航天问题主要难点是:受限的计算性能和内存资源,这篇论文在保证精度和速度的前提下解决这个问题。
论文使用了FPGA A3PE1500-FG676 Actel和DSP TMS320C6672 TI结合着实现了这个算法,这个算法与之前一样,是基于边缘连接的方法。
这部分主要是检测边缘,提取边缘线。与传统方法不同的是,这里用了加速边缘提取的方法,如果嵌入式需要加速,直接阅读其论文即可,这里仅仅是加速,因此不细致分析了(有需要应用嵌入式加速的话在评论区告诉我,我会给补上,方法不是很难)。
在复现时候,建议使用matlab里的canny进行边缘提取,有两点好处,第一,噪声少,第二,sobel梯度平滑,不会有太多的噪声。
提取的边缘满足两个性质:
这部分与传统方法不同的是,这里没有利用多边形逼近算法来近似其曲率信息,其使用sobel角度变换程度来判断分割点。
e 3 = ( p 1 , p 2 , . . , p n ) e^3 = (p_1,p_2,..,p_n) e3=(p1,p2,..,pn)为提取出的一条边缘点, θ = ( θ 1 , θ 2 , . . . , θ n ) \theta = (\theta_1,\theta_2,...,\theta_n) θ=(θ1,θ2,...,θn)为期对应的sobel梯度。 G = ( g 1 , g 2 , . . , g n ) G=(g_1,g_2,..,g_n) G=(g1,g2,..,gn)为对应的梯度变化率,其计算方式为 g i = θ i + 1 − θ i g_i = \theta_{i+1}-\theta_{i} gi=θi+1−θi。
值得注意的是,在这里计算 g i g_i gi没有完全写清楚,在相减之后,一定要将梯度再进行角度处理,防止出现大于180°的角度变量量。
每个弧段的极大值 S = ( s 1 , s 2 , . . . , s n − 1 ) S=(s_1,s_2,...,s_{n-1}) S=(s1,s2,...,sn−1)计算方式如下所示:
s i = { 1 ( g i > g i − 1 a n d g i > g i + 1 ) a n d ∣ g i − g i − 1 ∣ > T h 3 0 o t h e r w i s e s_i = \left\{\begin{array}{ll}1 & (g_i>g_{i-1} ~and ~g_i>g_{i+1}) ~and~|g_i-g_{i-1}|>Th_3\\ 0 & otherwise \end{array}\right. si={ 10(gi>gi−1 and gi>gi+1) and ∣gi−gi−1∣>Th3otherwise
分割出来的弧段仍然需要满足上述提取边缘时候给出的两个准则,即个数大于阈值 T h 1 Th_1 Th1,中点到起始点对应的直线的距离小于 T h 2 Th_2 Th2。两个弧段是否可以组合需要需要满足三个条件,这些条件将会在下一节进行说明(我怎么感觉这个论文的结构有问题,(/ω\))。
任意两个弧段组合需要满足三个条件。
条件1: 条件1的说明可以具体看下面这张图,针对于航天目标来说,很少出现同一个椭圆其梯度差异很大的情况,因此作者认为两个弧段的组合其梯度应具有相似性。这也是与常规方法不同的地方。
对于一个弧段 e i 4 e^4_i ei4,设其首尾点,弧段中点为 p 1 , p n , p n / 2 p_1,p_n,p_{n/2} p1,pn,pn/2。从 p 1 , p n p_1,p_n p1,pn中点到 p n / 2 p_{n/2} pn/2构成向量 v v v,同时在点 p n / 2 p_{n/2} pn/2处的梯度为 θ n / 2 \theta_{n/2} θn/2,那么这个弧段按照如下公式进行标记。
D e i 4 = { − i f 3 π 2 > ∣ θ v − θ n / 2 ∣ > π 2 + o t h e r w i s e D_{e^4_i}=\left\{\begin{array}{ll} - & if ~ \dfrac{3\pi}{2}>|\theta_{v}-\theta_{n/2}|>\dfrac{\pi}{2}\\ + & otherwise \end{array}\right. Dei4={ −+if 23π>∣θv−θn/2∣>2πotherwise
如果两个边缘弧段 l i 4 , l j 4 l^4_i,l^4_j li4,lj4可以组合,那么其应满足 D l i 4 D l j 4 > 0 D_{l^4_i}D_{l^4_j}>0 Dli4Dlj4>0,否则不能组合。
条件2: 这个条件主要是判断两个弧段的位置关系,对于弧段 e i e_i ei,根据其首尾点可以计算出一条直线 l i : f ( x ) = a x + b y + c = 0 , a ⩾ 0 l_i:f(x) = ax+by+c = 0,a\geqslant 0 li:f(x)=ax+by+c=0,a⩾0。
先计算弧段 i i i的凹凸性,根据弧段 i i i的中点 p n / 2 p_{n/2} pn/2带入 f ( x ) f(x) f(x),根据其符号,记录 R l i e i R^{e_i}_{l_i} Rliei,同理 R l j e j R^{e_j}_{l_j} Rljej为一样的含义。
R l i e i = { + i f f ( p n / 2 ) > 0 − o t h e r w i s e R^{e_i}_{l_i}=\left\{\begin{array}{ll}+ & if ~ f(p_{n/2})>0 \\ - & otherwise\end{array}\right. Rliei={ +−if f(pn/2)>0otherwise
其次是要计算 R l j e i R^{e_i}_{l_j} Rljei,这个表示弧段 j j j与直线的关系(这里 R l j e i R^{e_i}_{l_j} Rljei我认为默认为0,毕竟下面这个公式有阈值覆盖不到的区域)。统计在弧段 e j e_j ej上所有的点 p j p_j pj, f p j ⩾ 0 f_{p_j} \geqslant 0 fpj⩾0的个数 F i + F^+_i Fi+,同理得到 f p j < 0 f_{p_j} < 0 fpj<0的个数 F i − F^-_i Fi−。然后根据下面这个公式来计算:
R l i e j = { + i f F i − F i + < T h 4 − i f F i + F i − < T h 4 R^{e_j}_{l_i}=\left\{\begin{array}{ll}+ & if ~ \dfrac{F^-_i}{F^+_i}<Th_4\\ - & if~ \dfrac{F^+_i}{F^-_i}<Th_4\end{array}\right. Rliej=⎩⎪⎪⎨⎪⎪⎧+−if Fi+Fi−<Th4if Fi−Fi+<Th4
这样,如果 R l i e i R l i e j < 0 a n d R l j e i R l j e j < 0 R^{e_i}_{l_i}R^{e_j}_{l_i}<0 ~and~ R^{e_i}_{l_j}R^{e_j}_{l_j}<0 RlieiRliej<0 and RljeiRljej<0,则可以认为这两个弧段可以组合,否则无法组合。
其实这样是有瑕疵的,因为对于情况, T h 4 < F i − F i + < 1 T h 4 Th_4<\dfrac{F^-_i}{F^+_i}<\dfrac{1}{Th_4} Th4<Fi+Fi−<Th41是没有标记结果的,为了完整起见,对这种情况,我自己补充标记为0
条件3: 对这两个弧段进行拟合,拟合误差按照如下定义:
e r r = 1 − n N err=1-\dfrac{n}{N} err=1−Nn
这里的support定义不是很明确,个人理解就是 N N N为这两个弧段参与拟合的个数, n n n参与拟合的像素中,在拟合出椭圆上的个数。如果 e r r < T h 5 err<Th_5 err<Th5,则认为这个组合有效,否则无效。
那么如何判定当前像素点是否在椭圆上,作者并没有给出,我阅读其参考的文献,其参考的《Edge curvature and convexity based ellipse detection method》给出了判断像素点是否在椭圆上的准则,即, d d d为像素点到椭圆的距离,如果 d < d 0 , d 0 = 2 d<d_0,d_0=2 d<d0,d0=2,那么认为这个像素点在椭圆上。在论文《Fitting Multiple Connected Ellipses to an Image Silhouette Hierarchically》中,作者给出了一种计算点到椭圆距离的一种方法。给定一个椭圆,其中心点为 ( 0 , 0 ) (0,0) (0,0),旋转角为0,定义测试点为 ( x i , y i ) (x_i,y_i) (xi,yi)。(对于那些检测出来的任意椭圆,可以经过旋转平移得到当前准则下的椭圆)
d ( e l l i p s e , ( x i , y i ) ) = { d 1 , i f ( x i , y i ) i s i n s i d e o f e l l i p s e d 2 , i f ( x i , y i ) i s o u t s i d e o f e l l i p s e d(ellipse, (x_i,y_i)) = \left\{\begin{array}{ll}d_1, & if~(x_i,y_i)~is~inside~of~ellipse\\d_2, & if~(x_i,y_i)~is~outside~of~ellipse \end{array}\right. d(ellipse,(xi,yi))={ d1,d2,if (xi,yi) is inside of ellipseif (xi,yi) is outside of ellipse
其中 d 1 , d 2 d_1,d_2 d1,d2的定义如下所示, r r r为椭圆的半短轴。
d 1 ( x i , y i ) = r ( 1 − ( x i a ) 2 + ( y i b ) 2 ) d_1(x_i,y_i) = r\left(1-\sqrt{\left(\dfrac{x_i}{a}\right)^2 + \left(\dfrac{y_i}{b}\right)^2}\right) d1(xi,yi)=r(1−(axi)2+(byi)2)
d 2 ( x i , y i ) = x i 2 + y i 2 ( 1 − 1 ( x i a ) 2 + ( y i b ) 2 ) d_2(x_i,y_i)=\sqrt{x_i^2+y_i^2}\left(1-\dfrac{1}{\sqrt{\left(\dfrac{x_i}{a}\right)^2 + \left(\dfrac{y_i}{b}\right)^2}}\right) d2(xi,yi)=xi2+yi2⎝⎜⎜⎛1−(axi)2+(byi)21⎠⎟⎟⎞
下面给出这个计算方法的Matlab代码,其实经过实验表明这个公式几乎等价为采样点与椭圆中心点连线与椭圆的交点与这个采样点的距离。后期有空对其进行推导,这里的椭圆旋转角为逆时针旋转。(这里转成C++也很容易,有需要我再放上C++代码)
clc;clear;close all;
% 计算点到椭圆的近似最小距离
% 中心点,长短轴,旋转角
elp = [0,0,200,100,pi/3];
test_p = [135,100];
% 对向量进行旋转,使其满足椭圆旋转角为0
v = test_p - elp(1:2);
a = elp(3); b = elp(4); theta = elp(5);
R = [cos(theta), -sin(theta); sin(theta), cos(theta)]; % P* = R * P逆时针变换矩阵
origin_p = v * R;
inOrout = 0; % 0 点在椭圆内,1在外
err = origin_p(1)^2/a^2 + origin_p(2)^2/b^2;
if err > 1
inOrout = 1;
end
if inOrout == 1
dist = norm(v) * (1 - 1/sqrt(err));
else
dist = b * (1 - sqrt(err));
end
下图是在 E 4 E^4 E4中组合属于同一个椭圆的边缘段,这里 E 4 E^4 E4分割后得到的候选椭圆边缘弧段。思想理解起来就是先将一个弧段 e i e_i ei放进 S α S_\alpha Sα,然后判断其他所有的弧段是否可以与 S α S_\alpha Sα组合,如果可以组合,那就放进去,如此循环,最后得到一个 S α S_\alpha Sα。
重要关注: 在这个算法里面, ( S α , e j ) s a t i s f y p a i r g r o u p i n g s t r a t e g y (S_\alpha,e_j) ~~satisfy ~~pair ~~grouping ~~strategy (Sα,ej) satisfy pair grouping strategy说的非常模糊,个人认为应该是验证 e j e_j ej与 S α S_\alpha Sα里面每个弧段均两两验证是否满足pair gouping strategy,而不是将 S α S_\alpha Sα看做是一个弧段,如果这样的话,条件1,条件2很难实现,而且弧段顺序问题很难解决。更关键的是,论文后面还有句话,最终,对每个 S i 5 S^5_i Si5可以使用最小二乘拟合得到最终结果,如果真是把 S α S_\alpha Sα看成一个轮廓的话,直接在算法里面就可以得到最终结果,无需finally。
所以,这样存在一个问题:假设 S α = { s 1 , s 2 } S_\alpha=\{s_1,s_2\} Sα={ s1,s2},验证 s 3 s_3 s3是否在 S α S_\alpha Sα里面,有可能出现, s 1 , s 3 s_1,s_3 s1,s3满足条件, s 2 , s 3 s_2,s_3 s2,s3满足条件,但是 s 1 , s 2 , s 3 s_1,s_2,s_3 s1,s2,s3拟合后误差会很大。 这可能也是这个论文的缺点吧。而且,对于没有组合的弧段是如何处理的并没有说,这个我会在后期复现时候解决。
作者一共使用了2个数据集,一个为Prasad数据集,另一个是自己做的模型数据集。
T h 1 Th_1 Th1:曲线最短长度,数据集1设置为32,第二个设置为10.
T h 2 Th_2 Th2:判定弧段是否为直线阈值,设置为2
T h 3 Th_3 Th3:梯度变化率,设置为10°
T h 4 Th_4 Th4:条件2阈值,设置为0.1
T h 5 Th_5 Th5:拟合误差阈值,设置为0.05.
从结果上看,论文效果不错,用了很简单的方法做了椭圆检测,目前在组合时候对椭圆的最终处理我目前存有疑问,论文没说清楚,我会在这两天对其进行复现,对其细节进行更加细致的分析。