python opencv 圖像拼接的實(shí)現(xiàn)方法
初級(jí)的圖像拼接為將兩幅圖像簡(jiǎn)單的粘貼在一起,僅僅是圖像幾何空間的轉(zhuǎn)移與合成,與圖像內(nèi)容無關(guān)。高級(jí)圖像拼接也叫作基于特征匹配的圖像拼接,拼接時(shí)消去兩幅圖像相同的部分,實(shí)現(xiàn)拼接合成全景圖。
具有相同尺寸的圖A和圖B含有相同的部分與不同的部分,如圖所示:
用基于特征的圖像拼接實(shí)現(xiàn)后:
設(shè)圖像高為h,相同部分的寬度為wx
拼接后圖像的寬w=wA+wB-wx
因此,可以先構(gòu)建一個(gè)高為h,寬為W*2的空白圖像,將左圖像向右平移wx,右圖像粘貼在右側(cè)。則右圖像剛好覆蓋左圖像中的相同部分。最終拼接圖像完成,完成后的圖像左側(cè)有寬度為wx的空白即為所檢測(cè)出的兩幅圖像的相同部分,可根據(jù)需要選擇是否去除。示例圖如下。
實(shí)現(xiàn)上述效果的步驟如下:
1. 采用surft特征檢測(cè)算法檢測(cè)兩幅圖像的關(guān)鍵特征點(diǎn);
2. 建立FLANN匹配器,采用目前最快的特征匹配(最近鄰搜索)算法FlannBasedMatcher匹配關(guān)鍵點(diǎn)
3.從所匹配的全部關(guān)鍵點(diǎn)中篩選出優(yōu)秀的特征點(diǎn)(基于距離篩選)
4. 根據(jù)查詢圖像和模板圖像的特征描述子索引得出仿射變換矩陣
5. 獲取左邊圖像到右邊圖像的投影映射關(guān)系
6. 透視變換將左圖像放在相應(yīng)的位置
7. 將有圖像拷貝到特定位置完成拼接
先放python下利用opencv 進(jìn)行圖像拼接的代碼,環(huán)境為python2.7+opencv2:
#coding: utf-8 import numpy as np import cv2 leftgray = cv2.imread('1.jpg') rightgray = cv2.imread('2.jpg') hessian=400 surf=cv2.SURF(hessian) #將Hessian Threshold設(shè)置為400,閾值越大能檢測(cè)的特征就越少 kp1,des1=surf.detectAndCompute(leftgray,None) #查找關(guān)鍵點(diǎn)和描述符 kp2,des2=surf.detectAndCompute(rightgray,None) FLANN_INDEX_KDTREE=0 #建立FLANN匹配器的參數(shù) indexParams=dict(algorithm=FLANN_INDEX_KDTREE,trees=5) #配置索引,密度樹的數(shù)量為5 searchParams=dict(checks=50) #指定遞歸次數(shù) #FlannBasedMatcher:是目前最快的特征匹配算法(最近鄰搜索) flann=cv2.FlannBasedMatcher(indexParams,searchParams) #建立匹配器 matches=flann.knnMatch(des1,des2,k=2) #得出匹配的關(guān)鍵點(diǎn) good=[] #提取優(yōu)秀的特征點(diǎn) for m,n in matches: if m.distance < 0.7*n.distance: #如果第一個(gè)鄰近距離比第二個(gè)鄰近距離的0.7倍小,則保留 good.append(m) src_pts = np.array([ kp1[m.queryIdx].pt for m in good]) #查詢圖像的特征描述子索引 dst_pts = np.array([ kp2[m.trainIdx].pt for m in good]) #訓(xùn)練(模板)圖像的特征描述子索引 H=cv2.findHomography(src_pts,dst_pts) #生成變換矩陣 h,w=leftgray.shape[:2] h1,w1=rightgray.shape[:2] shft=np.array([[1.0,0,w],[0,1.0,0],[0,0,1.0]]) M=np.dot(shft,H[0]) #獲取左邊圖像到右邊圖像的投影映射關(guān)系 dst_corners=cv2.warpPerspective(leftgray,M,(w*2,h))#透視變換,新圖像可容納完整的兩幅圖 cv2.imshow('tiledImg1',dst_corners) #顯示,第一幅圖已在標(biāo)準(zhǔn)位置 dst_corners[0:h,w:w*2]=rightgray #將第二幅圖放在右側(cè) #cv2.imwrite('tiled.jpg',dst_corners) cv2.imshow('tiledImg',dst_corners) cv2.imshow('leftgray',leftgray) cv2.imshow('rightgray',rightgray) cv2.waitKey() cv2.destroyAllWindows()
所用圖像為:
拼接完成后的圖像為:
測(cè)試一下抗干擾能力,所用圖像:
拼接結(jié)果:
可見,抗干擾能力還是不錯(cuò)的,在測(cè)試中若拼接不成功,則注意以下兩點(diǎn):
1. 所用兩幅圖像尺寸是否相同,是否有相同的部分。
2. 適當(dāng)調(diào)整hessian的值。
總結(jié)
以上所述是小編給大家介紹的python opencv 圖像拼接的實(shí)現(xiàn)方法,希望對(duì)大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
相關(guān)文章
Python使用Tkinter實(shí)現(xiàn)轉(zhuǎn)盤抽獎(jiǎng)器的步驟詳解
這篇文章主要介紹了Python使用Tkinter實(shí)現(xiàn)轉(zhuǎn)盤抽獎(jiǎng)器,,本文分場(chǎng)景通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01一個(gè)非常簡(jiǎn)單好用的Python圖形界面庫(kù)(PysimpleGUI)
這篇文章主要介紹了一個(gè)非常簡(jiǎn)單好用的Python圖形界面庫(kù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12python 計(jì)算兩個(gè)列表的相關(guān)系數(shù)的實(shí)現(xiàn)
這篇文章主要介紹了python 計(jì)算兩個(gè)列表的相關(guān)系數(shù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08關(guān)于numpy中eye和identity的區(qū)別詳解
今天小編就為大家分享一篇關(guān)于numpy中eye和identity的區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11python 處理微信對(duì)賬單數(shù)據(jù)的實(shí)例代碼
本文通過實(shí)例代碼給大家介紹了python 處理微信對(duì)賬單數(shù)據(jù),代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07Python中在for循環(huán)中嵌套使用if和else語句的技巧
Python的語法糖非常強(qiáng)大,比如Python中在for循環(huán)中嵌套使用if和else語句的技巧便十分給力,下面我們就舉幾個(gè)例子來看詳細(xì)的用法:2016-06-06python 多進(jìn)程通信模塊的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了python 多進(jìn)程通信模塊的簡(jiǎn)單實(shí)現(xiàn),需要的朋友可以參考下2014-02-02pytorch model.cuda()花費(fèi)時(shí)間很長(zhǎng)的解決
這篇文章主要介紹了pytorch model.cuda()花費(fèi)時(shí)間很長(zhǎng)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06