日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

python+opencv圖像金字塔融合 (超詳細(xì)講解原理及代碼講解)

 雪柳花明 2017-09-12

本篇內(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ì)不上就麻煩了。

程序:

[python] view plain copy
  1. import cv2  
  2. import numpy as np  
  3. A = cv2.imread('apple.jpg')  
  4. B = cv2.imread('orange.jpg')  
  5. # generate Gaussian pyramid for A  
  6. G = A.copy()  
  7. gpA = [G]  
  8. for i in np.arange(6):     #將蘋果進(jìn)行高斯金字塔處理,總共六級(jí)處理  
  9.     G = cv2.pyrDown(G)  
  10.     gpA.append(G)  
  11. # generate Gaussian pyramid for B  
  12. G = B.copy()  
  13. gpB = [G]  
  14. for i in np.arange(6):  # #將橘子進(jìn)行高斯金字塔處理,總共六級(jí)處理  
  15.     G = cv2.pyrDown(G)  
  16.     gpB.append(G)  
  17. # generate Laplacian Pyramid for A  
  18. lpA = [gpA[5]]                 
  19. for i in np.arange(5,0,-1):    #將蘋果進(jìn)行拉普拉斯金字塔處理,總共5級(jí)處理  
  20.     GE = cv2.pyrUp(gpA[i])  
  21.     L = cv2.subtract(gpA[i-1],GE)  
  22.     lpA.append(L)  
  23. # generate Laplacian Pyramid for B  
  24. lpB = [gpB[5]]  
  25. for i in np.arange(5,0,-1):    #將橘子進(jìn)行拉普拉斯金字塔處理,總共5級(jí)處理  
  26.     GE = cv2.pyrUp(gpB[i])  
  27.     L = cv2.subtract(gpB[i-1],GE)  
  28.     lpB.append(L)  
  29. # Now add left and right halves of images in each level  
  30. #numpy.hstack(tup)  
  31. #Take a sequence of arrays and stack them horizontally  
  32. #to make a single array.  
  33. LS = []  
  34. for la,lb in zip(lpA,lpB):  
  35.     rows,cols,dpt = la.shape  
  36.     ls = np.hstack((la[:,0:cols//2], lb[:,cols//2:]))    #將兩個(gè)圖像的矩陣的左半部分和右半部分拼接到一起  
  37.     LS.append(ls)  
  38. # now reconstruct  
  39. ls_ = LS[0]   #這里L(fēng)S[0]為高斯金字塔的最小圖片  
  40. for i in xrange(1,6):                        #第一次循環(huán)的圖像為高斯金字塔的最小圖片,依次通過(guò)拉普拉斯金字塔恢復(fù)到大圖像  
  41.     ls_ = cv2.pyrUp(ls_)  
  42.     ls_ = cv2.add(ls_, LS[i])                #采用金字塔拼接方法的圖像  
  43. # image with direct connecting each half  
  44. real = np.hstack((A[:,:cols/2],B[:,cols/2:]))   #直接的拼接  
  45. cv2.imwrite('Pyramid_blending2.jpg',ls_)  
  46. cv2.imwrite('Direct_blending.jpg',real)  

對(duì)于讀者進(jìn)行程序調(diào)試時(shí),可通過(guò)cv2.imshow()和cv2.waitKey()函數(shù)進(jìn)行查看各個(gè)過(guò)程的輸出。


完!




    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多