跟我學Python影象處理丨關於影象金字塔的影象向下取樣和向上取樣
摘要:本文講述影象金字塔知識,瞭解專門用於影象向上取樣和向下取樣的pyrUp()和pyrDown()函式。
本文分享自華為雲社群《 [Python影象處理] 二十一.影象金字塔之影象向下取樣和向上取樣 》,作者:eastmount。
一.影象金字塔
影象金字塔是指由一組影象且不同分別率的子圖集合,它是影象多尺度表達的一種,以多解析度來解釋影象的結構,主要用於影象的分割或壓縮。一幅影象的金字塔是一系列以金字塔形狀排列的解析度逐步降低,且來源於同一張原始圖的影象集合。如圖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所示,每次向上取樣均為上次影象的四倍,但影象的清晰度會降低。
希望這篇基礎性文章對您有所幫助,如果有錯誤或不足之處,請海涵!
感恩能與大家在華為雲遇見!
參考文獻
- eastmount - [數字影象處理] 三.MFC實現影象灰度、取樣和量化功能詳解
- 《數字影象處理》(第3版),岡薩雷斯著,阮秋琦譯,電子工業出版社,2013年.
- 《數字影象處理學》(第3版),阮秋琦,電子工業出版社,2008年,北京.
- 《OpenCV3程式設計入門》,毛星雲,冷雪飛,電子工業出版社,2015,北京.
- 設計模式之狀態模式
- 如何實現資料庫讀一致性
- 我是怎麼入行做風控的
- C 11精要:部分語言特性
- 吳恩達來信:人工智慧領域的求職小 tips
- EasyCV帶你復現更好更快的自監督演算法-FastConvMAE
- 某車聯網App 通訊協議加密分析(四) Trace Code
- 帶你瞭解CANN的目標檢測與識別一站式方案
- EasyNLP玩轉文字摘要(新聞標題)生成
- PostgreSQL邏輯複製解密
- 基於 CoreDNS 和 K8s 構建雲原生場景下的企業級 DNS
- 迴圈神經網路(RNN)可是在語音識別、自然語言處理等其他領域中引起了變革!
- 技術分享| 分散式系統中服務註冊發現元件的原理及比較
- 利用谷歌地圖採集外貿客戶的電話和手機號碼
- 跟我學Python影象處理丨關於影象金字塔的影象向下取樣和向上取樣
- 帶你掌握如何使用CANN 運算元ST測試工具msopst
- 一招教你如何高效批量匯入與更新資料
- 一步步搞懂MySQL元資料鎖(MDL)
- 你知道如何用 PHP 實現多程序嗎?
- KubeSphere 閘道器的設計與實現(解讀)