圖像金字塔是圖像中多尺度表達的一種,也是很常見的,最主要用於圖像的分割。opencv中給出了圖像金字塔的一些列函數,再談openv之前先介紹下高斯金字塔和拉普拉斯金字塔
1 高斯金字塔和拉普拉斯金字塔
(1)高斯金字塔是通過高斯平滑和亞采樣獲得一些列下采樣圖像,也就是說第K層高斯金字塔通過平滑、亞采樣就可以獲得K+1層高斯圖像,高斯金字塔包含了一系列低通濾波器,其截至頻率從上一層到下一層是以因子2逐漸增加,所以高斯金字塔可以跨越很大的頻率范圍。金字塔的圖像如下:
高斯金字塔 拉普拉斯金字塔
(2)拉普拉斯金字塔包含了一些列的帶通濾波器,其具體過程如下:

可以看出,拉普拉絲圖像的形成過程大致為對原圖像進行低通濾波和降采樣得到一個粗尺度的近似圖像, 即分解得到的低通近似圖像, 把這個近似圖像經過插值、濾波, 再計算它和原圖像的差值, 就得到分解的帶通分量。下一級分解是在得到的低通近似圖像上進行, 迭代完成多尺度分解。可以看出拉普拉斯金字塔的分解過程(如圖1所示)包括四個步驟: 1低通濾波;2降采樣(縮小尺寸); 3內插(放大尺寸); 4帶通濾波(圖像相減) 。拉普拉斯圖像突出圖像中的高頻分量,注意的是拉普拉斯金字塔的最后一層是低通濾波圖像,不是帶通濾波圖像。
(3)源圖像的重建
源圖像的重建是構建拉普拉斯金字塔的逆過程,首先將第K層的高斯圖像 插值放大一倍,然后和第K-1層拉普拉斯金字塔相加就可以得到第K-1層的高斯金字塔圖像。以此類推,就可以得到源圖像。
2.opencv函數
(1)PyrDown 構建高斯金字塔
cvPyrDown函數
PyrDown
圖像的下采樣
void cvPyrDown( const CvArr* src, CvArr* dst, int filter=CV_GAUSSIAN_5x5 );
src 輸入圖像.
dst 輸出圖像, 寬度和高度應是輸入圖像的一半 ,傳入前必須已經完成初始化
filter 卷積濾波器的類型,目前僅支持 CV_GAUSSIAN_5x5
函數 cvPyrDown 使用 Gaussian 金字塔分解對輸入圖像向下采樣。首先它對輸入圖像用指定濾波器進行卷積,然后通過拒絕偶數的行與列來下采樣圖像。
(2)PyrUp(獲取的不是高斯金字塔的圖像哦)
cvPyrUp
void cvPyrUp( const CvArr* src, CvArr* dst, int filter=CV_GAUSSIAN_5x5 );
src 輸入圖像.
dst 輸出圖像, 寬度和高度應是輸入圖像的2倍
filter 卷積濾波器的類型,目前僅支持 CV_GAUSSIAN_5x5
函數 cvPyrUp 使用Gaussian 金字塔分解對輸入圖像向上采樣。首先通過在圖像中插入 0 偶數行和偶數列,然后對得到的圖像用指定的濾波器進行高斯卷積,
其中濾波器乘以4做插值。所以輸出圖像是輸入圖像的 4 倍大小
PyrUp處理結果
PyrDown和PyrUp過程並不是逆過程,opencv中PyrDown可以構建高斯金字塔,但是PyrUp函數得到的並不是拉普拉斯圖像,《learning opencv》中解釋說PyrUp函數實現的函數為:
實際上,我利用這個函數得到的圖像是一個經過低通濾波的圖像,可以看下圖:dst明顯是src圖像的一個高斯濾波。而並不是帶通圖像。也就是說PyrUp函數其實只是實現了
過程,查看源代碼確實如此。
構建拉普拉斯金字塔就可以將高斯金字塔減去響應的PyrUp處理結果即可,我寫了一個例子驗證這個結果:
構建拉普拉斯金字塔
cvNamedWindow("G0");
cvNamedWindow("G1");
cvNamedWindow("G1*g(5*5)");
cvNamedWindow("L0");
IplImage *img=cvLoadImage("Miss.bmp");
IplImage *img2 = cvCreateImage(cvSize(img->width,img->height),IPL_DEPTH_8U,1);
IplImage *img3 = cvCreateImage(cvSize(img->width/2,img->height/2),IPL_DEPTH_8U,1);
IplImage *img4 = cvCreateImage(cvSize(img->width,img->height),IPL_DEPTH_8U,1);
cvCvtColor(img,img2,CV_BGR2GRAY);
cvShowImage("G0",img2); //G0
cvPyrDown(img2,img3);
cvShowImage("G1",img3); //G1
cvPyrUp(img3,img4);
cvShowImage("G1*g(5*5)",img4); //對G1插值,然后使用高斯濾波(cvPyrUp過程)
cvSub(img2,img4,img4); //G0減去G1插值后的圖像獲得L0
cvShowImage("L0",img4);
cvDestroyWindow("G0");
cvDestroyWindow("G1");
cvDestroyWindow("G1*g(5*5)");
cvDestroyWindow("L0");
cvReleaseImage(&img2);
處理過程圖像以及結果

L0中包含很明顯的高頻信息,並不是低通結果,L金字塔剩下的構建以此類推。
關於金字塔的分割回頭和其他的分割算法一起學習吧