6.1特征检测算法
Opencv中常见的特征检测和提取算法有:
Harris:该算法用于检测角点
SIFT:该算法用于检测斑点
SURF:该算法用于检测斑点
FAST:该算法用于检测角点
BRIEF:该算法用于检测斑点
ORB:该算法代表方向的FAST算法与具有旋转不变性的BRIEF算法
特征的定义:特征就是有意义的图像区域。例如,角点及高密度区域、边缘、斑点等。
检测角点特征
connerHarris是一个opencv函数,可以检测图像的角点。
python代码实现:
import cv2
import numpy as np
img=cv2.imread(r'D:\\picture\\chess_board.jpg')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray=np.float32(gray)
dst=cv2.cornerHarris(gray,2,23,0.04)
img[dst>0.01*dst.max()] = [0,0,255]
while(True):
cv2.imshow('corners',img)
if cv2.waitKey(1000//12) & 0xff==ord("q"):
break
cv2.destroyAllWindows()
输入:输出:
使用DoG和SIFT进行特征提取与描述
当图像大小发生变化的时候发现上述方法的角点数目也发生变化。所以我们应该选择一种与图像比例无关的角点检测方法。SIFT可以解决这个问题。SIFT检测特征,对不同的图像尺度输出相同的结果。(需要注意的是,SIFT并不检测关键点,关键点可以由Difference of Gaussians检测,但SIFT会通过一个特征向量来描述关键点周围区域的情况。)
DoG:是对同一图像使用不同高斯滤波器所得到的结果,DoG的操作最终结果会得到感兴趣的区域(关键点)。SIFT对象会使用DoG检测关键点,并且对每个关键点周围的区域计算特征向量。
python代码实现:
import cv2
import sys
import numpy as np
imgpath='D:\\picture\\nopicture.png'
img = cv2.imread(imgpath)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#将图像变为灰度格式
sift = cv2.xfeatures2d.SIFT_create()#创建一个sift对象,并计算灰度图像
keypoints, descriptor = sift.detectAndCompute(gray,None)#sift会使用DoG检测关键点,并且对每个关键点周围的区域计算特征向量
img = cv2.drawKeypoints(image=img, outImage=img, keypoints = keypoints, flags = 4, color = (51, 163, 236))
cv2.imshow('sift_keypoints', img)
while (True):
if cv2.waitKey(1000 // 12) & 0xff == ord("q"):
break
cv2.destroyAllWindows()
使用快速Hessian算法和SURF来提取和检测特征
SURF吸收SIFT算法的思想,但是速度快了好几倍。
SURF采用快速Hessian算法检测关键点,SURF会提取特征。