Python 图像拼接
Python 圖像拼接
- 圖像拼接
- 1.1 基本介紹
- 1.2 基本原理
- 1.2.1 解決“鬼影”:APAP算法
- 1.2.2 尋找最佳拼接縫
- 1.2.3 圖像融合
- 1.3 實(shí)驗(yàn)過程
- 1.3.1 實(shí)驗(yàn)代碼
- 1.3.2 實(shí)驗(yàn)結(jié)果
- 1.3.3 結(jié)果分析
圖像拼接
1.1 基本介紹
??圖像拼接技術(shù)就是將數(shù)張有重疊部分的圖像(可能是不同時間、不同視角或者不同傳感器獲得的)拼成一幅無縫的全景圖或高分辨率圖像的技術(shù)。圖像拼接在醫(yī)學(xué)成像、計算機(jī)視覺、衛(wèi)星數(shù)據(jù)、軍事目標(biāo)自動識別等領(lǐng)域具有重要意義。
??圖像配準(zhǔn)(image alignment)和圖像融合是圖像拼接的兩個關(guān)鍵技術(shù)。圖像配準(zhǔn)是圖像融合的基礎(chǔ),而且圖像配準(zhǔn)算法的計算量一般非常大,因此圖像拼接技術(shù)的發(fā)展很大程度上取決于圖像配準(zhǔn)技術(shù)的創(chuàng)新。早期的圖像配準(zhǔn)技術(shù)主要采用點(diǎn)匹配法,這類方法速度慢、精度低,而且常常需要人工選取初始匹配點(diǎn),無法適應(yīng)大數(shù)據(jù)量圖像的融合。圖像拼接的方法很多,不同的算法步驟會有一定差異,但大致的過程是相同的。
1.2 基本原理
??在圖像拼接中首先利用SIFT算法提取圖像特征進(jìn)而進(jìn)行特征匹配,繼而使用RANSAC算法對特征匹配的結(jié)果進(jìn)行優(yōu)化,接著利用圖像變換結(jié)構(gòu)進(jìn)行圖像映射,最終進(jìn)行圖像融合。
1.2.1 解決“鬼影”:APAP算法
算法流程:
- 提取兩張圖片的sift特征點(diǎn)
- 對兩張圖片的特征點(diǎn)進(jìn)行匹配
- 匹配后,使用RANSAC算法進(jìn)行特征點(diǎn)對的篩選,排除錯誤點(diǎn)。篩選后的特征點(diǎn)基本能夠一一對應(yīng)
- 使用DLT算法,將剩下的特征點(diǎn)對進(jìn)行透視變換矩陣的估計
- 由于得到的透視變換矩陣是基于全局特征點(diǎn)對進(jìn)行的,即一個剛性的單應(yīng)性矩陣完成配準(zhǔn)。為提高配準(zhǔn)的精度,Apap將圖像切割成無數(shù)多個小方塊,對每個小方塊進(jìn)行單應(yīng)性矩陣變換,非常依賴于特征點(diǎn)對。若圖像高頻信息較少,特征點(diǎn)對過少,配準(zhǔn)將完全失效,并且對大尺度的圖像進(jìn)行配準(zhǔn),其效果也不是很好,一切都決定于特征點(diǎn)對的數(shù)量。
1.2.2 尋找最佳拼接縫
為什么尋找最佳拼接縫?
??因?yàn)閳D像的重疊導(dǎo)致了重影,解決方式就是不讓圖片重疊。具體的方式是在圖像重疊的區(qū)域中找到一條切割線,使得在切割線的左邊用圖片A,在切割線的右邊用圖片B,則就解決了圖像拼接后因?yàn)橹丿B而導(dǎo)致的重影問題。
尋找原則:
??要找到一條好的切割線,就要在線的左右兩邊圖像的像素差異比較小,這樣切割出來的效果,就沒有強(qiáng)烈的違和感。
1.2.3 圖像融合
??采用Laplacian(拉普拉斯)金字塔,通過對相鄰兩層的高斯金字塔進(jìn)行差分,將原圖分解成不同尺度的子圖,對每一個之圖進(jìn)行加權(quán)平均,得到每一層的融合結(jié)果,最后進(jìn)行金字塔的反向重建,得到最終融合效果過程。
首先計算當(dāng)前待拼接圖像和已合成圖像的重疊部分。
兩幅圖像的融合:分別構(gòu)建圖像A、B的高斯金字塔和拉普拉斯金字塔,然后進(jìn)行加權(quán)融合。
對加權(quán)后的拉普拉斯金字塔進(jìn)行重構(gòu)。
1.3 實(shí)驗(yàn)過程
1.3.1 實(shí)驗(yàn)代碼
from numpy import * from matplotlib.pyplot import * from PIL import Image from numpy import array, vstack, dotimport warp import homography from PCV.localdescriptors import siftfeatname = ['img/' + str(i + 1) + '.sift' for i in range(5)] imname = ['img/' + str(i + 1) + '.jpg' for i in range(5)] l = {} d = {} for i in range(5):sift.process_image(imname[i], featname[i])l[i], d[i] = sift.read_features_from_file(featname[i])matches = {} for i in range(4):matches[i] = sift.match(d[i + 1], d[i])# visualize the matches (Figure 3-11 in the book) for i in range(4):im1 = array(Image.open(imname[i]))im2 = array(Image.open(imname[i + 1]))figure()sift.plot_matches(im2, im1, l[i + 1], l[i], matches[i], show_below=True)# 將匹配轉(zhuǎn)換成齊次坐標(biāo)點(diǎn)的函數(shù) def convert_points(j):ndx = matches[j].nonzero()[0]fp = homography.make_homog(l[j + 1][ndx, :2].T)ndx2 = [int(matches[j][i]) for i in ndx]tp = homography.make_homog(l[j][ndx2, :2].T)# switch x and y - TODO this should move elsewherefp = vstack([fp[1], fp[0], fp[2]])tp = vstack([tp[1], tp[0], tp[2]])return fp, tp# 估計單應(yīng)性矩陣 model = homography.RanSacModel()fp, tp = convert_points(1) H_12 = homography.H_from_ransac(fp, tp, model)[0] # im 1 to 2fp, tp = convert_points(0) H_01 = homography.H_from_ransac(fp, tp, model)[0] # im 0 to 1tp, fp = convert_points(2) # NB: reverse order H_32 = homography.H_from_ransac(fp, tp, model)[0] # im 3 to 2tp, fp = convert_points(3) # NB: reverse order H_43 = homography.H_from_ransac(fp, tp, model)[0] # im 4 to 3# 扭曲圖像 # img delta # delta = 100 # 用于填充和平移 for padding and translation # libraryimg delta delta = 2000im1 = array(Image.open(imname[1]), "uint8") im2 = array(Image.open(imname[2]), "uint8") im_12 = warp.panorama(H_12, im1, im2, delta, delta)im1 = array(Image.open(imname[0]), "f") im_02 = warp.panorama(dot(H_12, H_01), im1, im_12, delta, delta)im1 = array(Image.open(imname[3]), "f") im_32 = warp.panorama(H_32, im1, im_02, delta, delta)im1 = array(Image.open(imname[4]), "f") im_42 = warp.panorama(dot(H_32, H_43), im1, im_32, delta, 2 * delta)figure() imshow(array(im_42, "uint8")) axis('off') show()1.3.2 實(shí)驗(yàn)結(jié)果
拼接圖像數(shù)據(jù)集:
特征匹配結(jié)果:
圖像拼接結(jié)果:
1.3.3 結(jié)果分析
??實(shí)驗(yàn)需要用到五張圖片,仔細(xì)觀察實(shí)驗(yàn)結(jié)果發(fā)現(xiàn)中間部分的圖片拼接的相對比較好,但是拼接處明暗差距比較明顯。邊緣的兩張圖片首先是出現(xiàn)了錯位的情況,使得周邊環(huán)境拼接跡象明顯且有一點(diǎn)傾斜。其次是有棵樹的位置出現(xiàn)錯誤。仔細(xì)觀察采集的圖像,發(fā)現(xiàn)雖然圖像間有相同的部分并且定點(diǎn)拍攝,但是拍攝角度把控得不是很好,邊緣兩張圖片中有兩棵樹很相似,導(dǎo)致左側(cè)的樹拼接到了右側(cè)。左側(cè)周邊環(huán)境中的樹反而缺失了。并且由于拍攝得不是很好,建筑頂部和建筑前面的空地沒有在最終的圖像拼接中體現(xiàn)出來,被裁減掉了,只保留了中間部分。
??在經(jīng)過多次嘗試后又考慮到圖片的順序會不會對結(jié)果有影響,原定采用從左到右的圖片順序,于是考慮嘗試用從右到左的圖片順序,經(jīng)過多次嘗試后發(fā)現(xiàn)從右到左的圖片拼接效果要比從左到右的拼接效果更好,不僅減少了錯位的狀況,也沒有圖片順序出錯的問題。
圖片順序從左到右:
圖片順序從右到左:
??日常生活中,一般手機(jī)都具備了全景拍攝的功能,期間的原理就包含了圖像拼接,通常會有沿水平線勻速平穩(wěn)移動鏡頭的提示,目的就是為了采集到盡可能好的圖像數(shù)據(jù)集合,使得最終的拼接效果更好,如果采集時的偏差大,就會出現(xiàn)像本次實(shí)驗(yàn)結(jié)果一樣的狀況。不僅拼接處痕跡明顯,還可能會有錯位的情況。
??本次實(shí)驗(yàn)中,圖像的像素大小會影響代碼的運(yùn)行速度,建議縮小一下圖像的像素再運(yùn)行,其次每張圖片的長寬需相同,否則就會出現(xiàn)下面這個錯誤
總結(jié)
以上是生活随笔為你收集整理的Python 图像拼接的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019-新年新计划
- 下一篇: 风云人物——李一男