11.2 Harris和Shi-Tomas算法

本文深入探讨Harris与Shi-Tomasi两种角点检测算法,详细解析其原理与OpenCV中的实现方法。Harris算法通过检测图像局部窗口内灰度变化来识别角点,而Shi-Tomasi算法则在此基础上改进,提高角点检测准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Harris和Shi-Tomas算法

学习目标

  • 理解Harris和Shi-Tomasi算法的原理

  • 能够利用Harris和Shi-Tomasi进行角点检测


1 Harris角点检测

1.1 原理

Harris角点检测的思想是通过图像的局部的小窗口观察图像,角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化,如下图所示:

 

 

 

 

 

 

椭圆函数特征值与图像中的角点、直线(边缘)和平面之间的关系如下图所示。

 

 

 

那我们怎么判断角点呢?如下图所示:

 

  • 当R为大数值的正数时是角点

  • 当R为大数值的负数时是边界

  • 当R为小数是认为是平坦区域

1.2 实现

在OpenCV中实现Hariis检测使用的API是:

dst=cv.cornerHarris(src, blockSize, ksize, k)

参数:

  • img:数据类型为 float32 的输入图像。

  • blockSize:角点检测中要考虑的邻域大小。

  • ksize:sobel求导使用的核大小

  • k :角点检测方程中的自由参数,取值参数为 [0.04,0.06].

示例:

import cv2 as cv

import numpy as np

import matplotlib.pyplot as plt

# 1 读取图像,并转换成灰度图像

img = cv.imread('./image/chessboard.jpg')

gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 2 角点检测# 2.1 输入图像必须是 float32

gray = np.float32(gray)



# 2.2 最后一个参数在 0.04 到 0.05 之间

dst = cv.cornerHarris(gray,2,3,0.04)

# 3 设置阈值,将角点绘制出来,阈值根据图像进行选择

img[dst>0.001*dst.max()] = [0,0,255]

# 4 图像显示

plt.figure(figsize=(10,8),dpi=100)

plt.imshow(img[:,:,::-1]),plt.title('Harris角点检测')

plt.xticks([]), plt.yticks([])

plt.show()

结果如下:

 

Harris角点检测的优缺点:

优点:

  • 旋转不变性,椭圆转过一定角度但是其形状保持不变(特征值保持不变)

  • 对于图像灰度的仿射变化具有部分的不变性,由于仅仅使用了图像的一介导数,对于图像灰度平移变化不变;对于图像灰度尺度变化不变

缺点:

  • 对尺度很敏感,不具备几何尺度不变性。

  • 提取的角点是像素级的

2 Shi-Tomasi角点检测

 

 

从这幅图中,可以看出来只有当 λ1 和 λ 2 都大于最小值时,才被认为是角点。

2.2 实现

在OpenCV中实现Shi-Tomasi角点检测使用API:

corners = cv2.goodFeaturesToTrack ( image, maxcorners, qualityLevel, minDistance )

参数:

  • Image: 输入灰度图像

  • maxCorners : 获取角点数的数目。

  • qualityLevel:该参数指出最低可接受的角点质量水平,在0-1之间。

  • minDistance:角点之间最小的欧式距离,避免得到相邻特征点。

返回:

  • Corners: 搜索到的角点,在这里所有低于质量水平的角点被排除掉,然后把合格的角点按质量排序,然后将质量较好的角点附近(小于最小欧式距离)的角点删掉,最后找到maxCorners个角点返回。

示例:

import numpy as np

import cv2 as cv

import matplotlib.pyplot as plt

# 1 读取图像

img = cv.imread('./image/tv.jpg')

gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)

# 2 角点检测

corners = cv.goodFeaturesToTrack(gray,1000,0.01,10)

# 3 绘制角点for i in corners:

x,y = i.ravel()

cv.circle(img,(x,y),2,(0,0,255),-1)

# 4 图像展示

plt.figure(figsize=(10,8),dpi=100)

plt.imshow(img[:,:,::-1]),plt.title('shi-tomasi角点检测')

plt.xticks([]), plt.yticks([])

plt.show()

结果如下:

 


总结

  1. Harris算法

    思想:通过图像的局部的小窗口观察图像,角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化。

    API: cv.cornerHarris()

  2. Shi-Tomasi算法

    对Harris算法的改进,能够更好地检测角点

    API: cv2.goodFeatureToTrack()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值