OpenCV中的SIFT特征提取

文章目錄

  • 引言
  • 一、SIFT算法概述
  • 二、OpenCV中的SIFT實現
    • 2.1 基本使用
      • 2.1.1 導入庫
      • 2.1.2 圖片預處理
      • 2.1.3 創建SIFT檢測器
      • 2.1.4 檢測關鍵點并計算描述符
      • 2.1.5 檢測關鍵點并計算描述符并對關鍵點可視化
      • 2.1.6 印關鍵點和描述符的形狀信息
    • 2.2 參數調優
  • 三、SIFT的優缺點分析
    • 3.1 優點
    • 3.2 缺點
  • 結語

引言

在計算機視覺領域,特征提取是許多任務的基礎步驟,如圖像匹配、目標識別和三維重建等。SIFT(Scale-Invariant Feature Transform,尺度不變特征變換)是一種經典的特征提取算法,由David Lowe在1999年提出。本文將詳細介紹SIFT算法的原理,并通過OpenCV實現展示其應用。

一、SIFT算法概述

SIFT是一種基于局部特征的圖像處理算法,具有以下突出特點:

  1. 尺度不變性:在不同尺度的圖像中都能檢測到相同的特征點
  2. 旋轉不變性:不受圖像旋轉的影響
  3. 光照魯棒性:對光照變化不敏感
  4. 視角部分不變性:能夠處理一定程度的視角變化

二、OpenCV中的SIFT實現

OpenCV提供了簡潔的SIFT接口:

2.1 基本使用

2.1.1 導入庫

import cv2
import numpy as np
  • 導入opencv庫和numpy庫

2.1.2 圖片預處理

image = cv2.imread('man.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  • 讀取圖像并轉換為灰度圖

2.1.3 創建SIFT檢測器

sift = cv2.SIFT_create()
  • 功能:創建一個 SIFT 特征檢測器 對象。
  • 細節:SIFT 是一種經典的 局部特征提取算法,對尺度、旋轉、光照變化具有魯棒性。
  • cv2.SIFT_create() 是 OpenCV 中初始化 SIFT 檢測器的方式(需 OpenCV ≥ 4.4.0,早期版本用cv2.xfeatures2d.SIFT_create())。

2.1.4 檢測關鍵點并計算描述符

kp = sift.detect(gray)

功能:在灰度圖像 gray 上檢測關鍵點(keypoints)

細節
sift.detect() 會返回一個列表 kp,其中每個元素是一個 KeyPoint 對象,包含以下屬性:

  • pt:關鍵點的坐標 (x, y)。
  • size:關鍵點的尺度(scale)。
  • angle:方向(角度,0-360°)。
  • response:關鍵點的強度(可用于篩選)。
  • octave:所在金字塔層級(尺度空間)

2.1.5 檢測關鍵點并計算描述符并對關鍵點可視化

man_sift = cv2.drawKeypoints(man,kp,None,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

輸入參數:

  • man:原始 BGR 彩色圖像(NumPy 數組)。
  • kp:SIFT 檢測到的關鍵點列表(cv2.KeyPoint 對象組成的列表)。
  • None:可選參數,表示輸出圖像(如果為 None,函數會新建一個圖像)。
  • flags:控制關鍵點的繪制方式。

輸出

  • man_sift:繪制了關鍵點后的新圖像(BGR 格式)

關鍵參數詳解:flags

flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS 表示 “以豐富格式繪制關鍵點”,具體效果包括:

  • 圓圈標記:每個關鍵點用一個圓圈表示,圓圈的 半徑 表示該關鍵點的 尺度(scale)(尺度越大,圓圈越大)。
  • 方向指示:圓圈內有一條直線,表示關鍵點的 主方向(angle)(方向由 SIFT 計算得出)。
  • 顏色對比:默認關鍵點會以醒目的顏色(如紅色、綠色)繪制,與原始圖像形成對比。

如果省略 flags 或設置為 cv2.DRAW_MATCHES_FLAGS_DEFAULT,則僅用簡單的小點標記位置,不顯示尺度和方向。

2.1.6 印關鍵點和描述符的形狀信息

kp,des = sift.compute(man,kp)
print(np.array(kp).shape,des.shape)

1.sift.compute(man, kp)

功能:基于原始圖像 man 和已檢測到的關鍵點 kp,計算每個關鍵點的 描述符(descriptor)。
輸入參數:

  • man:原始圖像(BGR 或灰度格式)。雖然 SIFT 檢測通常在灰度圖上進行,但 compute() 可以接受彩色圖像(內部會自動轉換為灰度)。
  • kp:之前通過 sift.detect() 得到的關鍵點列表(cv2.KeyPoint 對象的列表)。

輸出:

  • kp:更新后的關鍵點列表(可能與輸入相同,但某些實現可能會過濾掉無法計算描述符的關鍵點)。
  • des:描述符的 NumPy 數組,形狀為 (n_keypoints, 128),數據類型通常為 np.float32。

2.print(np.array(kp).shape, des.shape)

功能:打印關鍵點列表 kp 和描述符數組 des 的形狀。

輸出含義:

  • np.array(kp).shape:將關鍵點列表 kp 轉換為 NumPy 數組后的形狀。由于 kp 是 cv2.KeyPoint對象的列表,直接轉換后的形狀是 (n_keypoints,)(表示有 n_keypoints 個關鍵點)。
  • 注意:cv2.KeyPoint 對象的屬性(如坐標、尺度等)需要通過 kp[i].pt、kp[i].size 等方式單獨訪問。
  • des.shape: 描述符數組的形狀為 (n_keypoints, 128),表示每個關鍵點對應一個 128 維的特征向量(SIFT 描述符的固定維度)。

2.2 參數調優

OpenCV的SIFT實現提供了多個可調參數:

# 自定義參數創建SIFT
sift = cv2.SIFT_create(nfeatures=0,          # 保留的特征點數量,0表示不限制nOctaveLayers=3,      # 每組(octave)中的層數contrastThreshold=0.04,  # 對比度閾值edgeThreshold=10,      # 邊緣閾值sigma=1.6            # 高斯模糊的初始sigma值
)

三、SIFT的優缺點分析

3.1 優點

  1. 對尺度、旋轉、光照變化具有魯棒性
  2. 特征區分性強,匹配準確率高
  3. 算法成熟,有大量實際應用驗證

3.2 缺點

  1. 計算復雜度高,實時性較差
  2. 對模糊圖像和非剛性變形敏感
  3. 專利限制(已過期)

結語

SIFT作為計算機視覺領域的里程碑算法,盡管已有20多年歷史,但其核心思想仍影響著現代特征提取方法的發展。通過OpenCV的簡潔接口,我們可以輕松地將這一強大工具應用到各種視覺任務中。理解SIFT的原理和實現,對于掌握更先進的視覺算法也大有裨益。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77125.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77125.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77125.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【信息系統項目管理師】高分論文:論成本管理與采購管理(信用管理系統)

更多內容請見: 備考信息系統項目管理師-專欄介紹和目錄 文章目錄 論文1、規劃成本管理2、成本估算3、成本預算4、成本控制論文 2019年1月,我作為項目經理參與了 XX基金管理有限公司信用管理系統項目。該項目成 本1000萬,建設期為1年。通過該項目,XX基金管理有限公司在信用…

從邊緣到云端,如何通過時序數據庫 TDengine 實現數據的全局洞

在當今數字化轉型加速的背景下,海量的數據生成和實時處理需求已成為企業面臨的關鍵挑戰。無論是物聯網設備、工業自動化系統,還是智能城市的各類傳感器,數據的采集、傳輸與分析效率,直接影響企業的決策與運營。為此,TD…

Axure全局變量的含義與基礎應用

親愛的小伙伴,在您瀏覽之前,煩請關注一下,在此深表感謝! Axure產品經理精品視頻課已登錄CSDN可點擊學習https://edu.csdn.net/course/detail/40420 課程主題:全局變量 主要內容:全局變量含義、基礎應用 應用場景:元件賦值 案例展示: 案例視頻:

題目 3320: 藍橋杯2025年第十六屆省賽真題-產值調整

題目 3320: 藍橋杯2025年第十六屆省賽真題-產值調整 時間限制: 2s 內存限制: 192MB 提交: 549 解決: 122 題目描述 偏遠的小鎮上,三兄弟共同經營著一家小型礦業公司 “兄弟礦業”。公司旗下有三座礦山:金礦、銀礦和銅礦,它們的初始產值分別用…

常見緩存淘汰算法(LRU、LFU、FIFO)的區別與實現

一、前言 緩存淘汰算法主要用于在內存資源有限的情況下,優化緩存空間的使用效率。以確保緩存系統在容量不足時能夠智能地選擇需要移除的數據。 二、LRU(Least Recently Used) 核心思想:淘汰最久未被訪問的數據。實現方式&#x…

linux ptrace 圖文詳解(七) gdb、strace跟蹤系統調用

目錄 一、gdb/strace 跟蹤程序系統調用 二、實現原理 三、代碼實現 四、總結 (代碼:linux 6.3.1,架構:arm64) One look is worth a thousand words. —— Tess Flanders 相關鏈接: linux ptrace 圖…

Git基本使用(很詳細)

一:Git 概述 1.1 定義:分布式版本控制系統 1.2 版本控制 (1)定義: 版本控制時一種記錄文件內容變化,以便將來查閱特定版本修訂情況的系統 (2)舉例 多副本 優化: 不使用多…

23種設計模式-結構型模式之橋接模式(Java版本)

Java 橋接模式(Bridge Pattern)詳解 🌉 什么是橋接模式? 橋接模式用于將抽象部分與實現部分分離,使它們可以獨立變化。 通過在兩個獨立變化的維度之間建立“橋”,避免因多維度擴展導致的類爆炸。 &#x…

基于SIMMECHANICS的單自由度磁懸浮隔振器PID控制系統simulink建模與仿真

目錄 1.課題概述 2.系統仿真結果 3.核心程序與模型 4.系統原理簡介 4.1 單自由度磁懸浮減振器工作原理簡介 4.2 SIMMECHANICS工具箱 5.完整工程文件 1.課題概述 基于SIMMECHANICS的單自由度磁懸浮隔振器PID控制系統simulink建模與仿真。其中,SIMMECHANICS是M…

contenthash 持久化緩存

以下是關于持久化緩存(contenthash)的深度技術解析,涵蓋原理、配置策略及最佳實踐,幫助我們構建高性能前端應用的緩存體系: 一、緩存機制核心原理 1. 瀏覽器緩存決策矩陣 觸發條件緩存行為對應場景URL 未變化 + 強緩存有效直接讀取磁盤/內存緩存未修改的靜態資源URL 變化…

【前端記事】關于electron的入門使用

electron入門使用 背景how to start第一步 創建一個vite-vue3項目第二步 裝各種依賴第三步 配置vite.config.jspackage.jsonelectron入口 啟動重寫關閉、隱藏、最大化最小化 背景 最近對electron比較感興趣,折騰一段時間后有了點眉目,記錄一下 how to …

跨瀏覽器音頻錄制:實現兼容的音頻捕獲與WAV格式生成

在現代Web開發中,音頻錄制功能越來越受到開發者的關注。無論是在線會議、語音識別還是簡單的語音留言,音頻錄制都是一個重要的功能。然而,實現一個跨瀏覽器的音頻錄制功能并非易事,因為不同瀏覽器對音頻錄制API的支持存在差異。本…

Semantic Kernel也能充當MCP Client

背景 筆者之前,分別寫過兩篇關于Semantic Kernel(下簡稱SK)相關的博客,最近模型上下文協議(下稱MCP)大火,實際上了解過SK的小伙伴,一看到 MCP的一些具體呈現,會發現&…

識別圖片內容OCR并重命名文件

在工作場景中,經常出現通過拍攝設備獲取圖片后,未及時進行有效命名的情況。這些圖片中往往包含關鍵信息(如合同編號、產品型號、日期等),需要人工識別并命名,存在以下痛點: 效率低下&#xff1…

【防火墻 pfsense】3 portal

(1)應該考慮的問題: ->HTTPS 連接的干擾問題:HTTPS 是一種旨在防止惡意第三方截取和篡改流量的協議。但強制門戶的工作原理是截取并改變終端用戶與網絡之間的連接。這對于 HTTP 流量來說不是問題,但使用 HTTPS 加密…

銀發科技:AI健康小屋如何破解老齡化困局

隨著全球人口老齡化程度的不斷加深,如何保障老年人的健康、提升他們的生活質量,成為了社會各界關注的焦點。 在這場應對老齡化挑戰的戰役中,智紳科技順勢而生,七彩喜智慧養老系統構筑居家養老安全網。 而AI健康小屋作為一項創新…

TCP協議理解

文章目錄 TCP協議理解理論基礎TCP首部結構圖示字段逐項解析 TCP是面向連接(Connection-Oriented)面向連接的核心表現TCP 面向連接的核心特性TCP 與UDP對比 TCP是一個可靠的(reliable)序號與確認機制(Sequencing & Acknowledgment&#xf…

什么是機器視覺3D碰撞檢測?機器視覺3D碰撞檢測是機器視覺3D智能系統中安全運行的核心技術之一

機器視覺3D碰撞檢測是一種結合計算機視覺和三維空間分析的技術,旨在檢測三維場景中物體之間是否發生碰撞(即物理接觸或交疊)。它通過分析物體的形狀、位置、運動軌跡等信息,預測或實時判斷物體間的碰撞可能性。以下是其核心要點: 基本原理 三維感知:利用深度相機(如RGB-…

nacos設置權重進行負載均衡不生效

nacos設置權重進行負載均衡不生效,必須在啟動類下加上這個bean Beanpublic IRule nacosRule(){return new NacosRule();}如下圖所示

創建 Node.js Playwright 項目:從零開始搭建自動化測試環境

一、環境準備 在開始創建 Playwright 項目之前,確保你的電腦上已經安裝了以下工具: Node.js:Playwright 依賴于 Node.js 環境,確保你已經安裝了最新版本的 Node.js。可以通過以下命令檢查是否安裝成功: node -v npm -…