国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

計算機視覺----圖像拼接

這篇具有很好參考價值的文章主要介紹了計算機視覺----圖像拼接。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?一.簡介

圖像拼接(Image Stitching)是一種利用實景圖像組成全景空間的技術(shù),它將多幅圖像拼接成一幅大尺度圖像或360度全景圖,接可以看做是場景重建的一種特殊情況,其中圖像僅通過平面單應性進行關(guān)聯(lián)。圖像拼接在運動檢測和跟蹤,增強現(xiàn)實,分辨率增強,視頻壓縮和圖像穩(wěn)定等機器視覺領(lǐng)域有很大的應用。圖像拼接的輸出是兩個輸入圖像的并集。通常用到四個步驟:(1)特征提取(Feature Extraction):檢測輸入圖像中的特征點。(2)圖像配準(Image Registration):建立了圖像之間的幾何對應關(guān)系,使它們可以在一個共同的參照系中進行變換、比較和分析。(3)圖像變形(Warping):圖像變形是指將其中一幅圖像的圖像重投影,并將圖像放置在更大的畫布上。(4)圖像融合(Blending):圖像融合是通過改變邊界附近的圖像灰度級,去除這些縫隙,創(chuàng)建混合圖像,從而在圖像之間實現(xiàn)平滑過渡?;旌夏J?Blend modes)用于將兩層融合到一起。

二.實現(xiàn)方法

(1)用SIFT提取圖像中的特征點,并對每個關(guān)鍵點周圍的區(qū)域計算特征向量??梢允褂帽萐IFT快的SURF方法,但是我的opencv版本為最新版,不知道是專利的原因還是什么原因用SURF = cv2.xfeatures2D.SURF_create ()實例化的時候會報錯,網(wǎng)上說可以退opencv版本,但是我這里沒有嘗試,就用了sift = cv2.SIFT_create()。
(2)在分別提取好了兩張圖片的關(guān)鍵點和特征向量以后,可以利用它們進行兩張圖片的匹配。在拼接圖片中,可以使用Knn進行匹配,但是使用FLANN快速匹配庫更快,圖片拼接,需要用到FLANN的單應性匹配。
(3)單應性匹配完之后可以獲得透視變換H矩陣,用這個的逆矩陣來對第二幅圖片進行透視變換,將其轉(zhuǎn)到和第一張圖一樣的視角,為下一步拼接做準備。
(4)透視變化完后就可以直接拼接圖片了,將圖片通過numpy直接加到透視變化完成的圖像的左邊,覆蓋掉重合的部分,得到拼接圖片,但是這樣拼接得圖片中間會有一條很明顯的縫隙,可以通過加權(quán)平均法,界線的兩側(cè)各取一定的比例來融合縫隙,速度快,但不自然?;蛘哂鸹ǎ蛘呃绽菇鹱炙诤希Ч詈?。在這里用的是加權(quán)平均法,可以把第一張圖疊在左邊,但是對第一張圖和它的重疊區(qū)做一些加權(quán)處理,重疊部分,離左邊圖近的,左邊圖的權(quán)重就高一些,離右邊近的,右邊旋轉(zhuǎn)圖的權(quán)重就高一些,然后兩者相加,使得過渡是平滑地,這樣看上去效果好一些,速度就比較慢。

三.實驗圖片

圖像拼接,計算機視覺,opencv,圖像處理

圖像拼接,計算機視覺,opencv,圖像處理

?

?

四.實驗

4.1 直接拼接

代碼如下:

#導入庫
import cv2
import numpy as np
import sys
from PIL import Image
#圖像顯示函數(shù)
def show(name,img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
#讀取輸入圖片
ima = cv2.imread("p2.jpg")
imb = cv2.imread("p1.jpg")
A = ima.copy()
B = imb.copy()
imageA = cv2.resize(A,(0,0),fx=0.2,fy=0.2)
imageB = cv2.resize(B,(0,0),fx=0.2,fy=0.2)
#檢測A、B圖片的SIFT關(guān)鍵特征點,并計算特征描述子
def detectAndDescribe(image):
    # 建立SIFT生成器
    sift = cv2.SIFT_create()
    # 檢測SIFT特征點,并計算描述子
    (kps, features) = sift.detectAndCompute(image, None)
    # 將結(jié)果轉(zhuǎn)換成NumPy數(shù)組
    kps = np.float32([kp.pt for kp in kps])
    # 返回特征點集,及對應的描述特征
    return (kps, features)

#檢測A、B圖片的SIFT關(guān)鍵特征點,并計算特征描述子
kpsA, featuresA = detectAndDescribe(imageA)
kpsB, featuresB = detectAndDescribe(imageB)
# 建立暴力匹配器
bf = cv2.BFMatcher()
# 使用KNN檢測來自A、B圖的SIFT特征匹配對,K=2
matches = bf.knnMatch(featuresA, featuresB, 2)
good = []
for m in matches:
    # 當最近距離跟次近距離的比值小于ratio值時,保留此匹配對
    if len(m) == 2 and m[0].distance < m[1].distance * 0.75:
        # 存儲兩個點在featuresA, featuresB中的索引值
        good.append((m[0].trainIdx, m[0].queryIdx))

# 當篩選后的匹配對大于4時,計算視角變換矩陣
if len(good) > 4:
    # 獲取匹配對的點坐標
    ptsA = np.float32([kpsA[i] for (_, i) in good])
    ptsB = np.float32([kpsB[i] for (i, _) in good])
    # 計算視角變換矩陣
    H, status = cv2.findHomography(ptsA, ptsB, cv2.RANSAC,4.0)

# 匹配兩張圖片的所有特征點,返回匹配結(jié)果
M = (matches, H, status)
# 如果返回結(jié)果為空,沒有匹配成功的特征點,退出程序
if M is None:
    print("無匹配結(jié)果")
    sys.exit()
# 否則,提取匹配結(jié)果
# H是3x3視角變換矩陣
(matches, H, status) = M
# 將圖片A進行視角變換,result是變換后圖片
result = cv2.warpPerspective(imageA, H, (imageA.shape[1] + imageB.shape[1], imageA.shape[0]))
# 將圖片B傳入result圖片最左端
result[0:imageB.shape[0], 0:imageB.shape[1]] = imageB
show('res',result)
print(result.shape)

直接憑借得到的結(jié)果如下:

圖像拼接,計算機視覺,opencv,圖像處理
我們可以看到在圖像拼接出有明顯的縫隙:

圖像拼接,計算機視覺,opencv,圖像處理

4.2 進行Multi-band Blending處理縫隙

代碼如下:

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

def show(name,img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

MIN = 10
FLANN_INDEX_KDTREE = 0
starttime = time.time()
img1 = cv2.imread(r'D:\software\pycharm\PycharmProjects\computer-version\data\p1.jpg') #query
img2 = cv2.imread(r'D:\software\pycharm\PycharmProjects\computer-version\data\p2.jpg') #train
imageA = cv2.resize(img1,(0,0),fx=0.2,fy=0.2)
imageB = cv2.resize(img2,(0,0),fx=0.2,fy=0.2)
surf=cv2.xfeatures2d.SIFT_create()#可以改為SIFT
sift = cv2.SIFT_create()
kp1,descrip1 = sift.detectAndCompute(imageA,None)
kp2,descrip2 = sift.detectAndCompute(imageB,None)
#創(chuàng)建字典
indexParams = 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)

# 當篩選后的匹配對大于10時,計算視角變換矩陣
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(imageB, np.linalg.inv(M), (imageA.shape[1]+imageB.shape[1], imageB.shape[0]))
    direct=warpImg.copy()
    direct[0:imageA.shape[0], 0:imageB.shape[1]] =imageA
    simple=time.time()

show('res',warpImg)
rows,cols=imageA.shape[:2]
print(rows)
print(cols)
for col in range(0,cols):
    # 開始重疊的最左端
    if imageA[:, col].any() and warpImg[:, col].any():
        left = col
        print(left)
        break

for col in range(cols-1, 0, -1):
    #重疊的最右一列
    if imageA[:, col].any() and warpImg[:, col].any():
        right = col
        print(right)
        break

# Multi-band Blending算法
levels = 6
gaussian = cv2.getGaussianKernel(5, 0)
gaussian_pyramid_imageA = [imageA]
gaussian_pyramid_imageB = [warpImg]
laplacian_pyramid_imageA = [imageA]
laplacian_pyramid_imageB = [warpImg]

for i in range(levels):
    gaussian_imageA = cv2.pyrDown(gaussian_pyramid_imageA[i])
    gaussian_imageB = cv2.pyrDown(gaussian_pyramid_imageB[i])
    gaussian_pyramid_imageA.append(gaussian_imageA)
    gaussian_pyramid_imageB.append(gaussian_imageB)

for i in range(levels, 0, -1):
    laplacian_imageA = cv2.subtract(gaussian_pyramid_imageA[i-1], cv2.pyrUp(gaussian_pyramid_imageA[i], dstsize=gaussian_pyramid_imageA[i-1].shape[:2]))
    laplacian_imageB = cv2.subtract(gaussian_pyramid_imageB[i-1], cv2.pyrUp(gaussian_pyramid_imageB[i], dstsize=gaussian_pyramid_imageB[i-1].shape[:2]))
    laplacian_pyramid_imageA.append(laplacian_imageA)
    laplacian_pyramid_imageB.append(laplacian_imageB)

gaussian_pyramid_mask = [np.ones((imageA.shape[0]//(2**levels), imageA.shape[1]//(2**levels)), np.float32)]
for i in range(levels):
    gaussian_mask = cv2.pyrDown(gaussian_pyramid_mask[i])
    gaussian_pyramid_mask.append(gaussian_mask)

laplacian_pyramid = []
n = 0
for laplacian_imageA, laplacian_imageB, gaussian_mask in zip(laplacian_pyramid_imageA, laplacian_pyramid_imageB, gaussian_pyramid_mask[::-1]):
    rows, cols, dpt = laplacian_imageA.shape
    n += 1
    laplacian = np.zeros((rows, cols, dpt), np.float32)
    for row in range(rows):
        for col in range(cols):
            if gaussian_mask[row, col] == 1:
                laplacian[row, col] = laplacian_imageA[row, col]
            else:
                laplacian[row, col] = laplacian_imageB[row, col]
    laplacian_pyramid.append(laplacian)

#重建圖像
image_reconstruct = laplacian_pyramid[0]
for i in range(1, levels):
    image_reconstruct = cv2.pyrUp(image_reconstruct, dstsize=laplacian_pyramid[i].shape[:2])
    image_reconstruct = cv2.add(image_reconstruct, laplacian_pyramid[i])

for row in range(0, imageA.shape[0]):
    for col in range(0, left):
        if image_reconstruct[row, col].all() == 0:
            image_reconstruct[row, col] = imageA[row, col]

cv2.imshow('result', image_reconstruct)
cv2.waitKey(0)
cv2.destroyAllWindows()

結(jié)果如下:

?圖像拼接,計算機視覺,opencv,圖像處理

?分析:從圖中可以看出使用Multi-band Blending進行圖像平滑后,拼接處的縫隙得到了改善。但是不知道什么原因,左邊圖像是黑色的。查閱資料發(fā)現(xiàn):如果圖片旁出現(xiàn)了黑色部分,是因為圖片無法填充滿,可以試試拍攝時角度變化大一些??梢試L試通過blending進行融合來達到更好的效果。但是經(jīng)過試驗也沒有解決。文章來源地址http://www.zghlxwxcb.cn/news/detail-697613.html

到了這里,關(guān)于計算機視覺----圖像拼接的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • OpenCV處理圖像和計算機視覺任務(wù)時常見的算法和功能

    當涉及到OpenCV處理圖像和計算機視覺任務(wù)時,有許多常見的具體算法和功能。以下是一些更具體的細分: 圖像處理算法: 圖像去噪 :包括均值去噪、高斯去噪、中值濾波等,用于減少圖像中的噪聲。 直方圖均衡化 :用于增強圖像的對比度,特別適用于低對比度圖像。 邊緣

    2024年02月11日
    瀏覽(30)
  • 計算機視覺----圖像拼接

    計算機視覺----圖像拼接

    ?一.簡介 圖像拼接(Image Stitching)是一種利用實景圖像組成全景空間的技術(shù),它將多幅圖像拼接成一幅大尺度圖像或360度全景圖,接可以看做是場景重建的一種特殊情況,其中圖像僅通過平面單應性進行關(guān)聯(lián)。圖像拼接在運動檢測和跟蹤,增強現(xiàn)實,分辨率增強,視頻壓縮和圖

    2024年02月09日
    瀏覽(20)
  • 計算機視覺--圖像拼接

    計算機視覺--圖像拼接

    單應性變換是指一個平面上的點通過一個矩陣變換映射到另一個平面上的點,這個變換矩陣是一個 3 × 3 3 times 3 3 × 3 的矩陣,稱為單應性矩陣。單應性變換可以分為仿射變換和投影變換兩種類型。 在單應性變換中,仿射變換是其中一種特殊的變換。仿射變換是指在變換前后

    2024年02月04日
    瀏覽(28)
  • 計算機視覺(三)圖像拼接

    計算機視覺(三)圖像拼接

    1.1 流程 要拼接多張圖像,就一定要找到他們之間的映射關(guān)系,流程如下: 得到映射關(guān)系,就能進行拼接: 簡而言之,拼接兩張圖像,就是找到他們的特征點,根據(jù)這些特征點: 1.2 映射與處理 找到兩張圖像的像素點對應關(guān)系,然后把第二張圖像映射到在第一張圖像的坐標系

    2024年02月05日
    瀏覽(19)
  • 計算機視覺基礎(chǔ)學習-圖像拼接

    計算機視覺基礎(chǔ)學習-圖像拼接

    首先本文介紹的圖像拼接并非對尺寸相同的圖片進行簡單拼接,而是基于全景圖的拼接 普通相機拍攝圖像時,無法兼顧相機視場與視場中單個物體的分辨率問題,而全景相機普遍價格昂貴, 不適用于低成本的一般性場景。為了使用普通相機獲取寬視角,甚至是 360°全景圖像

    2023年04月10日
    瀏覽(26)
  • Python計算機視覺(三)—圖像拼接

    Python計算機視覺(三)—圖像拼接

    ? ? 圖像拼接是計算機視覺中的重要分支,它是將兩幅以上的具有部分重疊的圖像進行拼接從而得到較高分辨率或?qū)捯暯堑膱D像。本文將結(jié)合python+opencv實現(xiàn)兩幅圖像的拼接。 ? ? 圖像拼接一般步驟: 1.根據(jù)給定圖像/集,實現(xiàn)特征匹配 2.通過匹配特征計算圖像之間的變換結(jié)構(gòu)

    2024年02月15日
    瀏覽(23)
  • 【計算機視覺】數(shù)字圖像處理(六)—— 圖像壓縮

    【計算機視覺】數(shù)字圖像處理(六)—— 圖像壓縮

    (一)、圖像編碼技術(shù)的研究背景 1. 信息信息傳輸方式發(fā)生了很大的改變 通信方式的改變 文字+語音 圖像+文字+語音 通信對象的改變 人與人 人與機器,機器與機器 2. 圖像傳輸與存儲需要的信息量空間 (1)彩色視頻信息 對于電視畫面的分辨率640 480的彩色圖像,每秒30幀,

    2024年02月05日
    瀏覽(96)
  • 【計算機視覺】數(shù)字圖像處理(四)—— 圖像增強

    【計算機視覺】數(shù)字圖像處理(四)—— 圖像增強

    圖像增強是采用一系列技術(shù)去改善圖像的視覺效果,或?qū)D像轉(zhuǎn)換成一種更適合于人或機器進行分析和處理的形式。例如采用一系列技術(shù)有選擇地突出某些感興趣的信息,同時抑制一些不需要的信息,提高圖像的使用價值。 圖像增強方法 圖像增強方法從增強的作用域出發(fā),可

    2023年04月16日
    瀏覽(92)
  • 目標檢測 圖像處理 計算機視覺 工業(yè)視覺

    目標檢測 圖像處理 計算機視覺 工業(yè)視覺

    從事ai視覺算法有幾年了,本帖是對以往做過的計算機視覺項目的一些總結(jié),硬件部署的大多是基于nvidia的開發(fā)板和GPU服務(wù)器上,如jetson nano,還有地平線J3J5和瑞芯微以及星辰的開發(fā)板,另外就是對實時性要求不高的部署在cpu上。有相關(guān)項目需求可以一起交流和學習。(+v 3

    2024年02月06日
    瀏覽(106)
  • 計算機視覺——圖像處理基礎(chǔ)

    隨著計算機視覺的不斷發(fā)展,圖像的預處理成為分析圖像的必然前提,本文就介紹圖像處理的基礎(chǔ)內(nèi)容。 圖像中,高頻部分是圖像中像素值落差很大的部分,如圖像邊緣,該部分的有用信息經(jīng)常被噪聲淹沒。降低高頻段的噪聲是設(shè)計圖像濾波器的關(guān)鍵。 圖像濾波器就是一個

    2024年01月19日
    瀏覽(34)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包