Datawhale 计算机视觉基础1: Harris特征点检测器-兴趣点检测

Datawhale 计算机视觉基础1: Harris特征点检测器-兴趣点检测

一,特征点(角点)介绍
1.什么是角点?
在图像处理领域中,特征点又被称为兴趣点或者角点,它通常具有旋转不变性和光照不变性和视角不变性等优点,是图像的重要特征之一。
直观感受如图所示:
在这里插入图片描述
2.角点检测的原理
在这里插入图片描述
如图在左边的图像中,滑动窗口处的像素值变化是比较“平坦”的;在中间一副图像中表示的是一个边缘特征,如果左右移动窗口进行检测的话,窗口中的数据变化比较大,但是按照上下移动的话,窗口中的像素值变化较小,我们认为这种在一个方向上变化较大,但是在另一个方向变化较小的区域认为是边缘区域;在右边这个图中我们可以看到,当上下或者左右移动窗口时像素值都会发生较大的变化,我们称这样的区域为角点。

二,角点检测算法原理
角点检测常用的方法有Harris角点检测、FAST特征检测、SIFT特征检测及SURF特征检测。
像素值发生很大变化”这一现象可以用图像梯度进行描述。在图像局部内,图像梯度越大表示该局部内像素值变化越大(灰度的变化率越大)。 而图像的梯度在数学上可用微分或者导数来表示。对于数字图像来说,相当于是二维离散函数求梯度,并使用差分来近似导数: 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算子等。

下面介绍一下Harris 角点检测算法原理:
1.当窗口(局部区域)同时向 x (水平)和 y(垂直) 两个方向移动时,计算窗口内部的像素值变化量 E ( x , y ) E(x,y) E(x,y)

2.对于每个窗口,都计算其对应的一个角点响应函数 R R R

3.然后对该函数进行阈值处理,如果 R > t h r e s h o l d R > threshold R>threshold,表示该窗口对应一个角点特征。

三,基于OpenCV的实现

1.函数原型:cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]])
参数解释:
1).src - 输入灰度图像,float32类型
2).blockSize - 用于角点检测的邻域大小,就是上面提到的窗口的尺寸
3).ksize - 用于计算梯度图的Sobel算子的尺寸
4).k - 用于计算角点响应函数的参数k,取值范围常在0.04~0.06之间

2.代码

import cv2 as cv
from matplotlib import pyplot as plt
import numpy as np

# detector parameters
block_size = 3
sobel_size = 3
k = 0.06

image = cv.imread('/home/jun/图片/timg (1).jpeg')

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, cv2.COLOR_BGR2GRAY)


# 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 = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))
dst = cv.dilate(corners_img, kernel)

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

for r in range(height):
        for c in range(width):
            pix=dst[r,c]
            if pix>0.05*dst.max():
               cv2.circle(image,(c,r),5,(0,0,255),0)

image = cv.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.imshow(image)
plt.show()

原图
在这里插入图片描述
结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小俊俊的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值