OpenCV 4.12.0
開源計算機視覺
載入中...
搜尋中...
無匹配項
影像金字塔

上一篇教程: 使用形態學操作提取水平和垂直線
下一篇教程: 基本閾值操作

原始作者Ana Huamán
相容性OpenCV >= 3.0

目標

在本教程中,您將學習如何

  • 使用OpenCV函式 pyrUp()pyrDown() 對給定影像進行下采樣或上取樣。

理論

注意
以下解釋摘自Bradski和Kaehler的著作《學習OpenCV》。
  • 通常我們需要將影像轉換為與原始尺寸不同的尺寸。為此,有兩種可能的選擇:
    1. 放大影像(放大顯示)或
    2. 縮小影像(縮小顯示)。
  • 儘管OpenCV中有一個*幾何變換*函式可以(字面上地)調整影像大小(resize,我們將在未來的教程中展示),但在本節中,我們首先分析影像金字塔的使用,它在各種視覺應用中得到了廣泛應用。

影像金字塔

  • 影像金字塔是一組影像的集合——它們都源自單一原始影像——透過逐級下采樣生成,直到達到所需的終止點。
  • 影像金字塔有兩種常見型別:
    • 高斯金字塔: 用於下采樣影像
    • 拉普拉斯金字塔: 用於從金字塔中較低層(解析度較低)的影像重建上取樣影像
  • 在本教程中,我們將使用*高斯金字塔*。

高斯金字塔

  • 將金字塔想象成一組層,層越高,尺寸越小。
  • 每層從下到上編號,因此層 \((i+1)\)(表示為 \(G_{i+1}\))小於層 \(i\)(\(G_{i}\))。
  • 要在高斯金字塔中生成層 \((i+1)\),我們執行以下操作:

    • 將 \(G_{i}\) 與高斯核進行卷積

    \[\frac{1}{256} \begin{bmatrix} 1 & 4 & 6 & 4 & 1 \\ 4 & 16 & 24 & 16 & 4 \\ 6 & 24 & 36 & 24 & 6 \\ 4 & 16 & 24 & 16 & 4 \\ 1 & 4 & 6 & 4 & 1 \end{bmatrix}\]

    • 移除所有偶數行和偶數列。
  • 您會很容易注意到,結果影像的面積將恰好是其前一影像的四分之一。在輸入影像 \(G_{0}\)(原始影像)上重複此過程,即可生成整個金字塔。
  • 上述過程對於影像下采樣很有用。如果我們想放大影像怎麼辦?:用零 ( \(0 \)) 填充列
    • 首先,將影像的每個維度放大到原始尺寸的兩倍,幷包含新的偶數行和
    • 使用上面顯示(乘以4)的相同核進行卷積,以近似“缺失畫素”的值
  • 這兩個過程(如上所述的下采樣和上取樣)由OpenCV函式 pyrUp()pyrDown() 實現,我們將在下面的程式碼示例中看到。
注意
當我們減小影像尺寸時,實際上是丟失了影像資訊。

程式碼

本教程的程式碼如下所示。

解釋

讓我們檢查一下程式的總體結構

載入影像

建立視窗

迴圈

執行一個無限迴圈,等待使用者輸入。如果使用者按下 ESC 鍵,程式將退出。此外,它還有兩個選項:

  • 執行上取樣 - 放大(按下 'i' 後)

    我們使用帶有三個引數的函式 pyrUp()

    • src:當前和目標影像(將在螢幕上顯示,應為輸入影像的兩倍)
    • Size( tmp.cols*2, tmp.rows*2 ) :目標尺寸。由於我們正在進行上取樣,pyrUp() 期望的尺寸是輸入影像(在本例中為 src)的兩倍。
  • 執行下采樣 - 縮小(按下 'o' 後)

    我們使用帶有三個引數的函式 pyrDown()(與 pyrUp() 類似):

    • src:當前和目標影像(將在螢幕上顯示,應為輸入影像的一半)
    • Size( tmp.cols/2, tmp.rows/2 ) :目標尺寸。由於我們正在進行下采樣,pyrDown() 期望的尺寸是輸入影像(在本例中為 src)的一半。

請注意,輸入影像的尺寸(兩個維度)必須能被二整除。否則,將顯示錯誤。

結果

  • 程式預設呼叫 `samples/data` 資料夾中的影像 chicky_512.png。請注意,該影像尺寸為 \(512 \times 512\),因此下采樣不會產生任何錯誤(\(512 = 2^{9}\))。原始影像如下所示:
  • 首先,我們透過按下 'd' 鍵執行兩次連續的 pyrDown() 操作。輸出如下:
  • 請注意,由於我們減小了影像尺寸,應該會損失一些解析度。在我們兩次應用 pyrUp()(透過按下 'u' 鍵)後,這一點變得顯而易見。現在的輸出是: