图像金字塔被广泛用于各种视觉应用中。图像金字塔是一个图像集合,集合中所有的图像都源于同一个原始图
像,而且是通过对原始图像连续降采样活得,直到达到某个中止条件才停止降采样。(当然,降为一个像素肯
定是中止条件。)
有两种类型的图像金字塔常常出现在文献和应用中:高斯金字塔用来向下降采样图像,而拉普拉斯金字塔则用
来从金字塔低层图像中向上采样重建一个图像。
要从金字塔第 i 层生成第i+1 层,我们先要用高斯核对第i 层进行卷积,然后删除所有偶数行和偶数列。当
然,新得到的图像面积会变为源图像的四分之一。按上述过程对输入图像循环执行操作就可产生整个金字塔。
Opencv为我们提供了从金字塔中上一级图像生成下一级图像的方法:cvPyrDown。同样,我们可以通过后面
相似的函数(但不是降采样的逆操作)将现有的图像在每个维度上都放大两倍:cvPyrUp。在这种情况下,图
像首先在每个维度上都扩大为原来的两倍,新增的行(偶数行)以0填充。然后给指定的滤波器进行卷积(实际
上是一个在每一维上都扩大为两倍的过滤器)去估计”丢失“像素的近似值。
我们之前注意到函数cvPyrUp并不是函数cvPyrDown的逆操作。之所以这样是因为cvPyrDown是一个会丢失信
息的函数。为了恢复原来(更高的分辨率)的图像,我们需要获得由降采样操作丢失的信息。
实例:
#include<cv.h> #include<highgui.h> int main() { IplImage* src = NULL; IplImage* down = NULL; IplImage* up = NULL; src = cvLoadImage ("test.jpg", 1); down = cvCreateImage (cvSize(src->width/2, src->height/2), src->depth, src->nChannels); up = cvCreateImage (cvSize(src->width*2, src->height*2), src->depth, src->nChannels); cvPyrDown (src, down, IPL_GAUSSIAN_5x5); cvPyrUp (src, up, IPL_GAUSSIAN_5x5); cvNamedWindow ("src", 1); cvShowImage ("src", src); cvNamedWindow ("Down", 1); cvShowImage ("Down", down); cvNamedWindow ("Up", 1); cvShowImage ("Up", up); cvWaitKey (0); cvReleaseImage (&src); cvReleaseImage (&down); cvReleaseImage (&up); return 0; }