Datawhale 计算机视觉基础-图像处理(下)- Task01 Harris特征点检测器-兴趣点检测

1.1简介

特征点成为兴趣点和角点,常用的有harris角点检测、FAST特征检测、SIFT、SURF特征检测。

1.2角点的概念

使用一个滑动窗口在下面三幅图中滑动,可以得出以下结论:
  • 左图表示一个平坦区域,在各方向移动,窗口内像素值均没有太大变化;
  • 中图表示一个边缘特征(Edges),如果沿着水平方向移动(梯度方向),像素值会发生跳变;如果沿着边缘移动(平行于边缘) ,像素值不会发生变化;
  • 右图表示一个角(Corners),不管你把它朝哪个方向移动,像素值都会发生很大变化。

在这里插入图片描述

1.3Harris角点检测的算法原理

1.算法思想:利用局部窗口在图像上移动,判断图像的灰度是不是发生较大的变化。

  • 当窗口(局部区域)同时向 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,表示该窗口对应一个角点特征。

2.角点响应函数R
灰度值变化的大小则取决于矩阵M,M为梯度的协方差矩阵。在实际应用中为了能够应用更好的编程,所以定义了角点响应函数R,通过判定R大小来判断像素是否为角点。

计算每个窗口对应的得分(角点响应函数R定义):
在这里插入图片描述
Harris 角点检测的结果是带有这些分数 R 的灰度图像,设定一个阈值,分数大于这个阈值的像素就对应角点。

1.4OpenCV实现

在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 as cv
from matplotlib import pyplot as plt
import numpy as np


#detector parameters
block_size =2
sobel_size =3
k = 0.004


image = cv.imread('../Desktop/u=.jpg')
#照片是相对路径
print(image)
print(image.shape)
height = image.shape[0]
width = image.shape[1]
channels = image.shape[2]
print("width: %s height: %s channels: %s"%(width,height,channels))
gray_img = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
print(gray_img)


#modify the data type setting to 32-bit floating point
gray_img = np.float32(gray_img)

#detect the corners with appropriate values as input parameters
corners_img = cv.cornerHarris(gray_img,block_size,sobel_size,k)

#result is dilated for marking the corners,not necessary
kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))
dst = cv.dilate(corners_img,kernel)
#dilate()函数可以对输入图像用特定结构元素进行膨胀操作,该结构元素确定膨胀操作过程中的邻域的形状,各点像素值将被替换为对应邻域上的最大值:

#Threshold for an optimal value,marking the corners in Green
#image[corners_img>0.01*corners_img.max()] = [0,100,255]

for r in range(height):
    for c in range(width):
        pix= dst[r,c]
        if pix>0.05*dst.max():
            cv.circle(image,(c,r),5,(0,100,255),0)
            #circle(img, center, radius, color[, thickness[, lineType[, shift]]]) 
image = cv.cvtColor(image, cv.COLOR_BGR2RGB)
plt.imshow(image)
plt.show()

在这里插入图片描述

Harris角点检测的性质可总结如下:

  • 阈值决定角点的数量
  • Harris角点检测算子对亮度和对比度的变化不敏感(光照不变性)
    在进行Harris角点检测时,使用了微分算子对图像进行微分运算,而微分运算对图像密度的拉升或收缩和对亮度的抬高或下降不敏感。换言之,对亮度和对比度的仿射变换并不改变Harris响应的极值点出现的位置,但是,由于阈值的选择,可能会影响角点检测的数量。
  • Harris角点检测算子具有旋转不变性**
    Harris角点检测算子使用的是角点附近的区域灰度二阶矩矩阵。而二阶矩矩阵可以表示成一个椭圆,椭圆的长短轴正是二阶矩矩阵特征值平方根的倒数。当特征椭圆转动时,特征值并不发生变化,所以判断角点响应值也不发生变化,由此说明Harris角点检测算子具有旋转不变性。
  • Harris角点检测算子不具有尺度不变性
    尺度的变化会将角点变为边缘,或者边缘变为角点,Harris的理论基础并不具有尺度不变性。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值