高斯拉普拉斯——圖像金字塔

圖像金字塔原理

       一般情況下,我們要處理是一副具有固定分辨率的圖像。但是有些情況下, 我們需要對同一圖像的不同分辨率的子圖像進行處理。比如,我們要在一幅圖像中查找某個目標,比如臉,我們不知道目標在圖像中的尺寸大小。這種情況 下,我們需要創建一組圖像,這些圖像是具有不同分辨率的原始圖像。我 們把這組圖像叫做圖像金字塔(簡單來說就是同一圖像的不同分辨率的子圖集 合)。如果我們把最大的圖像放在底部,最小的放在頂部,看起來像一座金字 塔,故而得名圖像金字塔。
 
      圖像金字塔是一個圖像集合,集合中所有的圖像都源於同一個原始圖像,而且是通過對原始圖像連續降採樣獲得,直到達到某個中止條件才停止採樣。
 
有兩類圖像金字塔:高斯金字塔和拉普拉斯金字塔
       

一、高斯金字塔

   
     高斯金字塔用來向下降採樣圖像,而拉普拉斯金字塔則用來從金字塔低層圖像中向上採樣重建一個圖像。
 
      高斯金字塔的頂部是通過將底部圖像中的連續的行和列去除得到的:要從金字塔第i層生成第i+1層(我們表示第i+1層爲Gi+1),我們先要用高斯覈對Gi進行卷積(頂部圖像中的每個像素值等於下一層圖像中 5 個像素的高斯加權平均值),然後刪除所有偶數行和偶數列。這樣 操作一次一個 MxN 的圖像就變成了一個 M/2xN/2 的圖像。所以這幅圖像 的面積就變爲原來圖像面積的四分之一。這被稱爲 Octave。連續進行這樣 的操作我們就會得到一個分辨率不斷下降的圖像金字塔。
 
       我們可以使用函數 cv2.pyrDown() cv2.pyrUp() 構建圖像金字塔。
函數 cv2.pyrDown() 從一個高分辨率大尺寸的圖像向上構建一個金子塔 (尺寸變小,分辨率降低)。
     
img = cv2.imread('messi5.jpg')
lower_reso = cv2.pyrDown(higher_reso)
下圖是一個四層的圖像金字塔。

      函數 cv2.pyrUp() 從一個低分辨率小尺寸的圖像向下構建一個金子塔(尺 寸變大,但分辨率不會增加)。
 
 
  higher_reso2 = cv2.pyrUp(lower_reso)
   在這種情況下,圖像首先在每個維度上擴大爲原來的兩倍,新增的行(偶數行)以0填充。然後給指定的濾波器進行卷積(實際上是一個在每一維上都擴大爲兩倍的過濾器)去估計“丟失”像素的近似值。
        所以PyrUp()並不是PyrDown的逆操作。因爲一旦使 用 cv2.pyrDown(),圖像的分辨率就會降低,信息就會被丟失。
 
 

二、拉普拉斯金字塔

     爲了恢復原來(更高分辨率)的圖像,我們需要獲得由降採樣操作丟失的信息。 這些數據形成了拉普拉斯金字塔。
   拉普拉斯金字塔可以有高斯金字塔計算得來,公式如下:

  使用openCV直接進行拉普拉斯運算:
      Li = Gi   - PyrUp (Gi+1)
 
 
 
拉普拉金字塔的圖像看起來就像邊界圖,其中很多像素都是 0。他們經常 被用在圖像壓縮中。下圖就是一個三層的拉普拉斯金字塔:
 
 
 
 

附圖:高斯金字塔及其逆形式——拉普拉斯金字塔:

 
 
 

三、圖像金字塔的應用

3.1 圖像融合
  
金字塔的一個應用是圖像融合。例如,在圖像縫合中,你需要將兩幅 圖疊在一起,但是由於連接區域圖像像素的不連續性,整幅圖的效果看起來會 很差。這時圖像金字塔就可以排上用場了,他可以幫你實現無縫連接。這裏的 一個經典案例就是將兩個水果融合成一個,看看下圖也許你就明白我在講什麼 了。
 
實現上述效果的步驟如下:
1. 讀入兩幅圖像,蘋果和句子。
2. 構建蘋果和橘子的高斯金字塔(6 層)。
3. 根據高斯金字塔計算拉普拉斯金字塔。
4. 在拉普拉斯的每一層進行圖像融合(蘋果的左邊與橘子的右邊融合)
5. 根據融合後的圖像金字塔重建原始圖像。
 
3.2 圖像分割
 
   見cbPyrSegmentation()函數使用。
 
 
 
 

參考:

1.openCV官方教程;

2.學習openCV

發佈了80 篇原創文章 · 獲贊 142 · 訪問量 51萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章