国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

python利用opencv實(shí)現(xiàn)SIFT特征提取與匹配

瀏覽:4日期:2022-08-04 09:19:10

本文實(shí)例為大家分享了利用opencv實(shí)現(xiàn)SIFT特征提取與匹配的具體代碼,供大家參考,具體內(nèi)容如下

1、SIFT

1.1、sift的定義

SIFT,即尺度不變特征變換(Scale-invariant feature transform,SIFT),是用于圖像處理領(lǐng)域的一種描述。這種描述具有尺度不變性,可在圖像中檢測(cè)出關(guān)鍵點(diǎn),是一種局部特征描述子。

1.2、sift算法介紹

SIFT由David Lowe在1999年提出,在2004年加以完善 。SIFT在數(shù)字圖像的特征描述方面當(dāng)之無愧可稱之為最紅最火的一種,許多人對(duì)SIFT進(jìn)行了改進(jìn),誕生了SIFT的一系列變種。SIFT已經(jīng)申請(qǐng)了專利(所以現(xiàn)在opencv使用這個(gè)算法,需要低的版本)。

SIFT特征是基于物體上的一些局部外觀的興趣點(diǎn)而與影像的大小和旋轉(zhuǎn)無關(guān)。對(duì)于光線、噪聲、微視角改變的容忍度也相當(dāng)高。基于這些特性,它們是高度顯著而且相對(duì)容易擷取,在母數(shù)龐大的特征數(shù)據(jù)庫中,很容易辨識(shí)物體而且鮮有誤認(rèn)。使用SIFT特征描述對(duì)于部分物體遮蔽的偵測(cè)率也相當(dāng)高,甚至只需要3個(gè)以上的SIFT物體特征就足以計(jì)算出位置與方位。在現(xiàn)今的電腦硬件速度下和小型的特征數(shù)據(jù)庫條件下,辨識(shí)速度可接近即時(shí)運(yùn)算。SIFT特征的信息量大,適合在海量數(shù)據(jù)庫中快速準(zhǔn)確匹配。

SIFT算法具有如下一些特點(diǎn):

1)SIFT特征是圖像的局部特征,其對(duì)旋轉(zhuǎn)、尺度縮放、亮度變化保持不變性,對(duì)視角變化、仿射變換、噪聲也保持一定程度的穩(wěn)定性;2)區(qū)分性(Distinctiveness)好,信息量豐富,適用于在海量特征數(shù)據(jù)庫中進(jìn)行快速、準(zhǔn)確的匹配;3)多量性,即使少數(shù)的幾個(gè)物體也可以產(chǎn)生大量的SIFT特征向量;4)高速性,經(jīng)優(yōu)化的SIFT匹配算法甚至可以達(dá)到實(shí)時(shí)的要求;5)可擴(kuò)展性,可以很方便的與其他形式的特征向量進(jìn)行聯(lián)合。

1.3、特征檢測(cè)

SIFT特征檢測(cè)主要包括以下4個(gè)基本步驟:1)尺度空間極值檢測(cè):搜索所有尺度上的圖像位置。通過高斯微分函數(shù)來識(shí)別潛在的對(duì)于尺度和旋轉(zhuǎn)不變的興趣點(diǎn)。2)關(guān)鍵點(diǎn)定位:在每個(gè)候選的位置上,通過一個(gè)擬合精細(xì)的模型來確定位置和尺度。關(guān)鍵點(diǎn)的選擇依據(jù)于它們的穩(wěn)定程度。3)方向確定:基于圖像局部的梯度方向,分配給每個(gè)關(guān)鍵點(diǎn)位置一個(gè)或多個(gè)方向。所有后面的對(duì)圖像數(shù)據(jù)的操作都相對(duì)于關(guān)鍵點(diǎn)的方向、尺度和位置進(jìn)行變換,從而提供對(duì)于這些變換的不變性。4)關(guān)鍵點(diǎn)描述:在每個(gè)關(guān)鍵點(diǎn)周圍的鄰域內(nèi),在選定的尺度上測(cè)量圖像局部的梯度。這些梯度被變換成一種表示,這種表示允許比較大的局部形狀的變形和光照變化。

1.4、特征匹配

SIFT特征匹配主要包括2個(gè)階段:

第一階段:SIFT特征的生成,即從多幅圖像中提取對(duì)尺度縮放、旋轉(zhuǎn)、亮度變化無關(guān)的特征向量。第二階段:SIFT特征向量的匹配。

SIFT特征的生成一般包括以下幾個(gè)步驟:

1)構(gòu)建尺度空間,檢測(cè)極值點(diǎn),獲得尺度不變性。2)特征點(diǎn)過濾并進(jìn)行精確定位。3)為特征點(diǎn)分配方向值。4)生成特征描述子。以特征點(diǎn)為中心取16×16的鄰域作為采樣窗口,將采樣點(diǎn)與特征點(diǎn)的相對(duì)方向通過高斯加權(quán)后歸入包含8個(gè)bin的方向直方圖,最后獲得4×4×8的128維特征描述子。當(dāng)兩幅圖像的SIFT特征向量生成以后,下一步就可以采用關(guān)鍵點(diǎn)特征向量的歐式距離來作為兩幅圖像中關(guān)鍵點(diǎn)的相似性判定度量。取圖1的某個(gè)關(guān)鍵點(diǎn),通過遍歷找到圖像2中的距離最近的兩個(gè)關(guān)鍵點(diǎn)。在這兩個(gè)關(guān)鍵點(diǎn)中,如果最近距離除以次近距離小于某個(gè)閾值,則判定為一對(duì)匹配點(diǎn)。

2、python實(shí)現(xiàn)

2.1、準(zhǔn)備工作

由于SIFT已經(jīng)申請(qǐng)了專利,所以在高版本的opencv中,會(huì)出現(xiàn)錯(cuò)誤,以前是opencv4.0.1,然后安裝版本為opencv3.4.2.16卸載以前的版本(低版本,可以試試直接運(yùn)行代碼):

pip uninstall opencv-pythonpip uninstall opencv-contrib-python

用命令行(CMD),采用pip方式:

pip install opencv_python==3.4.2.16 pip install opencv-contrib-python==3.4.2.16

python利用opencv實(shí)現(xiàn)SIFT特征提取與匹配

2.2、代碼實(shí)現(xiàn)

#!/usr/bin/env python3# -*- coding:utf-8 -*-u’’’Created on 2019年6月14日@author: wuluo’’’__author__ = ’wuluo’__version__ = ’1.0.0’__company__ = u’重慶交大’__updated__ = ’2019-06-14’from matplotlib import pyplot as pltfrom imagedt.decorator import time_costimport cv2print(’cv version: ’, cv2.__version__)def bgr_rgb(img): (r, g, b) = cv2.split(img) return cv2.merge([b, g, r])def orb_detect(image_a, image_b): # feature match orb = cv2.ORB_create() kp1, des1 = orb.detectAndCompute(image_a, None) kp2, des2 = orb.detectAndCompute(image_b, None) # create BFMatcher object bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # Match descriptors. matches = bf.match(des1, des2) # Sort them in the order of their distance. matches = sorted(matches, key=lambda x: x.distance) # Draw first 10 matches. img3 = cv2.drawMatches(image_a, kp1, image_b, kp2, matches[:100], None, flags=2) return bgr_rgb(img3)@time_costdef sift_detect(img1, img2, detector=’surf’): if detector.startswith(’si’): print('sift detector......') sift = cv2.xfeatures2d.SURF_create() else: print('surf detector......') sift = cv2.xfeatures2d.SURF_create() # find the keypoints and descriptors with SIFT kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) # BFMatcher with default params bf = cv2.BFMatcher() matches = bf.knnMatch(des1, des2, k=2) # Apply ratio test good = [[m] for m, n in matches if m.distance < 0.5 * n.distance] # cv2.drawMatchesKnn expects list of lists as matches. img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, None, flags=2) return bgr_rgb(img3)if __name__ == '__main__': # load image image_a = cv2.imread(’G:/2018and2019two/qianrushi/wuluo1.jpg’)#絕對(duì)路徑 image_b = cv2.imread(’G:/2018and2019two/qianrushi/wuluo2.jpg’) # ORB # img = orb_detect(image_a, image_b) # SIFT or SURF img = sift_detect(image_a, image_b) plt.imshow(img) plt.show()

2.3、運(yùn)行結(jié)果

采用同一張圖片:

python利用opencv實(shí)現(xiàn)SIFT特征提取與匹配

兩張有重疊部分的代碼:

python利用opencv實(shí)現(xiàn)SIFT特征提取與匹配

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 久视频在线观看 | 亚洲国产成人久久精品图片 | 中文字幕在线观看亚洲日韩 | 99久久www免费 | 国产v片在线播放免费观 | a级片免费在线播放 | 国产精品久久自在自线观看 | 亚洲精品在线看 | 精品毛片免费看 | 毛片在线免费视频 | 久久久精品一区二区三区 | 国产高清一区二区 | a级在线观看视频 | 久久草在线视频免费 | 亚洲精品黄色 | 美女张开腿让男人桶的动态图 | 久草在线看 | 麻豆69堂免费视频 | 一级毛片在线完整免费观看 | 日韩欧美视频一区二区在线观看 | 国产精品国产高清国产专区 | 久久免费视频观看 | 一区二区三区视频在线 | 欧美色欧美色 | 不卡无毒免费毛片视频观看 | 国产在线高清不卡免费播放 | 国产区亚洲区 | av大片| 日韩成人在线观看 | 99久久免费精品国产免费 | 国产在线精品一区二区三区不卡 | 日韩男人的天堂 | 亚洲午夜a | 午夜香港三级a三级三点 | 成人毛片高清视频观看 | 日本三级11k影院在线 | 偷窥女厕国产在线视频 | 国内精品久久久久影院老司 | 欧美国产在线看 | 国产精品福利视频萌白酱 | 亚洲欧美自拍一区 |