图像处理Task01——Harris特征点检测器-兴趣点检测

图像处理Task01——Harris特征点检测器-兴趣点检测

1.1 简介

  • 在图像处理中,特征点可以称兴趣点或者角点,三者经常相互使用,即图像的极值点,线段的终点,曲线曲率最大的点或者水平或者竖直方向上属性最大的点等等,这些特征点是图像很重要的特征,对图像图形的理解和分析有很重要的作用。特征点在保留图像图形重要特征的同时,可以代替整幅图像的处理,有效地减少信息的数据量,使其信息的含量很高,有效地提高了计算的速度,有利于图像的可靠匹配,使得实时处理成为可能。
  • 特征点检测就是对有具体定义的、或者是能够具体检测出来的特征点的检测。目前检测方法很多,具体分有三大类:(1)基于灰度图像的角点检测(2)基于二值图像的角点检测(3)基于轮廓曲线的角点检测。基于灰度图像的角点检测又可分为基于梯度、基于模板和基于模板梯度组合3类方法,其中基于模板的方法主要考虑像素领域点的灰度变化,即图像亮度的变化,将与邻点亮度对比足够大的点定义为角点。常见的基于模板的角点检测算法有Kitchen-Rosenfeld角点检测算法,Harris角点检测算法、KLT角点检测算法及SUSAN角点检测算法。

1.2 学习目标

  • 理解Harris特征点检测算法的思想和数学原理
  • 学会利用OpenCV的Harris算子进行兴趣点检测

1.3 内容大纲

  • 基础知识
  • Harris角点检测算法原理
  • OpenCV实现

1.4 内容介绍

1.4.1 基础知识
  • 1.角点
    角点是一类具有特定特征的点,角点也是处在一个无论框框往哪边移动,框内像素值都会发生很大变化的点。
    如下图:蓝色边框无论往哪边移动,框内的像素值都不变,从颜色角度看都是绿色;黑色边框虽然上下移动框内的像素值发生变化但左右移动没有发生变化所以它也不是;而红色边框无论上下还是左右移动,其中的像素值都会发生很大变化,从颜色看就是红色与白色的比例在不断变化,所以它中心的点是角点
    在这里插入图片描述
  • 2.图像梯度
    “像素值发生很大变化”这一现象可以用图像梯度进行描述。在图像局部内,图像梯度越大表示该局部内像素值变化越大(灰度的变化率越大)。 而图像的梯度在数学上可用微分或者导数来表示。对于数字图像来说,相当于是二维离散函数求梯度,并使用差分来近似导数: G x ( x , y ) = H ( x + 1 , y ) − H ( x − 1 , y ) G_x(x,y)=H(x+1,y)-H(x-1,y) Gx(x,y)=H(x+1,y)H(x1,y) G y ( x , y ) = H ( x , y + 1 ) − H ( x , y − 1 ) G_y(x,y)=H(x,y+1)-H(x,y-1) Gy(x,y)=H(x,y+1)H(x,y1) 在实际操作中,对图像求梯度通常是考虑图像的每个像素的某个邻域内的灰度变化,因此通常对原始图像中像素某个邻域设置梯度算子,然后采用小区域模板进行卷积来计算,常用的有Prewitt算子、Sobel算子、Robinson算子、Laplace算子等。
1.4.2 Harris角点检测算法原理

算法的核心是利用局部窗口在图像上进行移动,判断灰度是否发生较大的变化。如果窗口内的灰度值(在梯度图上)都有较大的变化,那么这个窗口所在区域就存在角点。

这样就可以将 Harris 角点检测算法分为以下三步:

  • 当窗口(局部区域)同时向 x (水平)和 y(垂直) 两个方向移动时,计算窗口内部的像素值变化量 E ( x , y ) E(x,y) E(x,y)
  • 对于每个窗口,都计算其对应的一个角点响应函数 R R R
  • 然后对该函数进行阈值处理,如果 R > t h r e s h o l d R > threshold R>threshold,表示该窗口对应一个角点特征。
1.4.3 基于OpenCV的实现
  • 在opencv中有提供实现 Harris 角点检测的函数 cv2.cornerHarris,我们直接调用的就可以。

  • 函数原型:cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]])

  • 对于每一个像素 (x,y),在 (blockSize x blockSize) 邻域内,计算梯度图的协方差矩阵 M ( x , y ) M(x,y) M(x,y),然后通过上面第二步中的角点响应函数得到结果图。图像中的角点可以为该结果图的局部最大值。即可以得到输出图中的局部最大值,这些值就对应图像中的角点。
    参数解释:

  • src - 输入灰度图像,float32类型

  • blockSize - 用于角点检测的邻域大小,就是上面提到的窗口的尺寸

  • ksize - 用于计算梯度图的Sobel算子的尺寸

  • k - 用于计算角点响应函数的参数k,取值范围常在0.04~0.06之间

import cv2
import numpy as np

filename = '1010.jpg'
img = cv2.imread(filename)

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)

# 输入图像必须是float32, 最后一个参数在 0.04 到 0.05 之间
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
cv2.imshow('dst', dst)
#膨胀 提升后续图像角点标注的清晰准确度 可有可无
dst = cv2.dilate(dst, None)

img[dst > 0.05 * dst.max()] = [0, 0, 255]
cv2.imshow('img', img)
cv2.imshow('dst2', dst)

原始图片:
在这里插入图片描述
角点检测后的图片:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值