使用Python OpenCV中的Harris角检测器检测角点
在计算机视觉领域中,角点通常被认为是图像中最重要的特征点之一。角点可用于进行视觉定位、目标跟踪和图像配准等任务。而 Harris 角检测算法是最早的角点检测算法之一。下面我们就来了解一下如何使用 Python OpenCV 中的 Harris 角检测器检测角点。
Harris 角检测器原理
Harris 角检测器是一种通过计算图像局部区域的变化程度来检测角点的算法。它通过计算两种矩阵的特征值来判断某个像素点是否是角点。
其中 Ix 和 Iy 是图像中像素的梯度值,σ 是高斯核的标准差,W 是一个 M*M 的窗口函数,f 是 Harris 响应函数,λ1 和 λ2 是窗口函数内计算出的两个特征值。
当 λ1 和 λ2 的值都很小时,窗口内像素的变化程度很小,我们认为该像素不是角点;当 λ1 和 λ2 的其中一个值很大,另一个值很小,窗口内像素发生了明显的变化,我们就认为该像素是角点。
Python OpenCV 中的 Harris 角检测器函数
Python OpenCV 中的 Harris 角检测器函数是 cv2.cornerHarris()。它的语法如下:
dst = cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]])
- src:必选参数,使用单通道图像进行计算,如灰度图像;
- blockSize:必选参数,角点检测过程中使用的邻域大小,一般为 2 * sobel_kernel_size + 1(sobel_kernel_size 为 sobel 滤波器的大小);
- ksize:必选参数,Sobel 滤波器的大小;
- k:必选参数,Harris 角检测函数中的自由参数;
- dst:可选参数,输出角点检测后的图片,与输入图片大小相同;
- borderType:可选参数,生成导数时使用的边界模式。
下面给出一个简单的示例代码:
import cv2
import numpy as np
img = cv2.imread('test.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 函数使用的参数
block_size = 2
k_size = 3
k = 0.04
# Harris 角检测
dst = cv2.cornerHarris(gray_img, block_size, k_size, k)
# 将角点标记在图片上
img[dst > 0.01 * dst.max()] = [0, 0, 255]
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在这个示例代码中,我们首先使用 cv2.imread() 函数读取了一张名为 test.jpg 的图片,然后将其转换为灰度图像。接下来设置了一些 Harris 角检测函数中的参数,包括 block_size(邻域大小)、k_size(Sobel 滤波器大小)和 k。
然后我们对灰度图像使用 cv2.cornerHarris() 函数进行 Harris 角检测,并将返回值保存在 dst 变量中。最后,我们使用 dst.max() 获取 dst 的最大值,并将其与 0.01 相乘后和 dst 进行比较,将符合条件的角点用红色标记在原始图像上。
注意事项
在使用 Harris 角检测器时,需要注意一些问题:
- 需要将原始图像转换为灰度图像,因为该函数只能处理单通道的图像。
-
blockSize 和 kSize 参数的值不能过大或过小,否则可能无法检测到角点。
-
k 参数的值也会影响角点检测结果,通常取值范围为 0 ~ 0.5。
结论
通过本篇文章我们学习了如何使用 Python OpenCV 中的 Harris 角检测器来检测角点,并对其原理、参数等进行了讲解。在实际应用中,如果要更好地检测到角点,我们还可以使用其他角点检测算法如 Shi-Tomasi 角检测。