Harris 角点检测(Harris Corner Detection)(OpenCV实现)

Harris角点检测是由Harris和Stephens在1988年提出的一种用于图像特征点检测的方法,旨在解决运动图像追踪中的匹配问题。它通过分析像素点周围区域的形状变化来确定角点,相比于边缘检测,角点更稳定且不易受视角变换影响。Harris角点检测通过高斯窗口对图像进行平滑,然后计算响应矩阵的特征值,使用响应函数R来评估点的性质,从而找出角点。OpenCV库提供了Harris角点检测的实现,经过非极大值抑制和去除距离过近的点,可以得到高质量的角点图像。
摘要由CSDN通过智能技术生成

匹配问题

Harris角点检测是Chris Harris和Mike Stephens在1988年提出的。主要用于运动图像的追踪。当时的普遍想法是利用边缘进行追踪,但是当相机或物体运动时你不知道朝哪个方向,相机的几何变换也是未知的,所以边缘匹配很难达到预期的效果。即使是当时最优秀的边缘检测算子Canny算子,它的边缘检测也依赖于阈值的选取。所以Harris等人放弃了匹配边缘,转而寻找一些特殊的点来匹配,这些点是边缘线段的连接点,它们表征了图像的结构,代表了图像局部的特征。

例如不同时刻两幅建筑物图像,想要匹配它们,就是要找到它们有没有共同区域,一种方法就是——Patch Matching:

那么第二副图中哪一个窗口与红色窗是最佳匹配呢?人眼可以迅速判断出,怎么让计算机知道?

 

什么是角点

直观的说就是图像轮廓的连接点。不管视角怎么变换,这些点依然存在,是稳定的;它们与领域的点差别比较大。所以角点是一种优良的特征点。

如果你用一个小的加权窗口在角点的附近各个方向移动,将会出现一个大的变化!

 

Moravec角点检测

Harris角点检测来自于Moravec检点检测(1977,Moravec),并对它进行了改进和更强的数学建模。

Moravec角点检测用一个二值窗口在图像的某个像素点的所有方向上进行移动,并计算移动后和移动前像素强度变化的平均值,得到的最小的值定为该点的角点响应值。用公式表示,即为:

在移动时,会出现三种情况:

1.如果是在图像的平坦区域,shift的所有结果都很小;

2.如果是在图像的边缘,那么只有沿着边缘的方向shift时值比较小,其他方向都很大。

3.如果实在边缘的连接点处或者一个单独的点,无论什么方向怎么移动,值都很大。

最后设定一个阈值,大于这个阈值的判定为角点。

一般计算这个像素点水平、垂直、对角线、反对角线4个方向上的灰度差平方和。

 

 

Harris角点检测

Moravec角点有一些缺点,导致它的检测不精确,Harris改良了这些缺点。

1.相应是各向异性的,因为只考虑了45度倍数方向上的响应。Harris通过对shift region进行泰勒展开,覆盖所有方向的移动。

二元函数的一阶泰勒近似为:

所以,对于很小的shift,响应强度可以表示为:

将后面的平方项展开,

这里我们暂时把窗口去掉,考察一下移动࿰

### 回答1: Harris角点检测是一种常见的计算机视觉算法,它可以检测图像中的角点。在Python中,可以使用OpenCV库来实现Harris角点检测。 下面是一个简单的Harris角点检测Python实现的示例: ``` import cv2 import numpy as np # 加载图像 img = cv2.imread('image.jpg') # 转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 计算Harris角点 dst = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04) # 通过阈值进行筛选 img[dst > 0.01 * dst.max()] = [0, 0, 255] # 显示结果 cv2.imshow('Harris Corner Detection', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 首先,使用`cv2.imread`函数加载要处理的图像。然后,将图像转换为灰度图像,以便进行角点检测。接下来,使用`cv2.cornerHarris`函数计算图像中的Harris角点。在这个函数中,`blockSize`是要考虑的邻域大小,`ksize`是Sobel算子的大小,`k`是Harris角点响应函数的参数。然后,通过设置一个阈值来筛选角点,并将它们用红色标记出来。最后,使用`cv2.imshow`函数显示结果。 这是一个简单的Harris角点检测Python实现示例,可以根据具体情况进行调整和优化。 ### 回答2: Harris角点检测是一种计算机视觉中常用的角点检测算法,用于识别图像中的角点。Python有很多库可以实现Harris角点检测,这里以OpenCV库为例进行讲解。 首先,我们需要导入OpenCV库: ```python import cv2 ``` 然后,读取图像并将其转换为灰度图像: ```python image = cv2.imread('image.jpg') # 读取图像 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 转换为灰度图像 ``` 接下来,通过调用`cv2.cornerHarris()`函数实现Harris角点检测: ```python dst = cv2.cornerHarris(gray, 2, 3, 0.04) # 进行Harris角点检测 ``` 在上述代码中,`gray`是输入的灰度图像,`2`是角点窗口(卷积窗口)的大小,`3`是Sobel算子(用于计算梯度的算子)的孔径尺寸,`0.04`是Harris角点检测的自由参数k。 接下来,使用`cv2.dilate()`函数对角点图像进行膨胀操作,以便更好地显示角点: ```python dst = cv2.dilate(dst, None) # 对角点图像进行膨胀操作 ``` 然后,根据设定的阈值,将角点标记为最大值: ```python image[dst > 0.01 * dst.max()] = [0, 0, 255] # 根据阈值将角点标记为红色 ``` 最后,显示检测结果的图像: ```python cv2.imshow('Harris Corner Detection', image) # 显示检测结果 cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上就是使用Python实现Harris角点检测的步骤。通过对图像进行角点检测,我们可以在图像中找到重要的角点,这对于很多计算机视觉任务(如特征提取、图像配准等)是非常有用的。 ### 回答3: Harris角点检测是一种经典的计算机视觉算法,用于检测图像中的角点。下面是使用Python实现Harris角点检测的步骤: 1. 导入所需的库:首先导入OpenCV和NumPy库,用于图像处理和数组计算。 2. 读取图像:使用OpenCV的imread函数读取待处理的图像。 3. 图像灰度化:将读取的图像转换为灰度图像,可以使用OpenCV的cvtColor函数实现。 4. 计算图像的梯度:使用Sobel算子计算图像在x和y方向的梯度值,可以使用OpenCV的Sobel函数。 5. 计算Harris响应函数:根据Harris角点检测的定义,计算Harris响应函数R。 6. 阈值处理:设置一个阈值,将Harris响应函数大于阈值的像素点作为角点。 7. 绘制角点:根据计算得到的角点位置,在原图像上绘制特殊标记,可以使用OpenCV的circle函数。 8. 显示结果:显示处理结果,可以使用OpenCV的imshow函数。 9. 保存结果:保存处理后的图像,可以使用OpenCV的imwrite函数。 以上就是使用Python实现Harris角点检测的基本步骤。在实际编码中,还可以根据需要进行参数调整和优化,以获得更好的检测结果。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值