【OpenCV】图像金字塔详解及编程实现

        图像金字塔被广泛用于各种视觉应用中。图像金字塔是一个图像集合,集合中所有的图像都源于同一个原始图像,而且是通过对原始图像连续降采样获得,直到达到某个中止条件才停止降采样。有两种类型的图像金字塔常常出现在文献和应用中:高斯金字塔和拉普拉斯金字塔。高斯金字塔用来向下降采样图像,而拉普拉斯金字塔则用来从金字塔低层图像中向上采样重建一个图像。

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

编程时要注意

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值