当前位置: 首页 > news >正文

OpenCV图像特征提取:Harris角点检测与SIFT特征提取实战

前言

在计算机视觉领域,角点检测特征提取是图像识别、目标跟踪、图像拼接等任务的基础。本文将使用OpenCV实现经典的Harris角点检测算法和SIFT(尺度不变特征变换)特征提取算法,并通过代码演示关键步骤,帮助读者快速上手。


一、环境配置

  • Python 3.x

  • OpenCV contrib(支持SIFT)

  • NumPy


二、Harris角点检测

1. 什么是角点?

角点是图像中局部区域与周围区域灰度变化剧烈的点,例如物体的拐角、边缘交点。Harris角点检测通过计算像素点在各个方向上的灰度变化来判定是否为角点,具有旋转不变性,但对尺度变化敏感。

2. 核心函数

dst = cv2.cornerHarris(src, blockSize, ksize, k)
参数说明
src输入图像,必须是单通道灰度图(float32类型最佳)
blockSize角点检测时邻域窗口大小(整数,如2、3、5),窗口越大检测越宏观
ksizeSobel算子的卷积核大小(必须是奇数:3、5、7),用于计算图像梯度
kHarris角点检测的自由参数,经验值范围0.04~0.06

返回值dst是一个与输入图像同尺寸的浮点型数组,每个元素表示对应像素点的角点响应值,值越大,该点是角点的概率越高。

3. 代码实现

import cv2 import numpy as np # 读取图像并调整尺寸 img = cv2.imread("cxk.jpg") img = cv2.resize(img, (400, 500)) # 转为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Harris角点检测 dst = cv2.cornerHarris(gray, blockSize=4, ksize=3, k=0.04) # 标记检测到的角点(阈值处理) img[dst > 0.05 * dst.max()] = [0, 0, 255] # 将角点标记为红色 cv2.imshow("Harris角点检测", img) cv2.waitKey(0) cv2.destroyAllWindows()

代码说明

  • 将彩色图转换为灰度图,减少计算量。

  • 调用cornerHarris进行角点检测,得到响应图dst

  • 使用0.05 * dst.max()作为阈值,将响应值大于该阈值的像素点设为红色,即标记为角点。

运行结果:原图中的角点被红色像素标记,效果如下图所示(示例):


三、SIFT特征提取

1. 什么是SIFT?

SIFT(Scale-Invariant Feature Transform,尺度不变特征变换)是一种检测图像局部特征的算法。它提取的特征对旋转、尺度缩放、亮度变化保持不变性,非常稳定,广泛应用于图像匹配、物体识别等领域。

2. SIFT主要步骤

  1. 尺度空间极值检测:通过高斯差分金字塔寻找候选关键点。

  2. 关键点精确定位:剔除低对比度点和边缘响应点。

  3. 方向赋值:为每个关键点计算主方向,保证旋转不变性。

  4. 关键点描述:生成128维特征向量,用于后续匹配。

3. 核心函数

  • cv2.SIFT_create():创建SIFT对象。

  • sift.detect(img):检测关键点。

  • sift.compute(img, kp):计算关键点描述符。

  • sift.detectAndCompute(img, mask):一步完成检测和计算。

4. 代码实现

man = cv2.imread("cxk.jpg") man = cv2.resize(man, (400, 500)) man_gray = cv2.cvtColor(man, cv2.COLOR_BGR2GRAY) # 创建SIFT对象 sift = cv2.SIFT_create() # 检测关键点 kp = sift.detect(man_gray, None) # 绘制关键点(显示大小和方向) man_sift = cv2.drawKeypoints(man, kp, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow("SIFT关键点", man_sift) cv2.waitKey(0) # 计算描述符 kp, des = sift.compute(man, kp) print("关键点数量:", np.array(kp).shape) print("描述符形状:", des.shape) # 输出 (N, 128) cv2.destroyAllWindows()

代码说明

  • sift.detect()返回关键点列表kp,每个关键点包含坐标pt、尺度size、方向angle等属性。

  • cv2.drawKeypointsflags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS会绘制出关键点的圆形区域和方向线,直观展示特征点的尺度和方向。

  • sift.compute()计算描述符,输出des是一个二维数组,形状为(关键点数量, 128),每个128维向量用于唯一描述该关键点。

运行结果

  • 图像上会显示关键点位置及其圆形区域和方向线。

  • 控制台输出类似:

    关键点数量: (391,) 描述符形状: (391, 128)


四、SIFT的实际应用:特征匹配(扩展)

SIFT描述符常用于图像匹配。下面是一个简单的特征匹配示例,展示如何将两幅图像的特征点进行匹配:

# 读取两张图像 img1 = cv2.imread("scene.jpg") img2 = cv2.imread("object.jpg") sift = cv2.SIFT_create() kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) # 创建FLANN匹配器 flann = cv2.FlannBasedMatcher() matches = flann.knnMatch(des1, des2, k=2) # 应用比率测试筛选良好匹配 good = [] for m, n in matches: if m.distance < 0.75 * n.distance: good.append(m) # 绘制匹配结果 result = cv2.drawMatches(img1, kp1, img2, kp2, good, None, flags=2) cv2.imshow("SIFT匹配", result) cv2.waitKey(0)

通过匹配点对的数量或距离阈值,可以实现图像识别、指纹验证等任务。


五、总结

方法作用特点
Harris角点检测检测图像中的角点旋转不变,但对尺度变化敏感
SIFT特征提取检测关键点并生成描述符尺度、旋转、光照不变,适合匹配

通过本文的学习,你已经掌握了OpenCV中两种经典特征提取方法的基本使用。Harris角点检测适合快速定位图像中的角点区域,而SIFT特征则更强大,广泛用于图像匹配与识别任务。


六、参考资料

  • OpenCV官方文档:Harris角点检测 | SIFT


如果本文对你有帮助,请点赞、收藏、评论支持一下,你的鼓励是我持续创作的动力!

http://www.cnnetsun.cn/news/1444495.html

相关文章:

  • 聊聊基于静态电压补偿法的永磁同步电机无感控制Simulink仿真模型
  • 使用Qwen3进行自动化作业批改与反馈生成实践
  • 深度解析:美国海外仓选址底层逻辑,东岸 vs 西岸该如何进行架构布局?
  • 嵌入式Linux移植TranslateGemma轻量化方案
  • SHT7x温湿度传感器驱动开发与精准时序控制
  • Win11Debloat:Windows 11终极优化指南 - 一键清理系统垃圾,提升性能与隐私保护
  • Fun-ASR-MLT-Nano-2512部署教程:修复model.py初始化bug后的稳定推理方案
  • 从零搭建AI算力中心:英伟达GPU选型指南与实战配置
  • BurpSuite+SqlMap联动实战:5分钟搞定SQL注入自动化检测(附避坑指南)
  • STLink工具链升级全指南:从v1.7.0到v1.8.0的技术跃迁
  • PDF-Extract-Kit-1.0实操手册:/root/PDF-Extract-Kit目录下各sh脚本功能对比
  • 优选算法_分治_快速排序_归并排序_C++
  • 2023-阿里云云效Maven私有仓库实战:快速部署团队共享Jar包
  • MedGemma Medical Vision Lab实际作品:教学PPT嵌入式影像问答交互截图集
  • Hex文件结构解析到实战:用Python自制合并工具完整指南
  • RexUniNLU部署案例:中小企业低成本构建中文智能语义分析平台
  • MiniCPM-o-4.5-nvidia-FlagOS实战指南:图文对话助手快速上手(RTX 4090 D适配)
  • Orekit实战指南(四)——卫星轨道六根数与地面站经纬度的高效转换
  • 告别环境冲突!用Docker在Ubuntu 22.04上5分钟搞定ROS2 Humble和rviz
  • ArmSoM-Sige RK3588开发板实战指南:从开箱到多媒体应用部署
  • 科技伦理兜着岐金兰
  • 腾讯:揭示评估幻觉并构建知识驱动新范式
  • 神经防御工程:皮层植入反扫描病毒的系统架构与测试验证
  • 低资源消耗奇迹:Phi-3-mini-128k-instruct在消费级GPU上的流畅运行演示
  • 架构拆解 OpenClaw:基于心跳唤醒、跨端网关与 Markdown 极简记忆流的 Agent 实践
  • NEC红外编解码模块:UART接口即插即用设计解析
  • 2026年写作小白救星!开源免费AI论文神器——千笔·专业学术智能体
  • 探索永磁同步电机的机械参数辨识与无位置传感器转速估计之路
  • JDK 17 异常信息java.lang.reflect.InaccessibleObjectException:
  • GPS定位背后的数学魔法:手把手教你用Python解析广播星历数据