目录
一、基本概念
二、harris角点检测
三、SIFT算法
四、Shi-Tomasi角点检测
一、基本概念
特征检测指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征。特征检测的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者连续的区域。
特征检测包括边缘检测、角检测、区域检测和脊检测
特征检测应用场景:
- 图像搜索
- 拼图游戏
- 图像拼接
图像特征就是值得有意义的图像区域,具有独特性,易于识别性,比较角点,斑点以及高密度区
二、harris角点检测
案例代码如下:
import cv2
import numpy as np
img = cv2.imread('8.jpg')
# 变成灰度图片
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 角点检测
# blockSize没有要求必须是奇数
# 返回目标值(角点响应),每一个像素点都可以计算出一个角点响应
dst = cv2.cornerHarris(gray,blockSize=2,ksize=3,k=0.04)
#显示角点
# 设定阈值,dst.max()
img[dst > (0.01 * dst.max())] = [0,0,255]
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下:
三、SIFT算法
SIFT,即尺度不变特征变换,是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。
Harris角点具有旋转不变的特性,但是缩放后,原来的角点有可能就不是角点了
使用SIFT的步骤
- 创建SIFT对象sift = cv2.xfeatures2d.SIFT_create()
- 进行检测,kp = sift.detect(img,...)
- 绘制关键点,drawKeypoints(gray,kp,img)
案例代码如下:
import cv2
import numpy as np
img = cv2.imread('8.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 创建sift对象
# 注:xfeatures2d是opencv的扩展包中的内容,需要安装opencv-contrib-python
sift = cv2.xfeatures2d.SIFT_create()
# 进行检测
kp = sift.detect(gray)
# 计算描述子
kp,des = sift.compute(gray,kp)
# 还可以一步到位计算
kp,des = sift.detectAndCompute(gray)
# 绘制关键点
cv2.drawKeypoints(gray,kp,img)
# 展示
cv2.imshow('img',img)
# 释放资源
cv2.waitKey(0)
cv2.destroyAllWindows()
关键点与描述子的区别:
关键点:位置、大小和方向
描述子:记录了关键点周围对其有共享的像素点的一组向量值,其不受仿射变换
四、Shi-Tomasi角点检测
案例代码如下:
import cv2
import numpy as np
img = cv2.imread('8.jpg')
# 灰度化
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# shi-tomai角点检测
corners = cv2.goodFeaturesToTrack(gray,maxCorners=0,qualityLevel=0.01,minDistance=10)
# 变成int类型
corners = np.int0(corners)
# 画出角点
for i in corners:
# i相当于corners中的每一行数据
# ravel()把二维变成一维了,即角点的坐标点
x,y = i.ravel()
cv2.circle(img,(x,y),3,(255,0,0),-1)
# 展示图片
cv2.imshow('img',img)
# 释放资源
cv2.waitKey(0)
cv2.destroyAllWindows()