文章目录

  • SIFT(尺度不变特征变换)
    • 1 兴趣点、描述子
    • 2 检测兴趣点
    • 3 匹配描述子
    • 4 总结

SIFT(尺度不变特征变换)

SIFT即尺度不变特征变换,是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。

SIFT算法的特点有:

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

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

  1. 目标的旋转、缩放、平移
  2. 图像仿射/投影变换
  3. 光照影响
  4. 目标遮挡
  5. 杂物场景
  6. 噪声

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

1 兴趣点、描述子

SIFT特征使用高斯差分函数来定位兴趣点:

其中,Iσ是使用Gσ模糊的灰度图像,κ是决定相差尺度的常数。兴趣点是在图像位置和尺度变化下D(x, σ)的最大值和最小值点。这些候选位置点通过滤波去除不稳定点。基于一些准则,比如认为低对比度和位于边上的点不是兴趣点,可以去除一些候选兴趣点。

SIFT描述子使用主方向描述参考方向。主方向使用方向直方图来度量。

为了对图像亮度具有稳定性,SIFT描述子使用图像梯度。SIFT描述子在每个像素点附近选取子区域网格,在每个子区域内计算图像梯度方向直方图。每个子区域的直方图拼接起来自称描述子向量。SIFT描述子的标准设置使用4*4的子区域,每个子区域使用8个小区间的方向直方图,会产生共128个小区间的直方图。

2 检测兴趣点

创建sift.py文件,将下面调用可执行文件的函数添加到该文件中:

def process_image(imagename, resultname, params = "--edge-thresh 10 --peak-thresh 5"):if imagename[-3:] != 'pgm':im = Image.open(imagename).convert('L')im.save('tmp.pgm')imagename = 'tmp.pgm'cmmd = str("sift "+imagename+" --output="+resultname+" "+params)os.system(cmmd)print('processed', imagename, 'to', resultname)

由于该二进制文件需要的图像格式为灰度.pgm,所以如果图像为其他格式,就需要将其转换为.pgm文件。

为了从输出文件中将特征读取到NumPy数组,使用如下函数:

def read_features_from_file(filename):f = loadtxt(filename)return f[:, :4], f[:, 4:]

如果在Python会话中修改描述子,则需要将输出的结果保存在特征文件中,下边的函数使用NumPy中的savetxt()函数实现这一功能:

def write_features_to_file(filename, locs, desc):savetxt(filename, hstack((locs, desc)))

上边用到的hstack()函数通过拼接不同的行向量来实现水平堆叠两个向量的功能。

读取特征后,通过在图像上绘制出他们的位置,将其可视化。

def plot_features(im, locs, circle = False):def draw_circle(c, r):t = arange(0, 1.01, .01) * 2 * pix = r * cos(t) + c[0]y = r * sin(t) + c[1]plot = (x, y, 'b', linewidth = 2)imshow(im)if circle:for p in locs:draw_circle(p[:2], p[2])else:plot(locs[:, 0], locs[:, 1], 'ob')axis('off')

该函数在原始图像上使用蓝色的点绘制出SIFT特征点的位置。将参数circle的选项设置成True,该函数将使用draw_circle()函数绘制出圆圈,圆圈的半径为特征的尺度。

最后,通过下边的命令绘制出SIFT特征位置的图像:

import siftimname = 'jimei.jpg'
im1 = array(Image.open(imname).convert('L'))
sift.process_image(imname, 'jimei.sift')
l1, d1 = sift.read_features_from_file('jimei.sift')figure()
gray()
sift.plot_features(im, l1, circle=True)
show()

得到的图像与提取Harris角点进行对比:

图1 对提取SIFT特征和Harris角点的对比

通过对比可以看出,两种方法提取到的兴趣点的位置有所不同。

3 匹配描述子

对于将一幅图像中的特征匹配到另一幅图像的特征,一种稳健的准则是使用这两个特征距离和两个最匹配特征距离的比率。相比于图像中的其他特征,该准则保证能够找到足够相似的唯一特征,并使错误的匹配数降低。

 def match(desc1, desc2):desc1 = array([d / linalg.norm(d) for d in desc1])desc2 = array([d / linalg.norm(d) for d in desc2])dist_ratio = 0.6desc1_size = desc1.shapematchscores = zeros((desc1_size[0], 1), 'int')desc2t = desc2.Tfor i in range(desc1_size[0]):dotprods = dot(desc1[i, :], desc2t)dotprods = 0.9999 * dotprodsindx = argsort(arccos(dotprods))if arccos(dotprods)[indx[0]] < dist_ratio * arccos(dotprods)[indx[1]]:matchscores[i] = int(indx[0])return matchscores

该函数使用描述子向量间的夹角作为距离度量。在此之前,我们需要将描述子向量归一化到单位长度。因为这种匹配是单向的,即我们将每个特征向另一幅图像中的所有特征进行匹配,所以可以先计算第二幅图像兴趣点描述子向量的转置矩阵。

为了进一步增加匹配的稳健性,可以再反过来执行一次该步骤,用另外的方法匹配(从第二幅图像的特征向第一幅图像中的特征匹配。)最后仅保留同时满足这两种匹配准则的对应。

def match_twosided(desc1, desc2):matches_12 = match(desc1, desc2)matches_21 = match(desc2, desc1)ndx_12 = matches_12.nonzero()[0]for n in ndx_12:if matches_21[int(matches_12[n])] != n:matches_12[n] = 0return matches_12
 im1f = 'jimei_grey.jpg'im2f = 'jimei2.jpg'im1 = array(Image.open(im1f))im2 = array(Image.open(im2f).convert('L'))process_image(im1f,'jimei.sift')l1, d1 = read_features_from_file('jimei.sift')figure()gray()subplot(121)plot_features(im1, l1, circle=False)process_image(im2f, 'jimei2.sift')l2, d2 = read_features_from_file('jimei2.sift')subplot(122)plot_features(im2, l2, circle=False)matches = match_twosided(d1, d2)print ('{} matches'.format(len(matches.nonzero()[0])))figure()gray()plot_matches(im1, im2, l1, l2, matches)show()

下图为两张图片检测到的特征点:

图2 SIFT检测描述子

得到的匹配结果如下图所示:

图3 SIFT匹配描述子
通过实验对比可以发现sift相比Harris的检测效果更好,匹配效果也更好,sift匹配除去个别点,其余特征点匹配的都很正确,但是Harris匹配的特征点较为杂乱。

4 总结

SIFT特征对于尺度、旋转和亮度都具有不变性,因此可以用于三维视角和噪声的可靠匹配。

SIFT特征检测基本步骤
(1)尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点;
(2)关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度;
(3)方向确定,基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性;
(4)关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。

局部图像描述子——SIFT(尺度不变特征变换)相关推荐

  1. [转载]SIFT(尺度不变特征变换)算法小结

    原文地址:SIFT(尺度不变特征变换)算法小结[转]作者:慕容天峰 最近一直在看SIFT算法.Sift是David Lowe于1999年提出的局部特征描述子,并于2004年进行了更深入的发展和完善.S ...

  2. OPENCV学习笔记 - SIFT 尺度不变特征变换 Python

    OPENCV学习笔记 - SIFT 尺度不变特征变换 Python 为什么我们需要SIFT尺度不变特征变换? 第一,建立高斯差分金字塔 第二,极值点的精确定位 第三,确定关键点的主方向 第四,构建关键 ...

  3. OpenCV系列之SIFT尺度不变特征变换 | 三十九

    目标 在这一章当中, 我们将学习SIFT算法的概念 我们将学习找到SIFT关键点和描述算符. 理论 在前两章中,我们看到了一些像Harris这样的拐角检测器.它们是旋转不变的,这意味着即使图像旋转了, ...

  4. 计算机视觉学习2_局部图像描述子_SIFT算法_特征匹配_集美大学地标

    文章目录 相关环境的搭建 原理部分 Harris角点检测算法 SIFT(尺度不变特征变换) 尺度不变性 实验部分 Harris和sift特征匹配处理 结果对比 集美大学小地图 相关环境的搭建 1.PC ...

  5. OpenCV(22)SIFT尺度不变特征变换(纯理论)

    SIFT算法(纯理论) 1.引言 前面介绍了Harris和Shi-Tomasi角点检测算法,这两种算法具有旋转不变性,但不具有尺度不变性.以下图为例,在左侧小图中可以检测到角点,但是图像被放大后,在使 ...

  6. python-opencv图像处理之SIFT尺度不变特征变换

    在这一章当中,我们将学习SIFT算法的概念,找到SIFT关键点和描述算符. 一.概念 在前面,我们看到了一些像Harris这样的拐角检测器.它们是旋转不变的,这意味着即使图像旋转了,我们也可以找到相同 ...

  7. OpenCV中的尺度不变特征变换(SIFT Scale-Invariant Feature Transform)

    OpenCV中的尺度不变特征变换(SIFT Scale-Invariant Feature Transform) 1. 效果图 2. 原理 2.1 步骤 2.2 opencv实现方法 2.3 SIFT ...

  8. ehd边缘直方图描述子 matlab,第 2 章 局部图像描述子

    第 2 章 局部图像描述子 本章旨在寻找图像间的对应点和对应区域.本章将介绍用于图像匹配的两种局部描述子算法.本书的很多内容中都会用到这些局部特征,它们在很多应用中都有重要作用,比如创建全景图.增强现 ...

  9. 【计算机视觉】局部图像描述子:SIFT算法

    文章目录 [计算机视觉]局部图像描述子:SIFT算法 1. SIFT算法的原理 1.1 SIFT算法的目标与思想 1.1.1 算法目标 1.1.2 算法思想 1.2 尺度空间的思想和表示 1.2.1 ...

最新文章

  1. 在dw怎么关联css文件,重新设置Adobe Dreamweaver的文件关联解决办法
  2. 洛谷 [SDOI2009]晨跑
  3. 国内首本免费深度学习书籍!还有人没Get么?
  4. leetcode744. 寻找比目标字母大的最小字母(二分查找)
  5. 太强了!顶尖高校学霸“神仙笔记”刷屏,这10类专业绝了
  6. 为什么计算神经科学和AI会融合
  7. N - C语言实验——各位数字之和排序
  8. BZOJ 2631 tree(动态树)
  9. python上三角九九乘法表_用5行Python代码打印九九乘法表
  10. 使用ajax的时候必须要加的几行代码
  11. IOS创建静态库Cocoa Touch Static Library
  12. 在WINDOWS 2003上运行Apache服务
  13. Java中基本类型和引用类型(简单介绍)
  14. Linux之Mysql升级
  15. 重庆python爬虫培训_PYTHON爬虫工程师
  16. ## 7.1 奇异值分解SVD和对称矩阵谱分解
  17. html+css 设置select标签的宽高
  18. Json转XML后将首字母大写(或者其他自己的需求格式)对象中包含list集合以及日期字段的处理(注解形式)
  19. 洛谷P4234 最小差值生成树 题解
  20. nofollow标签的写法与作用

热门文章

  1. 【PC工具】好用的搜索引擎DogeDoge替代百度搜索,中国的duckduckgo
  2. 【树莓派】树莓派CSI摄像头安装及测试方法
  3. Matlab篇(二)MATLAB中addpath的用法 (转)
  4. 拿到了B轮融资,但这家创业公司还是被天使投资人玩死了
  5. JVM规范系列第2章:Java虚拟机结构
  6. CSS概念,引入,选择器
  7. 主线科技完成A轮融资,蔚来资本、普洛斯隐山资本联合领投
  8. 第三百七十七节,Django+Xadmin打造上线标准的在线教育平台—apps目录建立,以及数据表生成...
  9. 《算法设计手册》面试题解答 第三章:数据结构
  10. Windows 10的应用体验之二