图像金字塔被广泛用于各种视觉应用中。图像金字塔是一个图像集合,集合中所有的图像都源于同一个原始图像,而且是通过对原始图像连续降采样获得,直到达到某个中止条件才停止降采样。有两种类型的图像金字塔常常出现在文献和应用中:高斯金字塔和拉普拉斯金字塔。高斯金字塔用来向下降采样图像,而拉普拉斯金字塔则用来从金字塔低层图像中向上采样重建一个图像。
void cvPyrDown( const CvArr* src, CvArr* dst, int filter=CV_GAUSSIAN_5x5 );
src -输入图像.
dst -输出图像, 宽度和高度应是输入图像的一半 ,传入前必须已经完成初始化
filter -卷积滤波器的类型,目前仅支持 CV_GAUSSIAN_5x5
函数 cvPyrDown 使用 Gaussian 金字塔分解对输入图像向下采样。首先它对输入图像用指定滤波器进行卷积,然后通过拒绝偶数的行与列来下采样图像。
#include <stdlib.h>
#include <stdio.h>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <vector>
using namespace std;
IplImage* GetPyrDownImage(const IplImage* pSource, int nTime)
{
// 判断输入参数
if (pSource == NULL)
{
printf("GetPyrDownImage Source Image is NULL:\n");
return NULL;
}
if (nTime < 1)
{
printf("func GetPyrDownImage err!\n");
return NULL;
}
CvSize iSourceSize = cvGetSize(pSource);
CvSize iPyrDownSize = cvSize(iSourceSize.width / 2, iSourceSize.height / 2);
//中间变量
IplImage* pPyrDownedImage = cvCreateImage(iPyrDownSize, pSource->depth
,pSource->nChannels);
cvPyrDown(pSource, pPyrDownedImage, CV_GAUSSIAN_5x5);
// 结果
IplImage* pResult;
if (nTime == 1)
{
pResult = cvCloneImage(pPyrDownedImage);
}
else
{
pResult = GetPyrDownImage(pPyrDownedImage, --nTime);
}
cvReleaseImage(&pPyrDownedImage);
return pResult;
}
int main()
{
IplImage *img=cvLoadImage("C:\\Users\\Liu\\Desktop\\bridge.bmp",1);
IplImage *timg;
vector<IplImage *> Vimg;
for (int i=1; i<4; i++)
{
timg=GetPyrDownImage(img,i);
Vimg.push_back(timg);
}
cvNamedWindow("pyramid1", CV_WINDOW_AUTOSIZE );
cvNamedWindow("pyramid2", CV_WINDOW_AUTOSIZE );
cvNamedWindow("pyramid3", CV_WINDOW_AUTOSIZE );
for (int j=0; j<3; j++)
{
cvShowImage("pyramid1",Vimg[0]);
cvShowImage("pyramid2",Vimg[1]);
cvShowImage("pyramid3",Vimg[2]);
}
cvWaitKey(0);
for (int k=0; k<3; k++)
{
cvReleaseImage(&Vimg[k]);
}
cvReleaseImage(&img);
cvDestroyWindow("pyramid1");
cvDestroyWindow("pyramid2");
cvDestroyWindow("pyramid3");
}
注意参数不一致时,会提示:
Formats of input arguments do not match() int function xx
编程时要注意