python opencv之筛选算法示例

  

本文介绍了python opencv之筛选算法示例,分享给大家,具体如下:

  

<强>目标:

  

学习筛算法的概念
  学习在图像中查找筛选关键的和描述符

  

<强>原理:

  

(原理部分自己找了不少文章,内容中有不少自己理解和整理的东西,为了方便快速理解内容和能够快速理解原理,本文尽量不使用数学公式,仅仅使用文字来描述。本文中有很多引用别人文章的内容,仅供个人记录使用,若有错误,请指正出来,万分感谢)

  

之前的哈里斯算法和Shi-Tomasi算法,由于算法原理所致,具有旋转不变性,在目标图片发生旋转时依然能够获得相同的角点。但是如果对图像进行缩放以后,再使用之前的算法就会检测不出来,原理用一张图表示(图1):

  

 python opencv之筛选算法示例

  

(哈里斯算法和shi-tomasi算法都是基于窗口中像素分布和变化的原理,在图像放大且窗口大小不发生变化的时,窗口中的像素信息则会有很大的不同,造成无法检测的结果)

  

<强>筛选特性:

  
      <李>独特性,也就是特征点可分辨性高,类似指纹,适合在海量数据中匹配。   <李>多量性,提供的特征多。   <李>高速性,就是速度快。   <李>可扩展,能与其他特征向量联合使用。   
  

<强>筛选特点:

  
      <李>旋转,缩放平,移不变性李   <李>解决图像仿射变换,投影变换的关键的匹配李   <李>光照影响小李   <李>目标遮挡影响小李   <李>噪声景物影响小李   
  

<强>筛选算法步骤:

  
      <李>尺度空间极值检测李   <李>关键点定位李   <李>关键点方向参数   <李>关键点描述符   <李>关键点匹配李   
  

<强>尺度空间极值检测:

  

尺度空间的个人理解:
  你找一张分辨率1024×1024图片,在电脑上观看,十分清晰,但是图片太大。现在把这图片反正photoshop上,将分辨率改成512×512,图片看着依然很清晰,但是不可能像1024×1024的画面那么精细,只不过是因为人眼构造的原因,512×512图片依然能让你分辨出这是个什么东西。

  

粗俗点说,尺度空间,就相当于一个图片需要获得多少分辨率的量级。如果把一个图片从原始分辨率到,不停的对其分辨率进行减少,然后将这些图片摞在一起,可以看成一个四棱锥的样式,这个东西就叫做<强>图像金字塔强(如下图,图2)。
  

  

 python opencv之筛选算法示例

  

再回到尺度空间,在摄像头中,计算机无法分辨一个景物的尺度信息。而人眼不同,除了人大脑里已经对物体有了基本的概念(例如正常人在十几米外看到苹果,和在近距离看到苹果,都能认出是苹果)以外,人眼在距离物体近时,能够获得物体足够多的特性,在距离物体远时,能够或略细节,例如,近距离看一个人脸能看到毛,孔距离远了看不到毛孔等等。

  

在图片信息当中,分辨率都是固定的,要想得到类似人眼的效果,就要把图片弄成不同的分辨率,制作成图像金字塔来模拟人眼的功能,从而在其他图片中进行特征识别时,能够像人眼睛一样,即使要识别的物体尺寸变大或者变小,也能够识别出来!

  

从图1可以看的出,如果如果图像变大,窗口大小还是以前的大小,则无法正确检测出角点。那么很自然的就能想的到,如果图片变大,咱们把窗口也放大不就行了吗?这就需要上面提到的尺度空间发挥作用。

  

在筛选当中,利用了一个叫做<强>高斯核强的方程来构建尺度空间,原因是高斯核函数是唯一多尺度空间的核。听起来比较晦涩,个人理解为:

  

高斯核函数在之前的高斯滤波当中使用过,其原理就是利用高斯分布的特性,在以某一个点为中心要进行以某一个窗口大小进行模糊的操作,那么,根据滤波的原理,距离中心像素点位置的距离越远的像素点,需要“模糊化效果”的值就应该越少。那么这个距离值的分配方法,就是利用满足高斯核函数的分配方法,由中心,到四周,符合高斯核函数的“钟型”曲线(从二维上看)。

  

那么尺度空间中的高斯核也可以这么理解,高斯核函数的参数有三个 G (x, y,σ),在滤波当中,第三个参数σ在运算中是固定的一个值。而在尺度空间的构造当中,所谓的“尺度”,就是这个σ值变化,而x和y表示像素坐标.σ的值越小,图像被平滑(被模糊)的越少,尺度也越小,所以,大尺度图片可以对应成一个图像离远处观看,是个大致轮廓,小尺度图片可以对应成离近处观看,有更多细节。

python opencv之筛选算法示例