python+opencv之特征检测(Harris篇)

一、什么是特征

粗略的讲,特征是有意义的图像区域,该区域具有独特性或易于识别性 

可以作为特征的:角点、斑点、边缘等等

 

二、常见的几种特征检测算法

  • 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

 

本文撰写中借鉴了文中优秀的博客,在此致谢 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值