-
特征点检测和匹配
1. 特征检测的基本概念
特征检测是计算机视觉和图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征。特征检测的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者连续的区域。
特征检测包括边缘检测, 角检测, 区域检测和脊检测.
特征检测应用场景:
-
图像搜索, 比如以图搜图
-
拼图游戏
-
图像拼接
…
以拼图游戏为例来说明特征检测的应用流程.
-
寻找特征
-
特征是唯一的
-
特征是可追踪的
-
特征是能比较的
我们发现:
- 平坦部分很难找到它在原图中的位置
- 边缘相比平坦要好找一些, 但是也不能一下确定
- 角点可以一下就找到其在原图中的位置
图像特征就是值有意义的图像区域, 具有独特性, 易于识别性, 比较角点, 斑点以及高密度区.
在图像特征中最重要的就是角点. 哪些是角点呢?
- 灰度梯度的最大值对应的像素
- 两条线的交点
- 极值点(一阶导数最大, 二阶导数为0)
2. Harris角点检测
Harris角点检测原理
检测窗口在图像上移动, 上图对应着三种情况:
- 在平坦区域, 无论向哪个方向移动, 衡量系统变换不大.
- 边缘区域, 垂直边缘移动时, 衡量系统变换剧烈.
- 在角点处, 往哪个方向移动, 衡量系统都变化剧烈.
- cornerHarris(src, blockSize, ksize, k[, dst[, borderType]])
- blockSize: 检测窗口大小
- ksize: sobel的卷积核
- k: 权重系数, 即上面公式中的 α \alpha α , 是个经验值, 一般取0.04~0.06之间.一般默认0.04
import cv2 import numpy as np img = cv2.imread('./chess.png') # 变成灰度图片 gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) # harris角点检测 dst = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04) # 返回的东西叫做角点响应. 每一个像素点都能计算出一个角点响应来. # print(dst) print(dst.shape) # 显示角点 # 我们认为角点响应大于0.01倍的dst.max()就可以认为是角点了. img[dst > 0.01 * dst.max()] = [0, 0, 255] cv2.imshow('img', img) cv2.waitKey(0) cv2.destroyAllWindows()
3. Shi-Tomasi角点检测
-
Shi-Tomasi是Harris角点检测的改进.
-
Harris角点检测计算的稳定性和K有关, 而K是一个经验值, 不太好设定最佳的K值.
-
Shi-Tomasi 发现,角点的稳定性其实和矩阵 M 的较小特征值有关,于是直接用较小的那个特征值作为分数。这样就不用调整k值了。
- Shi-Tomasi 将分数公式改为如下形式: R = m i n ( λ 1 λ 2 ) R= min(\lambda_1\lambda_2) R=min(λ1λ2)
- 和 Harris 一样,如果该分数大于设定的阈值,我们就认为它是一个角点。
-
goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance[, corners[, mask[, blockSize[, useHarrisDetector[, k]]]]])
- maxCorners: 角点的最大数, 值为0表示无限制
- qualityLevel: 角点质量, 小于1.0的整数, 一般在0.01-0.1之间.
- minDistance: 角之间最小欧式距离, 忽略小于此距离的点.
- mask: 感兴趣的区域.
- blockSize: 检测窗口大小
- useHarrisDetector: 是否使用Harris算法.
- k: 默认是0.04
import cv2 import numpy as np #harris # blockSize = 2 # ksize = 3 # k = 0.04 #Shi-Tomasi maxCorners = 1000 ql = 0.01 minDistance = 10 img = cv2.imread('chess.png') #灰度化 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) corners = cv2.goodFeaturesToTrack(gray, maxCorners, ql, minDistance) corners = np.int0(corners)
-
十.OpenCv 特征点检测和匹配
最新推荐文章于 2024-06-12 16:07:44 发布