图像角点检测:找出图像中的"关键少数"

理论讲完了,咱们来动手试试!用Python实现角点检测就像玩一场"找不同"游戏,只需要准备两个"玩具":

OpenCV库:负责读取、显示和处理图像(相当于你的放大镜)

NumPy库:负责数值计算(相当于你的笔记本)

如果你还没有这些库,可以先在终端里输入这行命令安装:

pip install opencv-python numpy

然后复制下面这段代码,保存为corner_detection.py,运行后就能看到角点检测的效果啦!

# 导入需要的库

import cv2

import numpy as np

import matplotlib.pyplot as plt

# 读取灰度图像

gray_image = cv2.imread('images/gray_image.jpg', cv2.IMREAD_GRAYSCALE)

# 读取彩色图像用于显示

color_image = cv2.imread('images/color_image.jpg')

color_image = cv2.cvtColor(color_image, cv2.COLOR_BGR2RGB)

# 方法1:Harris角点检测

# 参数说明:图像,blockSize(邻域大小),ksize(Sobel算子大小),k(经验常数)

harris_corners = cv2.cornerHarris(gray_image, 2, 3, 0.04)

# 结果进行膨胀,使角点更明显

harris_corners = cv2.dilate(harris_corners, None)

# 创建Harris角点检测结果图像

harris_result = color_image.copy()

# 将角点标记为红色

harris_result[harris_corners > 0.01 * harris_corners.max()] = [255, 0, 0]

# 方法2:Shi-Tomasi角点检测

# 参数说明:图像,最大角点数,质量水平,最小距离

corners = cv2.goodFeaturesToTrack(gray_image, 100, 0.01, 10)

corners = np.int0(corners)

# 创建Shi-Tomasi角点检测结果图像

shi_tomasi_result = color_image.copy()

# 将角点标记为绿色

for i in corners:

x, y = i.ravel()

cv2.circle(shi_tomasi_result, (x, y), 3, (0, 255, 0), -1)

# 方法3:FAST角点检测

# 初始化FAST检测器

fast = cv2.FastFeatureDetector_create()

# 检测角点

keypoints = fast.detect(gray_image, None)

# 在图像上绘制角点

fast_result = cv2.drawKeypoints(color_image, keypoints, None, color=(0, 0, 255))

# 显示原图和不同方法得到的角点检测结果

plt.figure(figsize=(20, 10))

plt.subplot(221)

plt.imshow(color_image)

plt.title('彩色原图')

plt.axis('off')

plt.subplot(222)

plt.imshow(harris_result)

plt.title('Harris角点检测')

plt.axis('off')

plt.subplot(223)

plt.imshow(shi_tomasi_result)

plt.title('Shi-Tomasi角点检测')

plt.axis('off')

plt.subplot(224)

plt.imshow(fast_result)

plt.title('FAST角点检测')

plt.axis('off')

plt.tight_layout()

plt.show()

# 保存结果图像

cv2.imwrite('images/harris_corners.jpg', cv2.cvtColor(harris_result, cv2.COLOR_RGB2BGR))

print('角点检测图像已保存!')

💡 小技巧:不同的角点检测算法各有优缺点。Harris算法经典但计算量大;Shi-Tomasi算法更稳定;FAST算法速度最快,适合实时应用。就像选择不同的交通工具——赶时间选飞机(FAST),追求舒适选高铁(Shi-Tomasi),想了解历史选绿皮火车(Harris)!