【图像金字塔】
图像金字塔这个词,我们经常在很多地方可以看到。它是图像多尺度表达的一种,最主要的是用于图像的分割。同时,图像金字塔也被广泛用于各种视觉应用中。
图像金字塔是一个图像集合,集合中所有的图像都源于同一个原始图像,而是通过对原始图像连续降采样获得,直到达到某个终止条件才停止降采样。我们可以通过下图来形象的说明图像金字塔的概念。在金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似。在金字塔中,层级越高,则图像越小,分辨率越低。
在文献中,我们经常遇到两种很典型的图像金字塔-高斯金字塔和拉普拉斯金字塔。
高斯金字塔:向下降采样图像
拉普拉斯金字塔:从低层图像中向上采样重建图像。
具体的过程,我们可以这么描述下:
高斯金字塔:金字塔从i层生成第i+1层,我们要先用高斯核对Gi进行卷积,然后,删除所有偶数行和偶数列。这样,新得到的图像面积会变为源图像的四分之一。循环上述过程,即可产生整个金字塔。
拉普拉斯金字塔:图像首先在每个维度上扩大为原来的两倍,新增的行以0填充,然后给指定的滤波器进行卷积(实际上是一个在每一维上都扩大为2倍的过滤器)去估计“丢失”像素的近似值。得到后的图像与原来的图像相比较会发觉比较模糊,丢失了一些信息。为了恢复出原来的图像,我们需要获得这些丢失的信息,这些信息就构成了拉普拉斯金字塔。
在OpenCV中给出了两个函数,分别提供了从金字塔上一级图像生成下一级图像以及将已知图像在每一个维度上都扩大两倍的函数cvPyrDown()和cvPyrUp():
void cvPyrDown(
IplImage* src,
IplImage* dst,
IplFilter filter=CV_GAUSSIAN_5×5
)
void cvPyrUp(
IplImage* src,
IplImage* dst,
IplFilter filter=CV_GAUSSIAN_5×5
)
下面给出这个函数的应用实例:
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
int main()
{
IplImage* src = cvLoadImage("1.jpg", CV_LOAD_IMAGE_UNCHANGED);
cvShowImage("source", src);
IplImage* dst1 = cvCreateImage(cvSize(src->width / 2, src->height / 2), src->depth, src->nChannels);
cvPyrDown(src, dst1, CV_GAUSSIAN_5x5);
cvShowImage("dst1", dst1);
IplImage* dst2 = cvCreateImage(cvSize(src->width*2, src->height*2), src->depth, src->nChannels);
cvPyrUp(src, dst2, CV_GAUSSIAN_5x5);
cvShowImage("dst2", dst2);
cvWaitKey(0);
cvReleaseImage(&src);
cvReleaseImage(&dst1);
cvReleaseImage(&dst2);
cvDestroyAllWindows();
return 0;
}
程序运行的结果如下: