[OpenCV官方教程中文版-段力輝譯]-圖像金字塔

目標(biāo)

  • 學(xué)習(xí)圖像金字塔
  • 使用圖像創(chuàng)建一個(gè)新水果:“橘子蘋果”
  • 將要學(xué)習(xí)的函數(shù)有:cv2.pyrUp()卡啰,cv2.pyrDown()静稻。

原理

一般情況下,我們要處理是一副具有固定分辨率的圖像匈辱。但是有些情況下振湾,我們需要對(duì)同一圖像的不同分辨率的子圖像進(jìn)行處理。比如亡脸,我們要在一幅圖像中查找某個(gè)目標(biāo)押搪,比如臉,我們不知道目標(biāo)在圖像中的尺寸大小浅碾。這種情況下大州,我們需要?jiǎng)?chuàng)建創(chuàng)建一組圖像,這些圖像是具有不同分辨率的原始圖像垂谢。我們把這組圖像叫做圖像金字塔(簡單來說就是同一圖像的不同分辨率的子圖集合)厦画。如果我們把最大的圖像放在底部,最小的放在頂部埂陆,看起來像一座金字塔苛白,故而得名圖像金字塔。

有兩類圖像金字塔:高斯金字塔和拉普拉斯金字塔焚虱。

高斯金字塔的頂部是通過將底部圖像中的連續(xù)的行和列去除得到的购裙。頂部圖像中的每個(gè)像素值等于下一層圖像中 5 個(gè)像素的高斯加權(quán)平均值。這樣操作一次一個(gè) MxN 的圖像就變成了一個(gè) M/2xN/2 的圖像鹃栽。所以這幅圖像的面積就變?yōu)樵瓉韴D像面積的四分之一躏率。這被稱為 Octave。連續(xù)進(jìn)行這樣的操作我們就會(huì)得到一個(gè)分辨率不斷下降的圖像金字塔民鼓。我們可以使用函數(shù)cv2.pyrDown() 和 cv2.pyrUp() 構(gòu)建圖像金字塔薇芝。函數(shù) cv2.pyrDown() 從一個(gè)高分辨率大尺寸的圖像向上構(gòu)建一個(gè)金子塔(尺寸變小,分辨率降低)丰嘉。

img = cv2.imread('messi5.jpg')
lower_reso = cv2.pyrDown(higher_reso)

下圖是一個(gè)四層的圖像金字塔夯到。
image.png

函數(shù) cv2.pyrUp() 從一個(gè)低分辨率小尺寸的圖像向下構(gòu)建一個(gè)金子塔(尺寸變大,但分辨率不會(huì)增加)饮亏。

higher_reso2 = cv2.pyrUp(lower_reso)

你要記住的是是 higher_reso2 和 higher_reso 是不同的耍贾。因?yàn)橐坏┦褂?cv2.pyrDown()阅爽,圖像的分辨率就會(huì)降低,信息就會(huì)被丟失荐开。下圖就是從 cv2.pyrDown() 產(chǎn)生的圖像金字塔的(由下到上)第三層圖像使用函數(shù)cv2.pyrUp() 得到的圖像付翁,與原圖像相比分辨率差了很多。

image.png

image.png

拉普拉金字塔的圖像看起來就像邊界圖晃听,其中很多像素都是 0百侧。他們經(jīng)常被用在圖像壓縮中。下圖就是一個(gè)三層的拉普拉斯金字塔:
image.png

使用金字塔進(jìn)行圖像融合

圖像金字塔的一個(gè)應(yīng)用是圖像融合能扒。例如佣渴,在圖像縫合中,你需要將兩幅圖疊在一起赫粥,但是由于連接區(qū)域圖像像素的不連續(xù)性观话,整幅圖的效果看起來會(huì)很差。這時(shí)圖像金字塔就可以排上用場(chǎng)了越平,他可以幫你實(shí)現(xiàn)無縫連接频蛔。這里的一個(gè)經(jīng)典案例就是將兩個(gè)水果融合成一個(gè),看看下圖也許你就明白我在講什么了秦叛。


image.png

你可以通過閱讀后邊的更多資源來了解更多關(guān)于圖像融合晦溪,拉普拉斯金字塔的細(xì)節(jié)。

實(shí)現(xiàn)上述效果的步驟如下:

    1. 讀入兩幅圖像挣跋,蘋果和句子
    1. 構(gòu)建蘋果和橘子的高斯金字塔(6 層)
    1. 根據(jù)高斯金字塔計(jì)算拉普拉斯金字塔
    1. 在拉普拉斯的每一層進(jìn)行圖像融合(蘋果的左邊與橘子的右邊融合)
    1. 根據(jù)融合后的圖像金字塔重建原始圖像三圆。
      下圖是摘自《學(xué)習(xí) OpenCV》展示了金子塔的構(gòu)建,以及如何從金字塔重建原始圖像的過程避咆。


      image.png

      整個(gè)過程的代碼如下舟肉。(為了簡單,每一步都是獨(dú)立完成的查库,這回消耗更多的內(nèi)存路媚,如果你愿意的話可以對(duì)他進(jìn)行優(yōu)化)

import cv2
import numpy as np,sys
img1 = cv2.imread('D:/PYCHARM_WORK/cv/cv_detection/project/guandao_angle_detection/sample1.jpg')
A = cv2.resize(img1, (1024,1024), interpolation=cv2.INTER_AREA)
img2 = cv2.imread('D:/PYCHARM_WORK/cv/cv_detection/project/guandao_angle_detection/sample2.jpg')
B = cv2.resize(img2, (1024,1024), interpolation=cv2.INTER_AREA)
# generate Gaussian pyramid for A
G = A.copy()
gpA = [G]
for i in range(6):
    G = cv2.pyrDown(G)
    gpA.append(G)
# generate Gaussian pyramid for B
G = B.copy()
gpB = [G]
for i in range(6):
    G = cv2.pyrDown(G)
    gpB.append(G)
# generate Laplacian Pyramid for A
lpA = [gpA[5]]
for i in range(5,0,-1):
    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 range(5,0,-1):
    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:int(cols/2)], lb[:,int(cols/2):]))
    real = np.hstack((A[:, :int(cols/2)], B[:, int(cols/2):]))
    LS.append(ls)
# now reconstruct
ls_ = LS[0]
for i in range(1,6):
    ls_ = cv2.pyrUp(ls_)
    ls_ = cv2.add(ls_, LS[i])
# image with direct connecting each half

cv2.imwrite('Pyramid_blending2.jpg',ls_)
cv2.imwrite('Direct_blending.jpg',real)

import cv2
import numpy as np


__author__ = "boboa"


# 高斯金字塔
def pyramid_demo(image):
    level = 3
    temp = image.copy()
    pyramids_images = []  # 空列表
    for i in range(level):
        dst = cv2.pyrDown(temp)  # 先對(duì)圖像進(jìn)行高斯平滑,然后再進(jìn)行降采樣(將圖像尺寸行和列方向縮減一半)
        pyramids_images.append(dst)  # 在列表末尾添加新的對(duì)象
        cv2.imshow("pyramid_down_"+str(i), dst)
        temp = dst.copy()
    return pyramids_images


# 拉普拉斯金字塔
def lapalian_demo(image):
    pyramids_images = pyramid_demo(image)  # 拉普拉斯金字塔必須用到高斯金字塔的結(jié)果
    level = len(pyramids_images)
    # 遞減
    for i in range(level-1, -1, -1):
        if i - 1 < 0:
            expand = cv2.pyrUp(pyramids_images[i], dstsize=image.shape[0:2])
            lpls = cv2.subtract(image, expand)
            cv2.imshow("lapalian_down_" + str(i), lpls)
        else:
            expand = cv2.pyrUp(pyramids_images[i], dstsize=pyramids_images[i - 1].shape[:2])
            lpls = cv2.subtract(pyramids_images[i - 1], expand)
            cv2.imshow("lapalian_down_" + str(i), lpls)


if __name__ == "__main__":
    img = cv2.imread("image/img2.jpg")
    cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE)
    cv2.imshow("input image", img)
    pyramid_demo(img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末樊销,一起剝皮案震驚了整個(gè)濱河市整慎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌围苫,老刑警劉巖裤园,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異剂府,居然都是意外死亡拧揽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淤袜,“玉大人万俗,你說我怎么就攤上這事∫樱” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵嚎研,是天一觀的道長蓖墅。 經(jīng)常有香客問我,道長临扮,這世上最難降的妖魔是什么论矾? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮杆勇,結(jié)果婚禮上贪壳,老公的妹妹穿的比我還像新娘。我一直安慰自己蚜退,他們只是感情好闰靴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钻注,像睡著了一般蚂且。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上幅恋,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天杏死,我揣著相機(jī)與錄音,去河邊找鬼捆交。 笑死淑翼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的品追。 我是一名探鬼主播玄括,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼诵盼!你這毒婦竟也來了惠豺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤风宁,失蹤者是張志新(化名)和其女友劉穎洁墙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戒财,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡热监,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饮寞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孝扛。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡列吼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出苦始,到底是詐尸還是另有隱情寞钥,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布陌选,位于F島的核電站理郑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏咨油。R本人自食惡果不足惜您炉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望役电。 院中可真熱鬧赚爵,春花似錦、人聲如沸法瑟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽霎挟。三九已至畸写,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間氓扛,已是汗流浹背枯芬。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留采郎,地道東北人千所。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像蒜埋,于是被迫代替她去往敵國和親淫痰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容