图像处理中的角点检测Python-OpenCV 中的实现
马丁·亚当斯 (Martin Adams)在Unsplash上拍摄的照片
一、说明
在图像处理的背景下,“特征”可以直观地理解为图像中易于识别并用于表示图像的独特或独特的部分。将特征视为图像中使其可区分的“地标”或“焦点”。为了使这一点更具关联性,请考虑一下您如何识别现实生活中熟悉的地方或物体。
照片由Cory Schadt在Unsplash上拍摄
想象一下您正在看一张繁忙的城市街道的照片。什么首先引起您的注意?它可能是一座形状独特的建筑,一个色彩缤纷的广告牌,或者一个独特的街道标志。这些元素之所以引人注目,是因为它们在某种程度上与周围环境不同——也许是通过形状、颜色或纹理。在图像处理中,这些类似于特征。
功能是许多高级图像处理任务的构建块。它们就像算法用来“理解”并以有意义的方式处理图像的线索或关键点。
二、特征类型
- 边缘是图像中强度或颜色的显着过渡。想象一下天空映衬下一座山的轮廓;山与天交界处形成边缘。
边缘。来源
- 角是两条或多条边相交的点。它们就像相框的角,两条边相交于一点。
角落。来源
- 斑点是图像中与周围区域相比具有不同属性(例如亮度或颜色)的区域。将它们视为表面上的斑点或瑕疵。它们用于需要识别或计算对象的场景,例如计算图像中苹果的数量。
斑点。来源
- 山脊是图像强度在多个方向上增加的线条,例如波浪的波峰或山脊。
山脊。来源
三、特征检测
图像处理中的特征检测算法就像侦探在复杂场景中寻找重要线索的工具。这些算法旨在自动检测和识别图像的关键特征,例如边缘、角点和特定图案,这些特征对于理解和分析图像至关重要。
角点可以被认为是两条边缘的交点,或者图像中梯度方向显着改变的点。它代表多个方向上局部强度变化较大的点。
- 哈里斯角点检测
- Shi-Tomasi角点检测
3.1 哈里斯角点检测
Harris 角点检测器是图像处理角点检测的基本算法。它可以识别图像中各个方向上强度发生显着变化的点。
Harris 角点检测器背后的核心思想是识别图像中当您向任何方向移动时强度发生显着变化的区域。它基于这样的观察:在平坦区域(如晴朗的天空),强度保持相当恒定,而沿着边缘,强度在一个方向上发生巨大变化,但在垂直方向上变化不大。然而,在拐角处,各个方向的强度都会发生变化。
该算法使用一种数学方法,涉及计算图像中每个像素的矩阵(通常称为哈里斯矩阵)。该矩阵捕获该像素周围所有方向的梯度变化(即强度变化)。
它映射 X 和 Y 中采用的所有梯度。
来源
然后将椭圆拟合到分布中。
来源
该算法根据 lambda 值计算响应值。
来源
这是演示 Harris 角点检测器的基本脚本。
import cv2
import numpy as np
image = cv2.imread('image.jpeg')
if image is None:
print("Error loading image")
exit()
# Convert to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Convert to float32 for more precision
gray = np.float32(gray)
# Apply Harris Corner Detector
corners = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)
# Dilate corner image to enhance corner points
corners = cv2.dilate(corners, None)
# Threshold to mark the corners on the image
threshold = 0.01 * corners.max()
image[corners > threshold] = [0, 0, 255]
# Display the result
cv2.imshow('Harris Corners', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
该cv2.cornerHarris
函数是 OpenCV 中用于图像角点检测的关键函数,基于 Harris 角点检测算法。该函数分析图像中强度的局部变化以识别角点。
src
是输入图像。它必须是 类型的灰度图像float32
。blockSize
是考虑用于角点检测的邻域的大小。它指定将计算强度局部方差的窗口(即局部区域)的大小。ksize
是 Sobel 算子的孔径参数。Sobel 算子用于计算 Harris 角点检测算法中的图像梯度(x 和 y 导数)。ksize
是用于 Sobel 算子的内核的大小。常见值为 3、5 或 7。较大的内核大小有助于平滑梯度,但可能会降低检测尖角点的准确性。k
是算法中使用的方程中的 Harris 检测器自由参数。它用于计算响应分数,确定某个区域是否被视为角点。的值k
通常很小,通常在 0.04 到 0.06 的范围内。确切的值可以根据应用的具体要求进行调整。非常高的值可能会导致检测到更少的角点,而非常低的值可能会使检测器对噪声过于敏感。
哈里斯角点检测。图片由作者提供。
哈里斯角点检测器擅长区分边缘和角点。它不会错误地将边缘识别为角点。即使图像旋转,它仍然有效,因为角结构不会随着旋转而改变。虽然它不是完全尺度不变的,但在尺度的轻微变化和不同的照明条件下它的表现相当好。
检测器可能难以应对主要的尺度变化(例如,以不同尺寸出现的同一角),并且其本质上并不是为了处理照明或视角的显着变化而设计的。
它可用于特征提取、图像匹配、运动跟踪和 3D 建模等各种应用。
3.2 Shi-Tomasi角点检测
Shi-Tomasi 方法,也称为“良好特征跟踪检测器”,基于与 Harris 角点检测器相同的基本原理。然而,它引入了一种不同的方法来评估角点响应。
主要区别在于所使用的角响应函数。Harris 使用基于梯度协方差矩阵的两个特征值的组合得分,而 Shi-Tomasi 方法通过仅考虑两个特征值中较小的一个来简化此过程。
Shi-Tomasi 方法特别擅长检测更清晰且定义明确的角点。与 Harris 方法相比,它不太容易检测到平坦区域或沿边缘的假角。
import cv2
import numpy as np
image = cv2.imread('07.jpg')
if image is None:
print("Error loading image")
exit()
# Convert to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Shi-Tomasi corner detection parameters
maxCorners = 100
qualityLevel = 0.01
minDistance = 10
corners = cv2.goodFeaturesToTrack(gray, maxCorners, qualityLevel, minDistance)
# Draw corners on the image
if corners is not None:
corners = np.int0(corners)
for i in corners:
x, y = i.ravel()
cv2.circle(image, (x, y), 3, (0, 255, 0), -1)
# Display the result
cv2.imshow('Shi-Tomasi Corners', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
什托马西角。图片由作者提供。
Shi-Tomasi 角点检测需要灰度图像。cv2.cvtColor
将图像从一种颜色空间转换为另一种颜色空间。
cv2.goodFeaturesToTrack
是实现Shi-Tomasi角点检测算法的函数。
void cv::goodFeaturesToTrack ( InputArray image,
OutputArray corners,
int maxCorners,
double qualityLevel,
double minDistance,
InputArray mask = noArray(),
int blockSize = 3,
bool useHarrisDetector = false,
double k = 0.04
)
image
是要执行角点检测的源图像。maxCorners
指定要返回的最大角数。如果将其设置为负数,它将返回所有检测到的角点。qualityLevel
表征要考虑的拐角的最低质量。它是一种相对度量,基于图像中角点的最高质量得分。分数是根据 Shi-Tomasi 方法中的特征值或 Harris 中的响应函数确定的。minDistance
指定返回角点之间的最小欧氏距离。mask
是一个可选的二进制掩码,指定在哪里寻找角点。blockSize
是考虑用于角点检测的邻域的大小。
四、结论
以上我们了解到Harris和Shit焦点检测方法,关于tezheng