【计算机视觉】HARRIS\SIFT特征匹配/匹配地理标记图像

一、SIFT特征匹配原理

尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。其应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对。此算法有其专利,专利拥有者为英属哥伦比亚大学。局部影像特征的描述与侦测可以帮助辨识物体,SIFT 特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、些微视角改变的容忍度也相当高。基于这些特性,它们是高度显著而且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体而且鲜有误认。使用 SIFT特征描述对于部分物体遮蔽的侦测率也相当高,甚至只需要3个以上的SIFT物体特征就足以计算出位置与方位。在现今的电脑硬件速度下和小型的特征数据库条件下,辨识速度可接近即时运算。SIFT特征的信息量大,适合在海量数据库中快速准确匹配。

SIFT算法的特点有:

  1. SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;

  2. 独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;

  3. 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;

  4. 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;

  5. 可扩展性,可以很方便的与其他形式的特征向量进行联合。

SIFT算法可以解决的问题:目标的自身状态、场景所处的环境和成像器材的成像特性等因素影响图像配准/目标识别跟踪的性能。而SIFT算法在一定程度上可解决:

  1. 目标的旋转、缩放、平移(RST)

  2. 图像仿射/投影变换(视点viewpoint)

  3. 光照影响(illumination)

  4. 目标遮挡(occlusion)

  5. 杂物场景(clutter)

  6. 噪声

Lowe将SIFT算法分解为如下四步:

  1. 尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。

  2. 关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。

  3. 方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方 向、尺度和位置进行变换,从而提供对于这些变换的不变性。

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

具体可以参考SIFT算法详解:
https://blog.csdn.net/zddblog/article/details/7521424
https://blog.csdn.net/weixin_38404120/article/details/73740612

二、HARRIS和SIFT特征匹配

1.HARRIS特征匹配

from pylab import *
from numpy import *
from PIL import Image

from PCV.localdescriptors import harris
from PCV.tools.imtools import imresize

"""
This is the Harris point matching example in Figure 2-2.
"""

im1 = array(Image.open("D:/图片/school/2.jpg").convert("L"))
im2 = array(Image.open("D:/图片/school/6.jpg").convert("L"))

# resize to make matching faster
im1 = imresize(im1,(im1.shape[1]//2,im1.shape[0]//2))
im2 = imresize(im2,(im2.shape[1]//2,im2.shape[0]//2))

wid = 5
harrisim = harris.compute_harris_response(im1,5) 
filtered_coords1 = harris.get_harris_points(harrisim,wid+1) 
d1 = harris.get_descriptors(im1,filtered_coords1,wid)

harrisim = harris.compute_harris_response(im2,5) 
filtered_coords2 = harris.get_harris_points(harrisim,wid+1) 
d2 = harris.get_descriptors(im2,filtered_coords2,wid)

print ('starting matching')
matches = harris.match_twosided(d1,d2)
figure()
gray() 
harris.plot_matches(im1,im2,filtered_coords1,filtered_coords2,matches) 
show()

【计算机视觉】HARRIS\SIFT特征匹配/匹配地理标记图像_第1张图片

2.SIFT特性匹配

from PIL import Image

from pylab import *

from numpy import *

import sift

im1f = 'D:/图片/school/2.jpg'

im2f = 'D:/图片/school/6.jpg'

im1 = array(Image.open(im1f))

im2 = array(Image.open(im2f))

sift.process_image(im1f, 'out_sift_1.txt')

l1, d1 = sift.read_features_from_file('out_sift_1.txt')

figure()

gray()

subplot(121)

sift.plot_features(im1, l1, circle=False)

sift.process_image(im2f, 'out_sift_2.txt')

l2, d2 = sift.read_features_from_file('out_sift_2.txt')

subplot(122)

sift.plot_features(im2, l2, circle=False)

matches = sift.match_twosided(d1, d2)

print('{} matches'.format(len(matches.nonzero()[0])))

figure()

gray()

sift.plot_matches(im1, im1, l1, l2, matches, show_below=True)

show()

【计算机视觉】HARRIS\SIFT特征匹配/匹配地理标记图像_第2张图片
【计算机视觉】HARRIS\SIFT特征匹配/匹配地理标记图像_第3张图片

3.HARRIS和SIFT特征匹配的比较
harris角点检测是一种直接基于灰度图像的角点提取算法,稳定性高,尤其对L型角点检测精度高,但由于采用了高斯滤波,运算速度相对较慢,角点信息有丢失和位置偏移的现象,而且角点提取有聚簇现象。
从理论上说,SIFT是一种相似不变量,即对图像尺度变化和旋转是不变量。然而,由于构造SIFT特征时,在很多细节上进行了特殊处理,使得SIFT对图像的复杂变形和光照变化具有了较强的适应性,同时运算速度比较快,定位精度比较高。如:
  在多尺度空间采用DOG算子检测关键点,相比传统的基于LOG算子的检测方法,运算速度大大加快;
  关键点的精确定位不仅提高了精度,而且大大提高了关键点的稳定性;
  在构造描述子时,以子区域的统计特性,而不是以单个像素作为研究对象,提高了对图像局部变形的适应能

计算速度: SIFT>HARRIS
旋转鲁棒性: SIFT>HARRIS

三、匹配地理标记图像

1.提取特征

download_path = "D:\图片\school"

path = "D:\图片\school"

imlist = sift.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])

2.使用局部描述子匹配

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


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]

3.可视化连接图像

threshold = 2  # min number of matches needed to craete 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:
            # 图像对中的第一幅图像

            im = Image.open(imlist[i])

            im.thumbnail((100, 100))

            filename = path + str(i) + '.png'

            im.save(filename)  # 需要一定大小的临时文件

            g.add_node(pydot.Node(str(i), fontcolor='transparent',

                                  shape='rectangle', image=filename))



            im = Image.open(imlist[j])

            im.thumbnail((100, 100))

            filename = path + str(j) + '.png'

            im.save(filename)  # 需要一定大小的临时文件

            g.add_node(pydot.Node(str(j), fontcolor='transparent',

                                  shape='rectangle', image=filename))

            g.add_edge(pydot.Edge(str(i), str(j)))

g.write_png('chenyankui.png')

【计算机视觉】HARRIS\SIFT特征匹配/匹配地理标记图像_第4张图片

参与匹配的图片如下:

【计算机视觉】HARRIS\SIFT特征匹配/匹配地理标记图像_第5张图片

你可能感兴趣的:(【计算机视觉】HARRIS\SIFT特征匹配/匹配地理标记图像)