EDLines文章阅读笔记


  1. 边缘检测 Edge Drawing
  2. 线段提取
  3. 直线有效性检验
  4. 内部参数设定

[2011] EDLines: A real-time line segment detector with a false detection control.
以下为本篇文章的阅读笔记。

这篇文章的综述部分写的非常漂亮,有时间一定要翻译一下。

EDLines的基本结构分为以下三部分:

  1. 输入灰度图,利用 Edge Drawing (ED) 算法进行提取,输出干净、连续的像素链,又称为边缘段 (edge segments)。边缘段对应于对象边界;
  2. 利用最小二乘法从像素链中根据直线度准则提取线段;
  3. 用 Desolneux 等提出的 Helmholtz Principle 来消除线段误检。

1. 边缘检测 Edge Drawing

ED 算法的优势:其他边缘检测器将二值边缘图像作为输出,且被检测到的边缘像素通常是不相关、不连通、不连续的实体,以至于需要更进一步生成潜在的对象边界。ED算法的输出为干净、连续的像素链 (同时也是连通的对象边界),且运行速度较快。

算法流程

给定一个灰度图,ED 算法执行边缘检测进行如下四步输出边缘段 (edge segments):

  1. 首先将图像经过一个滤波,例如高斯滤波,来抑制图像噪声并对图像进行平滑处理。这里使用的是 \(5\times 5\) 的高斯核,且参数默认值为 \(\sigma = 1\)
  2. 计算平滑后图像每一个像素点的梯度强度和方向。这里可用已知的 Prewitt, Sobel, Scharr 等梯度算子。
  3. 利用 step 2 得到的平滑图像计算被称为锚点 (anchors) 的像素点集合。锚点对应梯度算子产生最大值的像素点,这些像素点也是大概率会成为边缘部分 (edge elements) 的像素点。
  4. 对 step 3 中得到的锚点进行连线,从而画出边缘。具体过程:从一个锚点出发,ED 利用邻居像素的梯度强度和方向,通过搜索梯度最大值走向下一个锚点,完成连线。

ED 算法的输入与阶段输出:(a) 包含四个长方形的灰度图, (b) 梯度地图, (c) 锚点, (d) 最后的边缘图。

接下来就是线段提取部分,即,分离这些像素链并拟合出直线段。

2. 线段提取

线段提取的基本思想是:依次经过像素格,并用最小二乘线拟合方法拟合出线段,直到误差超过特定阈值,例如一个像素,并输出提取线段。然后用算法迭代处理像素链上的剩余像素直到所有的像素都拟合完成。

线段提取算法可以被划分为如下几个阶段:

  1. 第一个 while 循环:用最小二乘生成一个最小长度的初始线段。其中的 最小线段长度依赖于直线有效性参数,将会在直线有效性部分进行解释;
  2. 第二个 while 循环:通过添加像素延展初始线段。具体做法:检查像素链剩余像素到拟合直线的距离,如果距离小于一定阈值,例如一个像素,就将像素加入到当前线段。直到出现拐点并且线段的方向发生变化;
  3. 输出当前线段,并对剩余像素进行迭代提取。
LineFit(Pixel *pixelChain, int noPixels){
double lineFitError = INFINITY; // 目前的直线拟合误差
LineEquation lineEquation; // y = ax + b 或者 x = ay + b

while (noPixels > MIN_LINE_LENGTH){
	LeastSquaresLineFit(pixelChain, MIN_LINE_LENGTH, &lineEquation, &lineFitError);
	if (lineFitError <= 1.0) break; // OK. 一个初始线段被检测到。
	pixelChain ++; //跳过第一个像素并尝试剩下的像素
	noPixels–; // 少一个像素
} // end-while

if (lineFitError > 1.0) return; //没有初始线段, Done.

//一个初始线段被检测到,尝试延展这个线段。
int lineLen = MIN_LINE_LENGTH;
while (lineLen < noPixels){
	double d = ComputePointDistance2Line(lineEquation,
	pixelChain[lineLen]);
	if (d > 1.0) break;
	lineLen++;
} //end-while

// 当前线段结束。计算最后的直线方程并输出。
LeastSquaresLineFit(pixelChain, lineLen, &lineEquation);
Output ‘‘lineEquation’’

// 从剩余像素中提取线段
LineFit(pixelChain + lineLen, noPixels-lineLen);
} //end-LineFit
从像素链中提取线段算法

3. 直线有效性检验

Helmholtz principle: 对于一个有感知意义的结构而言,它偶然出现的期望值(组合或是格式塔)一定是很低的。也即,被检测到的对象是作为背景模型的外点而存在的。

Number of False Alarms (NFA):根据 Helmholtz principle,直线段的 NFA 定义如下。假设 \(A\) 是一个长度为 \(n\) ,并在尺寸为 \(N \times N\) 像素的图像中拥有至少 \(k\) 个与之方向对齐的点,那么有

\[\text{NFA}(n, k)=N^{4} \cdot \sum_{i=k}^{n}\left(\begin{array}{l}n \\ i\end{array}\right) p^{i}(1-p)^{n-i}. \]

其中 \(N^{4}\) 代表 \(N \times N\) 图像中潜在线段的个数。概率 \(p\) 代表了直线方向的准确性,它的取值会在参数部分提及。如果一条线段的 NFA 满足 \(\text{NFA}(n, k) \leqslant \varepsilon\),我们就称之为具有 \(\varepsilon\) 意义的线段。

基于以上定义,我们给出线段的有效性判定标准:

  1. 对于长度为 \(n\) 的线段,计算沿着线段的每一个像素的梯度角 (基于未平滑图像),由此得到方向对齐的像素点数量 \(k\)
  2. 计算 \(\text{NFA}(n, k)\),当 \(\text{NFA}(n, k) \leqslant 1\) (每张图像只会出现一次误检) 则认为该线段有效,否则认为线段无效。

直线有效性检验被是 EDLines 的最后一步,具有可选择性,如无必要可以省去。直线有效性检验往往会过滤掉短线段,而长线段因为与背景有较大偏差,通常都会被保留下来。同时这一步也可以选择其他快于 Helmholtz principle 的筛选原则以达到更实时提取线段的目的。

4. 内部参数设定

a. 像素点的梯度强度与方向计算;
b. 直线有效性参数:直线上方向对齐像素和准确度 \(p\) 的定义;
c. 梯度阈值、锚点阈值和扫描间隔;
d. 直线拟合参数:最小线段长度、最大均值平方直线拟合误差。

a. 像素点的梯度强度与方向计算

计算像素点的梯度方向与水平线角度时使用如下公式:

\[\begin{aligned} &g_{x}(x, y)=\frac{I(x+1, y)-I(x, y)+I(x+1, y+1)-I(x, y+1)}{2} \\ &g_{y}(x, y)=\frac{I(x, y+1)-I(x, y)+I(x+1, y+1)-I(x+1, y)}{2} \\ &g(x, y)=\sqrt{g_{x}(x, y)^{2}+g_{y}(x, y)^{2}}, \quad \operatorname{angle}(x, y)=\arctan \left(\frac{g_{x}(x, y)}{-g_{y}(x, y)}\right). \end{aligned} \]

其中 \(I(x, y)\) 为像素点 \((x, y)\) 的强度信息,\(g(x, y)\)为梯度强度,\(\operatorname{angle}(x, y)\) 为水平线角度。为什么要这样定义? 减少梯度计算的依赖性,尽可能保持像素的不相关的特点,从而在直线有效性检验时尽可能满足 Helmholtz principle。

b. 直线有效性参数:直线上方向对齐像素和准确度 \(p\) 的定义

当两个点 (或者线段) \(P\)\(Q\) 的角度相差不超过 \(\pi / n\) 时,我们认为 \(P\)\(Q\) 有相同方向, 也即以准确度 \(1 / n\) 对齐。LSD 等文献表明 \(n\) 不应该超过 8,因此将直线有效性检验的准确度 (计算 NFA 时用到) 设置为 \(p = 1/8 = 0.125\),即当点(或线段)满足角度差小于 \(\pi / 8 = 22.5^{\circ}\) 时我们认为它们具有方向对齐的性质。

c. 梯度阈值、锚点阈值和扫描间隔

  1. 梯度阈值 \(\rho\)ED 算法中,在锚点计算与连接步骤中,我们首先需要对梯度至小于阈值 \(\rho\) 的像素进行过滤。

\[\rho=\frac{2}{\sin (22.5)}=5.22. \]

  1. 锚点阈值 AT。接下来用带有锚点阈值 ( AT) 的 non-maximal suppression (非极大值抑制) 算法来计算锚点。传统非极大值抑制算法假设如果某像素梯度值大于等于梯度方向的邻居像素,那么该像素可以认为是边缘段的候选点。ED则考虑像素梯度超出梯度方向的邻居像素某一阈值 (AT) 的像素点作为候选点,这样能够提高候选点的质量,得到更为干净的边缘段没有锚点阈值最优解的理论基础,全靠经验来定。

  2. 扫描间隔 \(k\) 扫描间隔定义了算法筛选锚点的稀疏性,\(k = 1\) 则对每行每列的像素筛选锚点,\(k = 4\) 则对每 4 行每 4 列的像素筛选锚点。锚点筛选越稀疏,最后输出的边缘地图的细节就会越少。这里将 \(k\) 设置为 1。

d. 直线拟合参数

  1. 最小线段长度。 为了使得最短线段能够通过直线有效性判定,线段长度 \(n\) 需要满足 \(\text{NFA}(n, n)=N^{4} * p^{n} \leqslant 1\),即 \(n \geqslant \frac{-4 \log (N)}{\log (p)}\),其中 \(p = 0.125\) 。例如在 \(512\times 512\) 的图像中,最小线段长度为 12 个像素。

  2. 最大均值平方直线拟合误差。基于实验,选取误差为一个像素。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM