Bootstrap

(三)计算机视觉 --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结果展示:

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

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算法匹配和对比的Harris匹配结果图:

 

;