亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python OpenCV高斯金字塔與拉普拉斯金字塔的實(shí)現(xiàn)

 更新時(shí)間:2021年03月25日 09:35:52   作者:夢(mèng)想橡皮擦  
這篇文章主要介紹了Python OpenCV高斯金字塔與拉普拉斯金字塔的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

基礎(chǔ)知識(shí)鋪墊

學(xué)習(xí)圖像金字塔,發(fā)現(xiàn)網(wǎng)上的資料比較多,檢索起來(lái)比較輕松。

圖像金字塔是一張圖像多尺度的表達(dá),或者可以理解成一張圖像不同分辨率展示。

金字塔越底層的圖片,像素越高,越向上,像素逐步降低,分辨率逐步降低。

高斯金字塔

我們依舊不對(duì)概念做過(guò)多解釋,第一遍學(xué)習(xí)應(yīng)用,應(yīng)用,畢竟 365 天的周期,時(shí)間長(zhǎng),后面補(bǔ)充理論知識(shí)。

高斯金字塔用于向下采樣,同時(shí)它也是最基本的圖像塔。

在互聯(lián)網(wǎng)檢索原理,得到最簡(jiǎn)單的說(shuō)明如下:

將圖像的最底層(高斯金字塔的第 0 層),例如高斯核(5x5)對(duì)其進(jìn)行卷積操作,這里的卷積主要處理掉的是偶數(shù)行與列,然后得到金字塔上一層圖像(即高斯金字塔第 1 層),在針對(duì)該圖像重復(fù)卷積操作,得到第 2 層,反復(fù)執(zhí)行下去,即可得到高斯金字塔。

每次操作之后,都會(huì)將 M×N 圖像變成 M/2 × N/2 圖像,即減少一半。

還有實(shí)測(cè)中發(fā)現(xiàn),需要用圖像的寬和高一致的圖片,并且寬高要是 2 的次冪數(shù),例如,8 像素,16 像素,32 像素等等,一會(huì)你也可以實(shí)際測(cè)試一下。

圖像金字塔應(yīng)用到的函數(shù)有 cv2.pyrDown() cv2.pyrUp() 。

cv2.pyrDown 與 cv2.pyrUp 函數(shù)原型

通過(guò) help 函數(shù)得到函數(shù)原型如下:

pyrDown(src[, dst[, dstsize[, borderType]]]) -> dst
pyrUp(src[, dst[, dstsize[, borderType]]]) -> dst

兩個(gè)函數(shù)原型參數(shù)一致,參數(shù)說(shuō)明如下:

  • src:輸入圖像;
  • dst: 輸出圖像;
  • dstsize: 輸出圖像尺寸,默認(rèn)值按照 ((src.cols+1)/2, (src.rows+1)/2) 計(jì)算。

關(guān)于兩個(gè)函數(shù)的補(bǔ)充說(shuō)明:

  • cv2.pyrDown 從一個(gè)相對(duì)高分辨率的大尺寸的圖像上構(gòu)建一個(gè)金字塔,運(yùn)行之后的結(jié)果是,圖像變小,分辨率降低(下采樣);
  • cv2.pyrUp 是一個(gè)上采樣的過(guò)程,盡管相對(duì)尺寸變大,但是分辨率不會(huì)增加,圖像會(huì)變得更模糊。

測(cè)試代碼如下:

import cv2 as cv

src = cv.imread("./testimg.jpeg")
print(src.shape[:2])
cv.imshow("src", src)
# 向下采樣
dst = cv.pyrDown(src)
print(dst.shape[:2])
cv.imshow("dst", dst)

# 再次向下采樣
dst1 = cv.pyrDown(dst)
print(dst1.shape[:2])
cv.imshow("dst1", dst1)

cv.waitKey()

運(yùn)行代碼之后,得到三張圖片,大小依次減小,分辨率降低。

Python OpenCV 之圖像金字塔,高斯金字塔與拉普拉斯金字塔

通過(guò)上面運(yùn)行得到的最小圖,在執(zhí)行向上采樣之后,圖片會(huì)變的模糊,這也說(shuō)明上采樣和下采樣是非線性處理,它們是不可逆的有損處理,因此下采樣后的圖像是無(wú)法還原的,即使放大圖片也會(huì)變模糊(后面學(xué)習(xí)到拉普拉斯金字塔可以解決該問(wèn)題)。

# 向上采樣
dst2 = cv.pyrUp(dst1)
print(dst2.shape[:2])
cv.imshow("dst2", dst2)

Python OpenCV 之圖像金字塔,高斯金字塔與拉普拉斯金字塔

在總結(jié)一下上采樣和下采樣的步驟:

  • 上采樣:使用 cv2.pyrUp 函數(shù), 先將圖像在每個(gè)方向放大為原來(lái)的兩倍,新增的行和列用 0 填充,再使用先前同樣的內(nèi)核與放大后的圖像卷積,獲得新增像素的近似值;
  • 下采樣:使用 cv2.pyrDown 函數(shù),先對(duì)圖像進(jìn)行高斯內(nèi)核卷積 ,再將所有偶數(shù)行和列去除。

拉普拉斯金字塔(Laplacian Pyramid, LP)

拉普拉斯金字塔主要用于重建圖像,由上文我們已經(jīng)知道在使用高斯金字塔的的時(shí)候,上采樣和下采樣會(huì)導(dǎo)致圖像細(xì)節(jié)丟失。

拉普拉斯就是為了在放大圖像的時(shí)候,可以預(yù)測(cè)殘差,何為殘差,即小圖像放大的時(shí)候,需要插入一些像素值,在上文直接插入的是 0,拉普拉斯金字塔算法可以根據(jù)周圍像素進(jìn)行預(yù)測(cè),從而實(shí)現(xiàn)對(duì)圖像最大程度的還原。

學(xué)習(xí)到原理如下:用高斯金字塔的每一層圖像,減去其上一層圖像上采樣并高斯卷積之后的預(yù)測(cè)圖像,得到一系列的差值圖像即為 LP 分解圖像(其中 LP 即為拉普拉斯金字塔圖像)。

關(guān)于拉普拉斯還存在一個(gè)公式(這是本系列課程第一次書寫公式),其中 L 為拉普拉斯金字塔圖像,G 為高斯金字塔圖像

使用下面的代碼進(jìn)行測(cè)試。

import cv2 as cv

src = cv.imread("./testimg.jpeg")
print(src.shape[:2])
cv.imshow("src", src)
# 向下采樣一次
dst = cv.pyrDown(src)
print(dst.shape[:2])
cv.imshow("dst", dst)

# 向上采樣一次
dst1 = cv.pyrUp(dst)
print(dst1.shape[:2])
cv.imshow("dst1", dst1)

# 計(jì)算拉普拉斯金字塔圖像
# 原圖 - 向上采樣一次的圖
laplace = cv.subtract(src, dst1)
cv.imshow("laplace", laplace)
cv.waitKey()

運(yùn)行結(jié)果如下,相關(guān)的圖像已經(jīng)呈現(xiàn)出來(lái),重點(diǎn)注意最右側(cè)的圖片。

Python OpenCV 之圖像金字塔,高斯金字塔與拉普拉斯金字塔

這個(gè)地方需要注意下,如果你使用 cv.subtract(src, dst1) 函數(shù),得到的是上圖效果,但是在使用還原的時(shí)候會(huì)發(fā)現(xiàn)問(wèn)題,建議直接使用 -完成,匹配公式,修改代碼如下:

# cv.subtract(src, dst1)
laplace = src - dst1

代碼運(yùn)行效果如下。

Python OpenCV 之圖像金字塔,高斯金字塔與拉普拉斯金字塔

學(xué)習(xí)過(guò)程中發(fā)現(xiàn)這樣一段話:圖像尺寸最好是 2 的整次冪,如 256,512 等,否則在金字塔向上的過(guò)程中圖像的尺寸會(huì)不等,這會(huì)導(dǎo)致在拉普拉斯金字塔處理時(shí)由于不同尺寸矩陣相減而出錯(cuò)。

這個(gè)我在實(shí)測(cè)的時(shí)候發(fā)現(xiàn)確實(shí)如此,例如案例中使用的圖像,在向下采樣 2 次的時(shí)候,圖像的尺寸就會(huì)發(fā)生變化,測(cè)試代碼如下:

import cv2 as cv

src = cv.imread("./testimg.jpeg")
print(src.shape[:2])
cv.imshow("src", src)
# 向下采樣1次
dst1 = cv.pyrDown(src)
print(dst1.shape[:2])
cv.imshow("dst", dst1)
# 向下采樣2次
dst2 = cv.pyrDown(dst1)
print(dst1.shape[:2])
cv.imshow("dst2", dst2)

# 向上采樣1次
up_dst1 = cv.pyrUp(dst2)
print(up_dst1.shape[:2])
cv.imshow("up_dst1", up_dst1)

# 計(jì)算拉普拉斯金字塔圖像
# 采樣1次 - 向上采樣1次的圖
laplace = dst1 - up_dst1
cv.imshow("laplace", laplace)
cv.waitKey()

注意 print(up_dst1.shape[:2]) 部分的輸出如下:

(710, 400)
(355, 200)
(355, 200)
(356, 200)

如果在該基礎(chǔ)上使用拉普拉斯圖像金字塔,就會(huì)出現(xiàn)如下錯(cuò)誤

Sizes of input arguments do not match

在總結(jié)一下拉普拉斯圖像金字塔的執(zhí)行過(guò)程:

  • 向下采樣:用高斯金字塔的第 i 層減去 i+1 層做上采樣的圖像,得到拉普拉斯第 i 層的圖像;
  • 向上采樣:用高斯金字塔的 i+1 層向上采樣加上拉普拉斯的第 i 層,得到第 i 層的原始圖像。

向下采樣上面的代碼已經(jīng)實(shí)現(xiàn)了,但是拉普拉斯向上采樣還未實(shí)現(xiàn),完善一下代碼如下,為了代碼清晰,我們將變量命名進(jìn)行修改。

import cv2 as cv

src = cv.imread("./testimg_rect.jpeg")
print(src.shape[:2])
cv.imshow("src", src)
# 高斯金字塔第 0 層
gus0 = src # 原圖
# 高斯金字塔第 1 層
gus1 = cv.pyrDown(gus0)
# 高斯第 2 層
gus2 = cv.pyrDown(gus1)

# 拉普拉斯金字塔第 0 層
lap0 = gus0 - cv.pyrUp(gus1)
# 拉普拉斯金字塔第 1 層
lap1 = gus1 - cv.pyrUp(gus2)

# 顯示拉普拉斯第一層代碼
cv.imshow("laplace", lap1)
cv.waitKey()

下面用修改好的代碼完成還原圖片的操作。

import cv2 as cv

src = cv.imread("./testimg_rect.jpeg")
print(src.shape[:2])
cv.imshow("src", src)
# 高斯金字塔第 0 層
gus0 = src # 原圖
# 高斯金字塔第 1 層
gus1 = cv.pyrDown(gus0)
# 高斯第 2 層
gus2 = cv.pyrDown(gus1)


# 拉普拉斯金字塔第 0 層
lap0 = gus0 - cv.pyrUp(gus1)
# 拉普拉斯金字塔第 1 層
lap1 = gus1 - cv.pyrUp(gus2)

rep = lap0 + cv.pyrUp(lap1 + cv.pyrUp(gus2))
gus_rep = cv.pyrUp(cv.pyrUp(gus2))

cv.imshow("rep", rep)
cv.imshow("gus_rep", gus_rep)
cv.waitKey()

以上代碼最重要的部分為下面兩句:

rep = lap0 + cv.pyrUp(lap1 + cv.pyrUp(gus2))
gus_rep = cv.pyrUp(cv.pyrUp(gus2))

第一行代碼中 lap1 + cv.pyrUp(gus2) 即文字公式 【用高斯金字塔的 i+1 層向上采樣加上拉普拉斯的第 i 層,得到第 i 層的原始圖像】的翻譯。

第二行代碼是使用直接向上采樣,最終得到的是損失細(xì)節(jié)的圖像。

上述代碼運(yùn)行的結(jié)果如下,通過(guò)拉普拉斯可以完美還原圖像。

學(xué)習(xí)本案例之后,你可以在復(fù)盤本文開始部分的代碼,將其進(jìn)行修改。

Python OpenCV 之圖像金字塔,高斯金字塔與拉普拉斯金字塔

最后在學(xué)習(xí)一種技巧,可以直接將兩幅圖片呈現(xiàn),代碼如下:

import cv2 as cv
import numpy as np
src = cv.imread("./testimg_rect.jpeg")
print(src.shape[:2])
cv.imshow("src", src)
# 向下采樣1次
down_dst1 = cv.pyrDown(src)
print(down_dst1.shape[:2])
cv.imshow("dst", down_dst1)


# 向上采樣1次
up_dst1 = cv.pyrUp(down_dst1)
print(up_dst1.shape[:2])
cv.imshow("up_dst1", up_dst1)

res = np.hstack((up_dst1, src))
cv.imshow('res', res)

cv.waitKey()

運(yùn)行之后,通過(guò) np.hstack((up_dst1, src))函數(shù),將兩個(gè)圖像矩陣合并,實(shí)現(xiàn)效果如下:

Python OpenCV 之圖像金字塔,高斯金字塔與拉普拉斯金字塔

到此這篇關(guān)于Python OpenCV高斯金字塔與拉普拉斯金字塔的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python OpenCV金字塔內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 爬蟲小技巧利用Mitmproxy破解app

    爬蟲小技巧利用Mitmproxy破解app

    不同于Fiddler或Wireshark等抓包工具,mitmproxy不僅可以截獲請(qǐng)求幫助開發(fā)者查看、分析,還可以通過(guò)自定義腳本進(jìn)行二次開發(fā)
    2021-09-09
  • Pandas groupby apply agg 的區(qū)別 運(yùn)行自定義函數(shù)說(shuō)明

    Pandas groupby apply agg 的區(qū)別 運(yùn)行自定義函數(shù)說(shuō)明

    這篇文章主要介紹了Pandas groupby apply agg 的區(qū)別 運(yùn)行自定義函數(shù)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • Python 3中的yield from語(yǔ)法詳解

    Python 3中的yield from語(yǔ)法詳解

    在python 3.3里,generator新增了一個(gè)語(yǔ)法 yield from,這個(gè)yield from的作用是什么?語(yǔ)法是什么呢?下面通過(guò)這篇文章主要給大家詳細(xì)介紹了Python 3中yield from語(yǔ)法的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-01-01
  • python: 自動(dòng)安裝缺失庫(kù)文件的方法

    python: 自動(dòng)安裝缺失庫(kù)文件的方法

    今天小編就為大家分享一篇python: 自動(dòng)安裝缺失庫(kù)文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Python生成器以及應(yīng)用實(shí)例解析

    Python生成器以及應(yīng)用實(shí)例解析

    這篇文章主要介紹了Python生成器以及應(yīng)用實(shí)例解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • python通過(guò)socket查詢whois的方法

    python通過(guò)socket查詢whois的方法

    這篇文章主要介紹了python通過(guò)socket查詢whois的方法,涉及Python基于socket模塊進(jìn)行查詢的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • 使用python實(shí)現(xiàn)三維圖可視化

    使用python實(shí)現(xiàn)三維圖可視化

    這篇文章主要介紹了使用python實(shí)現(xiàn)三維圖可視化,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Pandas的MultiIndex多層索引使用說(shuō)明

    Pandas的MultiIndex多層索引使用說(shuō)明

    這篇文章主要介紹了Pandas的MultiIndex多層索引使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 解決python-docx打包之后找不到default.docx的問(wèn)題

    解決python-docx打包之后找不到default.docx的問(wèn)題

    今天小編就為大家分享一篇解決python-docx打包之后找不到default.docx的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • python實(shí)現(xiàn)無(wú)人機(jī)航拍圖片像素坐標(biāo)轉(zhuǎn)世界坐標(biāo)的示例代碼

    python實(shí)現(xiàn)無(wú)人機(jī)航拍圖片像素坐標(biāo)轉(zhuǎn)世界坐標(biāo)的示例代碼

    已知相機(jī)參數(shù)在給定像素坐標(biāo)的前提下,求世界坐標(biāo),大部分通過(guò)AI來(lái)實(shí)現(xiàn),本文給大家分享實(shí)現(xiàn)腳本,感興趣的朋友跟隨小編一起看看吧
    2024-06-06

最新評(píng)論