目录
1.1 SIFT简介
1.2 SIFT特点
1.3 SIFT算法主要流程
1.4关键点检测的相关概念
1.4.1?哪些点是SIFT中要查找的关键点(特征点)
1.4.2?什么是尺度空间(scale space )
1.4.3 高斯模糊
?1.4.4 高斯金字塔
?1.5 关键点检测
?1.6 关键点匹配
1.7 算法实现
1.8特征匹配
二、匹配地理标记图像代码
一、SIFT(尺度不变特征变化)
1.1 SIFT简介
SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。
1.2 SIFT特点
1.SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;
2. 区分性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;
3. 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;
4.高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;
5.可扩展性,可以很方便的与其他形式的特征向量进行联合。
1.3 SIFT算法主要流程
1、提取关键点:关键点是一些十分突出的不会因光照、尺度、旋转等因素而消失的点,比如角点、边缘点、暗区域的亮点以及亮区域的暗点。此步骤是搜索所有尺度空间上的图像位置。通过高斯微分函数来识别潜在的具有尺度和旋转不变的兴趣点。 2、定位关键点并确定特征方向:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。然后基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。 3. 通过各关键点的特征向量,进行两两比较找出相互匹配的若干对特征点,建立景物间的对应关系。
1.4关键点检测的相关概念
1.4.1?哪些点是SIFT中要查找的关键点(特征点)
这些点是一些十分突出的点,不会因光照、尺度、旋转等因素的改变而消 失,比如角点、边缘点、暗区域的亮点以及亮区域的暗点。假定两幅图像中 有相同的景物,那么使用某种算法分别提取各自的特征点,这些点之间会有 相互对应的匹配关系。
1.4.2?什么是尺度空间(scale space )
尺度空间理论最早于1962年提出,其主要思想是通过对原 始图像进行尺度变换,获得图像多尺度下的空间表示。从而实 现边缘、角点检测和不同分辨率上的特征提取,以满足特征点 的尺度不变性。 2. 什么是尺度空间(scale space )? 关键点检测的相关概念 尺度空间中各尺度图像的模 糊程度逐渐变大,能够模拟人在 距离目标由近到远时目标在视网 膜上的形成过程。 尺度越大图像越模糊。

1.4.3 高斯模糊
高斯模糊是在Adobe Photoshop等图像处理软件中广泛使用的处理 效果,通常用它来减小图像噪声以及降低细节层次。这种模糊技术生成 的图像的视觉效果是好像经过一个半透明的屏幕观察图像。

?1.4.4 高斯金字塔
?高斯金字塔的构建过程可分为两步: (1)对图像做高斯平滑; (2)对图像做降采样。
为了让尺度体现其连续性,在简单 下采样的基础上加上了高斯滤波。 一幅图像可以产生几组(octave) 图像,一组图像包括几层 (interval)图像。

?1.5 关键点检测

DoG高斯差分金字塔?
对应DOG算子,需构建DOG金字塔 可以通过高斯差分图像 看出图像上的像素值变 化情况。(如果没有变 化,也就没有特征。特 征必须是变化尽可能多 的点。)DOG图像描 绘的是目标的轮廓。

?1.6 关键点匹配
分别对模板图(参考图,reference image)和实时图(观测图, observation image)建立关键点描述子集合。目标的识别是通过两点 集内关键点描述子的比对来完成。具有128维的关键点描述子的相似 性度量采用欧式距离。
关键点的匹配可以采用穷举法来完成,但是这样耗费的时间太 多,一般都采用kd树的数据结构来完成搜索。搜索的内容是以 目标图像的关键点为基准,搜索与目标图像的特征点最邻近的 原图像特征点和次邻近的原图像特征点。
1.7 算法实现
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
from PCV.localdescriptors import sift
# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"C:\Windows\Fonts\simsun.ttc", size=14)
imname = '1.jpg'
# 以灰度图的方式读入图片
im = np.array(Image.open(imname).convert('L'))
# 引用sift.py中的process_image将图像文件转化为pgm格式
sift.process_image(imname, '1.sift')
# l1为兴趣点坐标、尺度和方位角度,d1是对应描述符的128 维向量
l1, d1 = sift.read_features_from_file('1.sift')
plt.figure()
plt.gray()
plt.subplot(131)
plt.imshow(im, cmap='gray')
plt.axis('off')
plt.title(u'原图像', fontproperties=font)
plt.subplot(132)
sift.plot_features(im, l1, circle=False)
plt.title(u'SIFT特征', fontproperties=font)
plt.subplot(133)
sift.plot_features(im, l1, circle=True)
plt.title(u'圆圈表示特征尺度的SIFT特征', fontproperties=font)
plt.show()
运行结果

1.8特征匹配
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import sys
from PCV.localdescriptors import sift
# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"C:\Windows\Fonts\simsun.ttc", size=14)
im1path = '1.jpg'
im2path = '2.jpg'
im1 = np.array(Image.open(im1path))
im2 = np.array(Image.open(im2path))
sift.process_image(im1path, 'out_sift_1.txt')
l1, d1 = sift.read_features_from_file('out_sift_1.txt')
plt.figure()
plt.gray()
plt.subplot(121)
sift.plot_features(im1, l1, circle=False)
plt.title(u'第一幅图SIFT特征', fontproperties=font)
sift.process_image(im2path, 'out_sift_2.txt')
l2, d2 = sift.read_features_from_file('out_sift_2.txt')
plt.subplot(122)
sift.plot_features(im2, l2, circle=False)
plt.title(u'第二幅图SIFT特征', fontproperties=font)
# 输出两张图像的匹配度
matches = sift.match_twosided(d1, d2)
print('{} matches'.format(len(matches.nonzero()[0])))
plt.figure()
plt.gray()
sift.plot_matches(im1, im2, l1, l2, matches, show_below=True)
plt.show()
?运行结果

?
二、匹配地理标记图像代码
# -*- coding: utf-8 -*-
# from pylab import *
import numpy as np
from PIL import Image
from PCV.localdescriptors import sift
import pydot
import os
def get_imlist(path):
return [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.jpg')]
# 将其设置为存储图像的路径
download_path = "D:\DLsite"
# 保存缩略图的路径(pydot需要完整的系统路径)
path = "D:\\DLsite\\picture"
# 下载的文件名列表
imlist = 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 = np.zeros((nbr_images, nbr_images))
for i in range(nbr_images):
for j in range(i, nbr_images): # 仅仅计算上三角
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)
# 复制值
for i in range(nbr_images):
for j in range(i + 1, nbr_images): # 无需复制对角线
matchscores[j, i] = matchscores[i, j]
# 可视化
threshold = 2 # 创建关联所需的最小匹配数目
g = pydot.Dot(graph_type='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) + '.jpg'
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) + '.jpg'
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('jmu.jpg')
print('结束')
图片展示:

?
运行结果:

?
|