Python影象處理(13):brisk特徵檢測

快樂蝦

http://blog.csdn.net/lights_joy/

歡迎轉載,但請保留作者資訊

BRISK是BRIEF描述子的一種改進,相比於BRIEF特徵,它具有旋轉不變性、尺度不變性和對噪聲的魯棒性。本節嘗試在python下使用此特徵檢測方式,使用的測試影象為先前已經轉換為灰度圖的棉花影象:

首先讀取影象:

# 讀取原始影象
img = cv2.imread(r'F:\projects\src\opencv\images\cotton\39.gray.jpg')
plt.imshow(img)

接著建立一個brisk特徵檢測器:

# 建立brisk檢測器
brisk = cv2.BRISK_create()

接下來計算影象的特徵,此函式的原型為:

Help on built-in function detectAndCompute:
detectAndCompute(...)
detectAndCompute(image, mask[, descriptors[, useProvidedKeypoints]]) -> keypoints, descriptors

呼叫它計算特徵點並顯示:

# 計算特徵點並顯示
(kpt, desc) = brisk.detectAndCompute(img, None)
bk_img = img.copy()
out_img = img.copy()
out_img = cv2.drawKeypoints(bk_img, kpt, out_img)
plt.figure(2)
plt.imshow(out_img)

結果就是這樣的:

貌似對我們的葉片識別沒有直接的幫助,需要自己尋找特徵點才行。

直接將原圖旋轉30度:

# 原影象旋轉30度
ang=np.pi/6
rot_mat = np.array([[np.cos(ang), np.sin(ang), 0], [-np.sin(ang), np.cos(ang), 200]])
img_30 = cv2.warpAffine(img, rot_mat, (600,500))
plt.figure(3)
plt.imshow(img_30)

計算新的特徵值:

# 特徵點檢測
(kpt_30, desc_30) = brisk.detectAndCompute(img_30, None)
bk_img = img_30.copy()
out_img = img_30.copy()
out_img = cv2.drawKeypoints(bk_img, kpt_30, out_img)
plt.figure(4)
plt.imshow(out_img)

直接做特徵點的匹配:

# 特徵點匹配
matcher = cv2.BFMatcher()
matches = matcher.match(desc, desc_30)
print(matches)

最後用影象顯示匹配的結果:

# 顯示匹配結果,僅顯示前面的5個點
matches.sort(None, None, True)
out_img = cv2.drawMatches(img, kpt, img_30, kpt_30, matches[0:5], out_img)
plt.figure(5)
plt.imshow(out_img)

匹配的效果也令人失望。