Bootstrap

Python图像处理(13):brisk特征检测

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

欢迎转载,但请保留作者信息


BRISKBRIEF描述子的一种改进,相比于BRIEF特征,它具有旋转不变性、尺度不变性和对噪声的鲁棒性。本节尝试在Python下使用此特征检测方式,使用的测试图像为先前已经转换为灰度图的棉花图像:



首先读取图像:


[python]  view plain  copy
  1. # 读取原始图像  
  2. img = cv2.imread(r'F:\projects\src\opencv\images\cotton\39.gray.jpg')  
  3. plt.imshow(img)  

接着创建一个brisk特征检测器:

[python]  view plain  copy
  1. # 创建brisk检测器  
  2. brisk = cv2.BRISK_create()  

接下来计算图像的特征,此函数的原型为:

[plain]  view plain  copy
  1. Help on built-in function detectAndCompute:  
  2.   
  3. detectAndCompute(...)  
  4.     detectAndCompute(image, mask[, descriptors[, useProvidedKeypoints]]) -> keypoints, descriptors  

调用它计算特征点并显示:

[python]  view plain  copy
  1. # 计算特征点并显示  
  2. (kpt, desc) = brisk.detectAndCompute(img, None)  
  3. bk_img = img.copy()  
  4. out_img = img.copy()  
  5. out_img = cv2.drawKeypoints(bk_img, kpt, out_img)  
  6. plt.figure(2)  
  7. plt.imshow(out_img)  

结果就是这样的:


貌似对我们的叶片识别没有直接的帮助,需要自己寻找特征点才行。


直接将原图旋转30度:

[python]  view plain  copy
  1. # 原图像旋转30度  
  2. ang=np.pi/6  
  3. rot_mat = np.array([[np.cos(ang), np.sin(ang), 0], [-np.sin(ang), np.cos(ang), 200]])  
  4. img_30 = cv2.warpAffine(img, rot_mat, (600,500))  
  5. plt.figure(3)  
  6. plt.imshow(img_30)  

计算新的特征值:

[python]  view plain  copy
  1. # 特征点检测  
  2. (kpt_30, desc_30) = brisk.detectAndCompute(img_30, None)  
  3. bk_img = img_30.copy()  
  4. out_img = img_30.copy()  
  5. out_img = cv2.drawKeypoints(bk_img, kpt_30, out_img)  
  6. plt.figure(4)  
  7. plt.imshow(out_img)  


直接做特征点的匹配:

[python]  view plain  copy
  1. # 特征点匹配  
  2. matcher = cv2.BFMatcher()  
  3. matches = matcher.match(desc, desc_30)  
  4. print(matches)  

最后用图像显示匹配的结果:

[python]  view plain  copy
  1. # 显示匹配结果,仅显示前面的5个点  
  2. matches.sort(NoneNoneTrue)  
  3. out_img = cv2.drawMatches(img, kpt, img_30, kpt_30, matches[0:5], out_img)  
  4. plt.figure(5)  
  5. plt.imshow(out_img)  



匹配的效果也令人失望。




;