前面我們介紹了高斯金字塔,高斯金字塔是通過對一幅圖像一系列的向下采樣所產(chǎn)生的。有時,我們希望通過對金字塔中的小圖像進行向上采樣以獲取完整的大尺寸高分辨率圖像,這時就需要用到拉普拉斯金字塔
前面我們已經(jīng)介紹過,一幅圖像在經(jīng)過向下采樣后,再對其進行向上采樣,是無法恢復為原始狀態(tài)的。對此,我們也用程序進行了驗證。向上采樣并不是向下采樣的逆運算。這是很明顯的,因為向下采樣時在使用高斯濾波器處理后還要拋棄偶數(shù)行和偶數(shù)列,不可避免地要丟失一些信息。
為了在向上采樣時能夠恢復具有較高分辨率的原始圖像,就要獲取在采樣過程中所丟失的信息,這些丟失的信息就構(gòu)成了拉普拉斯金字塔。
拉普拉斯金字塔的定義形式為:
Li = Gi - pyrUp(Gi + 1)
式中:
- Li表示拉普拉斯金字塔中的第 i 層。
- Gi表示高斯金字塔中的第 i 層。
拉普拉斯金字塔中的第 i 層,等于“高斯金字塔中的第 i 層”與“高斯金字塔中的第 i+1 層的向上采樣結(jié)果”之差。圖 11-11 展示了高斯金字塔和拉普拉斯金字塔的對應(yīng)關(guān)系。
代碼示例:使用函數(shù) cv2.pyrDown()和 cv2.pyrUp()構(gòu)造拉普拉斯金字塔。
import cv2
O=cv2.imread("lena.png")
G0=O
G1=cv2.pyrDown(G0)
G2=cv2.pyrDown(G1)
G3=cv2.pyrDown(G2)
L0=G0-cv2.pyrUp(G1)
L1=G1-cv2.pyrUp(G2)
L2=G2-cv2.pyrUp(G3)
print("L0.shape=",L0.shape)
print("L1.shape=",L1.shape)
print("L2.shape=",L2.shape)
cv2.imshow("L0",L0)
cv2.imshow("L1",L1)
cv2.imshow("L2",L2)
cv2.waitKey()
cv2.destroyAllWindows()
程序運行后,會輸出如下運行結(jié)果:
L0.shape= (512, 512, 3)
L1.shape= (256, 256, 3)
L2.shape= (128, 128, 3)
1 中圖是通過語句“L0=G0-cv2.pyrUp(G1)”,用“原始圖像 G0”減去“圖像 G1 的向上
采樣結(jié)果”,得到的拉普拉斯金字塔的第 0 層 L0。
右邊圖是通過語句“L1=G1-cv2.pyrUp(G2)”,用“圖像 G1”減去“圖像 G2 的向上采樣
結(jié)果”,得到的拉普拉斯金字塔的第 1 層 L1。
左邊小圖是通過語句“L2=G2-cv2.pyrUp(G3)”,用“圖像 G2”減去“圖像 G3 的向上采樣
結(jié)果”,得到的拉普拉斯金字塔的第 2 層 L2。
如何恢復原圖?
拉普拉斯金字塔的作用在于,能夠恢復高分辨率的圖像。圖 11-13 演示了如何通過拉普拉斯金字塔恢復高分辨率圖像。其中,右圖是對左圖的簡化。
圖 11-13 中的各個標記的含義如下:
- G0、G1、G2、G3分別是高斯金字塔的第 0 層、第 1 層、第 2 層、第 3 層。
- L0、L1、L2分別是拉普拉斯金字塔的第 0 層、第 1 層、第 2 層。
- 向下的箭頭表示向下采樣操作(對應(yīng) cv2.pyrDown()函數(shù))。
- 向右上方的箭頭表示向上采樣操作(對應(yīng) cv2.pyrUp()函數(shù))。
- 加號“+”表示加法操作。
- 減號“-”表示減法操作。
在圖 11-13 中,描述的操作及關(guān)系有:
- 向下采樣(高斯金字塔的構(gòu)成)
G1=cv2.pyrDown(G0)
G2=cv2.pyrDown(G1)
G3=cv2.pyrDown(G2)
- 拉普拉斯金字塔
L0=G0-cv2.pyrUp(G1)
L1=G1-cv2.pyrUp(G2)
L2=G2-cv2.pyrUp(G3)
- 向上采樣恢復高分辨率圖像
G0=L0+cv2.pyrUp(G1)
G1=L1+cv2.pyrUp(G2)
G2=L2+cv2.pyrUp(G3)
上述關(guān)系是通過數(shù)學運算推導得到的。例如,已知L0=G0cv2.pyrUp(G1),將表達式右側(cè)的 cv2.pyrUp(G1)移到左側(cè),就得到了表達式 G0=L0+cv2.pyrUp(G1)。除此之外,G1 和 G2 都可以通過拉普拉斯金字塔的構(gòu)造表達式得到。在前面已經(jīng)介紹過了,構(gòu)造拉普拉斯金字塔的目的就是為了恢復高分辨率的圖像。
代碼示例:文章來源:http://www.zghlxwxcb.cn/news/detail-642357.html
import cv2
import numpy as np
O=cv2.imread("lena.png")
#==============生成高斯金字塔===================
G0=O
G1=cv2.pyrDown(G0)
G2=cv2.pyrDown(G1)
G3=cv2.pyrDown(G2)
#============生成拉普拉斯金字塔===================
L0=G0-cv2.pyrUp(G1) #拉普拉斯金字塔第 0 層
L1=G1-cv2.pyrUp(G2) #拉普拉斯金字塔第 1 層
L2=G2-cv2.pyrUp(G3) #拉普拉斯金字塔第 2 層
#=================復原 G0======================
RG0=L0+cv2.pyrUp(G1) #通過拉普拉斯圖像復原的原始圖像 G0
cv2.imshow("L0",L0)
cv2.imshow("L1",L1)
cv2.imshow("L2",L2)
cv2.imshow("RG0",RG0)
cv2.waitKey()
cv2.destroyAllWindows()
文章來源地址http://www.zghlxwxcb.cn/news/detail-642357.html
到了這里,關(guān)于opencv基礎(chǔ)46-圖像金字塔02-拉普拉斯金字塔的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!