图像配准之特征点匹配的思考
最近趕時(shí)髦,看了一些智能優(yōu)化算法如蟻群算法,還有機(jī)器學(xué)習(xí)的一些東西,就想著怎么把這些先進(jìn)的東西用在圖像配準(zhǔn)中。頭腦風(fēng)暴了一下,覺得在已經(jīng)檢測(cè)到兩幅圖像的特征點(diǎn)的基礎(chǔ)上,就如何對(duì)它們進(jìn)行匹配似乎有優(yōu)化的空間。
匹配的過程其實(shí)是找對(duì)應(yīng)點(diǎn)的過程,對(duì)應(yīng)點(diǎn)指的是在各自圖像中相對(duì)位置一樣的點(diǎn),如圖像進(jìn)行剛性變換之后,圖像點(diǎn)在坐標(biāo)雖然改變了,但是它們之間的相對(duì)位置是不會(huì)變的,三角形的直角對(duì)應(yīng)直角點(diǎn),銳角對(duì)應(yīng)銳角點(diǎn)。但是如何在對(duì)應(yīng)點(diǎn)坐標(biāo)之間建立關(guān)系呢,看代碼的時(shí)候看到利用??cv::perspectiveTransform(dstPoints, dstPoints, homography.inv())將實(shí)驗(yàn)圖像的特征點(diǎn)變換到參考圖像同一個(gè)坐標(biāo)系中,再進(jìn)行歐式距離的計(jì)算,這個(gè)暗含了估計(jì)的變換矩陣是正確的,而且這其實(shí)是為了衡量變換矩陣估計(jì)準(zhǔn)確性的標(biāo)準(zhǔn),并不是為了得到匹配對(duì)。這才想起來其實(shí)不用太多考慮坐標(biāo)、坐標(biāo)系,因?yàn)槲覀儥z測(cè)得到特征點(diǎn),更準(zhǔn)確說是描述子,描述子具有旋轉(zhuǎn)不變性。這個(gè)描述子已經(jīng)把特征點(diǎn)的坐標(biāo)、鄰域的梯度(包括方向、大小)都包含了。得到描述子的過程就包含了將坐標(biāo)軸旋轉(zhuǎn)為關(guān)鍵點(diǎn)方向。所以直接比較128維描述子(對(duì)SIFT來說),就可以得到哪些特征點(diǎn)是對(duì)應(yīng)的。這里又有兩種策略,一種是窮舉法https://docs.opencv.org/2.4/modules/features2d/doc/common_interfaces_of_descriptor_matchers.html#bfmatcher,一種是快速最近鄰搜索包(Fast_Library_for_Approximate_Nearest_Neighbors)https://docs.opencv.org/2.4/modules/features2d/doc/common_interfaces_of_descriptor_matchers.html#flannbasedmatcher。因?yàn)槊枋鲎右话愣际歉呔S向量,所以要優(yōu)化的話這會(huì)是一個(gè)值得關(guān)注的地方。
看看match具體是怎么實(shí)現(xiàn)的。之前博客中提到的圖像配準(zhǔn)算法比較對(duì)matchFeatures進(jìn)行了重載:
void FeatureAlgorithm::matchFeatures(constDescriptors& train, const Descriptors& query, Matches& matches)const
{
???matcher->match(query, train, matches);
}
?
void FeatureAlgorithm::matchFeatures(constDescriptors& train, const Descriptors& query, int k,std::vector<Matches>& matches) const//matchFeatures的重載,分別利用窮舉和knn,參數(shù)有int型k就是knn
{
???assert(knMatchSupported);
???matcher->knnMatch(query, train, matches, k);
}
matcher是OpenCV中的feature2 dmodule中的cv::DescriptorMatcher。在feature2d中對(duì)https://docs.opencv.org/2.4/modules/features2d/doc/features2d.htmlmatch也進(jìn)行了重載,這里matchFeatures用的是match的第一種變形,把train descriptors當(dāng)做變量輸入函數(shù),并且利用窮舉法搜索。matchFeatures的第二個(gè)重載用的是k近鄰點(diǎn)算法,從query集合中的每個(gè)描述子中找到k個(gè)最好的匹配對(duì),返回k個(gè)距離逐漸增大的匹配對(duì)(k通常不大于20)。這與通常意義上的匹配是不一樣的,這里不是一一對(duì)應(yīng)的,而是一對(duì)多。
KNN中是依靠周圍K個(gè)已知類別點(diǎn)來判斷待分類點(diǎn)的類別的,就像是物以類聚,這要求有一個(gè)先驗(yàn)知識(shí),即一個(gè)數(shù)據(jù)和標(biāo)簽已知的訓(xùn)練集。k個(gè)近鄰點(diǎn)中哪一類更多那么待判斷點(diǎn)就更有可能屬于那一類。
那么,具體在特征點(diǎn)匹配過程中如何使用KNN算法呢?特征點(diǎn)匹配和數(shù)據(jù)庫查、圖像檢索本質(zhì)上是同一個(gè)問題,都可以歸結(jié)為一個(gè)通過距離函數(shù)在高維矢量之間進(jìn)行相似性檢索的問題,如何快速而準(zhǔn)確地找到查詢點(diǎn)的近鄰,不少人提出了很多高維空間索引結(jié)構(gòu)和近似查詢的算法。https://blog.csdn.net/v_july_v/article/details/8203674k-d樹(本質(zhì)是一種平衡二叉樹)就是對(duì)搜索空間進(jìn)行不重疊劃分,實(shí)現(xiàn)k近鄰算法的一種方法。
結(jié)合Rob-Hess的源碼和參考3,用建立大頂堆的思想實(shí)現(xiàn)數(shù)據(jù)中最小的k個(gè)數(shù)據(jù)的查找。即用容量為k的最大堆存儲(chǔ)最小的k個(gè)數(shù),此時(shí),k1<k2<...<kmax(kmax設(shè)為大頂堆中最大元素)。遍歷一次數(shù)列,n,每次遍歷一個(gè)元素x,與堆頂元素比較,x<kmax,更新堆(用時(shí)logk),否則不更新堆。這樣下來,總費(fèi)時(shí)O(n*logk)。
那么這里還有一個(gè)問題就是在匹配過程中,我們只知道一系列高維數(shù)據(jù),但是是對(duì)一個(gè)query在train中找距離最近的前k個(gè),我們還需要先求query和所有train特征點(diǎn)之間的距離(若利用KD樹的搜索策略,應(yīng)該不會(huì)有重復(fù)計(jì)算)。距離的表示有很多種方法,參考2中也做了一番整理,常見的有歐式距離、曼哈頓距離(城市街區(qū)距離)、切比雪夫距離(國際象棋國王,坐標(biāo)差最大值)、馬氏距離(協(xié)方差距離,適合分類)、夾角余弦距離(根據(jù)向量方向重合度判斷相似性,用于文本分類的詞袋模型)、杰卡德相似系數(shù)(兩個(gè)集合A和B的交集元素在A,B的并集中所占的比例)。距離的選擇,一是要保證準(zhǔn)確性,即保證不對(duì)應(yīng)的特征點(diǎn)的距離盡可能大,相對(duì)應(yīng)的特征點(diǎn)距離盡可能小,另一方面要使運(yùn)算量小。Rob-Hess采用了歐式距離作為比較描述子的標(biāo)準(zhǔn)。對(duì)圖像1中的每一個(gè)特征點(diǎn)利用BBF找到了最近鄰的2個(gè)對(duì)應(yīng)點(diǎn),并分別計(jì)算出了它們之間的歐式距離。最近鄰小于次近鄰的0.49時(shí),把最近鄰作為對(duì)應(yīng)點(diǎn)。
針對(duì)高維數(shù)據(jù)處理,有一個(gè)方法是PCA主成分分析。還有核機(jī)制?
Ng所舉的例子是利用單幅圖像重構(gòu)了場(chǎng)景的3D模型。如果可以實(shí)現(xiàn)3D模型,那么我們就完全可以將圖像配準(zhǔn)到任何視角,而不是簡(jiǎn)單的透視變換。
還有一種思路是將特征點(diǎn)聚類,找到圖像中的主體,即將主體內(nèi)容和背景分離開來。將主體的中心點(diǎn)(數(shù)據(jù)中心化)和邊界找出來。
Flann
Reference:
1.https://blog.csdn.net/icvpr/article/details/8491369
2.https://blog.csdn.net/v_july_v/article/details/8203674
3.https://blog.csdn.net/v_JULY_v/article/details/6370650
總結(jié)
以上是生活随笔為你收集整理的图像配准之特征点匹配的思考的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tensorflow权重初始化
- 下一篇: Android实现支持缩放平移图片