计算机视觉——SIFT特征提取与检索

一、sift简介

尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。

局部影像特征的描述与侦测可以帮助辨识物体 ,SIFT 特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。 对于光线、噪声、些微视角改变的容忍度也相当高。基于这些特性,它们是高度显著而且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体而且鲜有误认。使用 SIFT特征描述对于部分物体遮蔽的侦测率也相当高,甚至只需要3个以上的SIFT物体特征就足以计算出位置与方位。在现今的电脑硬件速度下和小型的特征数据库条件下,辨识速度可接近即时运算。SIFT特征的信息量大,适合在海量数据库中快速准确匹配。

二、sift算法原理

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

1.特点

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

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

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

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

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

2.可解决的问题

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

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

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

  3. 光照影响(illumination)

  4. 目标遮挡(occlusion)

  5. 杂物场景(clutter)

  6. 噪声

3.算法分解

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

1.尺度空间极值检测——即找特征点
对于二维图像***I***(x,y),建立图像的DOG (difference of guassians,即高斯差分)金字塔,DOG尺度空间含义为:可以用一个尺度空间的高斯函数和图像的卷积来表示。
在这里插入图片描述
G为尺度可变的高斯函数,***I***为空间坐标,其中西伽马为尺度。
为确定特征点所在的位置,首先需要建立一个高斯金字塔。
得到高斯金字塔后,再通过两个相邻的高斯尺度空间做差,得到高斯差分DOC金字塔,整个过程的公式如下:
在这里插入图片描述
高斯差分金字塔建立后,特征点就是DOG尺度空间众多极值点,(个人认为对其进行求偏导数即可得到特征点的位置坐标),查找该极值点需要把每个点与邻域内的周围的26个点进行比较,这些点包括,在同一尺度上相邻的8个点,以及相邻尺度上相邻的18个点。

2.特征点的尺度方向的确定
得到了特征点的坐标是完全不够的,必须要增加方向尺度信息。
· 采用有限差分的方法,求出在以特征点为圆心,以3倍西伽马为半径的范围内的图像梯度的幅值和相位。
· 利用直方图统计方法,求助邻域内所有像素点的梯度方向以及幅值。特征点的主方向就是直方图的峰值所代表的方向,确定了主方向就可以使SIFT算法具备旋转不变性。
· 主方向的计算公式为:(注:L表示特征点的尺度)
在这里插入图片描述
3.特征向量的生成
特征向量最终是通过求得的特征点的邻域梯度信息来计算的。
· 先把坐标轴位置旋转到特征点所在的主方向上
· 接着以特征点为圆心,选择特征点附近的16个点作为种子点,分别求出8个方向上的梯度大小
· 最后得到的128维向量即为所求的特征向量
4.特征点的匹配
通常采用最邻近的方法,即查找每一个特征点在另外一副图像中的最邻近,即最短的欧式距离。
欧式距离的含义就是:两点连线的距离长度
具体如下:

· 对目标图像A中的某个特征点,求出该点与图像B中的所有特征点的特征向量的欧式距离;
· 将所求得的欧式距离值的大小进行排序;
· 找出最小的和次小(倒数第二小的)欧式距离值对于的目标图B中的特征点,并对这两个距离的比值进行计算;
· 假设该比值小于某个阈值,则这两个点为匹配点,否则不匹配。
(注:该阈值是一个经验阈值:是影响误匹配的主要原因,实验中一般选取的阈值大小是0.6左右)

详解SIFT算法的实现过程详见此篇

4.缺点

SIFT在图像的不变特征提取方面拥有无与伦比的优势,但并不完美,仍然存在:

  1. 实时性不高。

  2. 有时特征点较少。

  3. 对边缘光滑的目标无法准确提取特征点。

三、实验

数据集:
在这里插入图片描述

1.SIFT特征提取,并展示特征点

3.1.1代码实现

为了计算图像的SIFT特征,要用到开源工具包VLFeat。

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from PCV.localdescriptors import sift
from PCV.localdescriptors import harris

# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)

imname = r'D:\SiftPicture\16.jpg'
im = array(Image.open(imname).convert('L'))
sift.process_image(imname, 'empire.sift')
l1, d1 = sift.read_features_from_file('empire.sift')

figure()
gray()
subplot(131)
sift.plot_features(im, l1, circle=False)
title(u'SIFT特征',fontproperties=font)
subplot(132)
sift.plot_features(im, l1, circle=True)
title(u'用圆圈表示SIFT特征尺度',fontproperties=font)

# 检测harris角点
harrisim = harris.compute_harris_response(im)

subplot(133)
filtered_coords = harris.get_harris_points(harrisim, 6, 0.1)
imshow(im)
plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*')
axis('off')
title(u'Harris角点',fontproperties=font)

show()

3.1.2结果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从上述结果可知,这两种算法选择了不同的坐标。由图可以看出,与Harris角点检测相比,sift提取出来的特征点信息更多,而且更加精准,这是因为sift的特征点提取步骤比Harris的步骤复杂的多,它需要建立高斯图像金字塔和高斯差分金字塔之后再检测极值,而Harris角点只是对原图进行角点检测和变化。

2.SIFT特征匹配

3.2.1代码实现

要注意匹配的两张图大小和尺寸需一致,否则编译会出错。

from PIL import Image
from pylab import *
import sys
from PCV.localdescriptors import sift


if len(sys.argv) >= 3:
  im1f, im2f = sys.argv[1], sys.argv[2]
else:
#  im1f = '../data/sf_view1.jpg'
#  im2f = '../data/sf_view2.jpg'
  im1f = r'D:\SiftPicture\1.jpg'
  im2f = r'D:\SiftPicture\2.jpg'
#  im1f = '../data/climbing_1_small.jpg'
#  im2f = '../data/climbing_2_small.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(d1, d2)
matches = sift.match_twosided(d1, d2)
print '{} matches'.format(len(matches.nonzero
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SIFT(Scale-Invariant Feature Transform)是一种基于尺度空间的特征提取算法,用于在图像中检测出关键点并提取出其特征描述子,具有尺度不变性和旋转不变性。下面是SIFT特征提取与匹配的MATLAB代码实现: 1. SIFT特征提取 ```matlab % 读入图像 img = imread('img.jpg'); % 转为灰度图像 gray_img = rgb2gray(img); % 构建尺度空间 octaves = 4; % 构建的金字塔层数 scales = 5; % 每层构建的尺度数 k = 2^(1/scales); % 尺度因子 sigma = 1.6; % 高斯核标准差 [gaussian_pyramid, dog_pyramid] = build_pyramid(gray_img, octaves, scales, k, sigma); % 检测极值点 extrema = detect_extrema(dog_pyramid); % 剔除低对比度点和边缘响应点 extrema = eliminate_low_contrast_and_edge_points(extrema, dog_pyramid); % 计算关键点的尺度、方向和描述子 keypoints = compute_keypoints(gaussian_pyramid, extrema); ``` 其中,`build_pyramid`函数用于构建高斯金字塔和差分金字塔,`detect_extrema`函数用于检测极值点,`eliminate_low_contrast_and_edge_points`函数用于剔除低对比度点和边缘响应点,`compute_keypoints`函数用于计算关键点的尺度、方向和描述子。 2. SIFT特征匹配 ```matlab % 读入待匹配图像 img1 = imread('img1.jpg'); gray_img1 = rgb2gray(img1); % 读入模板图像 img2 = imread('img2.jpg'); gray_img2 = rgb2gray(img2); % 提取特征点和特征描述子 keypoints1 = detectSURFFeatures(gray_img1); [keypoints1, features1] = extractFeatures(gray_img1, keypoints1); keypoints2 = detectSURFFeatures(gray_img2); [keypoints2, features2] = extractFeatures(gray_img2, keypoints2); % 特征匹配 indexPairs = matchFeatures(features1, features2); matchedPoints1 = keypoints1(indexPairs(:, 1)); matchedPoints2 = keypoints2(indexPairs(:, 2)); % 显示匹配结果 figure; showMatchedFeatures(img1, img2, matchedPoints1, matchedPoints2); ``` 其中,`detectSURFFeatures`函数用于检测SURF特征点,`extractFeatures`函数用于提取SURF特征描述子,`matchFeatures`函数用于进行特征匹配,`showMatchedFeatures`函数用于显示匹配结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值