- 浏览: 282714 次
- 性别:
- 来自: 济南
文章分类
最新评论
《SIFT原理与源码分析》系列文章索引:http://blog.csdn.net/xiaowei_cqu/article/details/8069548
尺度空间理论
尺度越大图像越模糊。
为什么要讨论尺度空间?
图像的尺度空间表达就是图像在所有尺度下的描述。
尺度空间表达与金字塔多分辨率表达
高斯模糊
高斯核是唯一可以产生多尺度空间的核(《Scale-space theory: A basic tool for analysing structures at different scales》)。一个图像的尺度空间L(x,y,σ) ,定义为原始图像I(x,y)与一个可变尺度的2维高斯函数G(x,y,σ)卷积运算。
二维空间高斯函数:
尺度空间:
尺度是自然客观存在的,不是主观创造的。高斯卷积只是表现尺度空间的一种形式。
二维空间高斯函数是等高线从中心成正太分布的同心圆:
分布不为零的点组成卷积阵与原始图像做变换,即每个像素值是周围相邻像素值的高斯平均。一个5*5的高斯模版如下所示:
高斯模版是圆对称的,且卷积的结果使原始像素值有最大的权重,距离中心越远的相邻像素值权重也越小。
在实际应用中,在计算高斯函数的离散近似时,在大概3σ距离之外的像素都可以看作不起作用,这些像素的计算也就可以忽略。所以,通常程序只计算(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金字塔
高斯差分DoG金字塔
金字塔构建
构建高斯金字塔
// 构建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]); } } } }
构建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未经允许请勿用于商业用途)
发表评论
-
unity基础开发----物体位移和旋转实用代码
2013-11-21 22:46 1271using UnityEngine; using Syst ... -
Android中View绘制优化之一---- 优化布局层次
2012-09-04 23:00 1083... -
Android中View绘制优化二一---- 使用<include />标签复用布局文件
2012-09-08 13:54 1067... -
Android中View绘制优化之三---- 优化View
2012-09-13 21:00 1090... -
兰林任务管理应用程序雏形版以及概要说明
2012-09-15 21:54 887... -
Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(上)
2012-10-10 18:14 1180... -
Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)
2012-10-17 20:05 877... -
Android中文件选择器的实现
2012-11-30 08:59 1183... -
【编译原理】使用Lex将C/C++文件输出为HTML文件
2012-07-20 09:37 108508年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【编译原理】正则表达式
2012-07-21 21:49 232508年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【OpenCV】访问Mat图像中每个像素的值
2012-07-22 07:10 1183今天百度搜资料还搜到了自己的。。。《访问图像中每个像素的值 ... -
【编译原理】用Yacc做语法分析
2012-07-23 05:47 180308年9月入学,12年7月毕 ... -
【UML】UML几种图的绘制
2012-07-24 09:49 99408年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【OpenCV】邻域滤波:方框、高斯、中值、双边滤波
2012-07-26 10:52 1467邻域滤波(卷积) 邻域算子值利用给定像素 ... -
【数据结构】排序算法:希尔、归并、快速、堆排序
2012-07-28 06:15 103508年9月入学,12年7月毕 ... -
【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测
2012-07-31 13:25 1552角点 特征检测与匹配 ... -
【UML】案例分析:机场运作系统
2012-08-01 17:22 314908年9月入学,12年7月毕 ... -
【OpenCV】边缘检测:Sobel、拉普拉斯算子
2012-08-04 13:41 1559边缘 边缘(edge)是指图像局部强度变化最显著的部分。主要 ... -
【OpenCV】Canny 边缘检测
2012-08-08 10:17 2002Canny 边缘检测算法 1986 ... -
【UML】案例分析:新型超市购物自助系统
2012-08-19 01:13 130008年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ...
相关推荐
这个名为"openCV-2.2_collection.rar"的压缩包包含了一个针对OpenCV 2.2版本的源码分析,特别关注了SIFT(尺度不变特征变换)算法的实现。SIFT是一种经典且广泛使用的特征检测和描述方法,它在图像识别、匹配和3D...
SIFT算法,全称为尺度不变特征变换(Scale-Invariant Feature Transform),是一种在...通过深入分析OpenCV中的SIFT源码,可以更好地理解和应用SIFT算法,以及如何在不侵犯专利的前提下,开发类似的特征提取方法。
**OpenCV中的SIFT(尺度不变特征变换)算法详解** SIFT(Scale-Invariant Feature Transform,尺度不变特征变换)是一种强大的计算机视觉算法,用于在不同尺度和旋转下识别图像的关键点。OpenCV库,一个开源的...
**SIFT(尺度不变特征变换)**是一种在计算机视觉领域广泛应用的局部特征检测算法,由David G. Lowe在1999年提出。SIFT特征具有尺度不变性、旋转不变性和部分遮挡抗干扰能力,使得它在图像匹配、物体识别、三维重建...
通过阅读和理解这段代码,你可以深入学习SIFT算法的工作原理,以及如何利用OpenCV进行实际的图像处理任务。 在实际应用中,SIFT算法与其他图像处理技术结合,如RANSAC(随机样本一致性)进行几何变换的估计,可以...
**OpenCV实现的SIFT特征提取与匹配算法详解** ...总结,这个项目为学习和实践SIFT特征提取与匹配提供了一个基础平台,通过运行和分析代码,可以帮助开发者深入理解SIFT算法的工作原理,并为实际应用提供参考。
**基于OpenCV的SIFT(尺度不变特征转换)代码详解** SIFT(Scale-Invariant Feature Transform,尺度不变特征转换)是一种强大的图像特征检测方法,由David G. Lowe在2004年提出。该算法的核心在于它能检测出图像中...
1. **尺度空间极值检测**:SIFT算法首先通过高斯差分金字塔来构建尺度空间,以寻找在不同尺度下的关键点。这样可以确保特征在缩放、旋转或光照变化等情况下依然稳定。 2. **关键点定位**:找到尺度空间中的局部极大...
**OpenCV SIFT (尺度不变特征变换) 知识详解** OpenCV(开源计算机视觉库)是一个强大的跨平台计算机视觉库,它包含了各种用于图像处理和计算机视觉的算法。SIFT(尺度不变特征变换)是其中一种关键的特征检测与...
在这个OpenCV实现的SIFT算法源码中,我们可以深入理解SIFT的关键步骤: 1. **尺度空间极值检测**:SIFT算法首先在多尺度上寻找图像的局部极值点,通过高斯差分金字塔来实现。每个尺度层都通过高斯滤波器平滑图像,...
SIFT(尺度不变特征变换)和光流是其中两个关键的概念,它们在理解和分析图像序列时起着至关重要的作用。 SIFT特征是David Lowe在1999年提出的,是一种用于图像匹配和物体识别的鲁棒特征。它具有尺度不变性和旋转...
OpenCV SIFT(尺度不变特征转换)匹配是计算机视觉领域中的一个重要技术,用于识别和匹配图像中的关键点。SIFT算法由David Lowe在1999年提出,它具有旋转、尺度、亮度和对比度不变性,使得它在图像处理和计算机视觉...
计算机视觉是一种技术,它使计算机和软件系统能够识别和理解图像中的内容,SIFT(尺度不变特征变换)是其中一种重要的局部特征检测算法。本文将详细介绍如何在OpenCV3.0框架下,不直接调用预封装的SIFT函数,而是...
包含完整的从图像高斯金字塔、DOG、空间极值点提取、关键点描述、KDtree匹配等关键步骤的全部函数实现,对全面深入理解Lowe的SIFT算法有莫大帮助。 程序运行前须安装 (1)OpenCV: ...
1. **尺度空间极值检测**:SIFT算法首先通过高斯差分金字塔来构建尺度空间,以寻找最佳的尺度空间局部极值点,这些点可能对应于图像中的关键点。 2. **关键点定位与稳定**:确定了潜在的关键点后,算法会进行精确...
在实际应用中,SIFT与其它特征匹配算法(如SURF、ORB等)结合,可以提高识别和匹配的性能。 **总结:** SIFT算法是图像处理中重要的特征提取方法,OpenCV提供了方便的接口供开发者使用。通过这个特定的压缩包,用户...
PCA-SIFT(Principal Component Analysis Scale-Invariant Feature Transform)是一种结合了主成分分析(PCA)与SIFT(尺度不变特征变换)算法的方法,用于图像处理中的特征提取。OpenCV是一个强大的开源计算机视觉...
SIFT(尺度不变特征变换)是一种强大的特征检测算法,它能够在图像的尺度空间中找到稳定的兴趣点,并为这些点提供描述符,使其在不同的尺度、旋转和光照条件下保持不变性。 【描述】中提到,压缩包内包含了完整的...
Python作为当今最流行的编程语言之一,与OpenCV结合可以方便地实现各种视觉算法,包括SIFT(尺度不变特征变换)和手动区域光流跟踪。 SIFT是一种特征检测算法,它能在不同尺度和旋转下找到图像中的关键点,这些关键...