📌  相关文章
📜  Python|使用 OpenCV 的 Harris 角点检测方法进行角点检测(1)

📅  最后修改于: 2023-12-03 15:34:18.164000             🧑  作者: Mango

Python|使用 OpenCV 的 Harris 角点检测方法进行角点检测

本篇文章将介绍如何在 Python 中使用 OpenCV 的 Harris 角点检测方法进行角点检测。

角点检测

角点是一种在图像中常常出现的特征点,它是图像中灰度强度变化最大的点。角点检测是通过检测一幅图像中的角点来对图像进行特征提取的一种方法。

OpenCV 的角点检测函数包括 Harris 角点检测、Shi-Tomasi 角点检测、FAST 角点检测等多种方法。其中,Harris 角点检测是一种比较常用的方法,它是基于 Harris 算法的一种方法。

Harris 角点检测

Harris 角点检测算法是一种常用的角点检测算法,它通过计算图像每个像素的像素值差异来检测角点。在 Harris 角点检测算法中,对于图像中某一点 $(x,y)$,我们需要计算其相邻像素的像素值差异 $\Delta I(x,y)$,然后使用一个二阶矩阵来描述这个点的角度响应函数:

$$ E(u,v) = \sum_{x,y}w(x,y)(\Delta I(x,y)\times [u;;; v];M; [u;;; v]^T) $$

其中,$M$ 是一个二阶矩阵,$w(x,y)$ 是一个平滑窗口。

Harris 角点检测算法通过计算 $M$ 的特征值来判断图像中的角点位置。若 $M$ 的特征值都比较小,则说明该点是平坦区域;若 $M$ 的特征值有一个很大,另一个很小,则说明该点是边缘;若 $M$ 的特征值都比较大,则说明该点是角点。

代码实现

在 Python 中使用 OpenCV 进行 Harris 角点检测的代码如下:

import cv2
import numpy as np

# 读取图像
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# Harris 角点检测参数设置
blockSize = 2
ksize = 3
k = 0.04

# Harris 角点检测
dst = cv2.cornerHarris(gray,blockSize,ksize,k)

# 筛选角点
ret, dst = cv2.threshold(dst,0.01*dst.max(),255,0)
dst = np.uint8(dst)
ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst)

# 标记角点
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001)
corners = cv2.cornerSubPix(gray,np.float32(centroids),(5,5),(-1,-1),criteria)
res = np.hstack((centroids,corners))
res = np.int0(res)

# 绘制结果
img[res[:,1],res[:,0]] = [0,0,255]
img[res[:,3],res[:,2]] = [0,255,0]
cv2.imshow('img',img)
cv2.waitKey(0)

在以上代码中,我们首先读取一个测试图像,并将其转换为灰度图像。然后我们设置 Harris 角点检测的参数,包括窗口大小(blockSize)、Sobel 导数计算时使用的核的大小(ksize)、公式中的 $k$ 值等。接下来,我们调用 OpenCV 的 cornerHarris 函数进行 Harris 角点检测。

在角点检测得到的结果中,我们需要筛选出具体的角点,首先使用 cv2.threshold 函数将结果二值化,并使用 cv2.connectedComponentsWithStats 函数找到连通域。最后调用 cv2.cornerSubPix 函数进行亚像素级别的角点检测,并使用 cv2.drawCircle 函数在图像中标记角点。

实验效果

下面是使用 Harris 角点检测算法提取角点后的图像效果。

test

总结

通过本文的介绍,我们了解了 Harris 角点检测算法及其实现方法。在实际使用中,可以根据不同需求选择合适的角点检测算法,并调整参数以优化检测效果。