日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图像配准之特征点匹配的思考

發布時間:2024/7/23 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像配准之特征点匹配的思考 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近趕時髦,看了一些智能優化算法如蟻群算法,還有機器學習的一些東西,就想著怎么把這些先進的東西用在圖像配準中。頭腦風暴了一下,覺得在已經檢測到兩幅圖像的特征點的基礎上,就如何對它們進行匹配似乎有優化的空間。

匹配的過程其實是找對應點的過程,對應點指的是在各自圖像中相對位置一樣的點,如圖像進行剛性變換之后,圖像點在坐標雖然改變了,但是它們之間的相對位置是不會變的,三角形的直角對應直角點,銳角對應銳角點。但是如何在對應點坐標之間建立關系呢,看代碼的時候看到利用??cv::perspectiveTransform(dstPoints, dstPoints, homography.inv())將實驗圖像的特征點變換到參考圖像同一個坐標系中,再進行歐式距離的計算,這個暗含了估計的變換矩陣是正確的,而且這其實是為了衡量變換矩陣估計準確性的標準,并不是為了得到匹配對。這才想起來其實不用太多考慮坐標、坐標系,因為我們檢測得到特征點,更準確說是描述子,描述子具有旋轉不變性。這個描述子已經把特征點的坐標、鄰域的梯度(包括方向、大小)都包含了。得到描述子的過程就包含了將坐標軸旋轉為關鍵點方向。所以直接比較128維描述子(對SIFT來說),就可以得到哪些特征點是對應的。這里又有兩種策略,一種是窮舉法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。因為描述子一般都是高維向量,所以要優化的話這會是一個值得關注的地方。

看看match具體是怎么實現的。之前博客中提到的圖像配準算法比較對matchFeatures進行了重載:

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,參數有int型k就是knn

{

???assert(knMatchSupported);

???matcher->knnMatch(query, train, matches, k);

}

matcher是OpenCV中的feature2 dmodule中的cv::DescriptorMatcher。在feature2d中對https://docs.opencv.org/2.4/modules/features2d/doc/features2d.htmlmatch也進行了重載,這里matchFeatures用的是match的第一種變形,把train descriptors當做變量輸入函數,并且利用窮舉法搜索。matchFeatures的第二個重載用的是k近鄰點算法,從query集合中的每個描述子中找到k個最好的匹配對,返回k個距離逐漸增大的匹配對(k通常不大于20)。這與通常意義上的匹配是不一樣的,這里不是一一對應的,而是一對多。

KNN中是依靠周圍K個已知類別點來判斷待分類點的類別的,就像是物以類聚,這要求有一個先驗知識,即一個數據和標簽已知的訓練集。k個近鄰點中哪一類更多那么待判斷點就更有可能屬于那一類。


那么,具體在特征點匹配過程中如何使用KNN算法呢?特征點匹配和數據庫查、圖像檢索本質上是同一個問題,都可以歸結為一個通過距離函數在高維矢量之間進行相似性檢索的問題,如何快速而準確地找到查詢點的近鄰,不少人提出了很多高維空間索引結構和近似查詢的算法。https://blog.csdn.net/v_july_v/article/details/8203674k-d樹(本質是一種平衡二叉樹)就是對搜索空間進行不重疊劃分,實現k近鄰算法的一種方法。

結合Rob-Hess的源碼和參考3,用建立大頂堆的思想實現數據中最小的k個數據的查找。即用容量為k的最大堆存儲最小的k個數,此時,k1<k2<...<kmax(kmax設為大頂堆中最大元素)。遍歷一次數列,n,每次遍歷一個元素x,與堆頂元素比較,x<kmax,更新堆(用時logk),否則不更新堆。這樣下來,總費時O(n*logk)。

那么這里還有一個問題就是在匹配過程中,我們只知道一系列高維數據,但是是對一個query在train中找距離最近的前k個,我們還需要先求query和所有train特征點之間的距離(若利用KD樹的搜索策略,應該不會有重復計算)。距離的表示有很多種方法,參考2中也做了一番整理,常見的有歐式距離、曼哈頓距離(城市街區距離)、切比雪夫距離(國際象棋國王,坐標差最大值)、馬氏距離(協方差距離,適合分類)、夾角余弦距離(根據向量方向重合度判斷相似性,用于文本分類的詞袋模型)、杰卡德相似系數(兩個集合A和B的交集元素在A,B的并集中所占的比例)。距離的選擇,一是要保證準確性,即保證不對應的特征點的距離盡可能大,相對應的特征點距離盡可能小,另一方面要使運算量小。Rob-Hess采用了歐式距離作為比較描述子的標準。對圖像1中的每一個特征點利用BBF找到了最近鄰的2個對應點,并分別計算出了它們之間的歐式距離。最近鄰小于次近鄰的0.49時,把最近鄰作為對應點。

針對高維數據處理,有一個方法是PCA主成分分析。還有核機制?

Ng所舉的例子是利用單幅圖像重構了場景的3D模型。如果可以實現3D模型,那么我們就完全可以將圖像配準到任何視角,而不是簡單的透視變換。

還有一種思路是將特征點聚類,找到圖像中的主體,即將主體內容和背景分離開來。將主體的中心點(數據中心化)和邊界找出來。

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

總結

以上是生活随笔為你收集整理的图像配准之特征点匹配的思考的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。