最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實現(xiàn)圖像全景拼接

 更新時間:2020年03月27日 11:03:05   作者:Zhansijing  
這篇文章主要為大家詳細介紹了python實現(xiàn)圖像全景拼接,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

圖像的全景拼接包括三大部分:特征點提取與匹配、圖像配準、圖像融合。

1、基于SIFT的特征點的提取與匹配

利用Sift提取圖像的局部特征,在尺度空間尋找極值點,并提取出其位置、尺度、方向信息。

具體步驟:

1). 生成高斯差分金字塔(DOG金字塔),尺度空間構(gòu)建

2). 空間極值點檢測(關鍵點的初步查探)

3). 穩(wěn)定關鍵點的精確定位

4). 穩(wěn)定關鍵點方向信息分配

5). 關鍵點描述

6). 特征點匹配

2、圖像配準

圖像配準是一種確定待拼接圖像間的重疊區(qū)域以及重疊位置的技術(shù),它是整個圖像拼接的核心。本節(jié)采用的是基于特征點的圖像配準方法,即通過匹配點對構(gòu)建圖像序列之間的變換矩陣,從而完成全景圖像的拼接。

變換矩陣H求解是圖像配準的核心,其求解的算法流程如下。

1)檢測每幅圖像中特征點。

2)計算特征點之間的匹配。

3)計算圖像間變換矩陣的初始值。

4)迭代精煉H變換矩陣。

5)引導匹配。用估計的H去定義對極線附近的搜索區(qū)域,進一步確定特征點的對應。

6)重復迭代4)和5)直到對應點的數(shù)目穩(wěn)定為止。

設圖像序列之間的變換為投影變換

可用4組最佳匹配計算出H矩陣的8 個自由度參數(shù)hi=( i=0,1,...,7),并以此作為初始值。

為了提高圖像配準的精度,本節(jié)采用RANSAC算法對圖像變換矩陣進行求解與精煉,達到了較好的圖像拼接效果。RANSAC算法的思想簡單而巧妙:首先隨機地選擇兩個點,這兩個點確定了一條直線,并且稱在這條直線的一定范圍內(nèi)的點為這條直線的支撐。這樣的隨機選擇重復數(shù)次,然后,具有最大支撐集的直線被確認為是樣本點集的擬合。在擬合的誤差距離范圍內(nèi)的點被認為是內(nèi)點,它們構(gòu)成一致集,反之則為外點。根據(jù)算法描述,可以很快判斷,如果只有少量外點,那么隨機選取的包含外點的初始點集確定的直線不會獲得很大的支撐,值得注意的是,過大比例的外點將導致RANSAC算法失敗。在直線擬合的例子中,由點集確定直線至少需要兩個點;而對于透視變換,這樣的最小集合需要有4個點。

3、圖像融合

因為相機和光照強度的差異,會造成一幅圖像內(nèi)部,以及圖像之間亮度的不均勻,拼接后的圖像會出現(xiàn)明暗交替,這樣給觀察造成極大的不便。 亮度與顏色均衡處理,通常的處理方式是通過相機的光照模型,校正一幅圖像內(nèi)部的光照不均勻性,然后通過相鄰兩幅圖像重疊區(qū)域之間的關系,建立相鄰兩幅圖像之間直方圖映射表,通過映射表對兩幅圖像做整體的映射變換,最終達到整體的亮度和顏色的一致性。

具體實現(xiàn):

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

if __name__ == '__main__':
top, bot, left, right = 100, 100, 0, 500
img1 = cv.imread('1.jpg')
img2 = cv.imread('2.jpg')
srcImg = cv.copyMakeBorder(img1, top, bot, left, right, cv.BORDER_CONSTANT, value=(0, 0, 0))
testImg = cv.copyMakeBorder(img2, top, bot, left, right, cv.BORDER_CONSTANT, value=(0, 0, 0))
img1gray = cv.cvtColor(srcImg, cv.COLOR_BGR2GRAY)
img2gray = cv.cvtColor(testImg, cv.COLOR_BGR2GRAY)
sift = cv.xfeatures2d_SIFT().create()
# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1gray, None)
kp2, des2 = sift.detectAndCompute(img2gray, None)
# FLANN parameters
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)
flann = cv.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1, des2, k=2)

# Need to draw only good matches, so create a mask
matchesMask = [[0, 0] for i in range(len(matches))]

good = []
pts1 = []
pts2 = []
# ratio test as per Lowe's paper
for i, (m, n) in enumerate(matches):
if m.distance < 0.7*n.distance:
good.append(m)
pts2.append(kp2[m.trainIdx].pt)
pts1.append(kp1[m.queryIdx].pt)
matchesMask[i] = [1, 0]

draw_params = dict(matchColor=(0, 255, 0),
singlePointColor=(255, 0, 0),
matchesMask=matchesMask,
flags=0)
img3 = cv.drawMatchesKnn(img1gray, kp1, img2gray, kp2, matches, None, **draw_params)
plt.imshow(img3, ), plt.show()

rows, cols = srcImg.shape[:2]
MIN_MATCH_COUNT = 10
if len(good) > MIN_MATCH_COUNT:
src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)
dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2)
M, mask = cv.findHomography(src_pts, dst_pts, cv.RANSAC, 5.0)
warpImg = cv.warpPerspective(testImg, np.array(M), (testImg.shape[1], testImg.shape[0]), flags=cv.WARP_INVERSE_MAP)

for col in range(0, cols):
if srcImg[:, col].any() and warpImg[:, col].any():
left = col
break
for col in range(cols-1, 0, -1):
if srcImg[:, 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 srcImg[row, col].any():
res[row, col] = warpImg[row, col]
elif not warpImg[row, col].any():
res[row, col] = srcImg[row, col]
else:
srcImgLen = float(abs(col - left))
testImgLen = float(abs(col - right))
alpha = srcImgLen / (srcImgLen + testImgLen)
res[row, col] = np.clip(srcImg[row, col] * (1-alpha) + warpImg[row, col] * alpha, 0, 255)

# opencv is bgr, matplotlib is rgb
res = cv.cvtColor(res, cv.COLOR_BGR2RGB)
# show the result
plt.figure()
plt.imshow(res)
plt.show()
else:
print("Not enough matches are found - {}/{}".format(len(good), MIN_MATCH_COUNT))
matchesMask = None

實驗結(jié)果:

1、室內(nèi)場景:

原圖1

原圖2

拼接后:

2、室外場景:

場景1:

原圖1

原圖2

拼接后:

場景2:

原圖1

原圖2

拼接后:

場景3:

原圖1

原圖2

拼接后:

總結(jié):

本文分別針對室內(nèi)和室外兩種情況對兩張圖像做全景拼接,發(fā)現(xiàn)室內(nèi)情況下拼接的效果較為好。在室外場景1情況下,兩張圖像有近景和遠景結(jié)合,兩張圖像拼接后近景的圖像被放大并有一定程度的傾斜;在場景2中,兩張圖像都是遠景,拼接后的效果還不錯但是在拼接后圖像的中上方出現(xiàn)了拼接縫;場景3是在不同明亮程度下圖像的拼接可以發(fā)現(xiàn)拼接后的圖像出現(xiàn)明顯的明暗差距,并且拼接縫明顯兩張圖像沒有很好的拼接在一起,出現(xiàn)很多沒有重合的地方。

本實驗最初是用opencv-contrib3.4.5版本,但是由于sift的專利限制無法使用,隨后用opencv-contriv3.4.2代碼可以運行,不會出現(xiàn)問題。方法:先卸載當前版本的opencv并安裝:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-contrib-python==3.4.2.16

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • python密碼學列置換密碼學習

    python密碼學列置換密碼學習

    這篇文章主要為大家介紹了python密碼學列置換密碼學習的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Python實現(xiàn)簡單的俄羅斯方塊游戲

    Python實現(xiàn)簡單的俄羅斯方塊游戲

    這篇文章主要為大家詳細介紹了Python實現(xiàn)簡單的俄羅斯方塊游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • python抽象基類用法實例分析

    python抽象基類用法實例分析

    這篇文章主要介紹了python抽象基類用法,實例分析了Python抽象基類的使用方法與相關注意事項,需要的朋友可以參考下
    2015-06-06
  • Python實戰(zhàn)之Elasticsearch的高級實現(xiàn)詳解

    Python實戰(zhàn)之Elasticsearch的高級實現(xiàn)詳解

    Elasticsearch是一個功能強大的開源搜索引擎,廣泛應用于各種場景,本文將深入探討如何使用Python與Elasticsearch進行高級實現(xiàn),需要的可以參考下
    2024-04-04
  • Python多線程爬取豆瓣影評API接口

    Python多線程爬取豆瓣影評API接口

    這篇文章主要介紹了Python多線程爬取豆瓣影評API接口,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • keras 多gpu并行運行案例

    keras 多gpu并行運行案例

    這篇文章主要介紹了keras 多gpu并行運行案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python使用openpyxl庫讀寫Excel表格的方法(增刪改查操作)

    python使用openpyxl庫讀寫Excel表格的方法(增刪改查操作)

    這篇文章主要介紹了python使用openpyxl庫讀寫Excel表格的方法(增刪改查操作),本文通過實例圖文相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • Linux下升級安裝python3.8并配置pip及yum的教程

    Linux下升級安裝python3.8并配置pip及yum的教程

    這篇文章主要介紹了Linux下升級安裝python3.8并配置pip及yum的教程,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • python?Django實現(xiàn)增刪改查實戰(zhàn)代碼

    python?Django實現(xiàn)增刪改查實戰(zhàn)代碼

    這篇文章主要介紹了python?Django增刪改查快速體驗,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • python查找與排序算法詳解(示圖+代碼)

    python查找與排序算法詳解(示圖+代碼)

    這篇文章主要介紹了python查找與排序算法詳解(示圖+代碼),文章通過二分查找展開主題詳細內(nèi)容,需要的朋友可以參考一下
    2022-07-07

最新評論

饶河县| 隆化县| 喀喇| 枣庄市| 浦东新区| 怀仁县| 百色市| 河南省| 武安市| 准格尔旗| 正定县| 大宁县| 新源县| 江山市| 南华县| 滁州市| 施甸县| 利辛县| 林甸县| 永仁县| 松潘县| 临邑县| 南康市| 白银市| 荥经县| 毕节市| 如东县| 固始县| 高邑县| 和顺县| 华容县| 阳朔县| 基隆市| 库尔勒市| 当雄县| 安平县| 崇文区| 鄂尔多斯市| 理塘县| 阿坝| 平江县|