图像特征提取与描述

图像特征提取与描述


Harris和Shi-Tomas算法

Harris角点检测

原理:

检测的思想是通过图像的局部小窗口观察图像,角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化。

API:cv.cornerHarris(src,blockSize,ksize,k)

img:数据类型为float32的输入图像。

blockSize:角点检测中药考虑的邻域大小。

ksize:sobel求导使用的核大小。

k:角点检测方程中的自由参数,取值参数为[0.04,0.06]。

Shi-Tomasi角点检测

原理:Shi-Tomasi算法是对Harris角点检测算法的改进。改进方法主要是当矩阵M的两个特征值中较小的一个大于阈值,则认为他是角点。

API:cv.goodFeaturesToTrack(image,maxcorners,qualityLevel,minDistance)

image:输入灰度图像。

maxCorners:获取角点数的数目。

qualityLevel:该参数指出最低可接受的角点质量水平,在0-1之间。

minDistance:角点之间最小的欧式距离,避免得到相邻特征点。

返回:

Corners:搜索到的角点,在这里所有低于质量水平的角点被排除掉,然后把合格的角点按质量排序,然后将质量较好的角点附近(小于最小欧式距离)的角点删掉,最后找出maxCorners个角点返回。

SIFT/SURF算法

Harris和Shi-Tomasi角点检测算法不具有尺度不变性。因此引入尺度不变特征转换即SIFT。

SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点以及亮区的暗点等。

Lowe将SIFT算法分解为如下四步:

  1. 尺度空间极值检测:

  2. 关键点定位:

  3. 关键点方向确定:

  4. 关键点描述:

SIFT在图像的不变特征提取方面拥有无语伦比的优势,但并不完美,仍然存在实时性不高,有时特征点较少,对边缘光滑的目标无法准确提取特征点等缺陷。

API:

  1. 实例化SIFT:cv.xfeatures2d.SIFT_create()

  2. 关键点检测:实例.detectAndCompute(gray,None)

gray:进行关键点检测的图像,注意是灰度图像。

返回:

kp:关键点信息,包括位置,尺度,方向信息。

des:关键点描述符,每个关键点对应128个梯度信息的特征向量。

  1. 将关键点检测结果绘制在图像上

cv.drawKeypoints(image,keypoints,outputimage,color,flags)

image:原始图像。

keypoints:关键点信息,将其绘制在图像上,也就是上一步返回的kp。

outputimage:输出图片,可以是原始图像。

color:颜色设置,通过修改(b,g,r)的值,更改画笔的颜色,b=蓝色,g=绿色,r=红色。

flags:绘图功能的标识设置。其中包括:DRAW_MATCHES_FLAGS_DEFAULT;DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG;DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS;DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS。

SURF原理

使用SIFT算法进行关键点检测和描述的执行速度比较慢。而SURF算法是SIFT的增强版,它的计算量小,运算速度快,提取的特征与SIFT几乎相同。

FAST算法

原理:去图像中检测点,以该点为圆心,周围邻域内像素点判断检测点是否为角点,通俗的讲就是若一个像素周围有一定数量的像素与该点像素值不同,则认为其为角点。

模型的缺点:

  • 获得的候选点比较多。

  • 特征点的选取不是最优的,因为它的效果取决于要解决的问题和角点的分布情况。

  • 进行非特征点判别时大量的点被丢弃。

  • 检测到的很多特征点都是相邻的。

前三个问题可以通过机器学习的方法进行解决,最后一个问题可以使用非最大值抑制的方法解决。

API:cv.FastFeatureDetector_create(threshold,nonmaxSupperssion)

threshold:阈值t,有默认值10.

nonmaxSupperssion:是否进行非极大值抑制,默认值True。

返回值:

Fast:创建的FastFeatureDetector对象。

利用创建的对象.detect(grayImg,None)

gray:进行关键点检测的图像,注意是灰度图像。

kp:关键点信息,包括位置,尺度,方向信息。

最后使用cv.drawKeypoints(image,keypoints,outimage,color,flags)进行关键点检测结果在图像上的绘制。

ORB

该算法结合了Fast和Brief算法,提出了构造金字塔,为Fast特征点添加了方向,从而使得关键点具有了尺度不变性和旋转不变性。

API:cv.xfeatures2d.orb_create(nfeatures)

nfeatures:特征点的最大数量。

利用实例.detectAndCompute(gray,None)进行关键点检测计算。

gray:进行关键点检测的图像,注意是灰度图像

返回值:

kp:关键点信息,包括位置、尺度、方向信息。

des:关键点描述符,每个关键点BRIEF特征向量,二进制字符串。

最后利用drawKeypoints()将关键点检测结果绘制在图像上。

posted @ 2021-12-08 17:19  用余生去爱  阅读(432)  评论(0)    收藏  举报