日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

python opencv進(jìn)行圖像拼接

瀏覽:203日期:2022-07-31 18:49:43

本文實(shí)例為大家分享了python opencv進(jìn)行圖像拼接的具體代碼,供大家參考,具體內(nèi)容如下

思路和方法

思路

1、提取要拼接的兩張圖片的特征點(diǎn)、特征描述符;2、將兩張圖片中對(duì)應(yīng)的位置點(diǎn)找到,匹配起來(lái);3、如果找到了足夠多的匹配點(diǎn),就能將兩幅圖拼接起來(lái),拼接前,可能需要將第二幅圖透視旋轉(zhuǎn)一下,利用找到的關(guān)鍵點(diǎn),將第二幅圖透視旋轉(zhuǎn)到一個(gè)與第一幅圖相同的可以拼接的角度;4、進(jìn)行拼接;5、進(jìn)行拼接后的一些處理,讓效果看上去更好。

實(shí)現(xiàn)方法

1、提取圖片的特征點(diǎn)、描述符,可以使用opencv創(chuàng)建一個(gè)SIFT對(duì)象,SIFT對(duì)象使用DoG方法檢測(cè)關(guān)鍵點(diǎn),并對(duì)每個(gè)關(guān)鍵點(diǎn)周?chē)膮^(qū)域計(jì)算特征向量。在實(shí)現(xiàn)時(shí),可以使用比SIFT快的SURF方法,使用Hessian算法檢測(cè)關(guān)鍵點(diǎn)。因?yàn)橹皇沁M(jìn)行全景圖拼接,在使用SURF時(shí),還可以調(diào)節(jié)它的參數(shù),減少一些關(guān)鍵點(diǎn),只獲取64維而不是128維的向量等,加快速度。2、在分別提取好了兩張圖片的關(guān)鍵點(diǎn)和特征向量以后,可以利用它們進(jìn)行兩張圖片的匹配。在拼接圖片中,可以使用Knn進(jìn)行匹配,但是使用FLANN快速匹配庫(kù)更快,圖片拼接,需要用到FLANN的單應(yīng)性匹配。3、單應(yīng)性匹配完之后可以獲得透視變換H矩陣,用這個(gè)的逆矩陣來(lái)對(duì)第二幅圖片進(jìn)行透視變換,將其轉(zhuǎn)到和第一張圖一樣的視角,為下一步拼接做準(zhǔn)備。4、透視變換完的圖片,其大小就是最后全景圖的大小,它的右邊是透視變換以后的圖片,左邊是黑色沒(méi)有信息。拼接時(shí)可以比較簡(jiǎn)單地處理,通過(guò)numpy數(shù)組選擇直接把第一張圖加到它的左邊,覆蓋掉重疊部分,得到拼接圖片,這樣做非常快,但是最后效果不是很好,中間有一條分割痕跡非常明顯。使用opencv指南中圖像金字塔的代碼對(duì)拼接好的圖片進(jìn)行處理,整個(gè)圖片平滑了,中間的縫還是特別突兀。5、直接拼效果不是很好,可以把第一張圖疊在左邊,但是對(duì)第一張圖和它的重疊區(qū)做一些加權(quán)處理,重疊部分,離左邊圖近的,左邊圖的權(quán)重就高一些,離右邊近的,右邊旋轉(zhuǎn)圖的權(quán)重就高一些,然后兩者相加,使得過(guò)渡是平滑地,這樣看上去效果好一些,速度就比較慢。如果是用SURF來(lái)做,時(shí)間主要畫(huà)在平滑處理上而不是特征點(diǎn)提取和匹配。

python_opencv中主要使用的函數(shù)

0、基于python 3.7和對(duì)應(yīng)的python-opencv

1、cv2.xfeatures2d.SURF_create ([hessianThreshold[, nOctaves[, nOctaveLayers[, extended[, upright]]]]])該函數(shù)用于生成一個(gè)SURF對(duì)象,在使用時(shí),為提高速度,可以適當(dāng)提高h(yuǎn)essianThreshold,以減少檢測(cè)的關(guān)鍵點(diǎn)的數(shù)量,可以extended=False,只生成64維的描述符而不是128維,令upright=True,不檢測(cè)關(guān)鍵點(diǎn)的方向。

2、cv2.SURF.detectAndCompute(image, mask[, descriptors[, useProvidedKeypoints]])

該函數(shù)用于計(jì)算圖片的關(guān)鍵點(diǎn)和描述符,需要對(duì)兩幅圖都進(jìn)行計(jì)算。

3、flann=cv2.FlannBasedMatcher(indexParams,searchParams)match=flann.knnMatch(descrip1,descrip2,k=2)flann快速匹配器有兩個(gè)參數(shù),一個(gè)是indexParams,一個(gè)是searchParams,都用手冊(cè)上建議的值就可以。在創(chuàng)建了匹配器得到匹配數(shù)組match以后,就可以參考Lowe給出的參數(shù),對(duì)匹配進(jìn)行過(guò)濾,過(guò)濾掉不好的匹配。其中返回值match包括了兩張圖的描述符距離distance 、訓(xùn)練圖(第二張)的描述符索引trainIdx 、查詢的圖(第一張)的描述符索引queryIdx 這幾個(gè)屬性。

4、M,mask=cv2.findHomography(srcPoints, dstPoints[, method[, ransacReprojThreshold[, mask]]])這個(gè)函數(shù)實(shí)現(xiàn)單應(yīng)性匹配,返回的M是一個(gè)矩陣,即對(duì)關(guān)鍵點(diǎn)srcPoints做M變換能變到dstPoints的位置。

5、warpImg=cv2.warpPerspective(src,np.linalg.inv(M),dsize[,dst[,flags[,borderMode[,borderValue]]]])用這個(gè)函數(shù)進(jìn)行透視變換,變換視角。src是要變換的圖片,np.linalg.inv(M)是④中M的逆矩陣,得到方向一致的圖片。

6、a=b.copy() 實(shí)現(xiàn)深度復(fù)制,Python中默認(rèn)是按引用復(fù)制,a=b是a指向b的內(nèi)存。

7、draw_params = dict(matchColor = (0,255,0),singlePointColor = (255,0,0),matchesMask = matchMask,flags = 2),img3 = cv2.drawMatches(img1,kp1,img2,kp2,good,None,**draw_params)使用drawMatches可以畫(huà)出匹配的好的關(guān)鍵點(diǎn),matchMask是比較好的匹配點(diǎn),之間用綠色線連接起來(lái)。

核心代碼

import cv2import numpy as npfrom matplotlib import pyplot as pltimport timeMIN = 10starttime=time.time()img1 = cv2.imread(’1.jpg’) #queryimg2 = cv2.imread(’2.jpg’) #train#img1gray=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)#img2gray=cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)surf=cv2.xfeatures2d.SURF_create(10000,nOctaves=4,extended=False,upright=True)#surf=cv2.xfeatures2d.SIFT_create()#可以改為SIFTkp1,descrip1=surf.detectAndCompute(img1,None)kp2,descrip2=surf.detectAndCompute(img2,None)FLANN_INDEX_KDTREE = 0indexParams = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)searchParams = dict(checks=50)flann=cv2.FlannBasedMatcher(indexParams,searchParams)match=flann.knnMatch(descrip1,descrip2,k=2)good=[]for i,(m,n) in enumerate(match): if(m.distance<0.75*n.distance): good.append(m)if len(good)>MIN: src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1,1,2) ano_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1,1,2) M,mask=cv2.findHomography(src_pts,ano_pts,cv2.RANSAC,5.0) warpImg = cv2.warpPerspective(img2, np.linalg.inv(M), (img1.shape[1]+img2.shape[1], img2.shape[0])) direct=warpImg.copy() direct[0:img1.shape[0], 0:img1.shape[1]] =img1 simple=time.time()#cv2.namedWindow('Result', cv2.WINDOW_NORMAL)#cv2.imshow('Result',warpImg) rows,cols=img1.shape[:2] for col in range(0,cols): if img1[:, col].any() and warpImg[:, col].any():#開(kāi)始重疊的最左端 left = col break for col in range(cols-1, 0, -1): if img1[:, col].any() and warpImg[:, col].any():#重疊的最右一列 right = col break res = np.zeros([rows, cols, 3], np.uint8) for row in range(0, rows): for col in range(0, cols): if not img1[row, col].any():#如果沒(méi)有原圖,用旋轉(zhuǎn)的填充 res[row, col] = warpImg[row, col] elif not warpImg[row, col].any(): res[row, col] = img1[row, col] else: srcImgLen = float(abs(col - left)) testImgLen = float(abs(col - right)) alpha = srcImgLen / (srcImgLen + testImgLen) res[row, col] = np.clip(img1[row, col] * (1-alpha) + warpImg[row, col] * alpha, 0, 255) warpImg[0:img1.shape[0], 0:img1.shape[1]]=res final=time.time() img3=cv2.cvtColor(direct,cv2.COLOR_BGR2RGB) plt.imshow(img3,),plt.show() img4=cv2.cvtColor(warpImg,cv2.COLOR_BGR2RGB) plt.imshow(img4,),plt.show() print('simple stich cost %f'%(simple-starttime)) print('ntotal cost %f'%(final-starttime)) cv2.imwrite('simplepanorma.png',direct) cv2.imwrite('bestpanorma.png',warpImg) else: print('not enough matches!')

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

原圖1.jpg

python opencv進(jìn)行圖像拼接

原圖2.jpg

python opencv進(jìn)行圖像拼接

特征點(diǎn)匹配

python opencv進(jìn)行圖像拼接

直接拼接和平滑對(duì)比

python opencv進(jìn)行圖像拼接

效果

python opencv進(jìn)行圖像拼接

本文已被收錄到專(zhuān)題《python圖片處理操作》 ,歡迎大家點(diǎn)擊學(xué)習(xí)更多精彩內(nèi)容。

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

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
黄色欧美日韩| 国产一区导航| 国产精品久久久久久av公交车| 日韩美女国产精品| 91福利精品在线观看| 麻豆久久一区二区| 日产精品一区| 日韩欧美二区| 91久久视频| 青草国产精品| 日本不卡免费高清视频在线| 极品日韩av| 少妇精品在线| 久久精品一区二区国产| 性感美女一区二区在线观看| 在线综合亚洲| 国产乱人伦精品一区| 日韩综合精品| 蜜桃av一区二区| 国际精品欧美精品| 99国产精品| 国产精品久久久久av蜜臀| 色婷婷狠狠五月综合天色拍| 午夜精品网站| 国产日产精品一区二区三区四区的观看方式| 久久久久亚洲精品中文字幕| 国产高清一区二区| 国产乱码精品一区二区亚洲| 欧洲亚洲一区二区三区| 婷婷五月色综合香五月| 国产一区二区久久久久| 国产视频亚洲| 欧美激情五月| 午夜国产一区二区| 国产精品久久久久久av公交车| 久久精品青草| 国产精品美女午夜爽爽| 久久中文字幕二区| 日本在线不卡视频| 亚洲不卡系列| 国产亚洲高清在线观看| 99免费精品| 国产午夜精品一区在线观看| 久久精品免费一区二区三区| 欧美日韩亚洲一区三区| 婷婷亚洲综合| 国产成人精选| 欧美日韩精品一区二区三区视频 | 色在线视频观看| 亚洲日韩中文字幕一区| 久久九九精品| 美腿丝袜亚洲三区| 天堂va欧美ⅴa亚洲va一国产| 精品日韩视频| 国产激情久久| 日韩高清国产一区在线| 国产亚洲福利| 欧美亚洲在线日韩| 欧美激情网址| 日本在线成人| 久久xxxx| 自由日本语亚洲人高潮| 红杏一区二区三区| 国产精品一国产精品k频道56| 亚洲一区二区三区久久久| 国产一区二区三区自拍| 日本美女一区| 久久gogo国模啪啪裸体| 亚洲欧美专区| 久久亚洲美女| 一区二区视频欧美| 欧美日韩在线网站| 日韩中文在线电影| 高清久久一区| 丰满少妇一区| 精品中文字幕一区二区三区 | 极品日韩av| 欧美激情另类| 精品日韩一区| 国产黄色精品| 免费观看亚洲天堂| 久久av日韩| 麻豆精品国产91久久久久久| 国产精品久久久久久久久久白浆| 婷婷久久免费视频| 中文字幕日韩高清在线 | 制服诱惑一区二区| 婷婷成人综合| 久久精品亚洲人成影院| 色88888久久久久久影院| 天堂√8在线中文| 亚洲精品福利电影| 欧洲亚洲一区二区三区| 少妇精品导航| 成人羞羞在线观看网站| 日韩精品专区| 激情综合在线| 红桃视频国产精品| 久久亚洲视频| 日本精品另类| 美女性感视频久久| 国产精品福利在线观看播放| 三上亚洲一区二区| 精品捆绑调教一区二区三区| 999国产精品视频| 国产精品88久久久久久| 午夜在线精品| 涩涩涩久久久成人精品| 欧美啪啪一区| 美女高潮久久久| 91视频精品| 亚洲性图久久| 亚洲三级网址| 久久亚洲道色| 亚洲调教视频在线观看| 视频一区二区三区入口| 欧美视频二区| 国产成人精品免费视| 樱桃视频成人在线观看| 久久蜜桃av| 久久最新视频| 国产精品伊人| 久久精品影视| 日韩视频一二区| 国产精品麻豆久久| 中文国产一区| 国产精品二区影院| 亚洲午夜黄色| 欧美日韩99| 日韩高清中文字幕一区二区| 中文一区一区三区免费在线观| 国产伦乱精品| 亚洲婷婷在线| 日韩精品导航| 高潮一区二区| 中文字幕乱码亚洲无线精品一区| 久久gogo国模啪啪裸体| 久久九九电影| 日韩av不卡在线观看| 欧美香蕉视频| 日韩 欧美一区二区三区| 国产精品99一区二区三区| 亚洲欧美日本国产专区一区| 免费在线亚洲欧美| 亚洲欧美日本日韩| 高清日韩中文字幕| 亚洲精品激情| 亚洲伦乱视频| 午夜电影一区| 久久精品不卡| 欧美aⅴ一区二区三区视频| 在线综合欧美| 国产91在线精品| 欧美一区二区三区久久| 91精品国产91久久久久久黑人| 日韩精品视频在线看| 1000部精品久久久久久久久| 国产精品久久| 亚洲在线久久| 亚洲国产一区二区在线观看| 国产在视频一区二区三区吞精| 噜噜噜久久亚洲精品国产品小说| 欧美www视频在线观看| 日韩影院精彩在线| 亚洲伦乱视频| 麻豆一区在线| 日韩美女精品| 亚洲欧美日韩一区在线观看| 日韩欧美在线中字| 国产乱子精品一区二区在线观看| 欧美午夜不卡影院在线观看完整版免费| 精品丝袜久久| 国产三级一区| 日韩精品视频一区二区三区| 亚洲欧洲一区| 999久久久91| 国产拍在线视频| 你懂的国产精品永久在线| 亚洲精选91| 中文不卡在线| 丝袜国产日韩另类美女| av亚洲在线观看| se01亚洲视频 | 麻豆国产在线| 美女视频免费精品| 欧美日韩1区| 日本中文字幕视频一区| 亚洲综合丁香| 五月精品视频| 亚洲午夜一级| 久久伦理在线| 91精品国产福利在线观看麻豆| 成人国产精品久久| 精品一区二区三区中文字幕视频| 国产精品天天看天天狠| 91欧美极品| 国产伦理一区| 国产精品一在线观看| 国产精品大片免费观看| 国产精品入口久久|