Opencv第十六章 进阶篇之SIFT算法计算特征

图像尺度空间

在一定范围内,无论是物体是大还是小,人眼都可以分辨出来,然而计算机却很难完成,所以要让机器能够对物体在不同的尺度下有统一的认知,就需要考虑 图像在不同尺度下都存在的特点

尺度空间的获取可通过高斯模糊来实现

不同cgema的高斯函数决定了图像的平滑程度,越大的cgema对应的图像越模糊

图像金字塔可实现不同尺度图像大小比对

高斯差分金字塔 = 高斯变换 ==>图像金字塔 ==>不同层图像相减 ==> 得出不同特征中差异最大的特征 ==>特征关键点定位(离散 转 连续 ==> 泰勒级数展开(一维 到 三维) ==>消除边界影响(Hessian矩阵):(Lowe在论文中给出的γ=10,也就是说主曲率比值大于10的特征点将被删除):(γ=最大特征值与最小特征值的比值)==>特征点的主方向(到此一步:特征点得到了三个信息:位置,尺度,主方向(用arctan)) ==> 生成特征向量描述(使用直方图统计邻域内的梯度和方向 ==>特征要具有旋转不变性 ==>取中心点周围的88求梯度幅值和方向,加权运算,然后再44的小块中根据统计直方图分别做8维向量(论文中建议是128维向量[通常写作[4,4,8]及h=4,w=4,每个为8维])

img = cv2.imread('E:\Anaconda\Anaconda3.8\Pict.jpg') #读入图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度处理
cv2.__version__ #读出version版本
sift = cv2.xfeatures2d.SIFT_create() #SIFT特征算法的实例化
kp = sift.detect(gray,None)#detect 传入一张图像,此处需为灰度图 kp 及 keypoint
kp #封装好的类型

img = cv2.drawKeypoints(gray,kp,img) #绘制关键点

cv2.imshow('keypoint',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.imwrite('E:\Anaconda\Anaconda3.8\keypoint.jpg',img)

得到的图像如下:

 

#计算特征
kp,des = sift.compute(gray, kp)#传入灰度图像和关键点
print (np.array(kp).shape)#将关键点转化为.shape的形式输出 共有10220个关键点

得到结果为

des.shape#输出关键点,转化为128维的向量输出

 

des[0]#展开向量的结果

 这样便得到了SIFT算法的最终结果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值