(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接

目录

一、sift特征检测概述

1.1特征点

1.2sift特征检测

二、sift特征提取与匹配

2.1特征提取并展示

2.2对两张图片进行特征匹配计算

2.3给定一张图片,输出与其匹配最多的三张图片

三、匹配地理标记图像

3.1 用局部描述子匹配

3.2 可视化连接图像 

四、RANSAC算法介绍

4.1 RANSAC概述

4.2 RANSAC在消除错配中的应用

4.3 图像拼接

实验代码:

场景分析:

五、总结


 

一、sift特征检测概述

      SIFT即尺度不变特征转换,是一种计算机视觉的算法。它用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量。SIFT特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关,其对于光线、噪声等一些微视角改变的容忍度也相当高,且SIFT特征的信息量大,适合在海量数据库中快速准确匹配。

1.1特征点

     SIFT算法的实质是在不同的尺度空间上查找关键点,即特征点,并计算出特征点的方向。特征点是图像当中具有代表性的部分,就是能够在其他含有相同场景或目标的相似图像中以一种相同的或至少非常相似的不变形式表示图像或目标,即是对于同一物体或场景,从不同的角度采集多幅图片,如果相同的地方能够被识别出来是相同的,则这些具有尺度不变性的点被称为特征点。

     SIFT所查到的特征点是一些十分突出,不会因为光照、噪音等因素而变化的点,例如角点、边缘点、暗处的亮点和亮处的暗点等。对特征点提取特征的过程就是描述子,sift是一种特征描述子,其具有尺度不变性和光照不变性。

1.2sift特征检测

     sift特征检测有四个主要步骤:

(1)尺度空间的极值检测:搜索所有尺度空间上的图像,通过高斯微分函数来识别潜在的对尺度和选择不变的兴趣点。

(2)特征点定位:在每个候选的位置上,通过一个拟合精细模型来确定位置尺度,关键点的选取依据他们的稳定程度。

(3)特征方向赋值:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向,后续的所有操作都是对于关键点的方            向、尺度和位置进行变换,从而提供这些特征的不变性。

(4)特征点描述:在每个特征点周围的邻域内,在选定的尺度上测量图像的局部梯度,这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变换和光照变换。

二、sift特征提取与匹配

2.1特征提取并展示

2.1.1实验代码:

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from PCV.localdescriptors import sift
from PCV.localdescriptors import harris

# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)

# 读取图像
imname = 'C:/Users/asus/Pictures/window/sift/7.jpg'
im = array(Image.open(imname).convert('L'))  # 图像数组
sift.process_image(imname, 'c.sift')
l1, d1 = sift.read_features_from_file('c.sift')  # 读取特征

# 显示带有特征的图像
figure()
gray()
subplot(121)
sift.plot_features(im, l1, circle=False)
title(u'SIFT特征', fontproperties=font)
subplot(122)
sift.plot_features(im, l1, circle=True)
title(u'特征尺度', fontproperties=font)

show()

2.1.2结果展示:

(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第1张图片

为了作对比,下面显示之前学习的Harris检测的特征提取图:

(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第2张图片

2.1.3结果分析:

     由上面现实的特征图中我们可以看到,与Harris角点检测相比,sift提取出来的特征点信息更多且更加准确,因为sift的特征点提取步骤比Harris的步骤复杂的多,它需要建立高斯图像金字塔和高斯差分金字塔之后再检测极值,而Harris角点只是对原图进行角点检测和变化。

     sift的一个很明显的优点是可以解决尺度变化不变性,sift利用差分高斯金字塔,每层都是上层通过下采样得到的,而且每一层的高斯金字塔中都有不同的尺度因子的高斯模糊。相比而言,Harris就没有这一个优点,检测出来的特征点比较少。

2.2对两张图片进行特征匹配计算

2.2.1实验代码:

from PIL import Image
from pylab import *
import sys
from PCV.localdescriptors import sift

# 命令行参数个数小于3时读取图片文件
if len(sys.argv) >= 3:
    im1f, im2f = sys.argv[1], sys.argv[2]
else:
    im1f = 'C:/Users/asus/Pictures/window/sift/c.jpeg'
    im2f = 'C:/Users/asus/Pictures/window/sift/d.jpeg'

# 图像数组
im1 = array(Image.open(im1f))
im2 = array(Image.open(im2f))

sift.process_image(im1f, 'out_sift_1.sift')  # 处理图像im1f,将结果保存在out_sift_1.sift文件中
l1, d1 = sift.read_features_from_file('out_sift_1.sift')  # 读取特征属性值,以矩阵的形式返回
figure()
gray()
subplot(121)
sift.plot_features(im1, l1, circle=False)  # 显示带有特征的图像

sift.process_image(im2f, 'out_sift_2.sift')
l2, d2 = sift.read_features_from_file('out_sift_2.sift')
subplot(122)
sift.plot_features(im2, l2, circle=False)

# matches = sift.match(d1, d2)
matches = sift.match_twosided(d1, d2)  # 两幅图像中描述子的匹配
print('{} matches'.format(len(matches.nonzero()[0])))  # 匹配数

# 画匹配点连接
figure()
gray()
sift.plot_matches(im1, im2, l1, l2, matches, show_below=True)  # 显示带有连接匹配之间连线的图片
show()

2.2.2结果展示:

sift检测两张图片的兴趣点结果:

(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第3张图片

sift算法匹配和对比的Harris匹配结果图:

(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第4张图片 (三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第5张图片

(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第6张图片(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第7张图片

2.2.3结果分析:

      实验对两张图片进行匹配,首先是检测两张图片各自的兴趣点并显示,然后对一张图片中的每个描述子,选取其在另一张图片中的匹配,之后匹配之间连线,显示出来。

      对第一张兴趣点的图中,sift检测出的点很多,但是在匹配连线的图中我们可以看到,在两张图很多的兴趣点中,能够匹配的突出点就很少,这是在sift匹配算法中,匹配是将第一幅图中每个特征点描述子向量与第二幅图中每个特征点描述子向量比较,两个向量距离最近的一对描述子当做那个特征的最佳匹配。最佳匹配的计算结果也打印出来,如下图,23 matches:

(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第8张图片

     在对比的两种匹配中我们可以看到,Harris匹配的结果还是有很多不正确的。

2.3给定一张图片,输出与其匹配最多的三张图片

2.3.1实验代码:

# -*- coding: utf-8 -*-
from PCV.localdescriptors.sift import process_image, read_features_from_file, match_twosided
from PCV.tools.imtools import get_imlist
from PIL import Image
from pylab import *
from numpy import *
import matplotlib.image as mpimg  # 读取图片


# 文件路径
filelist = get_imlist('C:/Users/asus/Pictures/window/sift/')
im1f = 'C:/Users/asus/Pictures/window/111.jpg'  # 给定的图片
im1 = array(Image.open(im1f))
process_image(im1f, 'out_sift_1.txt')
l1, d1 = read_features_from_file('out_sift_1.txt')

i = 0
num = [0] * 30  # 匹配值
for infile in filelist:
    im2 = array(Image.open(infile))
    process_image(infile, 'out_sift_2.txt')
    l2, d2 = read_features_from_file('out_sift_2.txt')
    matches = match_twosided(d1, d2)
    num[i] = len(matches.nonzero()[0])
    i = i + 1
    print('{} matches'.format(num[i - 1]))  # 输出匹配结果

i = 1
figure()
while i < 4:  # 循环三次,输出匹配最多的三张图片
    index = num.index(max(num))
    print(index, filelist[index])
    lena = mpimg.imread(filelist[index])  # 读取当前匹配最大值的图片
    subplot(1, 3, i)
    plt.imshow(lena)  # 显示图片
    plt.axis('off')  # 不显示坐标轴
    num[index] = 0  # 将当前最大值清零
    i = i + 1
show()

2.3.2结果展示:

给定的图片:

(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第9张图片

输出匹配最多的三张图片:

(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第10张图片

匹配的数目及输出的图片信息:

(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第11张图片

2.3.3结果分析:

     实验对于一张给定的图片,在数据集中寻找最相似的三张图片并展示。上面的输入图片是偏向于椅子右边一点的区域,在数据集中的相关的图片有比较近比较远还有偏左的,匹配的时候是把给定图片与数据集中每一张图片进行匹配排序,把匹配最大的那三张图输出。首先读取数据集文件路径和给定匹配的图片,处理图片文件并提取特征值,将给定图片和数据集中的每一张图片进行两两的匹配,并把匹配数存放在数组中,最后比较匹配数,选取最大匹配的三张图片显示出来。

     多张图片的匹配也是和两张图片匹配一样进行,只是需要保存所有的匹配数最后来选取,sift匹配可以对大量的数据集进行比较。

三、匹配地理标记图像

 

3.1 用局部描述子匹配

数据集:

 

(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第12张图片

数据集共有十七张图片,是有多个不同场景的散照片,下面对数据集里的图像,提取局部描述子

编写代码:

# -*- coding: utf-8 -*-
from pylab import *
from PIL import Image
from PCV.localdescriptors import sift
from PCV.tools import imtools
import pydot

download_path = "C:/Users/asus/Pictures/window/sift"
path = "C:/Users/asus/Pictures/window/sift/"

imlist = imtools.get_imlist(download_path)
nbr_images = len(imlist)

featlist = [imname[:-3] + 'sift' for imname in imlist]
for i, imname in enumerate(imlist):
    sift.process_image(imname, featlist[i])

matchscores = zeros((nbr_images, nbr_images))

for i in range(nbr_images):
    for j in range(i, nbr_images):  # only compute upper triangle
        print('comparing ', imlist[i], imlist[j])
        l1, d1 = sift.read_features_from_file(featlist[i])
        l2, d2 = sift.read_features_from_file(featlist[j])
        matches = sift.match_twosided(d1, d2)
        nbr_matches = sum(matches > 0)
        print('number of matches = ', nbr_matches)
        matchscores[i, j] = nbr_matches
print("The match scores is: \n", matchscores)

# copy values
for i in range(nbr_images):
    for j in range(i + 1, nbr_images):  # no need to copy diagonal
        matchscores[j, i] = matchscores[i, j]

实验结果:

(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第13张图片

分析:在指定路径下的数据集中对每幅图像进行两两匹配,将每对图像间的匹配特征数保存在 matchscores 数组中。以上结果是两两匹配的匹配数,矩阵为17*17的矩阵,具有相似内容的图像间拥有更多的匹配特征数,后面可以根据匹配数将相似图片联系起来。

3.2 可视化连接图像 

主要代码:

# 可视化
threshold = 2  # min number of matches needed to create link
g = pydot.Dot(graph_type='graph')  # don't want the default directed graph

for i in range(nbr_images):
    for j in range(i + 1, nbr_images):
        if matchscores[i, j] > threshold:
            # first image in pair
            im = Image.open(imlist[i])
            im.thumbnail((100, 100))
            filename = path + str(i) + '.jpg'
            im.save(filename)  # need temporary files of the right size
            g.add_node(pydot.Node(str(i), fontcolor='transparent', shape='rectangle', image=filename))

            # second image in pair
            im = Image.open(imlist[j])
            im.thumbnail((100, 100))
            filename = path + str(j) + '.jpg'
            im.save(filename)  # need temporary files of the right size
            g.add_node(pydot.Node(str(j), fontcolor='transparent', shape='rectangle', image=filename))

            g.add_edge(pydot.Edge(str(i), str(j)))
g.write_jpg('C:/Users/asus/Pictures/window/sift/sift.jpg')

运行结果:

(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第14张图片

结果分析:

      实验将上面数据集中提取了描述字的图像进行匹配之后可视化展示出来。首先通过图像间是否具有匹配的局部描述子来定义图像间的连接,然后可视化这些图片连接的情况。为了完成可视化,我们可以在图中显示这些图像,图中的线代表连接。

     为了显示相似的图像组,我们设置一个阈值,如果匹配的数目高于一个阈值,我们使用连接线来连接相应的图像。数据集中一共有十七张图片,可视化连接的时候只连接了十五张,有两张是跟所有图片匹配的数目都没有达到阈值的。因为场景是比较散化,所有图连接看的比较的清楚。有椅子的一共是有五张图,每张都是比较相像的,但是结果可视化连接的时候只显示了三张连接,可以知道我们自己看到很相似的图,在匹配的时候匹配数有时也会很低,以至于显示两张图是不相似的。

四、RANSAC算法介绍

      当由一堆存在误差的数据样本恢复数据模型时,通常最简单的线性回归方法是最小二乘,然而当数据样本中的误差数据的误差值和其所占比例比较大时,最小二乘得出的结果往往不如人意,RANSAC算法(随机抽样一致性算法)利用迭代来解决这个问题。下面对RANSAC进行简单的介绍。

4.1 RANSAC概述

      RANSAC为 RANdom SAmple Consensus 的缩写,它是根据一组包含异常数据的样本数据集,计算出数据的数学模型参数,得到有效样本数据的算法。

      RANSAC算法的基本假设是样本中包含正确数据(inliers,可以被模型描述的数据),也包含异常数据(Outliers,偏离正常范围很远、无法适应数学模型的数据),即数据集中含有噪声。这些异常数据可能是由于错误的测量、错误的假设、错误的计算等产生的。同时RANSAC也假设,给定一组正确的数据,存在可以计算出符合这些数据的模型参数的方法。

RANSAC算法原理:

1. 有一个模型适应于假设的局内点,即所有的未知参数都能从假设的局内点计算得出。

2. 用1中得到的模型去测试所有的其它数据,如果某个点适用于估计的模型,认为它也是局内点。

3. 如果有足够多的点被归类为假设的局内点,那么估计的模型就足够合理。然后,用所有假设的局内点去重新估计模型(譬如使用最小二乘法),因为它仅仅被初始的假设局内点估计过。

4. 最后,通过估计局内点与模型的错误率来评估模型。

上述过程被重复执行固定的次数,每次产生的模型要么因为局内点太少还不如上一个模型而被舍弃,要么因为比现有的模型更好而被选用。

4.2 RANSAC在消除错配中的应用

       在特征点配对中,模型即为从一个平面上的特征点到另外一平面上的特征点的射影关系,反应为射影矩阵H。H是一个包含8个自由度的3×3矩阵,它最少可以由两平面中的4对匹配点计算出,但同一平面上的3个点必须不共面。

      RANSAC算法是寻找一个最佳单应性矩阵H,矩阵大小为3*3,目的是找到最优的参数矩阵,使得满足该矩阵的数据点个数最多,通常令  h_{33}=1,由于单应性矩阵有8个未知参数,所以需要8个线性方程求解,对应到点位置信息上,一组点对可以列出两个方程(即在x坐标和y坐标上满足同一映射关系),则至少包含4组匹配点对。 如下:

s\begin{bmatrix} x'\\ y'\\ 1 \end{bmatrix}=\begin{bmatrix} h_{11} & h_{12} &h_{13} \\ h_{21} & h_{22} &h_{23} \\ h_{31} & h_{32} &h_{33} \end{bmatrix}\begin{bmatrix} x\\ y\\ 1 \end{bmatrix}  ,其中(x,y)表示目标图像角点位置,(x’,y’)为场景图像角点位置,s为尺度参数。

RANSAC算法从匹配数据集中随机抽出4个样本并保证这四个样本之间不共线。计算出单应性矩阵矩阵,然后利用这个模型测试所有数据,并计算满足这个模型数据点的个数与投影误差(即代价函数)若此模型为最优模型,则对应的代价函数最小:

\sum_{i=0}^{n}\left ( x_{i} '-\frac{h_{11}\cdot x_{i}+h_{12}\cdot y_{i}+h_{13}}{h_{31}\cdot x_{i}+h_{32}\cdot y_{i}+h_{33}}\right )^{2}+\left ( y_{i} '-\frac{h_{21}\cdot x_{i}+h_{22}\cdot y_{i}+h_{23}}{h_{31}\cdot x_{i}+h_{32}\cdot y_{i}+h_{33}}\right )^{2}

算法步骤:

1.随机从数据集中随机抽出4个样本数据(此四个样本之间不共线)计算出变换矩阵H,记为模型M;

2.计算数据集中所有数据与模型M的投影误差,若误差小于阈值,加入内点集I;

3.如果当前内点集元素个数大于最优内点集I_best,则更新I_best=I,同时更新迭代次数k;

4.如果迭代次数大于k,则退出:否则迭代次数加1,并重复上述步骤

RANSAC删除错配分析:

在python里,实现相应的fit()和get_error()方法和正确使用ransac.py文件就可以的到相应的单应性矩阵。

homography.py:

 def fit(self, data):
        """ Fit homography to four selected correspondences. """   
        # transpose to fit H_from_points()
        data = data.T
        
        # from points
        fp = data[:3,:4]
        # target points
        tp = data[3:,:4]
        
        # fit homography and return
        return H_from_points(fp,tp)
    
    def get_error( self, data, H):
        """ Apply homography to all correspondences, 
            return error for each transformed point. """
        
        data = data.T
        
        # from points
        fp = data[:3]
        # target points
        tp = data[3:]
        
        # transform fp
        fp_transformed = dot(H,fp)
        
        # normalize hom. coordinates
        fp_transformed = normalize(fp_transformed)
                
        # return error per point
        return sqrt( sum((tp-fp_transformed)**2,axis=0) )

我们可以从homography.py文件里找到,这个类就包含了fit()方法,这种方法只接受ransac.py选择的4个对应点对(data中前四个点对,是计算单应性矩阵所需要的最少数目),然后合成一个单应性矩阵。get_error()方法是对每一个对应点对使用该单应性矩阵,之后返回相对应的平房距离之和(实际过程中需要在距离上使用一个阈值来决决定哪些单应性矩阵是合理的)。所以,RANSAC算法能够判断出哪些点对是正确的,哪些点对是错误的。

def H_from_ransac(fp,tp,model,maxiter=1000,match_theshold=10):
      
    from PCV.tools import ransac
    
    # group corresponding points
    data = vstack((fp,tp))
    
    # compute H and return
    H,ransac_data = ransac.ransac(data.T,model,4,maxiter,match_theshold,10,return_all=True)
    return H,ransac_data['inliers']

从上面这个函数可以看到,阈值和最小期望值的点对数目。最重要的是最大迭代次数:退出太早可能会得到坏解,太多又会浪费时间。 

应用

  • 没有RANSAC的sift匹配:

(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第15张图片(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第16张图片

  • 经过RANSAC的匹配:

(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第17张图片(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第18张图片

分析:

     上面两种不同场景是没有经过RANSAC处理的和经过RANSAC处理的不同结果,左边那幅景深比较大的远景图,在没有经过RANSAC基础的匹配时有很多错配,如第一张尚大楼左下边的一个树上的点匹配到了第二张图的白云,这两个明显是的错误点。但是经过RANSAC的匹配明显的很多错配点都删掉了,匹配的正确率比较高。右边那幅近景的图在经过RANSAC前后没有多少明显的错误。

4.3 图像拼接

实验代码:

# RANSAC算法拼接2张图片
from pylab import *
from numpy import *
from PIL import Image
from PCV.geometry import homography, warp
from PCV.localdescriptors import sift

# 获取图片
featname = ['C:/Users/asus/Pictures/window/RANSAC/' + str(i + 1) + '.sift' for i in range(2)]
imname = ['C:/Users/asus/Pictures/window/RANSAC/' + str(i + 1) + '.jpg' for i in range(2)]

# 提取特征并匹配
l = {}
d = {}
for i in range(2):
    sift.process_image(imname[i], featname[i])
    l[i], d[i] = sift.read_features_from_file(featname[i])

matches = {}
for i in range(1):
    matches[i] = sift.match(d[i + 1], d[i])

# visualize the matches
for i in range(1):
    im1 = array(Image.open(imname[i]))
    im2 = array(Image.open(imname[i + 1]))
    figure()
    sift.plot_matches(im2, im1, l[i + 1], l[i], matches[i], show_below=True)


# 将匹配转换成齐次坐标点的函数
def convert_points(j):
    ndx = matches[j].nonzero()[0]
    fp1 = homography.make_homog(l[j + 1][ndx, :2].T)
    ndx2 = [int(matches[j][i]) for i in ndx]
    tp1 = homography.make_homog(l[j][ndx2, :2].T)

    # switch x and y - TODO this should move elsewhere
    fp1 = vstack([fp1[1], fp1[0], fp1[2]])
    tp1 = vstack([tp1[1], tp1[0], tp1[2]])
    return fp1, tp1


# 估计单应性矩阵
model = homography.RansacModel()


# RANSAC稳健性估计点对应间的单应性矩阵Hv
fp, tp = convert_points(0)
H_01 = homography.H_from_ransac(fp, tp, model)[0]  # im 0 to 1

# warp the images(扭曲图像)
delta = 200  # for padding and translation

im1 = array(Image.open(imname[0]), "uint8")
im2 = array(Image.open(imname[1]), "uint8")
im_12 = warp.panorama(H_01, im1, im2, delta, delta)


figure()
imshow(array(im_12, "uint8"))
axis('off')
# savefig("ps.jpg", dpi=300)
show()

场景分析:

1、近景房子的拼接:

 

(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第19张图片(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第20张图片

分析:房子的两张图片匹配点差不多都是正确的,拼接起来也比较的好,看不出多少的不重合

2、景深大的图片拼接:

(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第21张图片(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第22张图片

(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第23张图片(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第24张图片

(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第25张图片   (三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第26张图片

分析:上面测试了三组图片,拼接效果都挺好的,后面两张图的图片光线的原因拼接的间隙看的比较的明显,但是放大图片看拼接处的景物,发现没有明显的多重折叠的现象。

图像拼接结果要是出现如下的现象:

(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第27张图片

这是因为用于填充平移的delta值太大,在扭曲图像的时候可以设置delta值小一点,就可以得到如下结果:

(三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接_第28张图片

五、总结

(1)SIFT特征检测具有尺度不变性,相比于之前学习的Harris角点检测效果要好很多,检测的特征点比较多。

(2)sift对旋转角度识别性比较大,而harris对旋转角度识别性不大,基本上出现匹配点错误,虽然sift也有匹配错误点,但是相对来说不会随意匹配,从harris匹配线可看出,匹配线杂乱无章,但是sift算子位置几乎是平行对应。所以对于旋转角度过后sift算法会更适合图像匹配,不过对于像素点多而又没有旋转角度拍摄的可以用harris来匹配,视觉效果可能会比较清晰,如果想匹配效果达到很高,建议还是使用sift算法匹配。

(3)RANSAC对于错误匹配的处理效果是较为明显的,经过处理的错配点都没有了,匹配的正确率高。

问题:自己之前运行的图片有大小不一样的,电脑死机很多次,最后都得强制关机。问别人说是SIFT计算复杂度很高,所以我们需要将匹配的图像大小修改成一样的,要是不同大小的图像匹配,电脑可能就卡住,死机了。后面修改图片像素,把像素改小一点,匹配的时候就没有太卡顿。所以尽量的把像素改小一点运行会比较快。

参考资料:

sift算法介绍:https://mp.weixin.qq.com/s/XVB88f119gRqpwTTRvTyrA

RANSAC算法:https://www.cnblogs.com/konlil/archive/2012/02/01/2334492.html

                         https://blog.csdn.net/robinhjwy/article/details/79174914

你可能感兴趣的:(计算机视觉)