OpenCV Python - 影像金字塔



有時,我們需要將影像轉換為與其原始尺寸不同的尺寸。為此,您可以放大影像(放大)或縮小影像(縮小)。

影像金字塔是一組影像(由單個原始影像構建),依次向下取樣指定次數。

高斯金字塔用於對影像進行下采樣,而拉普拉斯金字塔則使用較低解析度的金字塔影像重建上取樣影像。

可以將金字塔看作是一組層。影像如下所示:

Pyramid

金字塔較高層的影像尺寸較小。為了生成高斯金字塔中下一層的影像,我們使用高斯核對較低層影像進行卷積。

$$\frac{1}{16}\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}$$

現在刪除所有偶數行和偶數列。生成的影像面積將是其前驅影像的 1/4。對原始影像迭代此過程會生成整個金字塔。

為了使影像變大,用零填充列。首先,將影像在每個維度上放大到原始尺寸的兩倍,用新的偶數行填充,然後使用核進行卷積以近似缺失畫素的值。

**cv.pyrUp()** 函式將原始尺寸加倍,而 **cv.pyrDown()** 函式將其減半。

示例

以下程式根據使用者輸入的“I”或“o”分別呼叫 pyrUp() 和 pyrDown() 函式。

請注意,當我們減小影像尺寸時,會丟失影像資訊。如果我們縮小影像尺寸後再將其重新縮放回原始尺寸,我們會丟失一些資訊,並且新影像的解析度遠低於原始影像。

import sys
import cv2 as cv

filename = 'chicky_512.png'

src = cv.imread(filename)

while 1:
   print ("press 'i' for zoom in 'o' for zoom out esc to stop")
   rows, cols, _channels = map(int, src.shape)
   cv.imshow('Pyramids', src)
   k = cv.waitKey(0)

   if k == 27:
      break

   elif chr(k) == 'i':
      src = cv.pyrUp(src, dstsize=(2 * cols, 2 * rows))

   elif chr(k) == 'o':
      src = cv.pyrDown(src, dstsize=(cols // 2, rows // 2))

cv.destroyAllWindows()

輸出

Image Pyramids

Gaussian Pyramids

Laplacian Pyramids
廣告

© . All rights reserved.