图像角点检测:找出图像中的"关键少数"
理论讲完了,咱们来动手试试!用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)!