【計算機視覺系列實戰教程 (實戰02)】:基于特征點匹配的圖像配準

這里寫目錄標題

  • 1、特征點提取
    • (1)GFTT算法提取特征點
      • A.What(什么是GFTT)
      • B.GFTT的優勢
      • C.How(如何使用GFTT算法提取圖像特征點)
    • (2)FAST算法提取特征點
      • A.What(什么是FAST角點)
      • B.FAST角點的強度值
      • C.How(如何使用FAST算法提取圖像特征點)
    • (3)BRISK算法提取特征點
      • A.What
      • B.How(如何使用BRISK算法提取特征點)
    • (4)ORB算法提取特征點
      • A.What
      • B.How(如何使用ORB算法提取特征點)
  • 2、描述子
    • (1)What
    • (2)How(如何衡量兩個特征點相似性)
      • A.周圍像素的特征
      • B.周圍像素的描述子
      • C.基于深度學習的方法
    • (3)SIFT描述子實現關鍵點匹配
      • A.原理
      • B.How(如何得到SIFT特征點和描述子)
    • (4)ORB描述子實現關鍵點匹配
      • A.原理
      • B.BRIEF算法計算描述子
      • C.How(如何得到ORB特征點描述子)
  • 3、圖像匹配
  • 4、圖像配準

1、特征點提取

(1)GFTT算法提取特征點

A.What(什么是GFTT)

GFTT算法是對Harris的改進:一是針對特征點聚集問題,使用局部區域最大值解決;二是針對不均勻分布問題,使用限制兩個特征點之間最短具體解決

B.GFTT的優勢

  • 穩定性好:GTFF 算法檢測到的角點相對更加穩定,不容易出現聚簇現象,且角點信息的丟失和位置偏移也相對較少
  • 參數可調節:通過設置相關參數,如最大角點數目、角點可接受的最小特征值、角點之間的最小距離等,可以根據具體需求和圖像特點來優化特征點的提取效果

C.How(如何使用GFTT算法提取圖像特征點)

int GetKpsByGTFF(const cv::Mat& imSrcGray, std::vector<cv::KeyPoint>& vkps)
{//對參數進行檢測if(imSrcGray.empty() ){	return -1; }if(imSrcGray.channels()!=1){	return -2; }if(!vkps.empty()){	vkps.clear(); }//提取圖像特征點cv::Ptr<cv::GFTTDetector> ptrGFTT = cv::GFTTDetector::create(500, //關鍵點的最大數量0.01, //角點的最小特征值15); //角點之間允許的最短距離ptrGFTT->detect(imSrcGray, vkps); //調用算法探測圖像上的特征點if(vkps.size()==0){	return -3; }else{	return 1;	}}

(2)FAST算法提取特征點

A.What(什么是FAST角點)

以某個點為中心做一個圓,根據圓上的像素值判斷該 點是否為關鍵點。由于不需要作復雜的梯度計算,該方法提取關鍵點的效率很高,在實時性要求高的條件下使用很廣

B.FAST角點的強度值

計算中心點像素與 認定的連續圓弧上的像素的差值,然后將這些差值的絕對值累加,就能得到角點強度

C.How(如何使用FAST算法提取圖像特征點)

int GetKpsByFAST(const cv::Mat& imSrcGray, std::vector<cv::KeyPoint>& vkps)
{//對參數進行檢測if(imSrcGray.empty() ){	return -1; }if(imSrcGray.channels()!=1){	return -2; }if(!vkps.empty()){	vkps.clear(); }//使用FAST算法提取特征點cv::Ptr<cv::FastFeatureDetector> ptrFAST = cv::FastFeatureDetector::create(65);//65表關鍵點強度,即FAST角點的強度值(response)ptrFAST->detect(imgSrcGray, vkps);if(vkps.size()==0){return -3;}else{return 1;}
}

(3)BRISK算法提取特征點

A.What

基于FAST的多尺度快速檢測器。首先下采樣構建圖像金字塔,然后對金字塔所有圖像應用FAST特征檢測。只有是局部最大值的像素才可能成 為關鍵點。這個條件滿足后,比較這個點與上下兩層的相鄰像素的評分;如果它的評分在尺度上 也更高,那么就認為它是一個興趣點。

B.How(如何使用BRISK算法提取特征點)

int GetKpsByBRISK(const cv::Mat& imSrcGray, std::vector<cv::KeyPoint>& vkps)
{//對參數進行檢測if(imSrcGray.empty() ){	return -1; }if(imSrcGray.channels()!=1){	return -2; }if(!vkps.empty()){	vkps.clear(); }//使用BRISK算法提取圖像特征點cv::Ptr<cv::BRISK> ptrBRISK = cv::BRISK::create(60, 5); //60表示FAST角點的強度值必須達到60,才有可能被認為是關鍵點;5表示金字塔層數ptrBRISK->detect(imSrcGray, vkps);if (vkps.size() == 0){return -3;}else{return 1;}
}

(4)ORB算法提取特征點

A.What

基于FAST的多尺度帶方向的特征檢測算法。

  • 特征點方向:每個被檢測的興趣點總是關聯了一個方向。在FAST的中心點的圓形區域內計算重心,中心與重心的組成的向量即為該關鍵電的方向。

B.How(如何使用ORB算法提取特征點)

int GetKpsByORB(const cv::Mat& imSrcGray, std::vector<cv::KeyPoint>& vkps)
{//對參數進行檢測if(imSrcGray.empty() ){	return -1; }if(imSrcGray.channels()!=1){	return -2; }if(!vkps.empty()){	vkps.clear(); }//使用ORB算法對圖像進行特征點提取cv::Ptr<cv::ORB> ptrORB = cv::ORB::create(500, 1.2, 8);//500:特征點數量;1.2:金字塔的縮放尺度;8:金字塔層數ptrORB->detect(imSrcGray, vkps);if (vkps.size() == 0){return -3;}else{return 1;}
}

2、描述子

(1)What

A圖像的某一點和B圖像的某一點如果對應現實世界的同一點,那么它們就應該是匹配的。這也是特征點匹配的目的

從數學的角度分析:要進行特征點的匹配,就應該考慮兩個關鍵點的相似性,因此,如何衡量兩個關鍵點的相似性成為了我們要考慮的首要問題

(2)How(如何衡量兩個特征點相似性)

A.周圍像素的特征

計算該特征點指定區域的均值、方差、梯度等,用作衡量標準。但單個的值很容易受到環境的印象,具有不穩定性,在工程實踐中不會采用這些特征

B.周圍像素的描述子

使用一些專門為特征點設計的描述子(可以理解為一個向量),這些描述子能夠捕捉到角點的獨特特性,通過比較描述子的差異來衡量相似性。在工程實踐中一般采用特征點的描述子來進行特征點的匹配

C.基于深度學習的方法

利用訓練好的卷積神經網絡模型提取角點的深層特征,然后比較這些特征的相似度

(3)SIFT描述子實現關鍵點匹配

A.原理

step01:首先選取關鍵點周圍16×16像素點,將其分為4×4大小的子區域,總共16個子區域。
step02:然后對每個子區域統計八個方向的梯度方向直方圖,每個子區域用這8個統計結果進行描述。
step03:最后得到8×16 = 128 個數據作為描述符向量。

B.How(如何得到SIFT特征點和描述子)

#include <opencv2/features2d/features2d.hpp>
int GetKpsAndDescriptorBySIFT(const cv::Mat& imSrc,std::vector<cv::KeyPoint>& vkps,cv::Mat& matDescriptor)
{//對輸入的參數進行檢查if (imSrc.empty()){return -1;}if (imSrc.channels() != 1){return - 2;}if (!vkps.empty()){vkps.clear();}//提取關鍵點cv::Ptr<cv::SIFT> ptrSIFT = cv::SIFT::create(500, 3);ptrSIFT->detect(imSrc, vkps);if (vkps.size() == 0){return -3;}//計算關鍵點的描述子ptrSIFT->compute(imSrc, vkps, matDescriptor);if (matDescriptor.empty()){return -4;}return 1;
}

(4)ORB描述子實現關鍵點匹配

A.原理

采用BRIEF算法提取關鍵點的描述子

B.BRIEF算法計算描述子

  • 為減少噪聲干擾,先對圖像進行高斯濾波(方差為2,高斯窗口為9x9)
  • 以特征點為中心,取s×s的鄰域窗口,在窗口內隨機選取一對點,比較二者像素的大小,進行二進制賦值:若p(x) > p(y),則賦值為1;若p(x) ≤ p(y),則賦值為0,其中p(x)、p(y)分別是隨機點x=(u1,v1)、y=(u2,v2)的像素值。
  • 在窗口中隨機選取n對隨機點(一般n=256),重復步驟2的二進制賦值,形成一個二進制編碼,即特征描述子。

C.How(如何得到ORB特征點描述子)

int GetKpsAndDescriptorByORB(const cv::Mat& imSrc,std::vector<cv::KeyPoint>& vkps,cv::Mat& matDescriptor)
{//對輸入的參數進行檢查if (imSrc.empty()){return -1;}if (imSrc.channels() != 1){return - 2;}if (!vkps.empty()){vkps.clear();}//提取ORB關鍵點cv::Ptr<cv::Feature2D> ptrORB = cv::ORB::create(500, 1.2, 8);ptrORB->detect(imSrc, vkps);if (vkps.size() == 0){return -3;}//計算關鍵點的描述子ptrORB->compute(imSrc, vkps, matDescriptor);if (matDescriptor.empty()){return -4;}return 1;
}

3、圖像匹配

4、圖像配準

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

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

相關文章

每日Attention學習8——Rectangular self-Calibration Attention

模塊出處 [ECCV 24] [link] [code] Context-Guided Spatial Feature Reconstruction for Efficient Semantic Segmentation 模塊名稱 Rectangular self-Calibration Attention (RCA) 模塊作用 空間注意力 模塊結構 模塊代碼 import torch import torch.nn as nn import tor…

Ubuntu 22.04.1 LTS 離線安裝Docker

確定linux版本 cat /etc/lsb-release DISTRIB_IDUbuntuDISTRIB_RELEASE22.04DISTRIB_CODENAMEjammyDISTRIB_DESCRIPTION"Ubuntu 22.04.1 LTS"確定dpkg版本 sudo dpkg --print-architecture amd64下載地址 https://download.docker.com/linux/ubuntu/dists/jamm…

C++ | Leetcode C++題解之第216題組合總和III

題目&#xff1a; 題解&#xff1a; class Solution { private:vector<vector<int>> res;void backtracking(int k, int n, vector<int> ans){if(k 0 || n < 0){if(k 0 && n 0){res.emplace_back(ans);}return;}int start (ans.size() 0 ?…

深入解析Transformer中的多頭自注意力機制:原理與實現

深入解析Transformer中的多頭自注意力機制&#xff1a;原理與實現 Transformer模型自2017年由Vaswani等人提出以來&#xff0c;已經成為自然語言處理&#xff08;NLP&#xff09;領域的一個里程碑。其核心機制之一——多頭自注意力&#xff08;Multi-Head Attention&#xff0…

字節一年,人間三年

想來字節做研發&#xff0c;可以先看我這三年的體會和建議。 大家好&#xff0c;我是白露啊。 今天和大家分享一個真實的故事&#xff0c;是關于字節網友分享自己三年的工作經歷和感受。 由于白露也曾在字節待過兩年&#xff0c;可以說&#xff0c;說的都對。 你有沒有想過來…

javascript url 傳遞參數中文亂碼問題解決方案

在 JavaScript 中&#xff0c;傳遞 URL 參數時&#xff0c;如果參數包含中文字符&#xff0c;可能會出現亂碼問題。解決這一問題可以使用 encodeURIComponent 和 decodeURIComponent 函數。這些函數會對 URL 參數進行編碼和解碼&#xff0c;確保特殊字符&#xff08;包括中文字…

填報高考志愿,怎樣正確地選擇大學專業?

大學專業的選擇&#xff0c;會關系到未來幾年甚至一輩子的發展方向。這也是為什么很多人結束高考之后就開始愁眉苦臉&#xff0c;因為他們不知道應該如何選擇大學專業&#xff0c;生怕一個錯誤的決定會影響自己一生。 毋庸置疑&#xff0c;在面對這種選擇的時候&#xff0c;我…

全網最簡單的Java設計模式【三】工廠方法模式詳解

Java工廠方法模式詳解 一、概念介紹 1. 什么是工廠方法模式&#xff1f; 工廠方法模式&#xff08;Factory Method Pattern&#xff09;是一種創建型設計模式&#xff0c;它允許定義一個接口或抽象類來創建對象&#xff0c;但將實際對象的實例化延遲到子類中實現。工廠方法模…

mybatis mapper.xml 比較運算符(大于|小于|等于)的寫法: 轉義和<![CDATA[]]>

文章目錄 引言I 使用xml 原生轉義的方式進行轉義II 使用 <![CDATA[ 內容 ]]>引言 應用場景:查詢時間范圍 背景:在 *.xml 中使用常規的 < > = <= >= 會與xml的語法存在沖突 <![CDATA[]]> 比 轉義符 來的繁瑣 <![CDATA[]]> 表示xml解析器忽略…

c++ 聯合(Union)的特性和使用

聯合&#xff08;Union&#xff09;是一種特殊的數據結構&#xff0c;允許在同一內存位置存儲不同的數據類型。一個 union 可以有多個數據成員&#xff0c;但是在任意時刻只有一個數據成員可以有值。當某個成員被賦值后其他成員變為未定義狀態。以下是聯合的主要特點和使用方式…

工程安全監測儀器振弦采集儀提升工程質量和安全水平

工程安全監測儀器振弦采集儀提升工程質量和安全水平 振弦采集儀是一種重要的工程安全監測儀器&#xff0c;可以用來監測建筑物、橋梁、隧道等工程結構的振動情況。它通過測量結構物的振動頻率和振幅&#xff0c;可以提供關鍵的數據用于評估結構的安全性和穩定性。振弦采集儀在…

無法解析的外部符號 _imp_XXX

問題解決&#xff1a;無法解析的外部符號 _imp_XXXXXXXXX-CSDN博客 解決方法 1. 打開網站&#xff0c;搜索相關函數&#xff0c;找到其關聯庫lib 2. 程序指定鏈接到庫。注意該語法是msvc編譯器特有特性。 #pragma comment(lib, "xxxx.lib")

【項目實踐】貪吃蛇

一、游戲效果展示二、博客目標三、使用到的知識四、Win32 API 介紹 4.1 WIn32 API4.2 控制臺程序4.3 控制屏幕上的坐標COORD4.4 GetStdHandle4.5 GetConsoleCursorInfo 4.5.1 CONSOLE_CURSOR_INFO 4.6 SetConsoleCursorInfo4.7 SetConsoleCursorPosition4.8 GetAsyncKeyState 五…

秋招突擊——7/4——復習{}——新作{最長公共子序列、編輯距離}

文章目錄 引言復習新作1143-最長公共子序列個人實現 參考實現編輯距離個人實現參考實現 貪心——買股票的最佳時機個人實現參考實現 貪心——55-跳躍游戲個人實現參考做法 總結 引言 昨天主要是面試&#xff0c;然后剩下的時間都是用來對面試中不會的東西進行查漏補缺&#xff…

dolphinscheduler-筆記2

springboot集成dolphinscheduler 說明 為了避免對DolphinScheduler產生過度依賴&#xff0c;實踐中通常不會全面采用其內置的所有任務節點類型。相反&#xff0c;會選擇性地利用DolphinScheduler的HTTP任務節點功能&#xff0c;以此作為工作流執行管理的橋梁&#xff0c;對接…

項目管理實用表格與應用【項目文件資料分享】

項目管理基礎知識 項目管理可分為五大過程組&#xff08;啟動、規劃、執行、監控、收尾&#xff09;十大知識領域&#xff0c;其中包含49個子過程 項目十大知識領域分為&#xff1a;項目整合管理、項目范圍管理、項目進度管理、項目成本管理、項目質量管理、項目資源管理、項目…

標量場與向量場

標量場與向量場 flyfish 場 是一個函數&#xff0c;它把空間中的每一點關聯到一個數值或一個數學對象&#xff08;如向量、張量等&#xff09;。在物理學中&#xff0c;場可以描述許多物理現象&#xff0c;例如溫度分布、電場、磁場、壓力場等。 標量場 標量場 是一個函數&…

【BUUCTF-PWN】9-ciscn_2019_n_8

不屬于棧溢出&#xff0c;應該是比較簡單的pwn&#xff0c;看懂代碼邏輯使用pwntools 32位&#xff0c;開啟了Stack、NX、PIE保護 執行效果&#xff1a; main函數 使用通義千問詢問的代碼解讀&#xff1a; 即當var數組的第十四個元素是17就可以 這里可以用兩種payload…

Python使用總結之應用程序有哪些配置方式?配置方式對比

Python使用總結之應用程序有哪些配置方式&#xff1f;配置方式對比 在Python程序中&#xff0c;管理配置信息的方法有很多&#xff0c;常見的方式包括使用INI文件、JSON文件、YAML文件、環境變量、以及直接在代碼中定義配置。每種方式都有其獨特的優勢和適用場景。 1. INI文件 …

天環公益原創開發進度網站源碼帶后臺免費分享

天環公益計劃首發原創開發進度網站源碼帶后臺免費分享 后臺地址是&#xff1a;admin.php 后臺沒有賬號密碼 這個沒有數據庫 有能力的可以自己改 天環公益原創開發進度網站 帶后臺