魏老师学生——Cecil:学习OpenCV-机器视觉之旅
原理
- 加速稳健特征算法:加速版的SIFT。
- SURF使用盒子滤波器(box_filter)对LoG进行近似。
- 盒子滤波器优点:进行卷积计算时可利用积分图像。
- 积分图像特点:计算图像中某个窗口内所有像素和时,计算量大小和窗口大小无关。提高计算图像梯度的效率。
- SURF算法计算关键点的尺度与位置也依赖于Hessian矩阵行列式。
- U-SURF算法:不确定方向,进一步提速,保持+/-15°旋转稳定性。OpenCV支持此模式,upright=0计算方向,upright=1不计算方向。
- 生成特征点的特征矢量:计算图像的Haar小波响应。在矩形区域内,以特征点为中心,沿主方向将20×20的图像划分成4×4个子块。描述符长度64,降低维度以加速计算与匹配,提供更易区分的特征。
- SURF提供加强版128维的特征描述符,以增加特征点的独特性。在不增加计算复杂度情况下,特征就加倍。OpenCV参数extended为1 时128维,0时64维,默认128维。
- 检测特征点:使用Hessian矩阵行列式,计算得出Hessian矩阵的迹,迹为对角元素和。
- 特征点按亮度分为两种:一种是特征点迹周围小邻域的亮度比背景区域要亮,Hessian矩阵的迹为正;另一种是特征点迹周围小邻域的亮度比背景区域要暗,Hessian矩阵的迹为负。先对特征点的迹进行比较,若同号,特征点具有相同对比度;若异号,特征点的对比度不同,放弃特征点之间的后续相似性度量。
- 两个特征点描述子的相似性度量:利用欧式距离计算。
- SURF算法对每一步进行优化来提高速度,SURF速度是SIFT的3倍。
- SURF算法善于处理具有模糊和旋转的图像,但不善于处理视角变化和光照变化。
OpenCV中的SURF算法
- SURF对象:可选参数,64/128维描述符,Upright / Normal模式。
- SURF.detect() SURF.compute() ——解释:进行关键点混合和描述。
代码演示
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('./image2/mario.jpg',0)
surf=cv2.SURF(50000)
kp,des=surf.detectAndCompute(img,None)
leng=len(kp)
print(leng)
img2=cv2.drawKeypoints(img,kp,None,(255,0,0),4)
plt.imshow(img2)
plt.show()
surf.upright=True
kp=surf.detect(img,None)
img3=cv2.drawKeypoints(img,kp,None,(255,0,0),4)
plt.imshow(img3)
plt.show()
surf.extended=True
kp,des=surf.detectAndCompute(img,None)
dem1=surf.descriptorSize()
print(dem1)
shp1=des.shape()
print(shp1)