【OpenCV】SIFT原理与源码分析:DoG尺度空间构造

article/2025/10/9 13:49:31

《SIFT原理与源码分析》系列文章索引:http://blog.csdn.net/xiaowei_cqu/article/details/8069548

尺度空间理论


自然界中的物体随着观测 尺度不同有不同的表现形态。例如我们形容建筑物用“米”,观测分子、原子等用“纳米”。更形象的例子比如 Google地图,滑动鼠标轮可以改变观测地图的尺度,看到的地图绘制也不同;还有电影中的拉伸镜头等等……
尺度空间中各尺度图像的模糊程度逐渐变大,能够模拟人在距离目标由近到远时目标在视网膜上的形成过程。
尺度越大图像越模糊。

为什么要讨论尺度空间?

用机器视觉系统分析未知场景时,计算机并不预先知道图像中物体的尺度。我们需要同时考虑图像在多尺度下的描述,获知感兴趣物体的 最佳尺度。另外如果不同的尺度下都有同样的关键点,那么在不同的尺度的输入图像下就都可以检测出来关键点匹配,也就是 尺度不变性

图像的尺度空间表达就是图像在所有尺度下的描述。


尺度空间表达与金字塔多分辨率表达


高斯模糊

高斯核是唯一可以产生多尺度空间的核(《Scale-space theory: A basic tool for analysing structures at different scales》)。一个图像的尺度空间L(x,y,σ) ,定义为原始图像I(x,y)与一个可变尺度的2维高斯函数G(x,y,σ)卷积运算。 

二维空间高斯函数:


尺度空间:


尺度是自然客观存在的,不是主观创造的。高斯卷积只是表现尺度空间的一种形式。

二维空间高斯函数是等高线从中心成正太分布的同心圆:


分布不为零的点组成卷积阵与原始图像做变换,即每个像素值是周围相邻像素值的高斯平均。一个5*5的高斯模版如下所示:


高斯模版是圆对称的,且卷积的结果使原始像素值有最大的权重,距离中心越远的相邻像素值权重也越小。
在实际应用中,在计算高斯函数的离散近似时,在大概 距离之外的像素都可以看作不起作用,这些像素的计算也就可以忽略。所以,通常程序只计算 (6σ+1)*(6σ+1)就可以保证相关像素影响。

高斯模糊另一个很厉害的性质就是线性可分:使用二维矩阵变换的高斯模糊可以通过在水平和竖直方向各进行一维高斯矩阵变换相加得到。


O(N^2*m*n)次乘法就缩减成了O(N*m*n)+O(N*m*n)次乘法。(N为高斯核大小,m,n为二维图像高和宽)

其实高斯这一部分只需要简单了解就可以了,在OpenCV也只需要一句代码:

GaussianBlur(dbl, dbl, Size(), sig_diff, sig_diff);
我这里详写了一下是因为这块儿对分析算法效率比较有用,而且高斯模糊的算法真的很漂亮~

金字塔多分辨率

金字塔是早期图像多尺度的表示形式。图像金字塔化一般包括两个步骤:使用低通滤波器平滑图像;对平滑图像进行降采样(通常是水平,竖直方向1/2),从而得到一系列尺寸缩小的图像。


上图中(a)是对原始信号进行低通滤波,(b)是降采样得到的信号。

而对于二维图像,一个传统的金字塔中,每一层图像由上一层分辨率的长、宽各一半,也就是四分之一的像素组成:


多尺度和多分辨率

尺度空间表达和金字塔多分辨率表达之间最大的不同是:

  • 尺度空间表达是由不同高斯核平滑卷积得到,在所有尺度上有相同的分辨率;
  • 而金字塔多分辨率表达每层分辨率减少固定比率。
所以,金字塔多分辨率生成较快,且占用存储空间少;而多尺度表达随着尺度参数的增加冗余信息也变多。
多尺度表达的优点在于图像的局部特征可以用简单的形式在不同尺度上描述;而金字塔表达没有理论基础,难以分析图像局部特征。

DoG(Difference of Gaussian)


高斯拉普拉斯LoG金字塔

结合尺度空间表达和金字塔多分辨率表达,就是在使用尺度空间时使用金字塔表示,也就是计算机视觉中最有名的拉普拉斯金子塔( 《The Laplacian pyramid as a compact image code》)。
高斯拉普拉斯LoG(Laplace of Guassian)算子就是对高斯函数进行拉普拉斯变换:

核心思想还是高斯,这个不多叙述。

高斯差分DoG金字塔

DoG(Difference of Gaussian)其实是对高斯拉普拉斯LoG的近似,也就是对 的近似。SIFT算法建议,在某一尺度上的特征检测可以通过对两个相邻高斯尺度空间的图像相减,得到DoG的响应值图像D(x,y,σ)。然后仿照LoG方法,通过对响应值图像D(x,y,σ)进行局部最大值搜索,在空间位置和尺度空间定位局部特征点。其中:

k为相邻两个尺度空间倍数的常数。

上图中(a)是DoG的三维图,(b)是DoG与LoG的对比。

金字塔构建


构建高斯金字塔

为了得到DoG图像,先要构造高斯金字塔。我们回过头来继续说高斯金字塔~
高斯金字塔在多分辨率金字塔简单 降采样基础上加了高斯滤波,也就是对金字塔每层图像用不同参数的σ做高斯模糊,使得每层金字塔有多张高斯模糊图像。金字塔每层多张图像合称为一组(Octave),每组有多张(也叫层Interval)图像。另外,降采样时,金字塔上边一组图像的第一张图像(最底层的一张)是由前一组(金字塔下面一组)图像的倒数第三张隔点采样得到。


以下是OpenCV中构建高斯金字塔的代码,我加了相应的注释:
// 构建nOctaves组(每组nOctaves+3层)高斯金字塔
void SIFT::buildGaussianPyramid( const Mat& base, vector<Mat>& pyr, int nOctaves ) const
{
vector<double> sig(nOctaveLayers + 3);
pyr.resize(nOctaves*(nOctaveLayers + 3));
// precompute Gaussian sigmas using the following formula:
//  \sigma_{total}^2 = \sigma_{i}^2 + \sigma_{i-1}^2、
// 计算对图像做不同尺度高斯模糊的尺度因子
sig[0] = sigma;
double k = pow( 2., 1. / nOctaveLayers );
for( int i = 1; i < nOctaveLayers + 3; i++ )
{
double sig_prev = pow(k, (double)(i-1))*sigma;
double sig_total = sig_prev*k;
sig[i] = std::sqrt(sig_total*sig_total - sig_prev*sig_prev);
}
for( int o = 0; o < nOctaves; o++ )
{
// DoG金子塔需要nOctaveLayers+2层图像来检测nOctaves层尺度
// 所以高斯金字塔需要nOctaveLayers+3层图像得到nOctaveLayers+2层DoG金字塔
for( int i = 0; i < nOctaveLayers + 3; i++ )
{
// dst为第o组(Octave)金字塔
Mat& dst = pyr[o*(nOctaveLayers + 3) + i];
// 第0组第0层为原始图像
if( o == 0  &&  i == 0 )
dst = base;
// base of new octave is halved image from end of previous octave
// 每一组第0副图像时上一组倒数第三幅图像隔点采样得到
else if( i == 0 )
{
const Mat& src = pyr[(o-1)*(nOctaveLayers + 3) + nOctaveLayers];
resize(src, dst, Size(src.cols/2, src.rows/2),
0, 0, INTER_NEAREST);
}
// 每一组第i副图像是由第i-1副图像进行sig[i]的高斯模糊得到
// 也就是本组图像在sig[i]的尺度空间下的图像
else
{
const Mat& src = pyr[o*(nOctaveLayers + 3) + i-1];
GaussianBlur(src, dst, Size(), sig[i], sig[i]);
}
}
}
}

高斯金字塔的组数为:

代码10-17行是计算高斯模糊的系数σ,具体关系如下:

其中,σ为尺度空间坐标,s为每组中层坐标,σ0为初始尺度,S为每组层数(一般为3~5)。根据这个公式,我们可以得到金字塔组内各层尺度以及组间各图像尺度关系。
组内相邻图像尺度关系:

相邻组间尺度关系:

所以, 相邻两组的同一层尺度为2倍的关系
最终尺度序列总结为:

o为金字塔组数,n为每组金字塔层数。

构建DoG金字塔

构建高斯金字塔之后,就是用金字塔相邻图像相减构造DoG金字塔。



下面为构造DoG的代码:
// 构建nOctaves组(每组nOctaves+2层)高斯差分金字塔
void SIFT::buildDoGPyramid( const vector<Mat>& gpyr, vector<Mat>& dogpyr ) const
{
int nOctaves = (int)gpyr.size()/(nOctaveLayers + 3);
dogpyr.resize( nOctaves*(nOctaveLayers + 2) );
for( int o = 0; o < nOctaves; o++ )
{
for( int i = 0; i < nOctaveLayers + 2; i++ )
{
// 第o组第i副图像为高斯金字塔中第o组第i+1和i组图像相减得到
const Mat& src1 = gpyr[o*(nOctaveLayers + 3) + i];
const Mat& src2 = gpyr[o*(nOctaveLayers + 3) + i + 1];
Mat& dst = dogpyr[o*(nOctaveLayers + 2) + i];
subtract(src2, src1, dst, noArray(), CV_16S);
}
}
}
这个比较简单,就是一个 subtract()函数。

至此,SIFT第一步就完成了。参见《SIFT原理与源码分析》

(转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu 未经允许请勿用于商业用途)








http://chatgpt.dhexx.cn/article/so8O1wPy.shtml

相关文章

多尺度空间概念

1.图像的尺度 这里图像的尺度并非指图像的大小&#xff0c;而是指图像的模糊程度&#xff08;σ&#xff09; &#xff0c;例如&#xff0c;人近距离看一个物体和远距离看一个物体模糊程度是不一样的&#xff0c;从近距离到远距离图像越来越模糊的过程&#xff0c;也是图像的尺…

关于尺度空间的理解

通常会听到尺度变化等这类词语&#xff0c;看到的也总是一堆的数学公式&#xff0c;有时候真的不知道这到底有啥用&#xff0c;有啥意义&#xff0c;没有弄懂这些意义&#xff0c;当然就更不可能的理解&#xff0c;不可能去掌握应用它了&#xff0c;现在我才理解&#xff0c;小…

图像的尺度、尺度空间等概念

1.图像的尺度 这里图像的尺度并非指图像的大小&#xff0c;而是指图像的模糊程度&#xff08;σ&#xff09; &#xff0c;例如&#xff0c;人近距离看一个物体和远距离看一个物体模糊程度是不一样的&#xff0c;从近距离到远距离图像越来越模糊的过程&#xff0c;也是图像的尺…

SIFT算法系列之尺度空间

尺度空间定义 说到尺度空间理论最早可以追溯到1962年的T.Iijima最先提出,学术界开始关注尺度空间技术主要在1986年IEEE PAMI上同时刊出的4篇关于尺度空间理论的文章奠定了发展基础。现实世界中物体只有具备一定的尺度才能够倍人眼所察觉,计算机视觉学术研究就是在不断的尝试与…

尺度空间与图像金字塔(一)

文章目录 尺度空间什么是尺度空间&#xff08;scale space&#xff09;为什么需要尺度空间高斯核 图像金字塔什么是分辨率为什么需要多分辨率多尺度和多分辨率图像金字塔高斯金字塔SIFT 参考 Why multi-scale? Why should you blur? • Computational efficiency • Coarse-t…

关系数据库概述

一、数据模型 一般地讲&#xff0c;数据模型是严格定义的一组概念的集合&#xff0c;通常由数据结构、数据操作和完整性约束三部分组成。 1.1 数据结构 数据结构描述数据库的组成对象以及对象之间的联系。数据结构是刻画一个数据模型性质最重要的方面。因此在数据库系统中&…

数据库-关系数据库基本概念

1.关系数据库及形式化定义 I、关系 关系模型的数据结构非常简单&#xff0c;只包含单一的数据结构--关系&#xff08;表&#xff09;。在用户看来关系就是一张扁平的二维表。 关系模型的数据结构虽然简单但是能够表达丰富的语义&#xff0c;描述出现实世界中的实体以及实体间…

关系数据库理论----如何判断关系模式规范化达到第几范式

文章目录 求关系模式最高达到第几范式的步骤通俗理解1NF,2NF,3NF.如何求关系模式的候选码如何求闭包函数依赖 求关系模式最高达到第几范式的步骤 根据给定的U和F,首先求它的候选码根据候选码判断关系F中的函数关系是否满足第二范式,若不满足则为关系模式的规范化最高为第一范式…

关系数据库

一、关系数据库 实体间的关系有三种&#xff1a;一对一&#xff08;one-to-one&#xff09;、一对多&#xff08;one-to-many&#xff09;、多对多&#xff08;many-to-many&#xff09; &#xff08;一&#xff09;数据模型 1、层次模型&#xff08;一对多&#xff09; 层次模…

【数据库原理】关系数据库理论(一)

数据库规范化理论. 当面对一个现实问题&#xff0c;例如要求设计一个教学管理数据库&#xff0c;如何使用关系模型设计一个合理且合适的关系数据库&#xff0c;如何选择一个比较好的关系模式的集合&#xff0c;每个关系由哪些属性组成&#xff0c;这些属于数据库逻辑设计的问题…

数据库基本理论和概念:关系模型

关系模型有三个原理组件&#xff1a;结构性组件、完整性组件以及操纵性组件。 本文主要介绍结构性组件及其它组件的一些基本概念。本文的产生&#xff0c;基于阅读The Definitive Guide to Sqlite后的一些感想&#xff01; &#xff08;1&#xff09;结构性组件 定义了信息的组…

数据库理论

前言 本篇只讲述数据库相关的各种概念理论&#xff0c;具体代码实践不在本篇讨论范围之内&#xff0c;此后会另起一篇写代码和例题 由于是还有几天就要考试了&#xff0c;所以本篇内容尽量精简&#xff0c;采用的语言也并不官方&#xff0c;尽可能通俗易懂。 数据库发展史 什么…

数据库-关系数据库设计

关系数据库设计理论包括 1.数据依赖 2.范式 1NF,2NF,3NF,BCNF 3.关系模式的规范化 设计步骤 数据分析->数据建模->关系数据库模式->关系数据库管理 ER模型 实体指数据对象 实体集指一类实体构成的集合 实体某一特性称为属性 一、函数依赖 关系&#xff1a;描述实体及…

数据库-关系模型

最近开始做数据库的大实验&#xff0c;其中有一条实验要求如下&#xff1a; 通过网络查找相关文献并参考所给资料进行需求分析&#xff0c;画出系统的 E-R 图&#xff0c;给出实体或联系的属性&#xff0c;标明联系的种类&#xff0c;并写出 关系模式。 画ER图没有什么问题&…

【数据库原理及应用】——关系数据库的规范化理论(学习笔记)

&#x1f4d6; 前言&#xff1a;关系数据库的规范化理论是数据库设计的一个理论指南&#xff0c;提供了判断一个关系模式优劣的理论依据。本章讨论的关系数据库的规范化理论主要包含三方面内容&#xff1a;函数依赖、范式和模式分解准则。函数依赖起着核心作用&#xff0c;是模…

数据库原理—关系数据库

一、思维导图&#xff1a; 二、基本知识点&#xff1a; 1、关系数据库结构 &#xff08;1&#xff09;域&#xff1a;一组具有相同数据类型的值的集合&#xff08;如整数、实数、指定长度的字符串集合&#xff09; &#xff08;2&#xff09;笛卡尔积运算&#xff1a;假设两个…

数据库原理——关系数据理论(全)

关系数据理论 数据依赖包括函数依赖和多值依赖。 5.1 函数依赖 5.1.1 函数依赖的定义 设 R ( U ) R(U) R(U)是属性集U上的关系模式&#xff0c; X , Y ⊆ U X,Y\subseteq U X,Y⊆U &#xff08; X , Y X,Y X,Y是属性&#xff09;&#xff0c; 若对于 ∀ r ( 值 ) ∈ R ( U…

数据库原理——关系数据理论(一)

关系数据理论 数据依赖包括函数依赖和多值依赖。 5.1 函数依赖 5.1.1 函数依赖的定义 设 R ( U ) R(U) R(U)是属性集U上的关系模式&#xff0c; X , Y ⊆ U X,Y\subseteq U X,Y⊆U &#xff08; X , Y X,Y X,Y是属性&#xff09;&#xff0c; 若对于 ∀ r ( 值 ) ∈ R ( U…

关系数据库基础理论

mysql系列之一关系数据库基础理论 正是数据库管理的需要催生了数据库管理系统DBMS&#xff0c;而关系型数据库管理系统为RDBMS 常见的数据模型有三种&#xff1a; - 层次模型 - 网状模型 - 关系模型 一、关系数据库的产生 在DBMS出现之前&#xff0c;人们用文件来管理数据…

关系数据库(数据库原理)

目录 一、关系数据结构 二、关系的完整性 三、关系运算 四、关系的规范化 一、关系数据结构 1、关系的定义和性质 &#xff08;1&#xff09;、 关系的数学定义&#xff1a; 域&#xff1a; 一组有相同数据类型的值得集合 笛卡尔积&#xff1a; 设任意的N个域D1,D2,…,Dn。…