Accurate Subpixel Edge Location based on Partial Area Effect
基于区块面积的精确亚像素边缘定位
部分翻译一下,加深理解
文章翻译
摘要
本文介绍了一种新的边缘检测器。它基于从区块面积推导出的边缘和采集模型,并且不假设图像值是连续的。该方法的主要目标在于实现边缘的位置、方向、曲率和对比度的高精度提取,即使在困难的条件下,例如有噪声的图像、模糊的边缘、低对比度区域或非常接近的轮廓。为此,我们首先分析了区域内完美的直边或圆边的影响,这样,当满足这些条件时,可以准确地确定特征。之后,我们将它扩展到更现实的情况,考虑如何处理不利条件,并提出一个迭代方案来改善结果。
Introduction
亚像素检测技术可以分为三类:基于矩的、基于最小二乘误差和基于插值的。
从理论角度来看,我们提出的方法与标准技术的不同之处在于对图像采集模型所做的假设,因此也在于搜索边缘的方式。我们不采用基于图像连续信号假设的最大梯度或过零点,而是假设存在边缘的信号是不连续的。我们的算法试图精确定位该边缘,假设图像值的采集过程产生了区块面积效应。在真实图像的情况下,在像素值满足这个假设的程度上,我们的算法结果会更准确。在几个真实实验中获得的结果将表明该假设在大多数情况下是有效的,实现了边缘参数的高精度提取。由于这个原因,这种新方法不能准确地分类为上述三个类别中的任何一个。
在第二章中,我们引入了一个非连续图像采集模型作为初始假设,并分析了使用传统梯度计算时的误差。第3章中,处理最简单的情况。随后几章,处理复杂情况。第4章,处理低噪声图像,并概括了在这些情况下应用它的方法。第5章,当在相同区块中有多个相邻的边缘时,我们处理了这种复杂的情况,并使该方法在这些情况下正常工作。在第6章,我们处理了高噪声图像,并提出一种恢复算法,来增强图像质量和保证获得特征的精度。最后,实验比较,及总结。
基于区块面积的图像采集模型
这里采用了一个假设,有边缘穿过的像素,它的能量值是基于它面积的加权均值。
F
i
,
j
=
A
S
A
+
B
S
B
h
2
F_{i,j} = \frac{AS_A+BS_B}{h^2}
Fi,j=h2ASA+BSB
F
i
,
j
F_{i,j}
Fi,j有边缘的像素的能量值;
A
A
A和
B
B
B是边缘两侧平坦区的能量值;
S
A
S_A
SA和
S
B
S_B
SB是像素块被边缘划分的面积;
h
h
h是像素边的长度,面积公式
h
2
=
S
A
+
S
B
h^2=S_A+S_B
h2=SA+SB。
大多数方法都会计算每个像素的梯度值。也就是x和y方向的偏导数,梯度值是
d
x
2
+
d
y
2
\sqrt{\textup{d}x^2+\textup{d}y^2}
dx2+dy2,通常为了方便计算用L-1范数代替。Sobel和Prewit算子就是用的这个。然而,利用这些梯度估计,既不能获得边缘方向的精确值,也不能获得两侧的强度变化。
传统梯度计算的误差分析
对梯度算子进行了分析,说明其表达的方向和强度差异都是不准确的。
单个边的时候,最简单的情况
一条边将图像划分为两个部分。关心如何获得高精度的亚像素位置、方向、曲率和两边的能量变化。
一阶情况
也就是边缘是线模型,
y
=
a
+
b
x
y=a+bx
y=a+bx。这里采用了
5
×
3
5\times3
5×3的窗口。因为3列对于的三个公式,足可以用于求解一阶和二阶的参数。5行为了增加能量采样,有利于求解的精度。这个值可以加大,文章后面当滤波使边缘变宽时使用了9行。
F
(
i
,
j
)
=
A
S
A
+
B
(
1
−
S
A
)
h
2
=
B
+
A
−
B
h
2
P
i
,
j
F(i,j) = \frac{AS_A+B (1-S_{A})}{h^2} = B + \frac{A-B}{h^2}P_{i,j}
F(i,j)=h2ASA+B(1−SA)=B+h2A−BPi,j
P
i
,
j
=
S
A
P_{i,j}=S_A
Pi,j=SA。下面是计算每列的能量和,每个像素的能量是已知的,这里给出的是它们和的计算模型:
L
,
M
,
R
L,M,R
L,M,R分别表示有边缘通过的像素的下部分区域的面积。表达式
因为线的坐标原点在像素块的中心,所以上式就是积分求面积公式。将公式3带入到能量公式就可以得到直线的参数。
A
,
B
A,B
A,B的值,在代码中是采用了角上两个像素能量值的平均。
if m > 0:
AA = (GG[edge + m2] + GG[edge + rows + r2]) / 2
BB = (GG[edge - rows + l1] + GG[edge + m1]) / 2
else:
AA = (GG[edge - rows + l2] + GG[edge + m2]) / 2
BB = (GG[edge + m1] + GG[edge + rows + r1]) / 2
然后是计算亚像素位置,这个就很简单了,直线与坐标轴的交点就是。x方向时, ( 0 , a ) (0,a) (0,a),亚像素坐标是 ( x i , y j − a ) (x_i, y_j - a) (xi,yj−a); y方向时, ( a , 0 ) (a,0) (a,0),亚像素坐标是 ( x i − a , y j ) (x_i - a, y_j) (xi−a,yj)。对每个像素会分析边缘划分的状态,窗口有时取x方向,有时取y方向,后面会做介绍。
法向量计算:
法向量的幅值是边缘两边精确的能量变化。
二阶情况
与一阶时差不多,区别是像素块的求面积换成了二次曲线方程。构造的方程都是一次的,所以很容易解出二次方程的系数。
曲率的计算:
亚像素位置,与一阶时相同。
概括到所有的情况
主要是根据边缘两侧的能量分布状态,判断符号。也就是,x方向占优,还是y方向占优。
根据边缘点处的梯度值的幅值和符号来判断。并且,通过梯度阈值,可以直接提取边缘点,再用提到的方法。
例子
一些例子证明了方法的精度非常好。但是仍需要满足一些条件:
- 边缘可以近似为二阶曲线
- 在这个窗口中没有其他的边
- 边两侧的能量是均匀的
当窗口能有微小的高曲率的边时,这种方法就很难处理了。现实图像这种情况比较多。标定场景下,上述简单的情况是比较多的,可以用这种方法。
低噪声情况下
分析了高斯平滑算子带来的一些问题,主要是过渡区域的像素增多了。窗口也适当增大了。程序中最大到9。
while m1 > -4 and np.abs(Gx[edge + m1 * rows]) >= np.abs(Gx[edge + (m1 - 1) * rows]):
m1 = m1 - 1
while m2 < 4 and np.abs(Gx[edge + m2 * rows]) >= np.abs(Gx[edge + (m2 + 1) * rows]):
m2 = m2 + 1
很近的边
同一个窗口中有很近的边,那么会调整窗口的大小,如上述代码。根据梯度幅值。
高噪声情况下
迭代恢复算法的思想和各向异性滤波相同,即保留并增强边缘,平滑其他区域。首先用3x3的掩膜平滑图像。之后,用上述边缘检测器检测边缘,对每个边缘像素估计它的边缘特征,这里用到它邻域的信息。
也就是,用上述边缘估计方法,同时估计相邻的两个边缘点的特征。三个估计的窗口,叠加在一起。