天天看點

跟我學Python圖像處理丨關于圖像金字塔的圖像向下取樣和向上取樣

作者:華為雲開發者聯盟

本文分享自華為雲社群《[Python圖像處理] 二十一.圖像金字塔之圖像向下取樣和向上取樣-雲社群-華為雲》,作者:eastmount。

一.圖像金字塔

前面講解的圖像采樣處理可以降低圖像的大小,本小節将補充圖像金字塔知識,了解專門用于圖像向上采樣和向下采樣的pyrUp()和pyrDown()函數。

圖像金字塔是指由一組圖像且不同分别率的子圖集合,它是圖像多尺度表達的一種,以多分辨率來解釋圖像的結構,主要用于圖像的分割或壓縮。一幅圖像的金字塔是一系列以金字塔形狀排列的分辨率逐漸降低,且來源于同一張原始圖的圖像集合。如圖6-11所示,它包括了四層圖像,将這一層一層的圖像比喻成金字塔。圖像金字塔可以通過梯次向下采樣獲得,直到達到某個終止條件才停止采樣,在向下采樣中,層級越高,則圖像越小,分辨率越低。

跟我學Python圖像處理丨關于圖像金字塔的圖像向下取樣和向上取樣

生成圖像金字塔主要包括兩種方式——向下取樣、向上取樣。在圖6-11中,将圖像G0轉換為G1、G2、G3,圖像分辨率不斷降低的過程稱為向下取樣;将G3轉換為G2、G1、G0,圖像分辨率不斷增大的過程稱為向上取樣。

二.圖像向下取樣

在圖像向下取樣中,使用最多的是高斯金字塔。它将對圖像Gi進行高斯核卷積,并删除原圖中所有的偶數行和列,最終縮小圖像。其中,高斯核卷積運算就是對整幅圖像進行權重平均的過程,每一個像素點的值,都由其本身和鄰域内的其他像素值(權重不同)經過權重平均後得到。常見的3×3和5×5高斯核如下:

跟我學Python圖像處理丨關于圖像金字塔的圖像向下取樣和向上取樣
跟我學Python圖像處理丨關于圖像金字塔的圖像向下取樣和向上取樣

高斯核卷積讓臨近中心的像素點具有更高的重要度,對周圍像素計算權重平均值,如圖6-12所示,其中心位置權重最高為0.4。

跟我學Python圖像處理丨關于圖像金字塔的圖像向下取樣和向上取樣

顯而易見,原始圖像Gi具有M×N個像素,進行向下取樣之後,所得到的圖像Gi+1具有M/2×N/2個像素,隻有原圖的四分之一。通過對輸入的原始圖像不停疊代以上步驟就會得到整個金字塔。注意,由于每次向下取樣會删除偶數行和列,是以它會不停地丢失圖像的資訊。

在OpenCV中,向下取樣使用的函數為pyrDown(),其原型如下所示:

dst = pyrDown(src[, dst[, dstsize[, borderType]]])

  • src表示輸入圖像,
  • dst表示輸出圖像,和輸入圖像具有一樣的尺寸和類型
  • dstsize表示輸出圖像的大小,預設值為Size()
  • borderType表示像素外推方法,詳見cv::bordertypes

實作代碼如下所示:

# -*- coding: utf-8 -*-
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#讀取原始圖像
img = cv2.imread('nv.png')

#圖像向下取樣
r = cv2.pyrDown(img)

#顯示圖像
cv2.imshow('original', img)
cv2.imshow('PyrDown', r)
cv2.waitKey()
cv2.destroyAllWindows()
           

輸出結果如圖6-13所示,它将原始圖像壓縮成原圖的四分之一。

跟我學Python圖像處理丨關于圖像金字塔的圖像向下取樣和向上取樣

多次向下取樣的代碼如下:

# -*- coding: utf-8 -*-
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#讀取原始圖像
img = cv2.imread('nv.png')

#圖像向下取樣
r1 = cv2.pyrDown(img)
r2 = cv2.pyrDown(r1)
r3 = cv2.pyrDown(r2)

#顯示圖像
cv2.imshow('original', img)
cv2.imshow('PyrDown1', r1)
cv2.imshow('PyrDown2', r2)
cv2.imshow('PyrDown3', r3)
cv2.waitKey()
cv2.destroyAllWindows()
           

輸出結果如圖所示:

跟我學Python圖像處理丨關于圖像金字塔的圖像向下取樣和向上取樣

三.圖像向上取樣

在圖像向上取樣是由小圖像不斷放圖像的過程。它将圖像在每個方向上擴大為原圖像的2倍,新增的行和列均用0來填充,并使用與“向下取樣”相同的卷積核乘以4,再與放大後的圖像進行卷積運算,以獲得“新增像素”的新值。如圖6-15所示,它在原始像素45、123、89、149之間各新增了一行和一列值為0的像素。

跟我學Python圖像處理丨關于圖像金字塔的圖像向下取樣和向上取樣

在OpenCV中,向上取樣使用的函數為pyrUp(),其原型如下所示:

dst = pyrUp(src[, dst[, dstsize[, borderType]]])

  • src表示輸入圖像,
  • dst表示輸出圖像,和輸入圖像具有一樣的尺寸和類型
  • dstsize表示輸出圖像的大小,預設值為Size()
  • borderType表示像素外推方法,詳見cv::bordertypes

實作代碼如下所示:

# -*- coding: utf-8 -*-
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#讀取原始圖像
img = cv2.imread('lena.png')

#圖像向上取樣
r = cv2.pyrUp(img)

#顯示圖像
cv2.imshow('original', img)
cv2.imshow('PyrUp', r)
cv2.waitKey()
cv2.destroyAllWindows()
           

輸出結果如圖6-16所示,它将原始圖像擴大為原圖像的四倍。

跟我學Python圖像處理丨關于圖像金字塔的圖像向下取樣和向上取樣

多次向上取樣的代碼如下:

# -*- coding: utf-8 -*-
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#讀取原始圖像
img = cv2.imread('lena2.png')

#圖像向上取樣
r1 = cv2.pyrUp(img)
r2 = cv2.pyrUp(r1)
r3 = cv2.pyrUp(r2)

#顯示圖像
cv2.imshow('original', img)
cv2.imshow('PyrUp1', r1)
cv2.imshow('PyrUp2', r2)
cv2.imshow('PyrUp3', r3)
cv2.waitKey()
cv2.destroyAllWindows()
           

輸出結果如圖6-17所示,每次向上取樣均為上次圖像的四倍,但圖像的清晰度會降低。

跟我學Python圖像處理丨關于圖像金字塔的圖像向下取樣和向上取樣

參考文獻:

  • eastmount - [數字圖像處理] 三.MFC實作圖像灰階、采樣和量化功能詳解
  • 《數字圖像處理》(第3版),岡薩雷斯著,阮秋琦譯,電子工業出版社,2013年.
  • 《數字圖像處理學》(第3版),阮秋琦,電子工業出版社,2008年,北京.
  • 《OpenCV3程式設計入門》,毛星雲,冷雪飛,電子工業出版社,2015,北京.

點選下方,第一時間了解華為雲新鮮技術~

華為雲部落格_大資料部落格_AI部落格_雲計算部落格_開發者中心-華為雲