文章目录

  • 1.Harris和Shi-Tomasi特征检测
  • 2.SIFT(Scale-Invariant Feature Transform)关键点检测
  • 3.SIFT使用过程
  • (1)创建SIFT对象
  • (2)进行检测,(关键点)KP=sift.detect(img,……)
  • (3)绘制关键点,drawKeypoints(gray,KP,img)
  • 4.代码实战
  • 5.特征匹配
  • (1)方式一:关键点匹配
  • (2)方式二:关键点匹配


1.Harris和Shi-Tomasi特征检测


2.SIFT(Scale-Invariant Feature Transform)关键点检测

思考:既然有了Harris角点检测,为什么还要SIFT关键点检测呢?
(1)Harris角点具有旋转不变性的特性;但是缩放后,原来的角点有可能不一定为角点了;

Python基于sift特征的图像配准融合 sift python_python

可以看到当第一幅图的角点放大之后,就变成了第二幅图的样子,但是再去检测的时候已经不能检测出是角点了,而是边沿了。所以提出了SIFT。


3.SIFT使用过程

(1)创建SIFT对象

(2)进行检测,(关键点)KP=sift.detect(img,……)

(3)绘制关键点,drawKeypoints(gray,KP,img)

其中gray——原始图像,可以使三通道或单通道图像;KP——关键点;img——将点绘制到原始图像上;color——绘制的特征点的颜色信息,默认绘制的是随机彩色;
Flags——
(1)cv2.DRAW_MATCHES_FLAGS_DEFAULT:创建输出图像矩阵,使用现存的输出图像绘制匹配对和特征点,对每一个关键点只绘制中间点
(2)cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:不创建输出图像矩阵,而是在输出图像上绘制匹配对
(3)cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:对每一个特征点绘制带大小和方向的关键点图形
(4)cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:单点的特征点不被绘制


4.代码实战

import os
import cv2
import cv2

img=cv2.imread('images/HaLiSi.jpg')
img=cv2.resize(src=img,dsize=(450,450))
gray=cv2.cvtColor(src=img,code=cv2.COLOR_BGR2GRAY)
#SIFT对象创建
sift=cv2.SIFT_create()
#进行检测,其中第二个参数为None,表示对整张图进行检测
kp=sift.detect(gray,None)
#绘制角点
cv2.drawKeypoints(image=gray,keypoints=kp,outImage=img,color=(0,255,0))

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

if __name__ == '__main__':
    print('pycharm')

Python基于sift特征的图像配准融合 sift python_opencv_02


5.特征匹配

(1)关键点:位置,大小和方向;
计算SIFT描述子:
(2)记录了关键点周围对其贡献的像素点的一组向量值,其不受仿射变换,光照变换等的影响。

(1)方式一:关键点匹配

关键点匹配:
#方式一:进行特征匹配
kp,des=sift.compute(img,kp)
import os
import cv2
import numpy as np

img=cv2.imread('images/HaLiSi.jpg')
img=cv2.resize(src=img,dsize=(450,450))
gray=cv2.cvtColor(src=img,code=cv2.COLOR_BGR2GRAY)
#SIFT对象创建
sift=cv2.SIFT_create()
#进行检测,其中第二个参数为None,表示对整张图进行检测
kp=sift.detect(gray,None)
#进行特征匹配
kp,des=sift.compute(gray,kp)
print(des)
# kp,des=sift.detectAndCompute(gray)
#绘制角点
cv2.drawKeypoints(image=gray,keypoints=kp,outImage=img,color=(0,255,0))

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

if __name__ == '__main__':
    print('Pycharm')

(2)方式二:关键点匹配

同时进行关键点检测和特征匹配
Kp,des=sift.detectAndCompute(img,None)
Img:输入的图像(灰度图);
Mask:指定img中哪个区域进行计算。

Python基于sift特征的图像配准融合 sift python_python_03