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

Python圖像處理之圖像拼接

 更新時間:2021年04月28日 16:49:50   作者:顏夏✘  
這篇文章主要介紹了Python圖像處理之圖像拼接,文中有非常詳細的代碼示例,對正在學習python圖像處理的小伙伴們有非常好的幫助,需要的朋友可以參考下

一、前言

圖像拼接技術(shù)就是將數(shù)張有重疊部分的圖像(可能是不同時間、不同視角或者不同傳感器獲得的)拼成一幅無縫的全景圖或高分辨率圖像的技術(shù)。

二、特征點匹配

特征點具有局部差異性

動機:特征點具有局部差異性

在這里插入圖片描述

圖像梯度

在這里插入圖片描述

Harris矩陣

在這里插入圖片描述
在這里插入圖片描述

以每個點為中心取一個窗口,窗口大小為55或者77,如果這個點具有差異性,往周圍任意方向移動,周圍的環(huán)境變化都是會比較大的,如果滿足這個特性,我們就認為這個特征點具有明顯的局部差異性。在工事中,I表示像素,如果是 彩色圖像就是RGB,灰色圖像就是灰度。(u,v)表示方向。然后對上式進行一階泰勒展開。
Harris矩陣H的特征值分析:

在這里插入圖片描述

矩陣特征值反應(yīng)了兩個垂直方向的變化情況,一個事變化最快的方向,一個事變化最慢的方向

在這里插入圖片描述

在這里插入圖片描述

興趣點位于光滑區(qū)域,不是特征點

在這里插入圖片描述

興趣點位于邊緣區(qū)域

在這里插入圖片描述

興趣點位于角點區(qū)域

所以檢測特征的任務(wù)轉(zhuǎn)化為計算Harris矩陣,判斷特征值大小。

在實際操作中,很少通過計算特征值來判斷,因為計算特征值計算量比較大,取而代之的是Harris角點準則。

三、匹配錯誤的特征點干擾

在進行圖像匹配過程中,如果圖像的噪聲太大,就會使得特征點的匹配發(fā)生了偏差,匹配到了錯誤的點,這種不好的匹配效果,會對后面的圖像拼接產(chǎn)生很大的影響,如下圖

在這里插入圖片描述

四、消除干擾

為了進一步提升匹配精度,可以采用隨機樣本一致性(RANSAC)方法。

因為我們是使用一幅圖像(一個平面物體),我們可以將它定義為剛性的,可以在pattern image和query image的特征點之間找到單應(yīng)性變換(homography transformation )。使用cv::findHomography找到這個單應(yīng)性變換,使用RANSAC找到最佳單應(yīng)性矩陣。(由于這個函數(shù)使用的特征點同時包含正確和錯誤匹配點,因此計算的單應(yīng)性矩陣依賴于二次投影的準確性)

五、RANSAC進行圖像匹配

RANSAC是“RANdom SAmple Consensus(隨機抽樣一致)”的縮寫。它可以從一組包含“局外點”的觀測數(shù)據(jù)集中,通過迭代方式估計數(shù)學模型的參數(shù)。它是一種不確定的算法——它有一定的概率得出一個合理的結(jié)果;為了提高概率必須提高迭代次數(shù)。

RANSAC的基本假設(shè)是:

(1)數(shù)據(jù)由“局內(nèi)點”組成,例如:數(shù)據(jù)的分布可以用一些模型參數(shù)來解釋;
(2)“局外點”是不能適應(yīng)該模型的數(shù)據(jù);
(3)除此之外的數(shù)據(jù)屬于噪聲。

局外點產(chǎn)生的原因有:噪聲的極值;錯誤的測量方法;對數(shù)據(jù)的錯誤假設(shè)。

RANSAC也做了以下假設(shè):給定一組(通常很小的)局內(nèi)點,存在一個可以估計模型參數(shù)的過程;而該模型能夠解釋或者適用于局內(nèi)點。

RANSAC原理

OpenCV中濾除誤匹配對采用RANSAC算法尋找一個最佳單應(yīng)性矩陣H,矩陣大小為3×3。RANSAC目的是找到最優(yōu)的參數(shù)矩陣使得滿足該矩陣的數(shù)據(jù)點個數(shù)最多,通常令h3=1來歸一化矩陣。由于單應(yīng)性矩陣有8個未知參數(shù),至少需要8個線性方程求解,對應(yīng)到點位置信息上,一組點對可以列出兩個方程,則至少包含4組匹配點對。

在這里插入圖片描述

其中(x,y)表示目標圖像角點位置,(x',y')為場景圖像角點位置,s為尺度參數(shù)。

RANSAC算法從匹配數(shù)據(jù)集中隨機抽出4個樣本并保證這4個樣本之間不共線,計算出單應(yīng)性矩陣,然后利用這個模型測試所有數(shù)據(jù),并計算滿足這個模型數(shù)據(jù)點的個數(shù)與投影誤差(即代價函數(shù)),若此模型為最優(yōu)模型,則對應(yīng)的代價函數(shù)最小。

RANSAC算法步驟:

1.隨機從數(shù)據(jù)集中隨機抽出4個樣本數(shù)據(jù) (此4個樣本之間不能共線),計算出單應(yīng)矩陣H,記為模型M;

2.計算數(shù)據(jù)集中所有數(shù)據(jù)與模型M的投影誤差,若誤差小于閾值,加入內(nèi)點集 I ;

3.如果當前內(nèi)點集 I 元素個數(shù)大于最優(yōu)內(nèi)點集 I_best , 則更新 I_best = I,同時更新迭代次數(shù)k ;

4.如果迭代次數(shù)大于k,則退出 ; 否則迭代次數(shù)加1,并重復上述步驟;

注:迭代次數(shù)k在不大于最大迭代次數(shù)的情況下,是在不斷更新而不是固定的;
其中,p為置信度,一般取0.995;w為"內(nèi)點"的比例 ; m為計算模型所需要的最少樣本數(shù)=4;

在這里插入圖片描述
在這里插入圖片描述

使用RANSAC圖片匹配

from numpy import *
from matplotlib.pyplot import *
from PIL import Image
import warp
import homography
from PCV.localdescriptors import sift

featname = ['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)換成齊次坐標點的函數(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 elsewhere
    fp = 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 2
fp, tp = convert_points(0)
H_01 = homography.H_from_ransac(fp, tp, model)[0]  # im 0 to 1
tp, fp = convert_points(2)  # NB: reverse order
H_32 = homography.H_from_ransac(fp, tp, model)[0]  # im 3 to 2
tp, fp = convert_points(3)  # NB: reverse order
H_43 = homography.H_from_ransac(fp, tp, model)[0]  # im 4 to 3

# 扭曲圖像
delta = 100  # 用于填充和平移 for padding and translation

im1 = 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()

進行匹配的圖片

在這里插入圖片描述
在這里插入圖片描述

匹配后的圖片

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

六、總結(jié)

本次的拼接效果比較好,原因是因為我在同一時刻差不多角度拍攝的照片,噪聲比較小,之前一組圖片拍攝的噪聲太大,導致最后出現(xiàn)不了結(jié)果。
由圖片這部分可得,在不同時刻下拍攝照片導致天空顏色不同,在拼接的時候也會有明顯的分割線。

在這里插入圖片描述

在實驗過程中,剛開始使用了一組照片,但運行不出結(jié)果,后來經(jīng)過查詢找到原因是因為圖片匹配度太低,沒辦法進行匹配,后來重新拍攝了一組圖片最終才完成。

在這里插入圖片描述

到此這篇關(guān)于Python圖像處理之圖像拼接的文章就介紹到這了,更多相關(guān)Python圖像拼接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python周期任務(wù)調(diào)度工具Schedule使用詳解

    python周期任務(wù)調(diào)度工具Schedule使用詳解

    這篇文章主要為大家介紹了python周期任務(wù)調(diào)度工具Schedule的使用及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2021-11-11
  • Python Arrow處理時間數(shù)據(jù)使用詳解(標準庫之外另一種選擇)

    Python Arrow處理時間數(shù)據(jù)使用詳解(標準庫之外另一種選擇)

    這篇文章主要介紹了Python標準庫之外Arrow處理時間數(shù)據(jù)的另一種選擇使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Python爬蟲Xpath定位數(shù)據(jù)的兩種方法

    Python爬蟲Xpath定位數(shù)據(jù)的兩種方法

    這篇文章主要介紹了Python爬蟲Xpath定位數(shù)據(jù)的方法,第一種方法直接右鍵,將文章路徑復制下來點擊Copy?full?Xpath,方法二使用@制定標簽屬性,搜索指定位置,每種方法給大家介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • 使用Python實現(xiàn)圖像有效壓縮的方法

    使用Python實現(xiàn)圖像有效壓縮的方法

    在數(shù)字時代,圖像作為信息傳遞的重要媒介,在網(wǎng)頁設(shè)計、移動應(yīng)用和多媒體制作中扮演著不可或缺的角色,本文將詳細介紹如何使用Python,一個功能強大且易于學習的編程語言,來實現(xiàn)圖像的有效壓縮,感興趣的朋友可以參考下
    2024-03-03
  • django框架模板中定義變量(set variable in django template)的方法分析

    django框架模板中定義變量(set variable in django template)的方法分析

    這篇文章主要介紹了django框架模板中定義變量(set variable in django template)的方法,結(jié)合實例形式分析了Django框架實現(xiàn)模板中定義變量與變量賦值相關(guān)操作技巧,需要的朋友可以參考下
    2019-06-06
  • python計算分段函數(shù)值的方法

    python計算分段函數(shù)值的方法

    這篇文章主要為大家詳細介紹了python計算分段函數(shù)值的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Python多進程分塊讀取超大文件的方法

    Python多進程分塊讀取超大文件的方法

    這篇文章主要介紹了Python多進程分塊讀取超大文件的方法,涉及Python多進程操作與文件分塊讀取的相關(guān)技巧,需要的朋友可以參考下
    2016-04-04
  • python原始套接字編程示例分享

    python原始套接字編程示例分享

    在實驗中需要自己構(gòu)造單獨的HTTP數(shù)據(jù)報文,而使用SOCK_STREAM進行發(fā)送數(shù)據(jù)包,需要進行完整的TCP交互。因此想使用原始套接字進行編程,直接構(gòu)造數(shù)據(jù)包,并在IP層進行發(fā)送,即采用SOCK_RAW進行數(shù)據(jù)發(fā)送。使用SOCK_RAW的優(yōu)勢是,可以對數(shù)據(jù)包進行完整的修改,可以處理IP層上的所有數(shù)據(jù)包,對各字段進行修改,而不受UDP和TCP的限制。
    2014-02-02
  • 淺談Python3中datetime不同時區(qū)轉(zhuǎn)換介紹與踩坑

    淺談Python3中datetime不同時區(qū)轉(zhuǎn)換介紹與踩坑

    最近的項目需要根據(jù)用戶所屬時區(qū)制定一些特定策略,學習、應(yīng)用了若干python3的時區(qū)轉(zhuǎn)換相關(guān)知識,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • tensorflow轉(zhuǎn)換ckpt為savermodel模型的實現(xiàn)

    tensorflow轉(zhuǎn)換ckpt為savermodel模型的實現(xiàn)

    這篇文章主要介紹了tensorflow轉(zhuǎn)換ckpt為savermodel模型的實現(xiàn),具有很好的參考價值,希望對大家有所幫助,一起跟隨小編過來看看吧
    2020-05-05

最新評論

新源县| 荣成市| 武清区| 杂多县| 铁力市| 沧源| 南江县| 交口县| 西峡县| 开封县| 五莲县| 新泰市| 潢川县| 万山特区| 永定县| 衢州市| 江阴市| 宁强县| 彭山县| 奉新县| 白城市| 米脂县| 祥云县| 大宁县| 安龙县| 鱼台县| 广饶县| 苍溪县| 托里县| 调兵山市| 牡丹江市| 邯郸县| 万安县| 丁青县| 吕梁市| 和政县| 定陶县| 华安县| 东明县| 历史| 睢宁县|