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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python 图像拼接

發布時間:2023/12/18 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 图像拼接 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python 圖像拼接

  • 圖像拼接
    • 1.1 基本介紹
    • 1.2 基本原理
      • 1.2.1 解決“鬼影”:APAP算法
      • 1.2.2 尋找最佳拼接縫
      • 1.2.3 圖像融合
    • 1.3 實驗過程
      • 1.3.1 實驗代碼
      • 1.3.2 實驗結果
      • 1.3.3 結果分析

圖像拼接

1.1 基本介紹

??圖像拼接技術就是將數張有重疊部分的圖像(可能是不同時間、不同視角或者不同傳感器獲得的)拼成一幅無縫的全景圖或高分辨率圖像的技術。圖像拼接在醫學成像、計算機視覺、衛星數據、軍事目標自動識別等領域具有重要意義。
??圖像配準(image alignment)和圖像融合是圖像拼接的兩個關鍵技術。圖像配準是圖像融合的基礎,而且圖像配準算法的計算量一般非常大,因此圖像拼接技術的發展很大程度上取決于圖像配準技術的創新。早期的圖像配準技術主要采用點匹配法,這類方法速度慢、精度低,而且常常需要人工選取初始匹配點,無法適應大數據量圖像的融合。圖像拼接的方法很多,不同的算法步驟會有一定差異,但大致的過程是相同的。

1.2 基本原理

??在圖像拼接中首先利用SIFT算法提取圖像特征進而進行特征匹配,繼而使用RANSAC算法對特征匹配的結果進行優化,接著利用圖像變換結構進行圖像映射,最終進行圖像融合。

1.2.1 解決“鬼影”:APAP算法

算法流程:

  • 提取兩張圖片的sift特征點
  • 對兩張圖片的特征點進行匹配
  • 匹配后,使用RANSAC算法進行特征點對的篩選,排除錯誤點。篩選后的特征點基本能夠一一對應
  • 使用DLT算法,將剩下的特征點對進行透視變換矩陣的估計
  • 由于得到的透視變換矩陣是基于全局特征點對進行的,即一個剛性的單應性矩陣完成配準。為提高配準的精度,Apap將圖像切割成無數多個小方塊,對每個小方塊進行單應性矩陣變換,非常依賴于特征點對。若圖像高頻信息較少,特征點對過少,配準將完全失效,并且對大尺度的圖像進行配準,其效果也不是很好,一切都決定于特征點對的數量。

1.2.2 尋找最佳拼接縫

為什么尋找最佳拼接縫?
??因為圖像的重疊導致了重影,解決方式就是不讓圖片重疊。具體的方式是在圖像重疊的區域中找到一條切割線,使得在切割線的左邊用圖片A,在切割線的右邊用圖片B,則就解決了圖像拼接后因為重疊而導致的重影問題。

尋找原則:
??要找到一條好的切割線,就要在線的左右兩邊圖像的像素差異比較小,這樣切割出來的效果,就沒有強烈的違和感。

1.2.3 圖像融合

??采用Laplacian(拉普拉斯)金字塔,通過對相鄰兩層的高斯金字塔進行差分,將原圖分解成不同尺度的子圖,對每一個之圖進行加權平均,得到每一層的融合結果,最后進行金字塔的反向重建,得到最終融合效果過程。

  • 首先計算當前待拼接圖像和已合成圖像的重疊部分。

  • 兩幅圖像的融合:分別構建圖像A、B的高斯金字塔和拉普拉斯金字塔,然后進行加權融合。

  • 對加權后的拉普拉斯金字塔進行重構。

  • 1.3 實驗過程

    1.3.1 實驗代碼

    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)# 將匹配轉換成齊次坐標點的函數 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# 估計單應性矩陣 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 實驗結果

    拼接圖像數據集:

    特征匹配結果:


    圖像拼接結果:

    1.3.3 結果分析

    ??實驗需要用到五張圖片,仔細觀察實驗結果發現中間部分的圖片拼接的相對比較好,但是拼接處明暗差距比較明顯。邊緣的兩張圖片首先是出現了錯位的情況,使得周邊環境拼接跡象明顯且有一點傾斜。其次是有棵樹的位置出現錯誤。仔細觀察采集的圖像,發現雖然圖像間有相同的部分并且定點拍攝,但是拍攝角度把控得不是很好,邊緣兩張圖片中有兩棵樹很相似,導致左側的樹拼接到了右側。左側周邊環境中的樹反而缺失了。并且由于拍攝得不是很好,建筑頂部和建筑前面的空地沒有在最終的圖像拼接中體現出來,被裁減掉了,只保留了中間部分。

    ??在經過多次嘗試后又考慮到圖片的順序會不會對結果有影響,原定采用從左到右的圖片順序,于是考慮嘗試用從右到左的圖片順序,經過多次嘗試后發現從右到左的圖片拼接效果要比從左到右的拼接效果更好,不僅減少了錯位的狀況,也沒有圖片順序出錯的問題。
    圖片順序從左到右:

    圖片順序從右到左:

    ??日常生活中,一般手機都具備了全景拍攝的功能,期間的原理就包含了圖像拼接,通常會有沿水平線勻速平穩移動鏡頭的提示,目的就是為了采集到盡可能好的圖像數據集合,使得最終的拼接效果更好,如果采集時的偏差大,就會出現像本次實驗結果一樣的狀況。不僅拼接處痕跡明顯,還可能會有錯位的情況。

    ??本次實驗中,圖像的像素大小會影響代碼的運行速度,建議縮小一下圖像的像素再運行,其次每張圖片的長寬需相同,否則就會出現下面這個錯誤

    總結

    以上是生活随笔為你收集整理的Python 图像拼接的全部內容,希望文章能夠幫你解決所遇到的問題。

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