SIFT是尺度不变特征转换的简称,此算法由 David Lowe发表,是一种电脑视觉的算法用来侦测与描述影像中的局部性特征。SIFT特征包括兴趣点检测和描述子。它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,因此,它可以用于三维视角和噪声的可靠分配。SIFT特征包括兴趣点检测和描述子。
SIFT算法的特点:
1.图像的局部特征,对旋转、尺度缩放、亮度变化保持不变,对视角变化、仿射变换、噪声也保持一定程度的稳定性。
2.独特性好,信息量丰富,适用于海量特征库进行快速、准确的匹配。
3.多量性,即使是很少几个物体也可以产生大量的SIFT特征
4.高速性,经优化的SIFT匹配算法甚至可以达到实时性
5.扩招性,可以很方便的与其他的特征向量进行联合。
SIFT算法可以解决的问题:
1.目标的旋转、缩放、平移
2.图像仿射/投影变换
3.光照影响
4.目标遮挡
5.杂物场景
6.噪声
SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。
(1)尺度空间的极值检测(寻找特征点)
高斯金字塔
高斯金字塔是同一图像在不同的分辨率下得到的一组结果,其生成过程一般包括两个步骤:
<1>对原始图像进行高斯平滑;
<2>对处理后的图像进行降采样(通常是水平、垂直方向的1/2)。降采样后得到一系列不断尺寸缩小的图像。显然,一个传统的金字塔中,每一层的图像是其上一层图像长、高的各一半。
高斯尺度空间(DOG函数)
高斯核是唯一可以产生多尺度空间的核,一个图像的尺度空间,L(x,y,σ),定义为原始图像I(x,y)与一个可变尺度的2维高斯函数G(x,y,σ)卷积运算。一副二维图像的尺度空间定义为:
其中 G(x,y,σ) 是尺度可变高斯函数:
σ大小决定图像的平滑程度,大尺度对应图像的概貌特征,小尺度对应图像的细节特征。大的σ值对应低分辨率,反之,对应高分辨率。
为了有效的在尺度空间检测到稳定的关键点,提出了高斯差分尺度空间(DOG)。利用不同尺度的高斯差分核与图像卷积生成。
DOG高斯差分金字塔:
由图片的大小决定建几个塔,每塔几层图像。0塔的第0层是原始图像。同一个金字塔之间的图像是不同程度高斯卷积关系。直观上看来越往上图片越模糊。塔间的图像是降采样关系。
检测DOG尺度空间极值点
特征点时由DOG空间的局部极值点组成的。为了寻找尺度空间的极值点,每一个采样点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。如图所示,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。 一个点如果在DOG尺度空间本层以及上下两层的26个领域中是最大或最小值时,就认为该点是图像在该尺度下的一个特征点,如图所示。
(2)关键点方向分配
利用特征点邻域像素的梯度方法分布特性,为每个特征点指定参数方向,从而使描述子对图像旋转具有不变性。通过求每个极值点的梯度来为极值点赋予方向。
像素点的梯度表示:
梯度幅值:
梯度方向:
1、相关代码:
from PIL import Image
from pylab import *
from numpy import *
import sys
from PCV.localdescriptors import sift
im1f = 'F:/1python/image/bai1.jpg' #图片1
im2f = 'F:/1python/image/bai2.jpg' #图片2
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, im2, l1, l2, matches, show_below=True)
show()
2、运行结果:
注意!!
(1)在检测图片时,应该将图片压缩到合适的大小,否则图片太大的话会使电脑卡顿!
(2)两张图片的像素要一致。如果不一致就会提示数组尺寸不一致的错误。
(3)在运行程序后会出现一个主要的错误是 empire.sift not found ,解决这个错误的方法见https://blog.csdn.net/weixin_42578378
from pylab import *
from PIL import Image
from PCV.localdescriptors import sift
from PCV.tools import imtools
import pydot
""" This is the example graph illustration of matching images from Figure 2-10.
To download the images, see ch2_download_panoramio.py."""
download_path = "F:/1python/PythonWork/SIFT/image"
path = "F:/1python/PythonWork/SIFT/image/"
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):
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_jpg('whitehouse.jpg')
2、运行结果:
图像集:
图片拍摄于福建省集美大学的航海学院。厦门集美大学航海学院是我国唯一的专门从事培养航海人才的学院,也是著名爱国华侨陈嘉庚先生亲自创办的名校。航海学院弘扬嘉庚精神,秉承诚毅校训,办学成绩显著,在国内以及东南亚地区颇具影响,被誉为“航海家的摇篮”,也是福建重点高校集美大学的分院之一。这栋楼叫白楼,带有非常悠久的历史。