網(wǎng)站開發(fā)工具安全性能怎樣制作一個(gè)網(wǎng)站
在我們之前的學(xué)習(xí)過程中,使用的都是恒定大小的圖像,但是在某些情況下,我們需要使用不同分辨率的(相同)圖像。例如,當(dāng)在圖像中搜索某些東西(例如人臉)時(shí),我們不確定對(duì)象將以多大的尺寸顯示在圖像中。在這種情況下,我們將需要?jiǎng)?chuàng)建一組具有不同分辨率的相同圖像,并在所有圖像中搜索對(duì)象,這些具有不同分辨率的圖像集稱為“圖像金字塔”。
本期我們來實(shí)現(xiàn)使用圖像金字塔將兩張圖片融合到一張圖片。
完成本期內(nèi)容,你可以:
-
了解圖像金字塔的原理和應(yīng)用
-
掌握上采樣和下采樣對(duì)應(yīng)的原理和函數(shù)
-
掌握高斯金字塔的實(shí)現(xiàn)和應(yīng)用
-
掌握拉普拉斯金字塔的實(shí)現(xiàn)和應(yīng)用
若要運(yùn)行案例代碼,你需要有:
-
操作系統(tǒng):Ubuntu 16 以上 或者 Windows10
-
工具軟件:VScode 或者其他源碼編輯器
-
硬件環(huán)境:無特殊要求
-
核心庫:python 3.6.13, opencv-contrib-python 3.4.11.39,opencv-python 3.4.2.16
點(diǎn)擊下載源碼
下采樣
OpenCV將下采樣封裝成了cv2.pyrDown()
方法。
函數(shù)原型:dst = cv2.pyrDown( src[, dstsize[, borderType]] )
dst為輸出圖像。
參數(shù)描述如下:
- dst:目標(biāo)圖像。
- src: 原始圖像。
- dstsize:目標(biāo)圖像的大小。
- borderType:邊界類型。
上采樣
OpenCV將下采樣封裝成了cv2.pyrDown()
方法。
函數(shù)原型:dst = cv2.pyrDown( src[, dstsize[, borderType]] )
dst為輸出圖像。
參數(shù)描述如下:
- dst:目標(biāo)圖像。
- src: 原始圖像。
- dstsize:目標(biāo)圖像的大小。
- borderType:邊界類型。
高斯金字塔
高斯金字塔是由底部的最大分辨率圖像逐次向下采樣得到的一系列圖像。最下面的圖像分辨率最高,越往上圖像分辨率越低。高斯金字塔的向下采樣過程是:對(duì)于給定的圖像先做一次高斯平滑處理,也就是使用一個(gè)大小為的卷積核對(duì)圖像進(jìn)行卷積操作,然后再對(duì)圖像采樣,去除圖像中的偶數(shù)行和偶數(shù)列,然后就得到一張圖片,對(duì)這張圖片再進(jìn)行上述操作就可以得到高斯金字塔。
拉普拉斯金字塔
拉普拉斯金字塔是通過源圖像減去先縮小后再放大的圖像的一系列圖像構(gòu)成的。拉普拉金字塔的圖像看起來就像邊界圖,其中很多像素都是0。他們經(jīng)常被用在圖像壓縮中。將降采樣之后的圖像再進(jìn)行上采樣操作,然后與之前還沒降采樣的原圖進(jìn)行做差得到殘差圖。為還原圖像做信息的準(zhǔn)備。
圖像融合
圖像金字塔的重要應(yīng)用就是圖像融合,它的具體操作是首先對(duì)兩張圖片分別進(jìn)行降采樣,或者采用高斯金字塔法,當(dāng)降采樣到一定程度后,將兩張圖片合并,這時(shí)候由于在降采樣時(shí)丟失了一部分邊緣信息,因此邊緣處不匹配的現(xiàn)象就消失了。之后對(duì)合并的圖像進(jìn)行上采樣,或者采用拉普拉斯金字塔法,使圖像回到原來的大小。此時(shí),邊緣處的不匹配現(xiàn)象就會(huì)明顯降低甚至消失。
具體步驟
使用圖像金字塔將下列兩張圖片進(jìn)行融合。
步驟一:創(chuàng)建項(xiàng)目工具
創(chuàng)建項(xiàng)目名為使用圖像金字塔進(jìn)行圖像融合
,項(xiàng)目根目錄下新建code
文件夾儲(chǔ)存代碼,新建dataset
文件夾儲(chǔ)存數(shù)據(jù),項(xiàng)目結(jié)構(gòu)如下:
使用圖像金字塔進(jìn)行圖像融合 # 項(xiàng)目名稱
├── code # 儲(chǔ)存代碼文件
├── dataset # 儲(chǔ)存數(shù)據(jù)文件
注:如項(xiàng)目結(jié)構(gòu)已存在,無需再創(chuàng)建。
步驟二:加載蘋果和橙子的兩個(gè)圖像
- 導(dǎo)入所需模塊:OpenCV、NumPy ;
- 讀取
dataset
文件夾下的apple.png
和orange.png
圖片; - 將兩張圖像均修改為
515*512
的尺寸;
代碼實(shí)現(xiàn)
# 導(dǎo)入OpenCV、numpy
import cv2
import numpy as np# 讀取圖片
img = cv2.imread("../dataset/apple.png")
img1 = cv2.imread("../dataset/orange.png")# resize到2的冪次,方便降采樣處理
img = cv2.resize(img, (512, 512))
img1 = cv2.resize(img1, (512, 512))
步驟三:定義構(gòu)建高斯金字塔的函數(shù)
- 將原圖像復(fù)制,作為第一張圖像;
- 高斯平滑處理;
- 下采樣操作;
- 循環(huán)上面兩步操作,并將得到的圖像儲(chǔ)存至列表中。
代碼實(shí)現(xiàn)
# 定義構(gòu)建高斯金字塔的函數(shù)
def gaussian(ori_image, down_times=2):# 1:添加第一個(gè)圖像為原始圖像temp_gau = ori_image.copy()gaussian_pyramid = [temp_gau]for i in range(down_times):# 高斯平滑gaussian_img = cv2.GaussianBlur(temp_gau, (5, 5), 0, 0)# 2:連續(xù)存儲(chǔ)2次下采樣,這樣高斯金字塔就有3層temp_gau = cv2.pyrDown(gaussian_img)gaussian_pyramid.append(temp_gau)return gaussian_pyramid
步驟四:定義構(gòu)建拉普拉斯金字塔的函數(shù)
- 將高斯金字塔圖像列表中的最后一張圖像作為第一張圖像;
- 上采樣操作
- 與之前還沒降采樣的原圖進(jìn)行做差得到殘差圖;
- 循環(huán)上面兩步操作,并將得到的圖像儲(chǔ)存至列表中。
代碼實(shí)現(xiàn)
# 定義構(gòu)建拉普拉斯金字塔的函數(shù)
def laplacian(gaussian_pyramid, up_times=2):laplacian_pyramid = [gaussian_pyramid[-1]]for i in range(up_times,0, -1):# i的取值為2,1,0也就是拉普拉斯金字塔有3層temp_pyrUp = cv2.pyrUp(gaussian_pyramid[i])temp_lap = cv2.subtract(gaussian_pyramid[i-1], temp_pyrUp)laplacian_pyramid.append(temp_lap)return laplacian_pyramid
步驟五:對(duì)兩張圖像分別進(jìn)行高斯金字塔和拉普拉斯金字塔操作
代碼實(shí)現(xiàn)
# 第一張圖進(jìn)行高斯金字塔計(jì)算
gp1 = gaussian(img, down_times=5)# 第二張圖進(jìn)行高斯金字塔計(jì)算
gp2 = gaussian(img1,down_times=5)# 第一張圖進(jìn)行拉普拉斯金字塔計(jì)算
lp1 = laplacian(gp1,up_times=5)# # 第二張圖進(jìn)行拉普拉斯金字塔計(jì)算
lp2 = laplacian(gp2,up_times=5)
步驟六:圖像融合
- 在每個(gè)級(jí)別中添加第一張圖像的左邊和第二張圖像的右邊,組成新的圖像;
- 重建圖像;
- 展示圖像。
# 現(xiàn)在在每個(gè)級(jí)別中添加左右兩半圖像
merges = []
for i in range(step + 1):w, h, d = lp1[i].shapemerge = np.hstack((lp1[i][:, 0:w // 2 - 10 // 2 ** i], lp2[i][:, w // 2 - 10 // 2 ** i:]))merges.append(merge)
# 現(xiàn)在重建
ls_ = merges[0]
for i in range(1,6):ls_ = cv2.pyrUp(ls_)ls_ = cv2.add(ls_, merges[i])cv2.imshow('Pyramid_blending2.jpg',ls_)cv2.waitKey()
cv2.destroyAllWindows()
圖像金字塔是圖像中多尺度表達(dá)的一種,最主要用于圖像的分割,是一種以多分辨率來解釋圖像的有效但概念簡單的結(jié)構(gòu)。圖像金字塔最初用于機(jī)器視覺和圖像壓縮,一幅圖像的金字塔是一系列以金字塔形狀排列的分辨率逐步降低,且來源于同一張?jiān)紙D的圖像集合。其通過梯次向下采樣獲得,直到達(dá)到某個(gè)終止條件才停止采樣。金字塔的底部是待處理圖像的高分辨率表示,而頂部是低分辨率的近似。我們將一層一層的圖像比喻成金字塔,層級(jí)越高,則圖像越小,分辨率越低。
點(diǎn)擊下載源碼