Harris 角点检测算法是计算机视觉领域中的一种经典角点检测算法,它能够对图像中的角点进行检测和定位。Harris 角点检测算法基于图像亮度的变化来判断像素是否为角点,并使用局部结构的矩阵来评估角点的强度。以下是 Harris 角点检测算法的主要步骤:
图像梯度计算:首先,对原始图像进行梯度计算,以获取每个像素点在 x 方向和 y 方向上的梯度值。常用的方法是 Sobel 或 Roberts 算子。
计算结构矩阵:基于图像梯度,计算每个像素点的结构矩阵 M。结构矩阵 M 的定义如下:
M = sum(W(x, y) * [I_x^2, I_x * I_y; I_x * I_y, I_y^2])
其中,W(x, y) 是一个窗口函数,用于对附近像素进行加权,通常选择高斯函数。I_x 和 I_y 分别表示像素点 (x, y) 处的梯度值。
计算角点响应函数 R:通过计算结构矩阵的特征值(λ1 和 λ2)来评估像素点的角点性质,并得到角点响应函数 R。R 的计算公式如下: R = det(M) - k * trace(M)^2
其中,det(M) 表示结构矩阵 M 的行列式,trace(M) 表示 M 的迹(即特征值的和),k 是一个常数(通常设置为 0.04 - 0.06),用于调整角点的响应程度。
响应函数阈值化:根据设定的阈值对角点响应函数 R 进行阈值化处理,以筛选出具有较高响应的像素点,这些像素点被认为是角点。
非极大值抑制:对于附近的多个角点,通过非极大值抑制的方法选取其中的局部最大值,以减少重复检测的角点。
import cv2
import numpy as np
# 读入图片并灰度化
# img = cv2.imread("assets/blox.jpg")
img = cv2.imread("assets/left08.jpg")
# img = cv2.imread("assets/chessboard(1).png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 检测角点
gray = np.float32(gray)
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
# 膨胀
dst = cv2.dilate(dst, None)
# 找到计算值比较大的,并显示
img[dst>0.01*dst.max()] = [0, 0, 255]
cv2.imshow('dst', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Harris 角点检测算法具有较好的角点检测效果,尤其在对纹理丰富、视觉差异明显的图像中表现出色。然而,它对尺度变化和旋转变化较为敏感,并且可能会检测到一些边缘点。因此,在实际应用中,常常结合其他算法或进行后续处理,以提高检测的准确性。
Lnton 羚通专注于音视频算法、算力、云平台的高科技人工智能,基于视频分析技术、视频智能传输技术、远程监测技术以及智能语音融合技术等, 拥有多款可支持 ONVIF、RTSP、GB/T28181 等多协议、多路数的音视频智能分析服务器。