OpenCV 例程 300篇241. 尺度不变特征变换(SIFT)

Posted YouCans

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV 例程 300篇241. 尺度不变特征变换(SIFT)相关的知识,希望对你有一定的参考价值。

『youcans 的 OpenCV 例程300篇 - 总目录』


【youcans 的 OpenCV 例程 300篇】241. 尺度不变特征变换(SIFT)


6.4 尺度不变特征变换(SIFT)

6.4.1 简介

尺度不变特征转换算法(Scale-invariant feature transform,SIFT)是图像处理中经典的局部特征描述算法,广泛应用于物体识别、动作识别、影像配准、影像追踪和 3D 建模。

当不同图像尺度系统、方向相似时,可以用角检测和 MSER 作为整体图像特征。但存在尺度变化、方向旋转、光照变化和视点变化时,则需要使用 SIFT 方法提取图像中的不变特征。

SIFT 算法检测与描述影像中的局部性特征,在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量。

SIFT 算法的实质是在不同的尺度空间上查找关键点(特征点),计算特征点的大小、方向、尺度信息,利 用这些信息组成关键点对特征点进行描述的问题。SIFT 算法查找的关键点都是高度显著且容易获取的“稳定”特征点,如角点、边缘点、暗区的亮点以及亮区的暗点等,这些特征与大小、旋转无关,对于光线、噪声、视角改变的鲁棒性也很高。

SIFT 算法的特点是:

(1)SIFT 特征不仅具有尺度不变性,而且具有旋转不变性、亮度不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;
(2)独特性好,信息量丰富,适用于在海量的特征数据库中进行快速、准确的匹配;
(3)多量性,即使少数几个物体也可以产生大量的 SIFT 特征向量;
(4)高速性,优化的 SIFT 匹配算法可以满足实时要求;
(5)可扩展性,方便与其它形式的特征向量相结合。

SIFT 算法比较复杂,Lowe 将其分解为四个基本步骤:

(1)尺度空间极值检测:通过高斯差分金字塔识别潜在的对于尺度和旋转不变的兴趣点。
(2)关键点的精确定位:通过模型拟合确定关键点位置和尺度。
(3)确定关键点的方向:基于图像局部的梯度方向,确定每个关键点的一个或多个方向。
(4)关键点描述:在关键点的邻域内,在选定的尺度上测量图像局部的梯度。


6.4.2 数学方法

1、构造尺度空间

高斯差分金字塔(DoG pyramid) 是 SIFT 检测的基础。

物体在不同的观测尺度下有不同的表现形态。人在距离目标由近到远时,各尺度图像的模糊程度逐渐变大,尺度越大图像越模糊。图像高斯金字塔是一种图像的尺度空间,模拟人眼看到物体的远近程度以及模糊程度。

图像的尺度空间表达就是图像在所有尺度下的描述。尺度空间表达是由不同高斯核平滑卷积得到,在所有尺度上具有相同的分辨率,而高斯金字塔的多分辨率表达在每层分辨率减少。

高斯核是唯一可以产生多尺度空间的核。一个图像的尺度空间 L ( x , y , σ ) L(x,y,\\sigma) L(x,y,σ) 定义为原始图像 I ( x , y ) I(x,y) I(x,y) 与一个可变尺度二维高斯函数 G ( x , y , σ ) G(x,y,\\sigma) G(x,y,σ) 的卷积运算。

尺度空间:
L ( x , y , σ ) = G ( x , y , σ ) ⋆ I ( x , y ) L(x, y, \\sigma) = G(x,y,\\sigma) \\star I(x,y) L(x,y,σ)=G(x,y,σ)I(x,y)
二维空间高斯函数:
G ( x , y , σ ) = 1 2 π σ 2 e x p − ( x 2 + y 2 ) / 2 σ 2 G(x,y,\\sigma) = \\frac12\\pi \\sigma ^2 exp^-(x^2+y^2) /2 \\sigma ^2 G(x,y,σ)=2πσ21exp(x2+y2)/2σ2
输入图像 I ( x , y ) I(x,y) I(x,y) 依次与标准差为 σ , k σ , k 2 σ . . . \\sigma,k \\sigma,k^2 \\sigma... σk2σ... 的高斯核卷积,生成一组由常量因子 k 分隔的高斯平滑图像。

SIFT 将尺度空间细分为倍频程(八音度),每个倍频程对应于 σ \\sigma σ 的加倍。倍频程是指音乐中的频率之比为 2 的两个频段之间的间隔,每个频段的上限频率是下限频率的 2倍,如 31.25、62.5、125、250、500、1K …。

SIFT 将每个倍频程细分为 n 个区间。对于行高为 M、列宽为 N 的图像,可以求得图像高斯金字塔的组数 O、每组的层数 S:
O = [ l o g 2 m i n ( M , N ) ] − 3 S = n + 3 O = [log_2 min(M,N)] - 3\\\\ S = n + 3 O=[log2min(M,N)]3S=n+3
则:
σ ( o , r ) = σ 0 2 o + r / n ,  o ∈ [ 0 , . . . O − 1 ] , r ∈ [ 0 , . . . n + 2 ] \\sigma (o,r) = \\sigma _0 2^o+r/n,\\ o \\in [0,... O-1], r \\in [0,...n+2] σ(o,r)=σ02o+r/n o[0,...O1],r[0,...n+2]
式中 o 为组 Octave 的索引号,r 为组内各层的索引号, σ ( o , r ) \\sigma(o,r) σ(o,r) 为各组各层中图像的高斯模糊系数,初值被设为 σ 0 = 1.6 \\sigma _0 = 1.6 σ0=1.6 (考虑相机采样带来的模糊,修正为 σ 0 = 1. 6 2 − 0. 5 2 = 1.52 \\sigma _0 = \\sqrt1.6^2 - 0.5^2 = 1.52 σ0=1.620.52 =1.52 )。


2、检测局部极值

关键点是由高斯差分空间的局部极值点组成的。

关键点的初步探查是通过对同一组内各相邻层之间的高斯差分图像进行局部最大值搜索,在空间位置和尺度空间定位局部特征点。为了寻找局部极值点,每一个检测点要与其同尺度的 8 个相邻点及上下相邻尺度对应的 9*2 个点进行比较,以确保检测到尺度空间和图像空间的极值点。

SIFT 检测一个倍频程中两幅相邻尺度空间图像的高斯差的机制,然后与对应于这个倍频程的输入图像进行卷积。在实际计算中,对两个不同高斯尺度空间的图像相减,就得到高斯差分图像 D ( x , y , σ ) D(x,y,\\sigma) D(x,y,σ)
D ( x , y , σ ) = [ G ( x , y , k σ ) − G ( x , y , σ ) ] ⋆ I ( x , y ) = L ( x , y , k σ ) − L ( x , y , σ ) D(x,y,\\sigma) = [G(x,y,k\\sigma) - G(x,y,\\sigma)] \\star I(x,y)\\\\ = L(x,y,k\\sigma) - L(x,y,\\sigma) D(x,y,σ)=[G(x,y,)G(x,y,σ)]I(x,y)=L(x,y,)L(x,y,σ)

Lindberg 证明尺度空间中的尺度不变性要求使用 σ 2 \\sigma ^2 σ2 对高斯差分算子进行归一化:
G ( x , y , k σ ) − G ( x , y , σ ) ≈ ( k − 1 ) σ 2 ▽ 2 G G(x,y,k\\sigma) - G(x,y,\\sigma) \\approx (k-1) \\sigma ^2 \\triangledown ^2G G(x,y,)G(x,y,σ)(k1)σ22G

构造尺度空间和检测局部机制的具体实现步骤如下:

(1)对原图进行不同尺度的高斯模糊,得到一组图片,称为一个倍频程(Octave)。每个倍频程内的图片尺寸相同,高斯模糊系数 σ \\sigma σ 不同;
(2)对第一个倍频程内的图片进行差分操作,得到一组差分数据;
(3)对第一个倍频程中最上面的图片进行高斯降采样,得到尺寸缩小的图片,再对缩小图片进行不同尺度的高斯模糊,得到一组尺寸缩小的图片。
(4)对第二个倍频程内的图片进行差分操作,得到一组差分数据;
(5)重复以上过程,得到各组差分数据。


3、极值点(Key points)的精确定位

高斯差分金字塔在尺度空间和像素点都是离散的,检测到的极值点位置不太准确。高斯差分算子会产生较强的边缘响应,某些极值点对比度较低或稳定性较低。

通过三维二次拟合函数可以求出亚像素位置精度的极值点,精确确定关键点的位置和尺度,并去除低对比度的关键点和不稳定的边缘响应点,以增强匹配稳定性、提高抗噪声能力。

对高斯差分图像 D ( x , y , σ ) D(x,y,\\sigma) D(x,y,σ) 进行泰勒级数展开:

D ( x ) = D + ( ∂ D ∂ x ) T x + 1 2 x T ∂ 2 D ∂ x 2 x D(x) = D + (\\frac\\partial D\\partial x)^T x + \\frac12 x^T \\frac\\partial ^2 D\\partial x^2 x D(x)=D+(xD)Tx+21xTx22Dx

对上式求导后,求出极值点的精确位置为:

x ^ = − H − 1 ( ▽ D ) ▽ D = ∂ D ∂ x = [ D x D y D σ ] H x y σ [ D x x D x y D x σ D x y D y y D y σ D σ x D σ y D σ σ ] \\hatx = -H^-1(\\triangledown D) \\\\ \\triangledown D = \\frac\\partial D\\partial x = \\beginbmatrix D_x\\\\ D_y\\\\ D_\\sigma \\endbmatrix\\\\ H_xy\\sigma\\beginbmatrix D_xx & D_xy & D_x \\sigma\\\\ D_xy & D_yy & D_y \\sigma\\\\ D_\\sigma x & D_\\sigma y & D_\\sigma \\sigma\\\\ \\endbmatrix x^=H1(D)D=xD= 以上是关于OpenCV 例程 300篇241. 尺度不变特征变换(SIFT)的主要内容,如果未能解决你的问题,请参考以下文章