一、什么是特征
粗略的讲,特征是有意义的图像区域,该区域具有独特性或易于识别性
可以作为特征的:角点、斑点、边缘等等
二、常见的几种特征检测算法
- Harris:该算法用于检测角点
- SIFT:该算法用于检测斑点
- SURF:该算法用于检测斑点
- FAST:该算法用于检测角点
- BRIEF:该算法用于检测斑点
- ORB:该算法代表带方向的FAST算法与具有旋转不变性的BRIEF算法
三、Harris角点检测
角点并没有很明确的定义,主要指的是轮廓的交点,用数学意义来讲就是图像中亮度变化剧烈的点,或者是边缘中曲率取极大值的点,或者说这个点在邻域中具有两个方向的特征点。
在当前图像处理领域,角点检测可分为以下三类:
- 基于灰度图像的角点检测
- 基于二值图像的角点检测
- 基于轮廓曲线的角点检测
基于灰度的又分为三种:基于梯度的、基于模板的、基于模板梯度组合
其中基于模板的主要考虑像素领域点的灰度变化,即图像亮度的变化,将与邻点亮度对比度足够大的点定义为角点,Harris就属于这种检测方法。
主要公式:
当窗口发生[u,v]移动时,那么滑动前与滑动后对应的窗口中的像素点灰度变化描述如下:
- >[u,v]是窗口的偏移量
- >(x,y)是窗口内所对应的像素坐标位置,窗口有多大,就有多少个位置
- >w(x,y)是窗口函数,最简单情形就是窗口内的所有像素所对应的w权重系数均为1。
上式泰勒展开,经过一系列因式分解,变换后可得以下形式
M矩阵判断图像特征:
- 特征值都比较大时,即窗口中含有角点
- 特征值一个较大,一个较小,窗口中含有边缘
- 特征值都比较小,窗口处在平坦区域
其中k是常量,一般取值为0.04~0.06,这个参数仅仅是这个函数的一个系数,它的存在只是调节函数的形状而已。
该算法详细理论可见opencv-python 教程或https://blog.youkuaiyun.com/lwzkiller/article/details/54633670
四 opencv-python 代码示例
import numpy as np
import cv2 as cv
#输入图像
filename = 'chessboard.png'
img = cv.imread(filename)
#灰度化
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
gray = np.float32(gray)
#检测角点
dst = cv.cornerHarris(gray,2,3,0.04)
#更便于标记角点,可以去掉
dst = cv.dilate(dst,None)
# Threshold for an optimal value, it may vary depending on the image.
img[dst>0.01*dst.max()]=[0,0,255]
#防止图片输出时过大
cv2.namedWindow('dst',cv2.WINDOW_KEEPRATIO)
cv.imshow('dst',img)
if cv.waitKey(0) & 0xff == 27:
cv.destroyAllWindows()
dst=cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]])
- dst:Harri算法的输出矩阵(输出图像),CV_32FC1类型,与src有同样的尺寸
- src:输入图像,单通道,8位或浮点型
- blockSize:int类型的blockSize,表示邻域的大小,对每个像素,考虑blockSize×blockSize大小的邻域,在邻域上计算图像的2x2梯度的协方差矩阵M。
- ksize:int类型的ksize,为Soble算子核尺寸,如果小于0,采用3×3的Scharr滤波器。
- k:double类型的k,为角点响应函数中的经验常数(0.04~0.06)。
cv2.namedWindow('dst',cv2.WINDOW_KEEPRATIO)
- 预先创建一个窗口显示图片
- 参数1(‘dst’):窗口的名称
- 参数2:窗口的标识,一般默认为WINDOW_AUTOSIZE 。cv2.WINDOW_KEEPRATIO为图片尺寸保持比例
其他参数具体可见博客https://blog.youkuaiyun.com/xykenny/article/details/90513480
本文撰写中借鉴了文中优秀的博客,在此致谢