讲义地址:http://vision.stanford.edu/teaching/cs131_fall1718/files/06_ransac.pdf
本节内容可以看作是一种“自顶向下的介绍”。
用于边缘检测的一种模型匹配方法: random sample Consensus (RANSAC)
算法source:https://dl.acm.org/citation.cfm?id=358692
一方面,随着模型复杂度(参数个数)的增加,使用Hough transform在参数空间中拟合出一个模型将变得越来越慢;另一方面,在一个点集中,模型外点(如噪点或缺失点)将造成大量的误导。所以,引入RANSAC作为一种更加高效地解决定位问题(location determination problem,LDP)的模型拟合算法。
RANSAC的直觉解释是:主要基于外点引入的model不会得到大量内点的支持。
RANSAC算法:
维护一个(n,k,t,d)四元组,直到完成迭代。
其中:n-每拟合一个待测试模型M所需要的点的个数(直线通常为2,圆则是3);
k-迭代次数;
t-判断一个点是否满足前述模型M(记为“好点”和“坏点”)的阈值(如距离);
d-每次迭代中判定前述生成模型是“好的模型”所需要的“好点”个数。
在第k次迭代中:
随机均匀采样n个点;
由这n个点拟合出一个模型;
对于其他每一个点:用t筛选出“好点”
若得到至少d个“好点”,则用这至少d+n个点重新拟合模型M’,并计算拟合误差。把这k次迭代中拟合误差最小的M’作为最终结果。
举个例子:
有一个点集
随机sample2个点
这两个点拟合出1条直线
根据t区分“好点”7个,“坏点”8个。基于这7个点重新拟合,计算拟合误差。
新一轮迭代,随机sample2个点。
11个“好点”,4个“坏点”。基于这11个点重新拟合,该模型的拟合误差最小。做为最终结果返回。
可行性分析
假设待处理的点集中,真实最优模型“好点”所占总的点数的比率为
w
w
w,则采
n
n
n个点都是“好点”(意味着此次迭代能拟合出一个好的模型)的概率是
w
n
w^n
wn(私以为此处应当采用排列组合的方法计算,而不是简单粗暴地用幂,不过原论文中是用b来代替这个数而已,一个轻微的放大不影响结果的收敛性),
n
n
n个点中存在“坏点”(意味着此次迭代不能拟合出一个好的模型)的概率是
1
−
w
n
1-w^n
1−wn(记为
1
−
b
1-b
1−b)。计算迭代次数
k
k
k的期望(
E
(
k
)
=
1
b
E(k)=\dfrac{1}{b}
E(k)=b1)和标准差(
S
D
(
k
)
=
1
−
b
b
≈
1
b
=
E
(
k
)
SD(k)=\dfrac{\sqrt{1-b}}{b}\approx\dfrac{1}{b}=E(k)
SD(k)=b1−b≈b1=E(k))
前面说了,RANSAC不仅仅用在拟合直线上,其可以拟合的对象在part 2中做了说明-——
局部不变特征(local invariant feature)
通过前面提到的cross-correlation等全局表示来实现图像匹配通常是不切实际的如:
而通过局部的、突出的特征对图片进行描述和匹配,这种方法具有更强的鲁棒性。其算法如下:
1.在两幅图中分别获得一些“关键点”(key point);
2.在关键点周围定义一个“局部区域”(local region)
3.提取区域内容并归一化(如获得均值为0,方差为1 的像素直方图)
4.计算得到一个局部描述子(local descriptor)
5.从两幅图中匹配上述局部描述子
所以定义一个具有如下特征的、好的局部描述算法就很重要:
1.可重复性(repeatability):对象在不同的视角、光照下应当可被检测及比较。换而言之,算法应当在不同的亮度、噪声和平滑等处理下具体有鲁棒性;
2.局部性(locality):算法应当仅仅关注局部特性,以免受到遮挡部分的干扰;
3.数量(quantity)足够:要能获得足够多的特征来描述对象;
4.可分辨(distinctiveness):不同的区域要有一定的结构,可以分辨;
5.效率(efficiency):算法对新图片的实时执行效率应当有保证。
基于以上要求,本节介绍了Harris角检测器,在下一节又介绍了和尺度不变特征变换(SIFT)算法。
Harris角检测器
原文:A COMBINED CORNER AND EDGE DETECTOR// Chris Harris & Mike Stephens
如果像素周围不存在边,我们就认为这个点在一个区域的内部;如果像素周围只存在一个方向的边,我们就认为该点是在区域的边缘上;而如果一个像素周围存在多于一个方向的边,我们就认为该点是角点。对于图中的每一个像素
[
x
,
y
]
[x, y]
[x,y],首先获得方向
[
u
,
v
]
[u, v]
[u,v]上的密度偏移量:
E
(
u
,
v
)
=
∑
x
,
y
w
(
x
,
y
)
[
I
(
x
+
u
,
y
+
v
)
−
I
(
x
,
y
)
]
2
E(u,v) =\sum_{x,y} w(x, y) [I(x + u, y + v) − I(x, y)]^2
E(u,v)=x,y∑w(x,y)[I(x+u,y+v)−I(x,y)]2其中
w
(
x
,
y
)
w(x,y)
w(x,y)是窗函数,可以把它理解为一个方形mask,用于筛选局部特征,在实际操作中通常用高斯平滑卷积的形式。
[
I
(
x
+
u
,
y
+
v
)
−
I
(
x
,
y
)
]
2
[I(x + u, y + v) − I(x, y)]^2
[I(x+u,y+v)−I(x,y)]2用于提取给定方向的密度变化量,二次方的处理一方面是忽略方向的影响,另一方面是比绝对值的处理更加方便计算(可微)。
上式泰勒展开:
E
(
u
,
v
)
≈
[
u
,
v
]
M
[
u
v
]
E(u,v)\approx[u, v]M \left[ \begin{matrix} u\\ v \end{matrix} \right]
E(u,v)≈[u,v]M[uv]
其中:
M
=
∑
x
,
y
w
(
x
,
y
)
[
I
x
I
x
I
x
I
y
I
x
I
y
I
y
I
y
]
=
[
∑
I
x
I
x
∑
I
x
I
y
∑
I
x
I
y
∑
I
y
I
y
]
=
∑
[
I
x
I
y
]
[
I
x
,
I
y
]
M=\sum_{x,y}w(x,y) \left[ \begin{matrix} I_xI_x & I_xI_y\\ I_xI_y & I_yI_y\end{matrix} \right] =\left[ \begin{matrix} \sum I_xI_x & \sum I_xI_y\\ \sum I_xI_y & \sum I_yI_y\end{matrix} \right] =\sum \left[ \begin{matrix} I_x\\ I_y \end{matrix} \right][I_x,I_y]
M=x,y∑w(x,y)[IxIxIxIyIxIyIyIy]=[∑IxIx∑IxIy∑IxIy∑IyIy]=∑[IxIy][Ix,Iy]
该像素点处的response即为
R
[
x
,
y
]
=
d
e
t
(
M
)
−
k
T
r
(
M
)
2
=
λ
1
λ
2
−
k
(
λ
1
+
λ
2
)
2
R[x,y]=det(M)-kTr(M)^2=\lambda_1\lambda_2-k(\lambda_1+\lambda_2)^2
R[x,y]=det(M)−kTr(M)2=λ1λ2−k(λ1+λ2)2,其中
λ
1
λ
2
\lambda_1\lambda_2
λ1λ2是M的特征值,
α
\alpha
α是0.04~0.06的常数修正因子。R>0时该点是角点,R<0时改点是边缘点。R在0附近时该点可认为是平面内的点。
一些思考:
该算法对于平移变换和旋转变换都是robust,但是尺度变换可能会造成误差,原因是算法中的窗函数具有局部性,在图像尺度变换后会改变这种局部特性。
由此,我们可以使用另外一种在尺度变换下依然保持高效的检测方法SIFT。