fastica演算法
Ⅰ Fast演算法原理:fastica演算法步驟詳解
1. Fast演算法原理
我們前面已經介紹過幾個特徵檢測器,它們的效果都很好,特別是SIFT和SURF演算法,但是從實時處理的角度來看,效率還是太低了。為了解決這個問題,Edward Rosten和Tom Drummond在2006年提出了FAST演算法,並在2010年對其進行了修正。
FAST (全稱Features from accelerated segment test)是一種用於角點檢測的演算法,該演算法的原理是取圖像中檢測點,以該點為圓心的周圍鄰域內像素點判斷檢測點是否為角點,通俗的講就是若一個像素周圍有一定數量的像素與該點像素值不同,則認為其為角點。
1. 1 FAST演算法的基本流程
在圖像中選取一個像素點 p,來判斷它是不是關鍵點。$$I_p$$等於像素點 p的灰度值。
以r為半徑畫圓,覆蓋p點周圍的M個像素,通常情狂下,設置 r=3,則 M=16,如下圖所示:
設置一個閾值t,如果在這 16 個像素點中存在 n 個連續像素點的灰度值都高於$$I_p + t$$,或者低於$$I_p - t$$,那麼像素點 p 就被認為是一個角點。如上圖中的虛線所示,n 一般取值為 12。
由於在檢測特徵點時是需要對圖像中所有的像素點進行檢測,然而圖像中的絕大多數點都不是特徵點,如果對每個像素點都進行上述的檢測過程,那顯然會浪費許多時間,因此採用一種進行非特徵點判別的方法:首先對候選點的周圍每個 90 度的點:1,9,5,13 進行測試(先測試 1 和 19, 如果它們符合閾值要求再測試 5 和 13)。如果 p 是角點,那麼這四個點中至少有 3 個要符合閾值要求,否則直接剔除。對保留下來的點再繼續進行測試(是否有 12 的點符合閾值要求)。
雖然這個檢測器的效率很高,但它有以下幾條缺點:
·獲得的候選點比較多
·特徵點的選取不是最優的,因為它的效果取決與要解決的問題和角點的分布情況。
·進行非特徵點判別時大量的點被丟棄
·檢測到的很多特徵點都是相鄰的
前 3 個問題可以通過機器學習的方法解決,最後一個問題可以使用非最大值抑制的方法解決。
1. 2 機器學習的角點檢測器
選擇一組訓練圖片(最好是跟最後應用相關的圖片)
使用 FAST 演算法找出每幅圖像的特徵點,對圖像中的每一個特徵點,將其周圍的 16 個像素存儲構成一個向量P。
每一個特徵點的 16 像素點都屬於下列三類中的一種
根據這些像素點的分類,特徵向量 P 也被分為 3 個子集:Pd ,Ps ,Pb,
定義一個新的布爾變數$$K_p$$,如果 p 是角點就設置為 Ture,如果不是就設置為 False。
利用特徵值向量p,目標值是$K_p$,訓練ID3 樹(決策樹分類器)。
將構建好的決策樹運用於其他圖像的快速的檢測。
1. 3 非極大值抑制
在篩選出來的候選角點中有很多是緊挨在一起的,需要通過非極大值抑制來消除這種影響。
為所有的候選角點都確定一個打分函數$$V $$ , $$V $$的值可這樣計算:先分別計算$$I_p$$與圓上16個點的像素值差值,取絕對值,再將這16個絕對值相加,就得到了$$V $$的值
最後比較毗鄰候選角點的 V 值,把V值較小的候選角點pass掉。
FAST演算法的思想與我們對角點的直觀認識非常接近,化繁為簡。FAST演算法比其它角點的檢測演算法快,但是在雜訊較高時不夠穩定,這需要設置合適的閾值。
2.Fast實現
OpenCV中的FAST檢測演算法是用傳統方法實現的,
1.實例化fast
參數:
·threshold:閾值t,有默認值10
·nonmaxSuppression:是否進行非極大值抑制,默認值True
返回:
Fast:創建的FastFeatureDetector對象
2.利用fast.detect檢測關鍵點,沒有對應的關鍵點描述
參數:
gray: 進行關鍵點檢測的圖像,注意是灰度圖像
返回:
kp: 關鍵點信息,包括位置,尺度,方向信息
3.將關鍵點檢測結果繪制在圖像上,與在sift中是一樣的
示例:
結果:
Ⅱ FastICA演算法的MATLAB實現
對此我做了一段時間的學習,主要是最大非高斯估計的方法,目前的fastica演算法就是基於這種理論研究的。能夠分離得很好具有一定的條件,源圖像之間本身就相差很大,也就是基本上是 「獨立的」,如果相關性太強,而fastica演算法得到的信號本身就是不相關的,不可能完全恢復出來,我對於Amari以及fastica的作者在圖像混合和盲分離的結果持懷疑態度,偶爾效果可能好一些,這中間的問題我們可以交流的