本篇內(nèi)容參考《Opencv官方教程中文版(Python)》的內(nèi)容進(jìn)行講解和分析,其下載網(wǎng)址為 http://download.csdn.net/download/dengxf01/9692646
由于書中代碼所使用版本問(wèn)題,所以,不少讀者將其代碼復(fù)制后,運(yùn)行時(shí)出現(xiàn)錯(cuò)誤,在這里我將以Python3.6.1,Opencv 3.2版本進(jìn)行代碼展示和講解。
圖像金字塔主要涉及兩個(gè)函數(shù):cv2.pyrUp()(圖像尺寸變?。琧v2.pyrDown()(圖像尺寸變大,但會(huì)模糊)
圖像金字塔有兩類類型:高斯金字塔和拉普拉斯金字塔。
高斯金字塔的頂部是通過(guò)將底部圖像中的連續(xù)的行和列去除得到的。頂部圖像中的每個(gè)像素值等于下一層圖像中 5 個(gè)像素的高斯加權(quán)平均值。這樣操作一次一個(gè) MxN 的圖像就變成了一個(gè) M/2xN/2 的圖像。所謂的5個(gè)元素是指:前后左右+自身。下圖為高斯金字塔cv2.pyrUp() 的效果

高斯金字塔將小圖變大圖用,cv2.pyrDown(),但是圖像會(huì)模糊,如下圖,從小圖變大后的圖像

對(duì)于拉普拉斯金字塔,其計(jì)算公式與高斯金字塔相關(guān),具體為
Li=Gi-pyrUp(Gi+1), 其中i和i+1為下角標(biāo)
拉普拉斯金字塔的圖像效果為:

圖像融合的兩個(gè)重要作用為:
1.實(shí)現(xiàn)兩個(gè)圖像的無(wú)縫連接,下面用蘋果和橘子的例子說(shuō)明
2.圖像壓縮,從蘋果和橘子的例子中,讀者可以體會(huì)如何利用小圖像(被高斯金字塔變換后的圖像)和幾層拉普拉斯金字塔表示大圖像信息(拉普拉斯金字塔即使圖像很大,由于大部分為黑色,可認(rèn)為是0,因此壓縮后數(shù)量很?。?br>
蘋果和橘子的例子的原始圖像和融合后效果如圖所示:

對(duì)于讀者,實(shí)施蘋果和橘子的數(shù)據(jù)準(zhǔn)備階段:
蘋果和橘子的圖片,但是要注意?。。。。。。。。。?!由于程序采用六層金字塔,一次其圖片像素的行數(shù)和列數(shù)要能夠被(2X2X2X2X2X2)整除哦,否則計(jì)算過(guò)程中像素矩陣對(duì)不上就麻煩了。
程序:
- import cv2
- import numpy as np
- A = cv2.imread('apple.jpg')
- B = cv2.imread('orange.jpg')
- # generate Gaussian pyramid for A
- G = A.copy()
- gpA = [G]
- for i in np.arange(6): #將蘋果進(jìn)行高斯金字塔處理,總共六級(jí)處理
- G = cv2.pyrDown(G)
- gpA.append(G)
- # generate Gaussian pyramid for B
- G = B.copy()
- gpB = [G]
- for i in np.arange(6): # #將橘子進(jìn)行高斯金字塔處理,總共六級(jí)處理
- G = cv2.pyrDown(G)
- gpB.append(G)
- # generate Laplacian Pyramid for A
- lpA = [gpA[5]]
- for i in np.arange(5,0,-1): #將蘋果進(jìn)行拉普拉斯金字塔處理,總共5級(jí)處理
- GE = cv2.pyrUp(gpA[i])
- L = cv2.subtract(gpA[i-1],GE)
- lpA.append(L)
- # generate Laplacian Pyramid for B
- lpB = [gpB[5]]
- for i in np.arange(5,0,-1): #將橘子進(jìn)行拉普拉斯金字塔處理,總共5級(jí)處理
- GE = cv2.pyrUp(gpB[i])
- L = cv2.subtract(gpB[i-1],GE)
- lpB.append(L)
- # Now add left and right halves of images in each level
- #numpy.hstack(tup)
- #Take a sequence of arrays and stack them horizontally
- #to make a single array.
- LS = []
- for la,lb in zip(lpA,lpB):
- rows,cols,dpt = la.shape
- ls = np.hstack((la[:,0:cols//2], lb[:,cols//2:])) #將兩個(gè)圖像的矩陣的左半部分和右半部分拼接到一起
- LS.append(ls)
- # now reconstruct
- ls_ = LS[0] #這里L(fēng)S[0]為高斯金字塔的最小圖片
- for i in xrange(1,6): #第一次循環(huán)的圖像為高斯金字塔的最小圖片,依次通過(guò)拉普拉斯金字塔恢復(fù)到大圖像
- ls_ = cv2.pyrUp(ls_)
- ls_ = cv2.add(ls_, LS[i]) #采用金字塔拼接方法的圖像
- # image with direct connecting each half
- real = np.hstack((A[:,:cols/2],B[:,cols/2:])) #直接的拼接
- cv2.imwrite('Pyramid_blending2.jpg',ls_)
- cv2.imwrite('Direct_blending.jpg',real)
對(duì)于讀者進(jìn)行程序調(diào)試時(shí),可通過(guò)cv2.imshow()和cv2.waitKey()函數(shù)進(jìn)行查看各個(gè)過(guò)程的輸出。
完!
|