数字图像处理9--尺度空间
《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原理与源码分析》
数字图像处理9--尺度空间相关推荐
- 数字图像处理之尺度空间理论
尺度空间(scale space)思想最早是由Iijima于1962年提出的,后经witkin和Koenderink等人的推广逐渐得到关注,在计算机视觉领域使用广泛. 尺度空间理论的基本思想是:在图像 ...
- 数字图像处理学习笔记(二):SIFT(尺度不变特征变换)算法
数字图像处理学习笔记(二):SIFT(尺度不变特征变换)算法 一.概述: 提到特征点算法,首先就是大名鼎鼎的SIFT算法了.SIFT的全称是Scale Invariant Feature Transf ...
- 数字图像处理学习笔记(一):特征检测和匹配概述
数字图像处理学习笔记(一):特征检测和匹配概述 参考博客: 特征点的匹配 SIFT特征详解 数字图像处理学习笔记(二):SIFT(尺度不变特征变换)算法 1.特征点概述 如何高效且准确的匹配出两个不同 ...
- 数字图像处理:特征提取基本概念总结
数字图像处理:特征提取基本概念总结 一.特征提取概念 二.特征概述 1.边缘 2.角 3.区域 4.脊 三.常用图像特征概述 1.颜色特征 2.纹理特征 3.形状特征 4.空间关系特征 一.特征提取概 ...
- 数字图像处理及应用 阅读笔记
数字图像处理及应用 目录 [隐藏] 1 基础知识 2 数学变换 3 图像增强 4 图像复原 5 压缩编码 6 图像分割 7 形态学处理 8 图像描述 9 图像匹配 10 图像融合 11 目标检测 12 ...
- 酉变换 matlab,数字图像处理:原理与实践(MATLAB版)
数字图像处理:原理与实践(MATLAB版) 作 者:左飞 著 出版时间:2014 内容简介 本书全面系统地介绍了数字图像处理技术的理论与方法,内容涉及几何变换.灰度变换.图像增强.图像分割.图像去噪. ...
- 数字图像处理期末总结
前言概述部分 数字媒体包含哪些类型,涉及哪些研究领域? 1)可视数字媒体包含图像.视频.图形和可视化数据等媒体类型,这些媒体类型之间具有很强的相关性,但又有明确的差异性: 2)可视数字媒体涉及计算机视 ...
- 数字图像处理原理与实践(MATLAB版)勘误表
本文系<数字图像处理原理与实践(MATLAB版)>一书的勘误表. [内容简介]本书全面系统地介绍了数字图像处理技术的理论与方法,内容涉及几何变换.灰度变换.图像增强.图像分割.图像去噪.小 ...
- 数字图像处理:边缘检测(Edge detection)
转载自:https://zhuanlan.zhihu.com/p/59640437 觉得写得通俗易懂,要是每个人的博客都这么人性化.... 写在前面: 本文篇幅较长,用了大量图与公式帮助大家深入理解各 ...
- C语言数字图像处理编程
C语言数字图像处理 读取bmp图像并做简单显示 bmp图像几何变换(移动,旋转,镜像,转置,缩放) 彩色图像转灰度图,灰度图反色 图像中值滤波与平均滤波 bmp图像锐化 图像的半影调和抖动技术 bmp ...
最新文章
- 【鉴轻尘】你说你炒的了币,开发得了项目,然而这些你都知道吗?
- mysql 5.7临时表空间_深度解析MySQL 5.7之临时表空间
- RTX3090 Super曝光:完整GA102核心加持、性能提升5%
- struts2开发action 的三种方法以及通配符、路径匹配原则、常量
- 包含以下字段的 struct 怎么解决_S7-300/400进阶笔记4-2:STEP7的“结构”STRUCT数据类型的用法...
- 统考计算机和英语百度网盘,《计算机专业英语》在线考试系统
- for jq 嵌套_遍历嵌套列表 – jQuery
- Eclipse: Difference between clean, build and publish
- (C/C++) string / *char / int 基本轉換
- 详解Java异常Throwable、Error、Exception、RuntimeException的区别
- 在相近背景中找圆和直线
- 计算机有自带的拼音打字功能吗,搜狗拼音输入法 自带功能提升打字速度的技巧...
- c++矩阵转置_线性代数(Gelbert)对称矩阵
- MyBatis批量插入几千条数据,请慎用foreach
- 2010年度CSDN十大博客文章
- 学习Linux内核内存管理要看的布局图
- Go sync.Pool 浅析
- Nginx反向代理、配置ssl证书
- PKUSC 2018 旅游记
- Q3亏损收窄预计Q4季度实现盈利,趣头条走上盈利分水岭靠什么?
热门文章
- linux下system函数
- R语言入门代码(二)for循环的理解
- n的阶乘怎么用计算机语言表示,python中阶乘的表示方法
- 前端必看的 HTML + CSS技巧
- English - 英语学习小笔记
- php青蛙跳井代码,四川招警考试行测答题技巧:青蛙跳井问题全解析
- (10.2.3.3)静电的设计教室:APP设计利器Sketch教程(03)-让插件助你一臂之力(原创
- SpringBootSecurity与Shiro
- UOJ#748-[UNR #6]机器人表演【dp】
- 计算机技能培训 d,基于PC的医务人员CPR-D技能培训系统研发