本文主要是介绍CS131学习笔记(lecture6),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
讲义地址: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。
这篇关于CS131学习笔记(lecture6)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!