图像尺度空间
在一定范围内,无论是物体是大还是小,人眼都可以分辨出来,然而计算机却很难完成,所以要让机器能够对物体在不同的尺度下有统一的认知,就需要考虑 图像在不同尺度下都存在的特点
尺度空间的获取可通过高斯模糊来实现
不同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算法的最终结果。
|