- 應(yīng)用:圖像拼接哈误、圖像匹配
- 特征檢測(cè)和提取算法:Harris(檢測(cè)角點(diǎn))SIFT(檢測(cè)斑點(diǎn)blob)SURF(檢測(cè)斑點(diǎn))FAST(檢測(cè)角點(diǎn))BRIEF(檢測(cè)斑點(diǎn))ORB(帶方向的FAST算法與具有旋轉(zhuǎn)不變性的BRIEF算法)
- 特征匹配算法:暴力匹配(Brute-Force)基于FLANN匹配。
- 特征:特殊的圖形區(qū)域板熊、獨(dú)特性和易于識(shí)別性--角點(diǎn)和高密度區(qū)域。大量重復(fù)區(qū)域和低密度區(qū)域不適合作為特征海诲,邊緣時(shí)很好的特征洛勉,斑點(diǎn)(與周圍有很大差別的區(qū)域)
- cornerHarris檢測(cè)角點(diǎn)特征,代碼如下:
import cv2
import numpy as np
img = cv2.imread("../data/0.jpg")
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #彩色轉(zhuǎn)化為灰度
gray=np.float32(gray) #轉(zhuǎn)化為32浮點(diǎn)型
dst = cv2.cornerHarris(gray,15,23,0.04)
# 第三個(gè)參數(shù):Sobel算法中孔纵穿,行列變化檢測(cè)邊緣下隧。3-31之間奇數(shù)
#角點(diǎn)檢測(cè)的敏感度
#第二個(gè)參數(shù):參數(shù)值越小,標(biāo)記角點(diǎn)的記號(hào)越小
img[dst>0.01*dst.max()]=[0,0,255]
cv2.namedWindow("corners", cv2.WINDOW_NORMAL)
while(True):
cv2.imshow('corners',img)
if cv2.waitKey(10000) & 0xff == ord('q'): #退出循環(huán)條件
break
cv2.destroyAllWindows()
#cv2.imshow('corners',img)
#cv2.waitKey(0) #退出循環(huán)條件
#cv2.destroyAllWindows()
-
顯示結(jié)果如下:
檢測(cè)角點(diǎn) - 使用cornerHarris能很好的檢測(cè)角點(diǎn)谓媒,與角點(diǎn)本身特征有關(guān)淆院,但增加或者減小圖像大小,角點(diǎn)數(shù)量變化句惯。
- 尺度不變特征變換(SIFT)對(duì)于不同的圖像尺度輸出相同的結(jié)果土辩。SIFT不檢測(cè)關(guān)鍵點(diǎn),通過(guò)一個(gè)特征向量描述關(guān)鍵點(diǎn)周圍區(qū)域情況抢野。
- 步驟:
- 讀入圖像拷淘,并轉(zhuǎn)化為灰度圖
- 創(chuàng)建SIFT對(duì)象,計(jì)算灰度圖像
sift=cv2.xfeatures2d.SIFT_create()
keypoints,descriptor=sift.detectAndCompute(gray,None)
返回值是關(guān)鍵點(diǎn)信息和描述符指孤。--具體含義不清楚启涯,沒(méi)有看懂具體形式--,keypoints是list,里面每一個(gè)元素比如keypoint[0]為cv2.Keypoint類恃轩,有屬性pt(x,y坐標(biāo))size(特征直徑)angle(特征方向)response(關(guān)鍵點(diǎn)強(qiáng)度)octave(所在金字塔層次)class_id(關(guān)鍵點(diǎn)ID) - 圖像上繪制關(guān)鍵點(diǎn)结洼,使用drawKeypoints函數(shù),對(duì)每一個(gè)關(guān)鍵點(diǎn)繪制圓圈和方向详恼。
- 完整代碼如下:
import cv2
import numpy as np
img= cv2.imread('../data/0.jpg')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
sift=cv2.xfeatures2d.SIFT_create()
#sift對(duì)象適用DoG檢測(cè)關(guān)鍵點(diǎn)补君,并計(jì)算特征向量
#返回關(guān)鍵點(diǎn)信息和描述符
keypoints,descriptor=sift.detectAndCompute(gray,None)
img=cv2.drawKeypoints(image=img,outImage=img,keypoints=keypoints,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS,color=(51,163,236))
cv2.namedWindow('sift_keypoints',cv2.WINDOW_NORMAL)
cv2.imshow('sift_keypoints',img)
while(True):
if cv2.waitKey(1000) & 0xff==ord('q'):
break
cv2.destroyAllWindows()
-
生成圖像如下:SIFT
- SURF使用快速Hessian算法檢測(cè)關(guān)鍵點(diǎn),與SIFT無(wú)太大區(qū)別昧互,只需修創(chuàng)建surf對(duì)象并計(jì)算特征向量和往原始圖像畫出即可:
suft=cv2.xfeatures2d.SURF_create(8000)
keypoints,descriptor=suft.detectAndCompute(gray,None)
其中設(shè)置閾值為8000挽铁,越高識(shí)別的特征越少