特征點檢測 FAST算法及代碼詳解

本文著重介紹了用于圖像特征點檢測的算法,FAST算法,以及使用matlab的實現。

FAST算法是一種拐點檢測算法,其主要應用于提取圖像中的特征點,在動態成像的一系列圖像中追蹤定位對象。眾所周知,我們生活的世界是動態化的,3D的,如何關聯動態化過程中的平移,畸變,旋轉對象,對每一幀的圖像與上一幀之間的空間關系進行分析,很大程度上需求我們在每一幀中找到對應的關鍵點。FAST方法,拐點檢測方法,簡單來說就是用于提取圖像中的關鍵點的算法,為進一步的圖像處理,包括相機標定,SLAM打下了基礎。

1. FAST算法解析

FAST拐點檢測算法使用了一個包含了16個像素點的圓來判斷目標點P是不是一個真正意義上的拐點。這16個像素點標序號為1至16。對于每一個候選像素點P,其強度為IpI_pIp? (灰度圖中即為該像素點的灰度值)。如果該圓中N個連續像素都比候選像素點P的強度亮很多,或都比候選像素點P的強度暗很多,那么P就被分類為一個拐點。 這個也比較好理解,即找出局部范圍內最亮或最暗的點,作為局部圖像的關鍵點。P為拐點所包含的情況如下:

  • 條件1 : 一系列NNN個連續的像素點SSS?s∈S,Ix>Ip+t{\forall} s\in S, I_x > Ip + t?sS,Ix?>Ip+t
  • 條件2 : 一系列NNN個連續的像素點SSS, ?s∈S,Ix<Ip?t{\forall} s\in S, I_x < Ip - t?sS,Ix?<Ip?t

滿足兩個條件其中的任意一個,則可以認為像素點P為該局部區域的一個拐點。上述條件中,NNN 為連續的像素點個數,IxI_xIx?為像素點xxx的強度,ttt為設置的閾值。顯然,調整NNN以及閾值ttt,可以影響被分類為拐點的像素點P的個數。NNN值越大,被分類為拐點的像素點個數就會減少,同樣ttt值越大,被分類為拐點的像素點個數也會減少。
tips : 所謂的NNN個連續的像素點,指的是例如N=5N = 5N=5 , [1,2,3,4,5],[2,3,4,5,6]...[1,2,3,4,5], [2,3,4,5,6]...[1,2,3,4,5],[2,3,4,5,6]...這樣的像素點稱為NNN個連續的像素點。

在這里插入圖片描述
接下來我們就看看使用matlab如何實現這個拐點檢測算法FAST。

2. MATLAB實現

下面就放出matlab代碼,用于檢測圖像I中基于閾值t的拐點的函數。返回一個包含了這些拐點像素點坐標的矩陣。注釋中詳細解釋了代碼的原理。

function CS = FAST(I,t)
%     I : 灰度圖片
%     t : 用戶選擇的閾值% 定義一個矩陣,描述了16個像素點關于待測像素點P的坐標關系。
% 需要注意的是,這些坐標的定義(i,j)為先行后列。
List_voisinage = [  -3 0;-3 1;-2 2;-1 3;0 3;1 3;2 2;3 1;3 0;3 -1;2 -2;1 -3;0 -3;-1 -3;-2 -2;-3,-1];
[height, width] = size(I);
% 初始化CS矩陣為空矩陣
CS = [];
const = 3;
% 定義N個連續的像素點,這里取值12,可以根據需求更改
N = 12;
% 由于我們要在整個圖像上進行遍歷,因此在沒有Padding補充的情況下,需要考慮邊緣的像素點
for i = const+1 : height - constfor j = const+1 : width - constIp = I(i,j);% 與算法描述相同,根據閾值規定上限下限upper = Ip + t;lower = Ip - t;% 將P周圍的16個像素點的坐標及他們的灰度值,分別保存在coordonne_list 和% values_list 中 			         coordonne_list = zeros(16,2);values_list = zeros(16,1,"uint8");for k = 1:16coordonne_list(k,:) = List_voisinage(k,:) + [i, j];values_list(k,:) = I(coordonne_list(k,1),coordonne_list(k,2));end% X1向量,用于判斷條件1是否滿足X1 = zeros(16,1); for k = 1:16% 遍歷,給X1向量賦值 01 的邏輯值X1(k) = values_list(k,1) > upper; end cond1voisins = X1;cond1verifiee = 0;compteur = 0;% 當條件1滿足或數組已經循環平移過整個數組長度16時,結束循環while ~cond1verifiee && (compteur<16)nbVoisinCond1 = sum(cond1voisins(1:N));% 判斷是否N個bool值都是1,即X1前N項和為Ncond1verifiee = (nbVoisinCond1 == N);% cirshift函數用于循環平移數組cond1voisins = circshift(X1,1)';compteur = compteur + 1;end% 滿足條件1的時候,將目標點P的坐標添加進矩陣CSif cond1verifieeCS = [CS;[i,j]];      else% 如果條件1不滿足,則繼續判斷條件2,與條件一大同小異X2 = zeros(16,1);for k = 1:16X2(k) = values_list(k,1) < lower;endcond2voisins = X2;cond2verifiee = 0;compteur = 0;while ~cond2verifiee && (compteur<16)nbVoisinCond2 = sum(cond2voisins(1:N));cond2verifiee = (nbVoisinCond2 == N);cond2voisins = circshift(X1,1)';compteur = compteur + 1;end% 同樣如果滿足了條件2,點P也分類為拐點,將其坐標添加入矩陣CSif cond2verifieeCS = [CS;[i,j]];end    end end    endend

3. 使用FAST function進行拐點檢測的實驗

I1 = imread("1.JPG");
I1_gray = rgb2gray(I1);
cs1 = FAST(I1_gray,30);
figure()
imagesc(I1)
hold on
plot(cs1(:,2),cs1(:,1),"*")

檢測目標點結果如下 :

在這里插入圖片描述
在這里插入圖片描述
在這個實例中,設置了N值為12,閾值t為30。通過調整這兩個變量可以改變提取出的關鍵點的個數。

\newline
\newline
\newline
參考文獻 :

  • Rosten, Edward; Reid Porter; Tom Drummond (2010). “FASTER and better: A machine learning approach to corner detection”. IEEE Transactions on Pattern Analysis and Machine Intelligence. 32 (1): 105–119. arXiv:0810.2434. doi:10.1109/TPAMI.2008.275. PMID 19926902.

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

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

相關文章

Python Email發送,通知業務完成

Email 發送 #!/usr/bin/python # -*- coding: UTF-8 -*- import base64 import smtplib from email.mime.text import MIMEText from email.header import Header from email.utils import formataddrdef crypt(source, key):from itertools import cycleresulttempcycle(key)f…

基于SpringCloud的分布式事務框架(LCN)

框架特點 支持各種基于spring的db框架 兼容springcloud、dubbo 使用簡單&#xff0c;代碼完全開源 基于切面的強一致性事務框架 高可用&#xff0c;模塊可以依賴dubbo或springcloud的集群方式做集群化&#xff0c;TxManager也可以做集群化 使用示例 分布式事務發起方&#xf…

一文看懂計算機神經網絡與梯度下降

1. 計算機神經網絡與神經元 要理解神經網絡中的梯度下降算法&#xff0c;首先我們必須清楚神經元的定義。如下圖所示&#xff0c;每一個神經元可以由關系式yf(∑i1nwixib)y f(\sum_{i1}^nw_ix_i b)yf(∑i1n?wi?xi?b)來描述&#xff0c;其中X[x1,x2,...,xn]X [x_1,x_2,..…

vs2015web項目無法加載64位c++的dll,提示試圖加載不正確的格式

vs2015無法加載64位c的dll&#xff0c;提示試圖加載不正確的格式&#xff01; 開始用winform引用64位的c的dll&#xff0c;在項目的屬性設置生成里面選擇any cpu或者x64都可以成功! 但在web項目和接口里面運行就提示試圖加載不正確的格式&#xff0c;想辦法找了一天也沒處理掉&…

使用Rancher搭建K8S測試環境

環境準備&#xff08;4臺主機&#xff0c;Ubuntu16.04Docker1.12.6 SSH&#xff09;&#xff1a; rancher1 192.168.3.160 只做管理節點 node1 192.168.3.161 K8S的節點1 node2 192.168.3.162 K8S的節點2 node3 192.168.3.163 K8S的節點3 此時如…

Anaconda安裝tensorflow報錯問題解決方法

最近脫離了googlecolab想使用本地的anaconda進行機器學習課題的演練&#xff0c;在安裝tensorflow時報錯 : UnsatisfiableError: The following specifications were found。下面給出解決方法。 發現實際原因是由于anaconda的python環境&#xff0c;當前版本的tensorflow只能適…

5.07—018—周二

今日所學內容 一、模塊 二、遞歸刪除的思路 三、案例&#xff1a;跨文件夾移動文件 四、案例 遞歸遍歷打印目標路徑中所有的txt文件 五、項目開放周期 一、模塊 1、與時間相關的模塊 1&#xff09;time &#xff1a;時間 時間戳(timestamp)&#xff1a;time.time()  延遲線程…

機器學習模型中step與epoch,batch_size之間的關系

本文主要談談自己對step&#xff0c;epoch&#xff0c;batch_size這幾個常見參數的理解。 最近在調試模型的時候&#xff0c;發現在使用keras.optimizer.adam時&#xff0c;模型在添加了新的一層2D卷積層后難以收斂&#xff0c;在不調整初始權重矩陣的情況下&#xff0c;想通過…

yml的mybatis的sql查看

yml的mybatis的sql查看 控制臺輸出結果:

Debian 安裝 yum

sudo apt-get updatesudo apt-get install build-essentialsudo apt-get install yum轉載于:https://www.cnblogs.com/baiqian/p/10840169.html

unity如何讓canvas總是顯示在所有層的最上方?

由于unity中的圖層都是從上至下渲染的&#xff0c;那么在渲染的過程中&#xff0c;只需要將canvas所在的UI層的渲染優先級order排在其他層之后&#xff0c;就可以保證UI畫面總是最后加載出來的了。 在canvas的inspector中修改order in layer 或者 sorting layer都可以實現這一…

FZU - 2037 -Maximum Value Problem(規律題)

Let’s start with a very classical problem. Given an array a[1…n] of positive numbers, if the value of each element in the array is distinct, how to find the maximum element in this array? You may write down the following pseudo code to solve this proble…

解決Feign接口調用有時候不好用的分析思路

很多架構師為了鑒權&#xff0c;會把controller帶過來的header信息一股腦的利用feign的攔截器帶入RequestTemplate&#xff0c;然后方便feign接口鑒權。這時候可能會帶入其他的header信息&#xff0c;比如content-type&#xff0c;而有的feign接口是對特定對header信息有要求的…

關于同時可用git命令clone和TortoiseGit拉取代碼不需要密碼

工作需要在windows7下使用git分布式版本控制系統&#xff0c;需要同時可以在git命令行模式或TortoiseGit拉取代碼而不需要每次輸入密碼。 這時候需要同時安裝git和TortoiseGit。 git使用命令ssh-keygen -C “郵箱地址” -t rsa產生的密鑰在TortoiseGit中不能用。TortoiseGit 使…

交叉驗證 cross validation 與 K-fold Cross Validation K折疊驗證

交叉驗證&#xff0c;cross validation是機器學習中非常常見的驗證模型魯棒性的方法。其最主要原理是將數據集的一部分分離出來作為驗證集&#xff0c;剩余的用于模型的訓練&#xff0c;稱為訓練集。模型通過訓練集來最優化其內部參數權重&#xff0c;再在驗證集上檢驗其表現。…

這個太有意思了,程序員可以消遣娛樂

/***        ┏┓ ┏┓ *       ┏┛┻━━━━━━━┛┻┓ *       ┃       ┃*       ┃   ━   ┃ *       █████━█████ ┃*       ┃       ┃ *       ┃   ┻   ┃* …

第十一周總結

這個作業屬于那個課程 C語言程序設計II 這個作業要求在哪里 https://edu.cnblogs.com/campus/zswxy/computer-scienceclass4-2018/homework/3203 我在這個課程的目標是 理解與使用遞歸函數。 參考文獻 基礎題 2-1 宏定義“#define DIV(a, b) a/b”&#xff0c;經DIV(x …

softmax函數與交叉熵損失函數

本文主要介紹了當前機器學習模型中廣泛應用的交叉熵損失函數與softmax激勵函數。 這個損失函數主要應用于多分類問題&#xff0c;用于衡量預測值與實際值之間的相似程度。 交叉熵損失函數定義如下: LCE(y^,y?)?∑i1Nclassesyi?log(yi^)L_{CE}(\hat{y}, y^*) - \sum_{i1}^…

vue配置git的子模塊

在vue的模塊需要調用許多公共組件&#xff0c;在公共組件之后會需要不斷的更新以及分組做&#xff0c;這時候可以利用git的方式更新組件所在位置 [submodule "src/component/common"] path src/component/common urlgit111.111.111.111:projectname/web-common-…

unity如何讓物體與特定物體之間不發生碰撞

unity中我們普遍使用的是碰撞器來實現各個物體的碰撞體積&#xff0c;例如Box collider, Sphere Collider。 在實現游戲的過程中&#xff0c;如果不想要物體與特定物體產生碰撞&#xff0c;或反之&#xff0c;只想讓碰撞發生在特定物體之間時&#xff0c;我們就需要配置layer …