SIFT

sift 的定义

SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。

sift 算法介绍

SIFT 特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、微视角改变的容忍度也相当高。基于这些特性,它们是高度显著而且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体而且鲜有误认。使用 SIFT 特征描述对于部分物体遮蔽的侦测率也相当高,甚至只需要 3 个以上的 SIFT 物体特征就足以计算出位置与方位。在现今的电脑硬件速度下和小型的特征数据库条件下,辨识速度可接近即时运算。SIFT 特征的信息量大,适合在海量数据库中快速准确匹配

SIFT 算法特点:

特征检测

SIFT 特征检测主要包括以下 4 个基本步骤:

特征匹配

SIFT 特征匹配主要包括 2 个阶段

SIFT 特征的生成步骤:

环境准备

踩坑记录踩坑记录

具体实现

import cv2
from matplotlib import pyplot as plt
from imagedt.decorator import time_cost
print('cv version: ', cv2.__version__)

def bgr_rgb(img):
 (r, g, b) = cv2.split(img)
 return cv2.merge([b, g, r])

def orb_detect(image_a, image_b):
 orb = cv2.ORB_create()
 kp1, des1 = orb.detectAndCompute(image_a, None)
 kp2, des2 = orb.detectAndCompute(image_b, None)
 bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
 matches = bf.match(des1, des2)
 matches = sorted(matches, key=lambda x: x.distance)
 img3 = cv2.drawMatches(image_a, kp1, image_b, kp2,
    matches[:100], None, flags=2)
 return bgr_rgb(img3)

@time_cost
def sift_detect(img1, img2, detector='surf'):
 if detector.startswith('si'):
 print("sift detector......")
 sift = cv2.xfeatures2d.SURF_create()
 else:
 print("surf detector......")
 sift = cv2.xfeatures2d.SURF_create()
 kp1, des1 = sift.detectAndCompute(img1, None)
 kp2, des2 = sift.detectAndCompute(img2, None)
 bf = cv2.BFMatcher()
 matches = bf.knnMatch(des1, des2, k=2)
 good = [[m] for m, n in matches if m.distance < 0.5 * n.distance]
 img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, None, flags=2)
 return bgr_rgb(img3)

if __name__ == "__main__":
 image_a = cv2.imread('../images/a/dm.png')
 image_b = cv2.imread('../images/b/cg.jpg')
 img = sift_detect(image_a, image_b)
 plt.imshow(img)
 plt.show()

运行 dome


↙↙↙阅读原文可查看相关链接,并与作者交流