[ASIFT 0] ASIFT算法深入讲解

来源:互联网 发布:It 门槛 编辑:程序博客网 时间:2024/06/10 06:22

       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提取特征点


后记:对于ASIFT的研究,现在已经不是热点。但是关于ASIFT的效率的提升,以及对于宽基线遥感影像的匹配,应该还是有一定的研究价值。
2 0