Python圖像處理之圖像金字塔的向上和向下取樣
一.圖像金字塔
圖像金字塔是指由一組圖像且不同分別率的子圖集合,它是圖像多尺度表達的一種,以多分辨率來解釋圖像的結構,主要用于圖像的分割或壓縮。一幅圖像的金字塔是一系列以金字塔形狀排列的分辨率逐步降低,且來源于同一張原始圖的圖像集合。如圖6-11所示,它包括了四層圖像,將這一層一層的圖像比喻成金字塔。圖像金字塔可以通過梯次向下采樣獲得,直到達到某個終止條件才停止采樣,在向下采樣中,層級越高,則圖像越小,分辨率越低。
生成圖像金字塔主要包括兩種方式——向下取樣、向上取樣。在圖6-11中,將圖像G0轉換為G1、G2、G3,圖像分辨率不斷降低的過程稱為向下取樣;將G3轉換為G2、G1、G0,圖像分辨率不斷增大的過程稱為向上取樣。
二.圖像向下取樣
在圖像向下取樣中,使用最多的是高斯金字塔。它將對圖像Gi進行高斯核卷積,并刪除原圖中所有的偶數行和列,最終縮小圖像。其中,高斯核卷積運算就是對整幅圖像進行加權平均的過程,每一個像素點的值,都由其本身和鄰域內的其他像素值(權重不同)經過加權平均后得到。常見的3×3和5×5高斯核如下:
高斯核卷積讓臨近中心的像素點具有更高的重要度,對周圍像素計算加權平均值,如圖6-12所示,其中心位置權重最高為0.4。
顯而易見,原始圖像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所示,它將原始圖像壓縮成原圖的四分之一。
多次向下取樣的代碼如下:
# -*- 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()
輸出結果如圖所示:
三.圖像向上取樣
在圖像向上取樣是由小圖像不斷放圖像的過程。它將圖像在每個方向上擴大為原圖像的2倍,新增的行和列均用0來填充,并使用與“向下取樣”相同的卷積核乘以4,再與放大后的圖像進行卷積運算,以獲得“新增像素”的新值。如圖6-15所示,它在原始像素45、123、89、149之間各新增了一行和一列值為0的像素。
在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所示,它將原始圖像擴大為原圖像的四倍。
多次向上取樣的代碼如下:
# -*- 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圖像處理之圖像金字塔的向上和向下取樣的文章就介紹到這了,更多相關Python圖像金字塔內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python3+pycuda實現執(zhí)行簡單GPU計算任務
GPU的加速技術在深度學習、量子計算領域都已經被廣泛的應用。這篇文章就來和大家聊聊Python3如何利用pycuda執(zhí)行簡單GPU計算任務?,感興趣的可以了解一下2023-03-03Python報錯:ModuleNotFoundError的解決辦法
"ModuleNotFoundError: No module named 'xxx'"這個報錯是個非常常見的報錯,幾乎每個python程序員都遇到過,下面這篇文章主要給大家介紹了關于Python報:ModuleNotFoundError錯誤的解決辦法,需要的朋友可以參考下2022-06-06從零學python系列之淺談pickle模塊封裝和拆封數據對象的方法
這個系列也發(fā)了幾篇文章了,都是個人的一些學習心得的記錄,今天在學習文件數據處理的時候了解到有pickle模塊,查找官方文檔學習了一些需要用到的pickle內容。2014-05-05