OpenCv_03——图像特征

目录

  • 3.图像特征
    • 3.1角点检测
    • 3.2 SIFT图像尺度空间

上一篇: OpenCv_02——图像处理
下一篇: OpenCv_04——特征匹配

3.图像特征

图片自取区

chess.jpg house.jpg girl123

3.1角点检测

OpenCv_03——图像特征_第1张图片

基本原理

OpenCv_03——图像特征_第2张图片

OpenCv_03——图像特征_第3张图片

OpenCv_03——图像特征_第4张图片

OpenCv_03——图像特征_第5张图片

OpenCv_03——图像特征_第6张图片

OpenCv_03——图像特征_第7张图片

OpenCv_03——图像特征_第8张图片

cv2.cornerHarris()

参数 说明
img 数据类型为float32的入口图像
blockSize 数据类型为float32的入口图像
ksize Sobel求导中使用的窗口大小
k 取值参数为[0.04,0.06]
import cv2
import numpy as np

img=cv2.imread('chess.jpg')
print('img.shape:',img.shape)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray=np.float32(gray)
dst=cv2.cornerHarris(gray,2,3,0.04)
print('dst.shape:',dst.shape)
img[dst>0.01*dst.max()]=[0,0,255]
cv2.imshow('dst',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
OpenCv_03——图像特征_第9张图片

3.2 SIFT图像尺度空间

图像尺度空间

  • 再一定的范围内,无论物体是大还是小,人眼都可以分辨出来,然而计算机要有相同的能力却很难所以要让机器能够对物体在不同尺度下有一个统一的认知,就需要在考虑图像在不同尺度下都有存在的特点。
  • 尺度空间的获取通常使用高斯模糊来实现

OpenCv_03——图像特征_第10张图片

  • 不同σ的高斯函数决定了对图像的平滑程度,越大的σ值对应的图像越模糊。

多分辨率金字塔

OpenCv_03——图像特征_第11张图片

高斯差分金字塔(DOG)

OpenCv_03——图像特征_第12张图片

DOG定义公式

image-20220905102956553

DOG极值空间检测

  • 为了寻找尺度空间的极值点,每个像素点要和其图像领域(同一尺度空间)和尺度域(相邻的尺度空间)的所有相邻点进行比较,当大于或小于所有相邻点时,该点就是极值点。如下图所示,中间的检测点要和其所在图像的33邻域8个像素点,以及其相邻的上下两层的33领域18个像素点,共26个像素点进行比较。

OpenCv_03——图像特征_第13张图片

关键点的精确定位

  • 这些候选关键点是DOG空间的局部极值点,而且这些极值点均为离散的点,精确定位极值点的一种方法是,对尺度空间DOG函数进行曲线你和,计算其极值点,从而实现关键点的精确定位。

OpenCv_03——图像特征_第14张图片

消除边界响应

OpenCv_03——图像特征_第15张图片

每个特征点可以得到三个信息(x,y,σ,θ),即位置、尺度和方向。具有多个方向的关键点可以被复制成多份,然后将方向值分别赋值给复制后的特征点,一个特征点就产生了多个坐标、尺度等,但是方向不同的特征点。

生成特征描述

  • 在完成关键点的梯度计算之后,使用直方图统计邻域内像素的梯度和方向。

OpenCv_03——图像特征_第16张图片

为保证特征矢量的旋转性不变,要以特征点为中心,在附近邻域内将坐标轴旋转θ角度,即将坐标轴旋转为特征点的主方向。

OpenCv_03——图像特征_第17张图片

旋转之后的主方向为中心取8×8的窗口,求每个像素的梯度幅值和方向,箭头方向代表梯度方向,长度代表梯度幅值,然后利用高斯窗口对其进行加权运算,最后在每个4×4的小块上绘制8个方向的梯度直方图,计算每个梯度方向的累加值,即可形成一个种子点,即每个特征点由4个种子组成,每个种子点有8个方向的向量信息。

OpenCv_03——图像特征_第18张图片

论文中建议对每个关键点使用4×4共16个种子点来描述,这样一个关键点就会产生128维的SIFT特征向量。

OpenCv_03——图像特征_第19张图片

opencv3.x.的cv2.drawKeypoints() 函数主要五个参数:

参数 说明
image 也就是原始图片
keypoints 从原图中获得的关键点,这也是画图时所用到的数据
outputimage 输出 //可以是原始图片
color 颜色设置,通过修改(b,g,r)的值,更改画笔的颜色,b=蓝色,g=绿色,r=红色。
flags 绘图功能的标识设置
import cv2
import numpy as np

img=cv2.imread('girll23.jpg')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#查看opencv版本
cv2.__version__
#'3.4.1'

#得到特征点
sift=cv2.xfeatures2d.SIFT_create()
kp=sift.detect(gray,None)#特征提取


img=cv2.drawKeypoints(gray,kp,img)

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

OpenCv_03——图像特征_第20张图片

#计算特征
kp,des=sift.compute(gray,kp)#compute特征匹配

print(np.array(kp).shape)
#(116,)

des.shape
#(116, 128)

des[0]
'''array([ 62.,   3.,   0.,   0.,   0.,   0.,   1.,   6., 149.,   3.,   0.,
         0.,   0.,   1.,   6.,  50.,  38.,   4.,   9.,  14.,  17.,   5.,
        15.,  26.,   5.,   2.,   5.,  20., 144.,  33.,   0.,   0.,  58.,
         2.,   0.,   0.,   0.,   0.,   0.,   5., 149.,   9.,   0.,   0.,
         0.,  10.,  12.,  40.,  37.,   1.,   6.,  13.,  16., 107.,  29.,
        12.,   0.,   0.,   3.,  15., 113.,  61.,   3.,   0.,  10.,   1.,
         0.,   0.,   0.,   0.,   0.,   5., 149.,  56.,   0.,   0.,   0.,
         3.,   5.,  28., 109.,  13.,   0.,   0.,  37., 122.,  19.,   9.,
         0.,   0.,   0.,   0., 124., 128.,   4.,   0.,   0.,   0.,   0.,
         0.,   0.,   0.,   0.,   0., 149.,  62.,   0.,   0.,   0.,   0.,
         0.,   5., 135.,  60.,   3.,   3.,  46.,  30.,   1.,   4.,   1.,
         0.,   0.,   1.,  42., 101.,  21.,   4.], dtype=float32)'''

你可能感兴趣的:(#,OpenCv,opencv,计算机视觉,python)