图像处理什么叫尺度不变形

2019-12-26 00:03:59 u011341856 阅读数 557

图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低1

上述是百度百科关于图像金字塔的定义,看完觉得也不咋形象。我们先看一张金字塔的示意图:
在这里插入图片描述
下面我从图像金字塔在SLAM中的应用中,实际的理解一下它,并且看一下它是怎么应用在SLAM中的特征点提取上的。

在SLAM中图像金字塔的应用,主要是用来解决尺度不变性问题。尺度不变性由构建图像金字塔,并在金字塔的每一层上检测角点来实现2

下面我以ORB-SLAM2中的处理金字塔的方式进行探究。

首先先把图片一步一步缩小到前一张的11.2\frac{1}{1.2},这样我们就可总共可以得到8张图片,这8张图片的效果如下:

第0层(原图)
在这里插入图片描述

第1层
在这里插入图片描述

第2层
在这里插入图片描述

第3层
在这里插入图片描述
第4层
在这里插入图片描述

第5层
在这里插入图片描述
第6层
在这里插入图片描述

第7层
在这里插入图片描述
上面就是按照我们预定缩放比产生的图像金字塔,连续观察这8张图,我们发现我们似乎离场景越来越远,第7层图片中的人小的已经快看不清了,显然通过这种方法只要一张图片就能制造出简单的深度效果。

按说我们离场景远了,看到的内容会更多,但是记录一张图片之后,在缩放的过程中,没法去补充内容进去,所以图片虽然制造出了深度变化的效果,但是画面尺寸也变小了,这一点你自己可以想一下。

现在我们直观的看到了图像金字塔的效果了,如果我们还想让它更加接近于真实的视觉效果,我们是不是还可以给它加点儿模糊效果啊,想象一下我们看东西的时候,越近的是不是越清楚啊,越远的越模糊。

既然是讲在SLAM中的应用,那我就给你看一个SLAM的例子,在SLAM中为了达到特征点的尺度不变性,我们常常对图片做图像金字塔,然后分别对每一层图片提取特征点,为什么要这样做呢?

我们想象一下,我们在一定距离下看到场景当中的一个人,但是当我们往后退100米再观察的时候,那个人就变成了了一个点了,可能就被检测成了关键点,所以为了满足拍摄一张图片涵盖多个观测距离,我们就通过图像金字塔缩放图片,然后分别提取关键点,这样就可以产生更多的点,涵盖更多的尺度。

下面我把ORB-SLAM2图像金字塔中提取的关键点图片拿出来看一下,如下系列图:

第0层
在这里插入图片描述

第1层在这里插入图片描述

第2层
在这里插入图片描述第3层
在这里插入图片描述
第4层
在这里插入图片描述
第5层
在这里插入图片描述
第6层
在这里插入图片描述
第7层
在这里插入图片描述
观察上面的几张图我们可以很容易发现,通过这样的金字塔之后,我们的关键点提取的更多,而且也产生出了在不同距离上提取特征点的效果,这样就可以保证特征点尺度不变性,也就是说我在一个距离上拍摄的图片,我下一次在这个距离的更远的地方拍摄的图片,也依然可以匹配到很多特征点,是不是就解决了尺度导致的特征点匹配问题啦!


  1. 图像金字塔,百度百科 ↩︎

  2. 《视觉SLAM十四讲 从理论到实践》,P135页 ↩︎

2017-04-20 13:56:22 chaipp0607 阅读数 13257

图像的hu矩是一种具有平移、旋转和尺度不变性的图像特征。

普通矩的计算:
f(x,y)的p+q阶原点矩可以表示为:
这里写图片描述

而数字图像是一个二维的离散信号,对上述公式进行离散化之后:
这里写图片描述
其中C与R分别表示图像的列与行。

各阶矩的物理意义:
0阶矩(m00):目标区域的质量
1阶矩(m01,m10):目标区域的质心
2阶矩(m02,m11,m20):目标区域的旋转半径
3阶矩(m03,m12,m21,m30):目标区域的方位和斜度,反应目标的扭曲

但是目标区域往往伴随着空间变换(平移,尺度,旋转),所以需要在普通矩的基础上构造出具备不变性的矩组—hu矩。

中心矩:构造平移不变性
由零阶原点矩和一阶原点矩,我们可以求得目标区域的质心坐标:
这里写图片描述
由求得的质心坐标,我们可以构造出中心矩:

这里写图片描述

由于我们选择了以目标区域的质心为中心构建中心矩,那么矩的计算时永远是目标区域中的点相对于目标区域的质心,而与目标区域的位置无关,及具备了平移不变性。

归一化中心矩:构造尺度不变性

为抵消尺度变化对中心矩的影响,利用零阶中心矩u00对各阶中心距进行归一化处理,得到归一化中心矩:

这里写图片描述

由上文可知,零阶矩表示目标区域的质量(面积),那么如果目标区域的尺度发生变化(缩小2倍),显然其零阶中心矩也会相应变小,使得矩具备尺度不变性。

hu矩:构造旋转不变性
利用二阶和三阶规格中心矩可以导出下面7个不变矩组(Φ1 Φ7),它们在图像平移、旋转和比例变化时保持不变。
这里写图片描述

2016-06-03 21:38:27 zhengalen 阅读数 16328

转载:http://blog.csdn.net/abcjennifer/article/details/7639681

博主:Rachel-Zhang

SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,or corner points)及其有关scale 和 orientation 的描述子得到特征并进行图像特征点匹配,获得了良好效果,详细解析如下:

算法描述

SIFT特征不只具有尺度不变性,即使改变旋转角度,图像亮度或拍摄视角,仍然能够得到好的检测效果。整个算法分为以下几个部分:

1. 构建尺度空间

这是一个初始化操作,尺度空间理论目的是模拟图像数据的多尺度特征

高斯卷积核是实现尺度变换的唯一线性核,于是一副二维图像的尺度空间定义为:


其中 G(x,y,σ) 是尺度可变高斯函数 

(x,y)是空间坐标,是尺度坐标。σ大小决定图像的平滑程度,大尺度对应图像的概貌特征,小尺度对应图像的细节特征。大的σ值对应粗糙尺度(低分辨率),反之,对应精细尺度(高分辨率)。为了有效的在尺度空间检测到稳定的关键点,提出了高斯差分尺度空间(DOG scale-space)。利用不同尺度的高斯差分核与图像卷积生成。

下图所示不同σ下图像尺度空间:



关于尺度空间的理解说明:2kσ中的2是必须的,尺度空间是连续的。在  Lowe的论文中 ,将第0层的初始尺度定为1.6(最模糊),图片的初始尺度定为0.5(最清晰). 在检测极值点前对原始图像的高斯平滑以致图像丢失高频信息,所以 Lowe 建议在建立尺度空间前首先对原始图像长宽扩展一倍,以保留原始图像信息,增加特征点数量。尺度越大图像越模糊。 


图像金字塔的建立:对于一幅图像I,建立其在不同尺度(scale)的图像,也成为子八度(octave),这是为了scale-invariant,也就是在任何尺度都能够有对应的特征点,第一个子八度的scale为原图大小,后面每个octave为上一个octave降采样的结果,即原图的1/4(长宽分别减半),构成下一个子八度(高一层金字塔)。



尺度空间的所有取值,i为octave的塔数(第几个塔),s为每塔层数

由图片size决定建几个塔,每塔几层图像(S一般为3-5)0塔的第0层是原始图像(或你double后的图像),往上每一层是对其下一层进行Laplacian变换(高斯卷积,其中σ值渐大,例如可以是σ, k*σ, k*k*σ),直观上看来越往上图片越模糊。塔间的图片是降采样关系,例如1塔的第0层可以由0塔的第3down sample得到,然后进行与0塔类似的高斯卷积操作。


2. LoG近似DoG找到关键点<检测DOG尺度空间极值点>

为了寻找尺度空间的极值点,每一个采样点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。如图所示,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。 一个点如果在DOG尺度空间本层以及上下两层的26个领域中是最大或最小值时,就认为该点是图像在该尺度下的一个特征点,如图所示。


同一组中的相邻尺度(由于k的取值关系,肯定是上下层)之间进行寻找


s=3的情况

 在极值比较的过程中,每一组图像的首末两层是无法进行极值比较的,为了满足尺度变化的连续性(下面有详解)
我们在每一组图像的顶层继续用高斯模糊生成了 3 幅图像,高斯金字塔有每组S+3层图像。DOG金字塔每组有S+2层图像.

==========================================
这里有的童鞋不理解什么叫“为了满足尺度变化的连续性”,现在做仔细阐述:
假设s=3,也就是每个塔里有3层,则k=21/s=21/3,那么按照上图可得Gauss Space和DoG space 分别有3个(s个)和2个(s-1个)分量,在DoG space中,1st-octave两项分别是σ,kσ; 2nd-octave两项分别是2σ,2kσ;由于无法比较极值,我们必须在高斯空间继续添加高斯模糊项,使得形成σ,kσ,k2σ,k3σ,k4σ这样就可以选择DoG space中的中间三项kσ,k2σ,k3σ(只有左右都有才能有极值),那么下一octave中(由上一层降采样获得)所得三项即为2kσ,2k2σ,2k3σ,其首项2kσ=24/3。刚好与上一octave末项k3σ=23/3尺度变化连续起来,所以每次要在Gaussian space添加3项,每组(塔)共S+3层图像,相应的DoG金字塔有S+2层图像。
==========================================

使用Laplacian of Gaussian能够很好地找到找到图像中的兴趣点,但是需要大量的计算量,所以使用Difference of Gaussian图像的极大极小值近似寻找特征点.DOG算子计算简单,是尺度归一化的LoG算子的近似,有关DOG寻找特征点的介绍及方法详见http://blog.csdn.net/abcjennifer/article/details/7639488极值点检测用的Non-Maximal Suppression


3. 除去不好的特征点

这一步本质上要去掉DoG局部曲率非常不对称的像素。


通过拟和三维二次函数以精确确定关键点的位置和尺度(达到亚像素精度),同时去除低对比度的关键点和不稳定的边缘响应点(因为DoG算子会产生较强的边缘响应),以增强匹配稳定性、提高抗噪声能力,在这里使用近似Harris Corner检测器。

①空间尺度函数泰勒展开式如下:对上式求导,并令其为0,得到精确的位置, 得

②在已经检测到的特征点中,要去掉低对比度的特征点和不稳定的边缘响应点。去除低对比度的点:把公式(2)代入公式(1),即在DoG Space的极值点处D(x)取值,只取前两项可得:


若   ,该特征点就保留下来,否则丢弃。

③边缘响应的去除
一个定义不好的高斯差分算子的极值在横跨边缘的地方有较大的主曲率,而在垂直边缘的方向有较小的主曲率。主曲率通过一个2×2 的Hessian矩阵H求出:

导数由采样点相邻差估计得到。

D的主曲率和H的特征值成正比,令α为较大特征值,β为较小的特征值,则

令α=γβ,则

 (r + 1)2/r的值在两个特征值相等的时候最小,随着r的增大而增大,因此,为了检测主曲率是否在某域值r下,只需检测

if (α+β)/ αβ> (r+1)2/r, throw it out.   在Lowe的文章中,取r=10。



4. 给特征点赋值一个128维方向参数

上一步中确定了每幅图中的特征点,为每个特征点计算一个方向,依照这个方向做进一步的计算, 利用关键点邻域像素的梯度方向分布特性为每个关键点指定方向参数,使算子具备旋转不变性。


为(x,y)处梯度的模值和方向公式。其中L所用的尺度为每个关键点各自所在的尺度。至此,图像的关键点已经检测完毕,每个关键点有三个信息:位置,所处尺度、方向,由此可以确定一个SIFT特征区域。


梯度直方图的范围是0~360度,其中每10度一个柱,总共36个柱。随着距
      中心点越远的领域其对直方图的贡献也响应减小.Lowe论文中还提到要使用高斯函数对直方图进行平滑,减少突变的影响。

在实际计算时,我们在以关键点为中心的邻域窗口内采样,并用直方图统计邻域像素的梯度方向。梯度直方图的范围是0~360度,其中每45度一个柱,总共8个柱, 或者每10度一个柱,总共36个柱。Lowe论文中还提到要使用高斯函数对直方图进行平滑,减少突变的影响。直方图的峰值则代表了该关键点处邻域梯度的主方向,即作为该关键点的方向


直方图中的峰值就是主方向,其他的达到最大值80%的方向可作为辅助方向

由梯度方向直方图确定主梯度方向

该步中将建立所有scale中特征点的描述子(128维)

Identify peak and assign orientation and sum of magnitude to key point.
  The user may choose a threshold to exclude key points based on their assigned sum of magnitudes.


关键点描述子的生成步骤


 通过对关键点周围图像区域分块,计算块内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象,具有唯一性。


5. 关键点描述子的生成

首先将坐标轴旋转为关键点的方向,以确保旋转不变性。以关键点为中心取8×8的窗口。

Figure.16*16的图中其中1/4的特征点梯度方向及scale,右图为其加权到8个主方向后的效果。

图左部分的中央为当前关键点的位置,每个小格代表关键点邻域所在尺度空间的一个像素,利用公式求得每个像素的梯度幅值与梯度方向,箭头方向代表该像素的梯度方向,箭头长度代表梯度模值,然后用高斯窗口对其进行加权运算。


图中蓝色的圈代表高斯加权的范围(越靠近关键点的像素梯度方向信息贡献越大)。然后在每4×4的小块上计算8个方向的梯度方向直方图,绘制每个梯度方向的累加值,即可形成一个种子点,如图右部分示。此图中一个关键点由2×2共4个种子点组成,每个种子点有8个方向向量信息。这种邻域方向性信息联合的思想增强了算法抗噪声的能力,同时对于含有定位误差的特征匹配也提供了较好的容错性。


计算keypoint周围的16*16的window中每一个像素的梯度,而且使用高斯下降函数降低远离中心的权重。

在每个4*4的1/16象限中,通过加权梯度值加到直方图8个方向区间中的一个,计算出一个梯度方向直方图。

这样就可以对每个feature形成一个4*4*8=128维的描述子,每一维都可以表示4*4个格子中一个的scale/orientation. 将这个向量归一化之后,就进一步去除了光照的影响。

5. 根据SIFT进行Match

生成了A、B两幅图的描述子,(分别是k1*128维和k2*128维),就将两图中各个scale(所有scale)的描述子进行匹配,匹配上128维即可表示两个特征点match上了。


实际计算过程中,为了增强匹配的稳健性,Lowe建议对每个关键点使用4×4共16个种子点来描述,这样对于一个关键点就可以产生128个数据,即最终形成128维的SIFT特征向量。此时SIFT特征向量已经去除了尺度变化、旋转等几何变形因素的影响,再继续将特征向量的长度归一化,则可以进一步去除光照变化的影响。 当两幅图像的SIFT特征向量生成后,下一步我们采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。取图像1中的某个关键点,并找出其与图像2中欧式距离最近的前两个关键点,在这两个关键点中,如果最近的距离除以次近的距离少于某个比例阈值,则接受这一对匹配点。降低这个比例阈值,SIFT匹配点数目会减少,但更加稳定。为了排除因为图像遮挡和背景混乱而产生的无匹配关系的关键点,Lowe提出了比较最近邻距离与次近邻距离的方法,距离比率ratio小于某个阈值的认为是正确匹配。因为对于错误匹配,由于特征空间的高维性,相似的距离可能有大量其他的错误匹配,从而它的ratio值比较高。Lowe推荐ratio的阈值为0.8。但作者对大量任意存在尺度、旋转和亮度变化的两幅图片进行匹配,结果表明ratio取值在0. 4~0. 6之间最佳,小于0. 4的很少有匹配点,大于0. 6的则存在大量错误匹配点。(如果这个地方你要改进,最好给出一个匹配率和ration之间的关系图,这样才有说服力)作者建议ratio的取值原则如下:

ratio=0. 4 对于准确度要求高的匹配;
ratio=0. 6 对于匹配点数目要求比较多的匹配; 
ratio=0. 5 一般情况下。
也可按如下原则:当最近邻距离<200时ratio=0. 6,反之ratio=0. 4。ratio的取值策略能排分错误匹配点。



当两幅图像的SIFT特征向量生成后,下一步我们采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。取图像1中的某个关键点,并找出其与图像2中欧式距离最近的前两个关键点,在这两个关键点中,如果最近的距离除以次近的距离少于某个比例阈值,则接受这一对匹配点。降低这个比例阈值,SIFT匹配点数目会减少,但更加稳定。

 

实验结果:







Python+opencv实现:


  1. import cv2  
  2. import numpy as np  
  3. #import pdb  
  4. #pdb.set_trace()#turn on the pdb prompt  
  5.   
  6. #read image  
  7. img = cv2.imread('D:\privacy\picture\little girl.jpg',cv2.IMREAD_COLOR)  
  8. gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  
  9. cv2.imshow('origin',img);  
  10.   
  11. #SIFT  
  12. detector = cv2.SIFT()  
  13. keypoints = detector.detect(gray,None)  
  14. img = cv2.drawKeypoints(gray,keypoints)  
  15. #img = cv2.drawKeypoints(gray,keypoints,flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)  
  16. cv2.imshow('test',img);  
  17. cv2.waitKey(0)  
  18. cv2.destroyAllWindows()  



C实现:


  1. // FeatureDetector.cpp : Defines the entry point for the console application.  
  2. //    
  3. //  Created by Rachel on 14-1-12.    
  4. //  Copyright (c) 2013年 ZJU. All rights reserved.    
  5. //    
  6.   
  7. #include "stdafx.h"  
  8. #include "highgui.h"  
  9. #include "cv.h"  
  10. #include "vector"  
  11. #include "opencv\cxcore.hpp"  
  12. #include "iostream"  
  13. #include "opencv.hpp"  
  14. #include "nonfree.hpp"  
  15. #include "showhelper.h"  
  16.   
  17. using namespace cv;  
  18. using namespace std;  
  19.   
  20. int _tmain(int argc, _TCHAR* argv[])  
  21. {  
  22.     //Load Image   
  23.     Mat c_src1 =  imread( "..\\Images\\3.jpg");  
  24.     Mat c_src2 = imread("..\\Images\\4.jpg");  
  25.     Mat src1 = imread( "..\\Images\\3.jpg", CV_LOAD_IMAGE_GRAYSCALE);  
  26.     Mat src2 = imread( "..\\Images\\4.jpg", CV_LOAD_IMAGE_GRAYSCALE);  
  27.     if( !src1.data || !src2.data )  
  28.     { std::cout<< " --(!) Error reading images " << std::endl; return -1; }  
  29.   
  30.     //sift feature detect  
  31.     SiftFeatureDetector detector;  
  32.     std::vector<KeyPoint> kp1, kp2;  
  33.   
  34.     detector.detect( src1, kp1 );  
  35.     detector.detect( src2, kp2 );  
  36.     SiftDescriptorExtractor extractor;  
  37.     Mat des1,des2;//descriptor  
  38.     extractor.compute(src1,kp1,des1);  
  39.     extractor.compute(src2,kp2,des2);     
  40.     Mat res1,res2;   
  41.     int drawmode = DrawMatchesFlags::DRAW_RICH_KEYPOINTS;  
  42.     drawKeypoints(c_src1,kp1,res1,Scalar::all(-1),drawmode);//在内存中画出特征点  
  43.     drawKeypoints(c_src2,kp2,res2,Scalar::all(-1),drawmode);  
  44.     cout<<"size of description of Img1: "<<kp1.size()<<endl;  
  45.     cout<<"size of description of Img2: "<<kp2.size()<<endl;  
  46.   
  47.     //write the size of features on picture  
  48.     CvFont font;      
  49.     double hScale=1;     
  50.     double vScale=1;      
  51.     int lineWidth=2;// 相当于写字的线条      
  52.     cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC, hScale,vScale,0,lineWidth);//初始化字体,准备写到图片上的     
  53.     // cvPoint 为起笔的x,y坐标     
  54.     IplImage* transimg1 = cvCloneImage(&(IplImage) res1);  
  55.     IplImage* transimg2 = cvCloneImage(&(IplImage) res2);  
  56.           
  57.     char str1[20],str2[20];  
  58.     sprintf(str1,"%d",kp1.size());  
  59.     sprintf(str2,"%d",kp2.size());  
  60.   
  61.   
  62.     const char* str = str1;  
  63.     cvPutText(transimg1,str1,cvPoint(280,230),&font,CV_RGB(255,0,0));//在图片中输出字符   
  64.   
  65.     str = str2;  
  66.     cvPutText(transimg2,str2,cvPoint(280,230),&font,CV_RGB(255,0,0));//在图片中输出字符   
  67.   
  68.     //imshow("Description 1",res1);  
  69.     cvShowImage("descriptor1",transimg1);  
  70.     cvShowImage("descriptor2",transimg2);  
  71.   
  72.     BFMatcher matcher(NORM_L2);  
  73.     vector<DMatch> matches;  
  74.     matcher.match(des1,des2,matches);  
  75.     Mat img_match;  
  76.     drawMatches(src1,kp1,src2,kp2,matches,img_match);//,Scalar::all(-1),Scalar::all(-1),vector<char>(),drawmode);  
  77.     cout<<"number of matched points: "<<matches.size()<<endl;  
  78.     imshow("matches",img_match);  
  79.     cvWaitKey();  
  80.     cvDestroyAllWindows();  
  81.   
  82.     return 0;  
  83. }  





===============================
基本概念及一些补充
什么是局部特征?
  •局部特征从总体上说是图像或在视觉领域中一些有别于其周围的地方
  •局部特征通常是描述一块区域,使其能具有高可区分度
  •局部特征的好坏直接会决定着后面分类、识别是否会得到一个好的结果
 局部特征需具备的特性
  •重复性
  •可区分性
  •准确性
  •数量以及效率
  •不变性
 局部特征提取算法-sift
  •SIFT算法由D.G.Lowe 1999年提出,2004年完善总结。后来Y.Ke将其描述子部分用PCA代替直方图的方式,对其进行改进。
   •SIFT算法是一种提取局部特征的算法,在尺度空间寻找极值点,提取位置,尺度,旋转不变量
  •SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性。
  •独特性好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配。
  •多量性,即使少数的几个物体也可以产生大量SIFT特征向量。
  •可扩展性,可以很方便的与其他形式的特征向量进行联合。
尺度空间理论
  •尺度空间理论目的是模拟图像数据的多尺度特征
  •其基本思想是在视觉信息图像信息处理模型中引入一个被视为尺度的参数, 通过连续变化尺度参数获得不同尺度下的视觉处理信息, 然后综合这些信息以深入地挖掘图像的本质特征。
描述子生成的细节
  •以极值点为中心点,并且以此点所处于的高斯尺度sigma值作为半径因子。对于远离中心点的梯度值降低对其所处区域的直方图的贡献,防止一些突变的影响。
  •每个极值点对其进行三线性插值,这样可以把此极值点的贡献均衡的分到直方图中相邻的柱子上
归一化处理
  •在求出4*4*8的128维特征向量后,此时SIFT特征向量已经去除了尺度变化、旋转等几何变形因素的影响。而图像的对比度变化相当于每个像素点乘上一个因子,光照变化是每个像素点加上一个值,但这些对图像归一化的梯度没有影响。因此将特征向量的长度归一化,则可以进一步去除光照变化的影响。
  •对于一些非线性的光照变化,SIFT并不具备不变性,但由于这类变化影响的主要是梯度的幅值变化,对梯度的方向影响较小,因此作者通过限制梯度幅值的值来减少这类变化造成的影响。
PCA-SIFT算法
  •PCA-SIFT与标准SIFT有相同的亚像素位置,尺度和主方向。但在第4步计算描述子的设计,采用的主成分分析的技术。
  •下面介绍一下其特征描述子计算的部分:
    •用特征点周围的41×41的像斑计算它的主元,并用PCA-SIFT将原来的2×39×39维的向量降成20维,以达到更精确的表示方式。
    •它的主要步骤为,对每一个关键点:在关键点周围提取一个41×41的像斑于给定的尺度,旋转到它的主方向 ;计算39×39水平和垂直的梯度,形成一个大小为3042的矢量;用预先计算好的投影矩阵n×3042与此矢量相乘;这样生成一个大小为n的PCA-SIFT描述子。
===============================

辅助资料:





===============================


Reference:

Lowe SIFT 原文:http://www.cs.ubc.ca/~lowe/papers/ijcv04.pdf

SIFT 的C实现:https://github.com/robwhess/opensift/blob/master/src

MATLAB 应用Sift算子的模式识别方法:http://blog.csdn.net/abcjennifer/article/details/7372880

http://blog.csdn.net/abcjennifer/article/details/7365882

http://en.wikipedia.org/wiki/Scale-invariant_feature_transform#David_Lowe.27s_method

http://blog.sciencenet.cn/blog-613779-475881.html

http://www.cnblogs.com/linyunzju/archive/2011/06/14/2080950.html

http://www.cnblogs.com/linyunzju/archive/2011/06/14/2080951.html

http://blog.csdn.net/ijuliet/article/details/4640624

http://www.cnblogs.com/cfantaisie/archive/2011/06/14/2080917.html  (部分图片有误,以本文中的图片为准)


2018-04-16 14:33:59 qq_38906523 阅读数 8708

1. 特征的不变性

何谓特征?

每个物体,我们总可以用一些词语或部件来描述它,比如人脸的特征:两个眼睛、一个鼻子和一个嘴巴。对于图像而言,我们需要计算机去理解图像,描述图像就需要计算机去取得图像的特征,对图像比较全面的描述即一个二维矩阵,矩阵内的每个值代表图像的亮度。有时候我们需要让计算机更简化的来描述一个图像,抓住一些显著特征,这些特征要具有一些良好的性质,比如局部不变性。局部不变性一般包括两个方面:尺度不变性与旋转不变性。

- 尺度不变性:人类在识别一个物体时,不管这个物体或远或近,都能对它进行正确的辨认,这就是所谓的尺度不变性。尺度空间理论经常与生物视觉关联,有人也称图像局部不变性特征为基于生物视觉的不变性方法。

- 旋转不变性:当这个物体发生旋转时,我们照样可以正确地辨认它,这就是所谓的旋转不变性。

2. 局部不变特征

全局特征:从整个图像中抽取的特征。较多的运用在图像检索领域,如图像颜色直方图。

局部特征:从图像的局部区域中抽取的特征(这个局部区域往往是图像中的一个像素及它周围的邻域)。

一种好的局部特征应该具有下面的特性:

  1. 可重复性:同一个物体在不同时间,不同角度拍到图像中,检测到的特征对应的越多越好。
  2. 独特性:特征在该物体上表现为独特性,能与场景下其他物体区分。
  3. 局部性:特征往往是物体某个局部的特点,这样才可以避免遮挡时不能匹配的问题。
  4. 数量性:检测到的特征数目一定要多,密集度最好能在一定程度上反映图像的内容。
  5. 准确性:得到的特征应该能被精确定位,能够精确到像素。
  6. 高效性:特征检测算法运算要快。

为了研究图像的尺度不变特征,我们需要先从图像的尺度空间理论开始。

3. 图像尺度空间理论

当用一个机器视觉系统分析未知场景时,计算机没有办法预先知识图像中物体尺度,因此,我们需要同时考虑图像在多尺度下的描述,获知感兴趣物体的最佳尺度。

所以在很多时候,我们会在将图像构建为一系列不同尺度的图像集,在不同的尺度中去检测我们感兴趣的特征。比如:在Harr特征检测人脸的时候,因为我们并不知道图像中人脸的尺寸,所以需要生成一个不同大小的图像组成的金字塔,扫描其中每一幅图像来寻找可能的人脸。

3.1 金字塔分辨率

图像金字塔化的一般步骤:首先,图像经过一个低通滤波器进行平滑(这个步骤会使图像变模糊,好像模仿人的视觉中远处的物体没有近处的清晰的原理),然后,对这个平滑后的图像进行抽样(一般抽样比例在水平和竖直方向上都为1/2),从而得到一系列的缩小的图像。

   

假设高斯金字塔的第 ll 层图像为GlGl,则有:

Gl(i,j)=m=22n=22ω(m,n)Gl1(2i+m,2j+n)Gl(i,j)=∑m=−22∑n=−22ω(m,n)Gl−1(2i+m,2j+n)

(1lN,0iRl,0jCl)(1≤l≤N,0≤i≤Rl,0≤j≤Cl)

式中,NN为高斯金字塔顶层 拨动号;RlRlGlGl分别为高斯金字塔第ll层的行数和列数;ω(m,n)ω(m,n)是一个二维可分离的5×55×5窗口函数,表达式为:

ω=12561464141624164624362464162416414641=116[14641]×11614641ω=1256[1464141624164624362464162416414641]=116[14641]×116[14641]

写成上面的形式是为了说明,二维窗口的卷积算子,可以写成两个方向上的1维卷积核(二项核)的乘积。上面卷积形式的公式实际上完成了2个步骤:1)高斯模糊;2)降维。

按上述步骤生成的G0,G1,,GNG0,G1,…,GN就构成了图像的高斯金字塔,其中G0G0为金字塔的底层(与原图像相同),GNGN为金字塔的顶层。可见高斯金字塔的当前层图像是对其前一层图像先进行高斯低通滤波,然后做隔行和隔列的降采样(去除偶数行与偶数列)而生成的。当前层图像的大小依次为前一层图像大小的1/4。

下面是用OpenCV中的图像金字塔相关函数写的一个生成图像金字塔的示例程序。程序中,不但生成了图像金字塔,而且生成了图像的拉普拉斯金字塔(接下来的内容)。

enum pyrType { PYR_GUASS, PYR_LAPLACE };
void genPyr(const Mat& imgSrc, vector<Mat>& outPutArray, int TYPE, int level)
{
    outPutArray.assign(level + 1, Mat());
    outPutArray[0] = imgSrc.clone(); // the 0 level is the image. 
    for (int i = 0; i != level; i++)
    {
        pyrDown(outPutArray[i], outPutArray[i + 1]);
    }
    if (PYR_GUASS == TYPE)
    {
        return;
    }
    for (int i = 0; i != level; i++)
    {
        Mat UpSampleImg;
        pyrUp(outPutArray[i + 1], UpSampleImg, outPutArray[i].size());
        outPutArray[i] -= UpSampleImg;
    }
}

3.2 图像的拉普拉斯金字塔

GlGl进行内插(这里内插用的不是双线性而是用的与降维时相同的滤波核)得到放大图像GlGl∗,使GlGl∗的尺寸与Gl1Gl−1的尺寸相同,表示为:

Gl(i,j)=4m=22n=22ω(m,n)Gl(i+m2,j+n2)(0lN,0iRl,0jGl)Gl∗(i,j)=4∑m=−22∑n=−22ω(m,n)Gl(i+m2,j+n2)(0≤l≤N,0≤i≤Rl,0≤j≤Gl)

上面的系数4,是因为每次能参与加权的项,的权值和为4/256,这个与我们用的ωω的值有关。

式中,

Gl(i+m2,j+n2)={Gl(i+m2,j+n2),0,i+m2,j+n2Gl(i+m2,j+n2)={Gl(i+m2,j+n2),当i+m2,j+n2为整数时0,其他

{LPl=GlGl+1,LPN=GN,0lNl=N{LPl=Gl−Gl+1∗,当0≤l≤N时LPN=GN,当l=N时

式中,NN为拉普拉斯金字塔顶层号,LPlLPl是拉普拉斯金字塔分解的第ll层图像。

LP0,LP1,,LPl,,LPNLP0,LP1,…,LPl,…,LPN构成的金字塔即为拉普拉斯金字塔。它的每一层图像是高斯金字塔本层图像与其高一级的图像经内插放大后图像的差,此过程相当于带通滤波,因此拉普拉斯金字塔又称为带通金字塔分解。

下图为小猫图像的拉普拉斯金字塔图像:

image image image image

3.3 为什么用高斯核

图像的金字塔化能高效地(计算效率也较高)对图像进行多尺度的表达,但它缺乏坚实的理论基础,不能分析图像中物体的各种尺度(虽然我们有小猫的金字塔图像,我们还是不知道原图像内小猫的大小)。

信号的尺度空间刚提出是就是通过一系列单参数、宽度递增的高斯滤波器将原始信号滤波得到到组低频信号。那么一个很明显的疑问是:除了高斯滤波之外,其他带有参数t的低通滤波器是否也可以用来生成一个尺度空间。

后来Koenerink、Lindeberg[Scale-space theory in computer vision]、Florack等人用精确的数学形式通过不同的途径都证明了高斯核是实现尺度变换的唯一变换核。

虽然很多研究者从可分性、旋转不变性、因果性等特性推出高斯滤波器是建立线性尺度空间的最优滤波器。然后在数字图像处理中,需要对核函数进行采样,离散的高斯函数并不满足连续高斯函数的的一些优良的性质。所以后来出现了一些非线性的滤波器组来建立尺度空间,如B样条核函数。

使用高斯滤波器对图像进行尺度空间金塔塔图的构建,让这个尺度空间具有下面的性质:

1)加权平均和有限孔径效应

信号在尺度t上的表达可以看成是原信号在空间上的一系列加权平均,权重就是具有不同尺度参数的高斯核。

信号在尺度t上的表达也对应于用一个无方向性的孔径函数(特征长度为σ=tσ=t)来观测信号的结果。这时候信号中特征长度小于σσ的精细结构会被抑制[理解为一维信号上小于σσ的波动会被平滑掉。]。

2)层叠平滑

也叫高斯核族的半群(Semi-Group)性质:两个高斯核的卷积等同于另外一个不同核参数的高斯核卷积。

g(μ,σ1)g(μ,σ2)=g(μ,σ21+σ22)g(μ,σ1)∗g(μ,σ2)=g(μ,σ12+σ22)

这个性质的意思就是说不同的高斯核对图像的平滑是连续的。

3)局部极值递性

这个特征可以从人眼的视觉原理去理解,人在看一件物体时,离得越远,物体的细节看到的越少,细节特征是在减少的。

高斯核对图像进行滤波具有压制局部细节的性质。

4)尺度伸缩不变性。

这里只是一个公式推导的问题,对原来的信号加一个变换函数,对变换后的信号再进行高斯核的尺度空间生成,新的信号的极值点等特征是不变的。

Young对经生理学的研究中发现,哺乳动物的视网膜和视觉皮层的感受区域可以很好地用4阶以内的高斯微分来建模。

3.4 尺度的选择[经验之谈]

一般我们采集到的图像中,我们并不知道我们感兴趣的目标在图像中的尺度,在这样的情况下,我们对图像进行分析时就无法选择合适的参数,比如边缘检测,可能由于参数不当,而造成过多的局部细节。

如下图所示:红色圆圈内的斑点的大小(直径)比例对应着两幅图像之间尺度比例(scale ratio)。如果对两幅图像采用相同的固定尺度的LoG检测器检测,很难将这两个斑点检测出来。LoG检测器相当于一个匹配滤波器,只有当LoG的尺度与图片中斑点结构尺度相当时才会有较强的响应。如果用与左图中斑点结构相当大小尺度LoG算子,在中的大斑点的对应的LoG响应很小不能被检测出来,反之亦然。因此固定尺度的LoG斑点检测器不具有尺度不变性。使用尺度空间进行多尺度检测可以将两幅图像中不同尺度的斑点检测出来。但是由于斑点结构是在一定尺度范围之内存在的,比如用5~8尺度的LoG可能都能检测出来右边图像中的斑点结构,所以在尺度空间中进行斑点检测会有重复检测的缺点。

 image

在实际操作中,我们需要定义一个特征响应函数,在不同的尺度空间上寻找一个极值点。比如小猫的金字塔图像分析时,我们定义了一个大小为[w,h]的小猫的模板,用这个模板去与金字塔系列图像匹配,一定有匹配度最佳(即特征响应最强)。

需要注意的是,图像结构往往是在粗糙的尺度上被检测到,此时位置信息未必是最准确的,因此通常图像的尺度分析包含两个阶段:首先在粗尺度上进行特征(结构)检测,然后再在细尺度上进行精确定位。

 

参考资料:

[1] opencv教程:图像金字塔

[2] 计算机视觉——算法与应用 3.5节 金字塔与小波

[3] 现代数字图像 1.1节 图像多分辨率真金字塔

[4] OpenCV的5种图像内插方法

2016-09-19 16:10:42 bzdwdmzjsmff 阅读数 5036

尺度,这个曾经困扰了我好久的点,到底什么是尺度。

尺度不变又指的是什么。


为了这个 宝宝正在去截图。好像前面的文章的确也没有解释,什么是尺度,下面这段试图解释什么是尺度(如果有异议,希望一起交流下:)




这三张图其实还蛮有意思的,第一张图片应该是一个小人儿蹲在墙角,如果想象不好的可以自己去蹲一下,想象你看到他的视角。以及他的大小。这个人假设他是1.7米。为了后面好叙述。

看第二张图,如果这个女人体是正常大小的话,那么小人儿应该是个玩偶,也就是说小人儿应该是17厘米左右大小。

(如果小人儿是真实的人,那么女人体应该是一个比他大很多的蜡像才对,或者是一个建筑什么的模拟,这个我们不深究,毕竟只假设出来一种情况就足够描述这个问题了)

看第三张图这一切都可以被很合理的解释,这是个手,这些东西都是在手上画的。那么小人儿应该可能最多1.7厘米。

所以三张图对应了小人儿三个大小,那么在这种情况下,这个尺度就是变化的,到底多大是我们的参考系。

如果我现在告诉你这是如来佛祖的手,那么这个小人儿又该是多大呢?


对于这个问题它的尺度就不是不变的。所以lowe 提出的尺度不变特征转换的点十分必要,因为存在缩放匹配这种情况这也是人家算法高明的地方,如果你刻意做一些图片,就可能导致一张瓶盖图可能跟太阳图对上,这是拼接里面所不希望看到的。

尺度不变就是在特征点提取,或者匹配的时候,永远都把握好他就是那么大的存在,不会因为缩放把它变形。


所以现在见到尺度这个词,是不是会好一点儿了呢。




图像处理——矩

阅读数 5112