本文介绍了python opencv之筛选算法示例,分享给大家,具体如下:
<强>目标:强>
学习筛算法的概念
学习在图像中查找筛选关键的和描述符
<强>原理:强>
(原理部分自己找了不少文章,内容中有不少自己理解和整理的东西,为了方便快速理解内容和能够快速理解原理,本文尽量不使用数学公式,仅仅使用文字来描述。本文中有很多引用别人文章的内容,仅供个人记录使用,若有错误,请指正出来,万分感谢)
之前的哈里斯算法和Shi-Tomasi算法,由于算法原理所致,具有旋转不变性,在目标图片发生旋转时依然能够获得相同的角点。但是如果对图像进行缩放以后,再使用之前的算法就会检测不出来,原理用一张图表示(图1):
(哈里斯算法和shi-tomasi算法都是基于窗口中像素分布和变化的原理,在图像放大且窗口大小不发生变化的时,窗口中的像素信息则会有很大的不同,造成无法检测的结果)
<强>筛选特性:强>
-
<李>独特性,也就是特征点可分辨性高,类似指纹,适合在海量数据中匹配。李>
<李>多量性,提供的特征多。李>
<李>高速性,就是速度快。李>
<李>可扩展,能与其他特征向量联合使用。李>
<强>筛选特点:强>
-
<李>旋转,缩放平,移不变性李>
<李>解决图像仿射变换,投影变换的关键的匹配李>
<李>光照影响小李>
<李>目标遮挡影响小李>
<李>噪声景物影响小李>
<强>筛选算法步骤:强>
-
<李>尺度空间极值检测李>
<李>关键点定位李>
<李>关键点方向参数李>
<李>关键点描述符李>
<李>关键点匹配李>
<强>尺度空间极值检测:强>
尺度空间的个人理解:
你找一张分辨率1024×1024图片,在电脑上观看,十分清晰,但是图片太大。现在把这图片反正photoshop上,将分辨率改成512×512,图片看着依然很清晰,但是不可能像1024×1024的画面那么精细,只不过是因为人眼构造的原因,512×512图片依然能让你分辨出这是个什么东西。
粗俗点说,尺度空间,就相当于一个图片需要获得多少分辨率的量级。如果把一个图片从原始分辨率到,不停的对其分辨率进行减少,然后将这些图片摞在一起,可以看成一个四棱锥的样式,这个东西就叫做<强>图像金字塔>强(如下图,图2)。
再回到尺度空间,在摄像头中,计算机无法分辨一个景物的尺度信息。而人眼不同,除了人大脑里已经对物体有了基本的概念(例如正常人在十几米外看到苹果,和在近距离看到苹果,都能认出是苹果)以外,人眼在距离物体近时,能够获得物体足够多的特性,在距离物体远时,能够或略细节,例如,近距离看一个人脸能看到毛,孔距离远了看不到毛孔等等。
在图片信息当中,分辨率都是固定的,要想得到类似人眼的效果,就要把图片弄成不同的分辨率,制作成图像金字塔来模拟人眼的功能,从而在其他图片中进行特征识别时,能够像人眼睛一样,即使要识别的物体尺寸变大或者变小,也能够识别出来!
从图1可以看的出,如果如果图像变大,窗口大小还是以前的大小,则无法正确检测出角点。那么很自然的就能想的到,如果图片变大,咱们把窗口也放大不就行了吗?这就需要上面提到的尺度空间发挥作用。
在筛选当中,利用了一个叫做<强>高斯核>强的方程来构建尺度空间,原因是高斯核函数是唯一多尺度空间的核。听起来比较晦涩,个人理解为:
高斯核函数在之前的高斯滤波当中使用过,其原理就是利用高斯分布的特性,在以某一个点为中心要进行以某一个窗口大小进行模糊的操作,那么,根据滤波的原理,距离中心像素点位置的距离越远的像素点,需要“模糊化效果”的值就应该越少。那么这个距离值的分配方法,就是利用满足高斯核函数的分配方法,由中心,到四周,符合高斯核函数的“钟型”曲线(从二维上看)。
那么尺度空间中的高斯核也可以这么理解,高斯核函数的参数有三个