ASITF算法出现已经很长时间了,这个算法主要是解决SIFT等特征提起算法在影像有较大倾斜角度时,同名点对提取较少的问题。有一些关于该算法的应用和改进算法效率的中文文章,一些博客也做了基本的介绍,但是总感觉大多是走马观花,讨论的不深入,希望对大家有所帮助。
1. 算法流程
2. 算法细节
2.1 采样点的产生
2.2 算法中反走样高斯滤波应用原理
2.3 双分辨率原理(two-resolution acceleration)
3. 算法伪代码实现
1. 算法流程
ASIFT算法就是为了解决SIFT、ORB、SURF等特征描述算子倾斜匹配的问题。上面的这些算法可以很好的应对尺度、旋转情况下的匹配,但是对于倾斜影像的特征点匹配只能提取很少量的特征,所以作者在提出ASIFT来解决这个问题。
这个算法的假设是:对于光滑的平面,在局部可以建立仿射变化模型代替投影变化模型。基于此,作者形象化的建立一个半球形空间,通过球形中的经度和纬度唯一的确定相机的空间位置。在这些空间位置上,对图像进行模拟,模拟所有可能的仿射扭曲。然后对模拟图像进行SIFT特征点匹配,进而实现算法的仿射不变性匹配算法。
2. 算法细节
2.1 采样点的产生
这些扭曲由两个参量决定:经度(水平角度)φ 和纬度(垂直角度)θ 。倾斜度参数 t 完成:t = 1 cosθ。设原始图像为 u( x , y ),原始图像在 X 轴上倾斜度为 t 的变换由 u ( x , y ) → u (t x ,y)得到。对数字图像来说,倾斜图像由具有方向性的 t 倍二次采样(t-subsampling)得到。
为使 ASIFT 算法对任何仿射变换具有不变性,倾斜度t和角度φ 必须具有较高精度。采样间隔由自然图像的多次实验得到。在较大的θ 下,较小的Δθ改变便能使图像产生较大的扭曲。对t 进行几何级数的采样可满足这一需求。一般来说,采样比率Δt应与角度φ无关。倾斜度最佳采样间隔应是Δt =1.414。
同样的,对水平采样来说,当 θ = arccos1/t增加时,水平采样的精度必须增加。在较大的垂直角度θ下,图像水平角度 Δφ 较小的变化即能使图像产生较大扭曲。文献[12]中提出,水平最佳采样间隔应是Δφ =72/t。
下图说明了不规则采样参数 θ = arccos1/t和φ 在半球体上的显示情况。采样点集中在赤道区域。
得到的θ,就是45,60,70,75,80. 得到了下图中右图所示的采样位置。
按照参数 θ = arccos1/t和φ 进行抽样。黑色为采样点。左图为半球体沿Y 轴半球体透视图。右图为沿 Z 轴的半球体透视图。θ 值如图所示。
2.2 算法中反走样高斯滤波应用原理
算法中存在对图像重新计算size的过程,所以当图像被缩小的时候,然后对图像进行反走样的高斯滤波(参见程序-另一篇博文)。它要求之前在 X 轴上有一次抗走样处理(antialiasing filter),最大限度的减少图像失真。该滤波由标准差为c的高斯卷积完成。在文献[1]中 Lowe 建议该值取c = 0.8。文献[15]中证明了该取值图像失真度较小。
对图像进行旋转变换和倾斜变换可以模拟有限的一些不同水平角度,垂直角度拍摄图像。对这些参数进行采样能保证模拟图像在不同的φ 和θ 引起的视角变换下保持近似。所有模拟倾斜后的图像将由 SIFT 算法进行匹配比较。
2.3 双分辨率原理
有的博文上说“在实际应用中,可能会存在不同分辨率下的图像匹配问题。ASIFT 遇到不同分辨率的图像时可归结到低分辨率下去实现。”这是论文中采用双分辨率的原因,但是我的理解不是这样的。通过对论文原文的理解,双分辨率是为了加速ASIFT算法。在低分辨率图像中,找到能提取最多同名点的一种变化矩阵,然后直接将这个矩阵应用在高分辨率的图像匹配中,最后达到能够最快的实现较好的匹配结果。
首先,程序选择低分辨率搜索下会产生匹配对的仿射变换,然后在原始查询图像以及搜索图库中模拟所选的仿射变换,最后运用 SIFT 算法比较模拟仿射变换后的图片。两种不同分辨率下的解决办法如下所述:
(1)、采用系数 K × K二次采样查询图片 u 和待搜索图片 v。u′ = SK*GK*u and v′ = SK*GK*v
因为是降低图像的分辨率,故使用高斯做反走样平滑滤波GK,为 K×K二次采样。
(2)、低分辨率下的 ASIFT 算法:对查询图片u′和搜索图片v′ 应用 ASIFT 算法;
(3)、确定u′ 和v′ 中可能产生最多匹配对的 M 种仿射变换;
(4)、高分辨率下的 ASIFT:在原始图像 u 和 v 上使用 ASIFT 算法,但是模拟倾斜时只使用这 M 种仿射变换。
上图中左图为低分辨率的 ASIFT 算法,采用了3 × 3次二次采样。找到 19 个匹配点。右图为高分辨率 ASIFT 算法,找到 51 个点。
3. 算法伪码实现
Algorithm 1: ASIFT 特征点计算
Input : Image u, tilt sampling step δt = √2, tilt sampling range n = 5, rotation sampling step factor b = 72
Output: ASIFT keypoints (referenced by tilt and rotation values)
for t = 1,δt,δt^2 ,··· ,δt^n // loop over tilts
do
if t == 1 // when t = 1 (no tilt),
then theta=0 // calculate scale-, rotation- and translation-invariant features on the original image
key(t, theta) = SIFT(u) // C++ routine: compute sift keypoints
else
for theta = 0,b/t,2b/t,··· ,kb/t (such that kb/t < 180) // loop over rotations (angle in degrees)
do ur = rot(u, theta) // rotate image (with bilinear interpolation)
uf = G(0.8t)*ur // anti-aliasing filtering (G(0.8t) is a Gaussian convolution with kernel standard deviation equal to 0.8t). This 1-dimensional convolution is made in the vertical direction, before sub-sampling in the same direction.
ut = tilt(uf, t) // tilt image (subsample in vertical direction by a factor of t)
key(t, theta) = SIFT(ut) // calculate scale-, rotation- and translation-invariant features.
endif
Algorithm2:特征点匹配
Input : ASIFT keypoints of the two images: key1 and key2
Output: Matched keypoints: matchinglist
for t1 = 1,δt,δt^2 ,··· ,δt^n // loop over tilts on image 1
do
if t1 == 1 // when t1 = 1 (no tilt), no rotation simulated
then theta1 all = [0]
else
theta1 all = [0, b/t1, 2b/t1, ..., kb/t1] (such that kb/t1 < 180)
for theta1 in theta1 all // loop over rotations on image 1 (angle in degrees)
do
for t2 = 1,δt,δt^2 ,...,δt^n // loop over tilts on image 2
do
if t2 == 1 // when t2 = 1 (no tilt), no rotation simulated
then theta2 all = [0]
else
theta2 all = [0, b/t2, 2b/t2, ..., kb/t2] (such that kb/t2 < 180)
for theta2 in theta2 all // loop over rotations on image 2 (angle in degrees)
do matchinglist(t1, theta1, t2, theta2) = SIFT match(keys1(t1, theta1), keys2(t2, theta2)) // Matching the keypoints between the two simulated images.
从程序伪代码中可以看到,一、ASIFT算法使用双线性插值的方法进行对图像进行旋转theta,
二、然后进行反走样滤波
三、在垂直方向进行采样 获得模拟图像
四、对模拟图像进行SIFT提取特征点