【计算机视觉】图像局部描述子——SIFT

目录

  • (一)SIFT特征原理描述
    • 1、SIFT概述
    • 2、SIFT特征检测的步骤
  • (二)SIFT特征匹配(含代码及运行结果)


(一)SIFT特征原理描述

1、SIFT概述

SIFT是尺度不变特征转换的简称,此算法由 David Lowe发表,是一种电脑视觉的算法用来侦测与描述影像中的局部性特征。SIFT特征包括兴趣点检测和描述子。它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,因此,它可以用于三维视角和噪声的可靠分配。SIFT特征包括兴趣点检测和描述子。

  • SIFT算法的特点:
    1.图像的局部特征,对旋转、尺度缩放、亮度变化保持不变,对视角变化、仿射变换、噪声也保持一定程度的稳定性。
    2.独特性好,信息量丰富,适用于海量特征库进行快速、准确的匹配。
    3.多量性,即使是很少几个物体也可以产生大量的SIFT特征
    4.高速性,经优化的SIFT匹配算法甚至可以达到实时性
    5.扩招性,可以很方便的与其他的特征向量进行联合。

  • SIFT算法可以解决的问题:
    1.目标的旋转、缩放、平移
    2.图像仿射/投影变换
    3.光照影响
    4.目标遮挡
    5.杂物场景
    6.噪声

SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。

2、SIFT特征检测的步骤

(1)尺度空间的极值检测(寻找特征点)

  • 高斯金字塔
    高斯金字塔是同一图像在不同的分辨率下得到的一组结果,其生成过程一般包括两个步骤:
    <1>对原始图像进行高斯平滑;
    <2>对处理后的图像进行降采样(通常是水平、垂直方向的1/2)。降采样后得到一系列不断尺寸缩小的图像。显然,一个传统的金字塔中,每一层的图像是其上一层图像长、高的各一半。
    【计算机视觉】图像局部描述子——SIFT_第1张图片

  • 高斯尺度空间(DOG函数)
    高斯核是唯一可以产生多尺度空间的核,一个图像的尺度空间,L(x,y,σ),定义为原始图像I(x,y)与一个可变尺度的2维高斯函数G(x,y,σ)卷积运算。一副二维图像的尺度空间定义为:
    在这里插入图片描述其中 G(x,y,σ) 是尺度可变高斯函数:
    在这里插入图片描述σ大小决定图像的平滑程度,大尺度对应图像的概貌特征,小尺度对应图像的细节特征。大的σ值对应低分辨率,反之,对应高分辨率。
    为了有效的在尺度空间检测到稳定的关键点,提出了高斯差分尺度空间(DOG)。利用不同尺度的高斯差分核与图像卷积生成。
    【计算机视觉】图像局部描述子——SIFT_第2张图片

  • DOG高斯差分金字塔:
    由图片的大小决定建几个塔,每塔几层图像。0塔的第0层是原始图像。同一个金字塔之间的图像是不同程度高斯卷积关系。直观上看来越往上图片越模糊。塔间的图像是降采样关系。
    【计算机视觉】图像局部描述子——SIFT_第3张图片

  • 检测DOG尺度空间极值点
    特征点时由DOG空间的局部极值点组成的。为了寻找尺度空间的极值点,每一个采样点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。如图所示,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。 一个点如果在DOG尺度空间本层以及上下两层的26个领域中是最大或最小值时,就认为该点是图像在该尺度下的一个特征点,如图所示。
    【计算机视觉】图像局部描述子——SIFT_第4张图片

(2)关键点方向分配
利用特征点邻域像素的梯度方法分布特性,为每个特征点指定参数方向,从而使描述子对图像旋转具有不变性。通过求每个极值点的梯度来为极值点赋予方向。
像素点的梯度表示:在这里插入图片描述
梯度幅值:
在这里插入图片描述
梯度方向:
在这里插入图片描述

  • 生成方向直方图
    确定关键点的方向采用梯度直方图统计法,统计以关键点为原点,一定区域内的图像像素点对关键点方向生成所作的贡献。
    【计算机视觉】图像局部描述子——SIFT_第5张图片
    利用直方图统计领域内像素对应的梯度和幅值:梯度方向角为横轴刻度,取45度为一个单位,那么横轴就有8个刻度;纵轴是对应梯度的幅值累加值。
    【计算机视觉】图像局部描述子——SIFT_第6张图片
    (3)关键点描述
    用一组向量将这个关键点描述出来。描述特征点时还必须考虑到它周围点的情况,所以这个描述子不但包括关键点,也包括关键点周围对其有贡献的像素点。特征描述子与关键点所在尺度有关,因此对梯度的求取应在特征点对应的高斯图像上进行。
    【计算机视觉】图像局部描述子——SIFT_第7张图片
    (4)特征点匹配
    分别对参考图和观测图建立特征点描述子集合,目标的识别是通过两点集内特征点描述子的比对来完成。具有128维的特征点描述子的相似性度量采用欧式距离。(可以采用穷举法或者Kd树的数据结构来完成搜索)

(二)SIFT特征匹配(含代码及运行结果)

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、运行结果:
【计算机视觉】图像局部描述子——SIFT_第8张图片
注意!!
(1)在检测图片时,应该将图片压缩到合适的大小,否则图片太大的话会使电脑卡顿!
(2)两张图片的像素要一致。如果不一致就会提示数组尺寸不一致的错误。
(3)在运行程序后会出现一个主要的错误是 empire.sift not found ,解决这个错误的方法见https://blog.csdn.net/weixin_42578378


# (三)匹配地理标记图像 1、相关代码:
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、运行结果:
【计算机视觉】图像局部描述子——SIFT_第9张图片
图像集:
【计算机视觉】图像局部描述子——SIFT_第10张图片
【计算机视觉】图像局部描述子——SIFT_第11张图片
图片拍摄于福建省集美大学的航海学院。厦门集美大学航海学院是我国唯一的专门从事培养航海人才的学院,也是著名爱国华侨陈嘉庚先生亲自创办的名校。航海学院弘扬嘉庚精神,秉承诚毅校训,办学成绩显著,在国内以及东南亚地区颇具影响,被誉为“航海家的摇篮”,也是福建重点高校集美大学的分院之一。这栋楼叫白楼,带有非常悠久的历史。

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