SIFT(Scale - Invariant Feature Transform,尺度不变特征变换)是一种计算机视觉领域的特征提取算法,具有重要的地位和广泛的应用。

算法原理

  • 构建高斯金字塔

为了实现多尺度检测,SIFT 算法会构建高斯金字塔。首先将原始图像进行高斯模糊,然后依次对模糊后的图像进行降采样,每次降采样后图像尺寸减半,从而得到一系列不同尺度的图像,构成一个八度。通常会构建多个八度,每个八度包含若干层,以覆盖不同的尺度范围。

  • 差分高斯金字塔与关键点检测

基于高斯金字塔构建差分高斯金字塔,即将同一八度中相邻两层高斯图像相减得到。关键点检测就是在这个差分高斯金字塔中,通过寻找每个样本点在周围邻域中的极值点来确定。具体来说,对于每个图像点,会将其与同层相邻的 8 个点以及上下层相邻的 9 个点(共 26 个点)进行比较,如果该点的差分高斯响应值是这 26 个点中的最大值或最小值,则认为该点是一个极值点,即候选关键点。

  • 关键点定位与筛选

为了提高关键点的定位精度,并去除一些低对比度的关键点和不稳定的边缘响应点,需要对初步检测到的关键点进行定位和筛选。通过拟合三维二次函数到邻域像素来对关键点的位置和尺度进行迭代精修,确定其精确位置和对应的尺度。同时,计算关键点的对比度,去除对比度过低的点,以确保关键点的稳定性。

  • 关键点方向赋值

为了使关键点具有旋转不变性,需要为每个关键点分配一个方向。在关键点的邻域内,利用高斯加权函数计算图像梯度的方向直方图。直方图的峰值方向即为该关键点的主方向,关键点的方向由其邻域内梯度的方向分布情况来确定,从而使得关键点描述子具有旋转不变性。

  • 关键点描述子生成

在关键点周围选取一个邻域,将该邻域分成多个子区域,例如将 16×16 的邻域分成 16 个 4×4 的子区域。在每个子区域内计算梯度的方向直方图,通常使用 8 个方向作为直方图的柱,从而得到每个子区域的 8 维向量。将所有子区域的向量连接起来,就形成了一个 128 维的向量作为该关键点的描述子。

特点

  • 尺度不变性 :能够在不同尺度的图像中检测到相同的特征点,对图像的缩放具有很强的鲁棒性。

  • 旋转不变性 :通过为关键点赋予方向,使得描述子与关键点的方向相关,从而在图像旋转时仍能保持匹配的准确性。

  • 局部性与鲜明性 :提取的特征是图像中的局部特征,具有鲜明的局部信息,能够很好地抵抗遮挡、光照变化等问题,且在图像中具有较高的独特性,便于区分不同的物体或场景。

  • 可重复性与稳定性 :对于同一场景或物体的不同图像,能够稳定地提取出相似的关键点,减少了特征点的丢失和误检,具有较高的可重复性。

应用

  • 图像匹配 :在全景图拼接、图像搜索、目标识别等需要对两幅或多幅图像进行匹配的场景中,SIFT 算法被广泛应用。通过提取并匹配两幅图像中的 SIFT 特征,可以确定图像之间的对应关系,进而实现图像的拼接、查询或识别。

  • 目标识别与定位 :在机器人导航、自动驾驶、工业自动化等领域,SIFT 特征可用于识别和定位目标物体。例如,在自动驾驶中,通过对道路标志或车辆的 SIFT 特征进行匹配和识别,帮助车辆实现自主导航和目标检测。

  • 三维重建 :在基于图像的三维重建中,SIFT 特征用于确定多幅图像之间的特征对应关系,从而计算出相机的内外参数以及场景的三维结构信息。

优点与缺点

  • 优点 :能够自动检测出大量的特征点,且具有良好的重复性和稳定性,对尺度、旋转、光照变化以及一定程度的仿射变换具有鲁棒性,特征的区分能力较强,适合于大规模的图像匹配和目标识别任务。

  • 缺点 :计算复杂度较高,尤其是在处理高分辨率图像或多幅图像进行匹配时,计算速度可能会较慢。此外,SIFT 算法在面对视角变化较大、特征重复性较高或者存在大量相似特征的场景时,可能会出现一定的匹配错误或特征点匹配不足的问题。

环境准备

  • Python :确保已安装 Python 环境,推荐 3.6 及以上版本。

  • OpenCV :通过 pip install opencv-python 命令安装 OpenCV 库,它提供了丰富的计算机视觉功能,包括 SIFT 算法。

使用示例代码

import cv2
import numpy as np# 读取图像
img1 = cv2.imread('image1.jpg', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE)# 初始化 SIFT 检测器
sift = cv2.SIFT_create()# 检测关键点和计算描述符
keypoints1, descriptors1 = sift.detectAndCompute(img1, None)
keypoints2, descriptors2 = sift.detectAndCompute(img2, None)# 使用 FLANN 进行特征匹配
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(descriptors1, descriptors2, k=2)# 应用比率测试筛选匹配项
good_matches = []
for m, n in matches:if m.distance < 0.7 * n.distance:good_matches.append(m)# 获取匹配点的坐标
src_pts = np.float32([keypoints1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)
dst_pts = np.float32([keypoints2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)# 计算单应性矩阵
if len(good_matches) > 4:M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)matches_mask = mask.ravel().tolist()
else:matches_mask = None# 绘制匹配结果
draw_params = dict(matchColor=(0, 255, 0),singlePointColor=None,matchesMask=matches_mask,flags=2)result_img = cv2.drawMatches(img1, keypoints1, img2, keypoints2, good_matches, None, **draw_params)
  • 关键点检测与描述符计算sift.detectAndCompute() 函数用于检测图像中的关键点并计算对应的描述符。

  • 特征匹配 :使用 FLANN(快速最近邻搜索)匹配算法进行特征匹配,knnMatch() 方法返回每个特征点的两个最近邻匹配。

  • 比率测试 :通过比较两个最近邻匹配的距离,筛选出高质量的匹配项,以减少误匹配。

  • 单应性计算 :如果匹配项数量足够(大于 4 个),使用 RANSAC 算法计算单应性矩阵,用于确定图像之间的几何变换关系。

  • 结果绘制cv2.drawMatches() 函数用于绘制匹配结果,显示在图像上。

注意事项

  • 专利问题 :SIFT 是专利算法,虽专利已过期,但商业使用时仍需考虑许可问题。

  • 计算复杂度 :SIFT 算法计算复杂度较高,处理大图像时可能耗时较长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/85575.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/85575.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/85575.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

光纤通道收发器:市场洞察、技术演进与未来机遇

一、引言 在数字化浪潮席卷全球的当下&#xff0c;数据存储与传输的需求呈爆发式增长。光纤通道收发器作为高速、可靠数据存储网络&#xff08;如存储区域网络 SAN&#xff09;中的关键组件&#xff0c;发挥着至关重要的作用。它通过光纤实现服务器、存储设备和交换机之间的数…

candence17.4如何设置两个焊盘之间在TOP与BOTTOM可以存在两根线

为什么要走两根线&#xff1f; 为了过大电流&#xff0c;有时候就需要我们在TOP、BOTTOM两个面走线&#xff0c;同时开窗&#xff0c;然后通过加锡的方式增加过流能力&#xff1b; 当然由于两面都有导线&#xff0c;必然会存在过孔&#xff0c;而过孔的过流能力不仅与过孔孔径…

Dify:参数调节,让LLM从能用到好用的机制

前言 随着大语言模型(LLM)在文本生成、智能对话、技术问答等前沿领域的深度渗透&#xff0c;参数精细化调节已成为开发者驾驭 AI 能力的核心必修课。 本文将系统的解释温度(Temperature)、核采样(Top - P)、截断采样(Top - K)等关键参数的底层作用机制&#xff0c;结合多种场景…

防抖不同的实现

防抖&#xff08;Debounce&#xff09;&#xff1a;在事件被触发后&#xff0c;延迟一段时间再执行函数。如果在延迟期间事件再次被触发&#xff0c;则重新计时。常用于搜索框输入、窗口大小调整等场景。 1.不安装任何依赖和库&#xff0c;编写一个防抖的函数 在utils里面增加…

MySQL 数据库索引详解

一、索引是什么&#xff1f;能干嘛&#xff1f; 类比理解&#xff1a;索引就像书的目录。比如你想查《哈利波特》中 “伏地魔” 出现的页数&#xff0c;不用逐页翻书&#xff0c;直接看目录找关键词就行。数据库里的索引就是帮你快速找到数据的 “目录”。 核心作用&#xff…

【620公司工作记录】

已有数据汇总 好的,完全同意。在编写新代码之前,清晰地盘点我们手中已有的“弹药”是至关重要的一步。 根据您提供的 test/20250610_88_100mm_frame_000.csv 文件头,我来为您完整地解析一下我们当前拥有的全部数据字段。我们的数据是以“行”为单位组织的,每一行都代表一…

SpringBoot 集成Caffeine实现一级缓存

SpeingBoot 集成Caffeine实现一级缓存使我们经常遇到的场景。今天我们具体分享一下&#xff1a; 首先 Caffeine 作为一级缓存&#xff0c;它是 Spring 5.x 默认的本地缓存实现&#xff0c;性能优于 Guava Cache&#xff0c;且支持过期时间设置。缓存执行的流程图如下&#xff…

中科米堆3D自动扫描检测系统三维数字化智能解决方案

3D自动扫描检测系统基于先进的光学、激光或结构光等测量技术&#xff0c;能够快速、准确地获取工件的三维几何数据。在检测过程中&#xff0c;系统通过向被测工件投射特定的光模式&#xff0c;利用高分辨率相机捕捉工件表面的反射光信息&#xff0c;再经过复杂的算法处理&#…

Unity3d中使用Mirror进行自定义消息通信

一、服务端&#xff1a; 1.创建服务端脚本MyServer.cs 继承自NetworkManager类 using Mirror; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class MyServer : NetworkManager {[Header(&quo…

Odoo 18 固定资产管理自动化指南

如何在Odoo 18中实现资产管理自动化 1. 创建资产模型实现资产管理自动化 使用 Odoo 18 的会计模块&#xff0c;资产的创建和确认可轻松实现自动化。这将使资产管理变得更加简单高效。使用资产自动化功能&#xff0c;一旦验证相关产品的供应商账单&#xff0c;Odoo将自动生成并…

如何轻松地将音乐从 iPhone 传输到 Mac?

想把音乐从 iPhone 传输到 Mac 吗&#xff1f;这很常见&#xff0c;无论你是想更换设备、备份收藏&#xff0c;还是只想在更大的屏幕上欣赏喜爱的歌曲。幸运的是&#xff0c;有 6 种有效的方法可以完成这项工作&#xff0c;具体取决于你喜欢使用的工具。让我们开始吧。 第 1 部…

人工智能——解读AI智慧课堂系统解决方案【附全文阅读】

该文档是 AI 智慧课堂系统解决方案,聚焦教育信息化需求,通过 AI 技术与教学深度融合,解决传统课堂考勤效率低、资源管理难、分析不精准等问题。 方案以课堂为核心,构建 “背景分析 - 方案设计 - 优势价值” 框架,技术架构涵盖教师摄像机、学生抓拍机、智能录播主机等设备,…

使用Nginx的RTMP模块进行直播流转HLS时,处理和预防`.ts`文件过多

当使用Nginx的RTMP模块进行直播流转HLS时,如果长时间运行或处理大量流媒体内容,可能会遇到.ts文件累积过多的问题。这不仅会占用大量的磁盘空间,还可能影响系统性能。以下是一些处理和预防.ts文件过多的方法: 1. 配置HLS清理 Nginx RTMP模块允许配置HLS片段的过期时间,这…

结构体解决冒泡排序

设计英雄的结构体 //1、设计结构体 struct Hero {string name;//姓名int age;//年龄string sex;//性别 };创建英雄的数组 //2、创建数组存放英雄 struct Hero Array[5] {{"刘备", 34 ,"男"},{"关羽", 45 ,"男"},{"张飞",…

spring-webmvc @RequestParam 典型用法

典型用法 基本使用 HTTP请求参数绑定到方法参数 GetMapping("/users") public String getUsers(RequestParam String name) {return "Hello, " name; }请求&#xff1a;/users?nameJohn 输出&#xff1a;Hello, John-----GetMapping("/filter&qu…

AntDesignPro前后端权限按钮系统实现

目录 Ant Design Pro 后端接口权限按钮系统 系统架构图 前端实现 权限按钮组件 (AuthButton.tsx) 权限钩子 (useAccess.ts) 权限服务 (permission.ts) 产品列表页面 (ProductList.tsx) 后端接口设计 (Node.js Express 示例) 权限接口控制器 (permissionController.js…

RAG工程落地:处理文档中表格数据

在 RAG&#xff08;Retrieval-Augmented Generation&#xff09;工程落地过程中&#xff0c;处理文档中的表格数据 是一个非常重要但复杂的问题&#xff0c;特别是针对技术文档、报告、论文等结构化强的资料。比如PDF文档里的表格数据&#xff0c;如下&#xff1a; RAG处理表格…

大模型在肺癌预测及个性化诊疗方案中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 国内外研究现状 二、大模型预测肺癌的原理与方法 2.1 大模型概述 2.2 数据收集与预处理 2.3 特征工程 2.4 模型训练与优化 三、术前预测与方案制定 3.1 病情评估 3.1.1 肿瘤大小、位置及分期预测 3.1.…

如何高效分享WordPress博客文章

在当今信息过载的时代&#xff0c;写好一篇优秀的 WordPress 博客文章只是起点&#xff0c;如何有效地分享给更多读者才是成功的关键所在。对于新手用户而言&#xff0c;选择合适的工具和平台尤为重要。现在许多服务器提供商支持一键安装WordPress功能&#xff0c;比如 Hosteas…

以孝治家有机农业生态文明考察组赴邯郸心田农场考察学习

按照2025年中共中央、国务院印发了关于《乡村全面振兴规划&#xff08;2024—2027年&#xff09;》的战略部署。根据《乡村全面振兴规划》提出的“坚持人与自然和谐共生。牢固树立和践行绿水青山就是金山银山的理念&#xff0c;落实节约优先、保护优先、自然恢复为主的方针&…