?????? 圖像金字塔被廣泛用于各種視覺應用中。圖像金字塔是一個圖像集合,集合中所有的圖像都源于同一個原始圖像,而且是通過對原始圖像連續降采樣活得,直到達到某個中止條件才停止降采樣。(當然,降為一個像素肯定是中止條件。)
????? 有兩種類型的圖像金字塔常常出現在文獻和應用中:高斯金字塔用來向下降采樣圖像,而拉普拉斯金字塔則用來從金字塔低層圖像中向上采樣重建一個圖像。
????? 要從金字塔第 i 層生成第i+1 層,我們先要用高斯核對第i 層進行卷積,然后刪除所有偶數行和偶數列。當然,新得到的圖像面積會變為源圖像的四分之一。按上述過程對輸入圖像循環執行操作就可產生整個金字塔。
????? Opencv為我們提供了從金字塔中上一級圖像生成下一級圖像的方法:cvPyrDown。同樣,我們可以通過后面相似的函數(但不是降采樣的逆操作)將現有的圖像在每個維度上都放大兩倍:cvPyrUp。在這種情況下,圖像首先在每個維度上都擴大為原來的兩倍,新增的行(偶數行)以0填充。然后給指定的濾波器進行卷積(實際上是一個在每一維上都擴大為兩倍的過濾器)去估計”丟失“像素的近似值。
????? 我們之前注意到函數cvPyrUp并不是函數cvPyrDown的逆操作。之所以這樣是因為cvPyrDown是一個會丟失信息的函數。為了恢復原來(更高的分辨率)的圖像,我們需要獲得由降采樣操作丟失的信息。
?????????
??? PyrDown ???? 圖像的下采樣 ?
??? void cvPyrDown( const CvArr* src, CvArr* dst, int filter=CV_GAUSSIAN_5x5 ); ?
??? src ?
??? 輸入圖像. ?
??? dst ?
??? 輸出圖像, 寬度和高度應是輸入圖像的一半 ,傳入前必須已經完成初始化 ?
??? filter ?
??? 卷積濾波器的類型,目前僅支持 CV_GAUSSIAN_5x5 ?
??? 函數 cvPyrDown 使用 Gaussian 金字塔分解對輸入圖像向下采樣。首先它對輸入圖像用指定濾波器進行卷積,然后通過拒絕偶數的行與列來下采樣圖像。 ?
?
? ?? PyrUp ?
??? 圖像的上采樣 ?
??? void cvPyrUp( const CvArr* src, CvArr* dst, int filter=CV_GAUSSIAN_5x5 ); ?
??? src ?
??? 輸入圖像. ?
??? dst ?
??? 輸出圖像, 寬度和高度應是輸入圖像的2倍 ?
??? filter ?
??? 卷積濾波器的類型,目前僅支持 CV_GAUSSIAN_5x5 ?
??? 函數 cvPyrUp 使用Gaussian 金字塔分解對輸入圖像向上采樣。首先通過在圖像中插入 0 偶數行和偶數列,然后對得到的圖像用指定的濾波器進行高斯卷積,其中濾波器乘以4做插值。所以輸出圖像是輸入圖像的 4 倍大小。(hunnish: 原理不清楚,尚待探討)?
#include "StdAfx.h" #include "highgui.h" #include"cv.h" //superdont //blog.csdn.net/<span class="username">pinbodexiaozhu</span> int main(int argc,char ** argv) { IplImage * src = cvLoadImage("guagua.bmp"); IplImage * result1 = cvCreateImage( cvSize( src->width/2, src->height/2 ), src->depth, src->nChannels ); cvPyrDown( src, result1,CV_GAUSSIAN_5x5); IplImage * result2 = cvCreateImage( cvSize( src->width*2, src->height*2 ), src->depth, src->nChannels ); cvPyrUp( src, result2,CV_GAUSSIAN_5x5); cvNamedWindow("source",1); cvShowImage("source",src); cvNamedWindow( "PyrDown" ,1); cvShowImage( "PyrDown", result1); cvNamedWindow( "PyrUp" ,1); cvShowImage( "PyrUp",result2); cvWaitKey(0); cvReleaseImage(&src); cvReleaseImage(&result1); cvReleaseImage(&result2); cvDestroyAllWindows(); return 0; }