图像金字塔是一个图像集合,集合中所有的图像都源于同一个原始图像,通过对原始图像进行连续采样得到图像集合。
常见的有两种图像金字塔,即高斯金字塔和拉普拉斯金字塔。
高斯金字塔:向下降采样图像。金字塔从i层生成第i+1层,先用高斯核对Gi进行卷积,然后,删除所有偶数行和偶数列。这样,新得到的图像面积会变为源图像的四分之一。循环上述过程,即可产生整个金字塔。
拉普拉斯金字塔:从低层图像中向上采样重建图像。图像首先在每个维度上扩大为原来的两倍,新增的行以0填充,然后与指定的滤波器进行卷积(实际上是一个在每一维度上都扩大为2倍的过滤器)去估计“丢失”像素的近似值。得到后的图像与原来的图像相比会模糊一些,丢失了一些信息。
在OpenCV中给了两个函数,pyrUp和pyrDown函数分别用于实现拉普拉斯金字塔和高斯金字塔的上采样和下采样!
使用示例代码如下:
代码中用到的图像下载链接:http://pan.baidu.com/s/1bQSvls 密码:dlil
图像处理开发资料、图像处理开发需求、图像处理接私活挣零花钱,可以搜索公众号"qxsf321",并关注!
//opencv版本:OpenCV3.0
//VS版本:VS2013
//Author:qxsf321.net
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>
using namespace cv;
using namespace std;
//全局变量
Mat src, dst, tmp;
char* window_name = "pyrDown and pyrUp Demo";
int main(int argc, char** argv)
{
//测试图像
src = imread("jin_dong.jpg");
if (!src.data)
{
printf(" No data! -- Exiting the program \n");
return -1;
}
tmp = src;
dst = tmp;
//创建显示窗口
namedWindow(window_name, CV_WINDOW_AUTOSIZE);
imshow(window_name, dst);
//循环
while (true)
{
int c;
c = waitKey(10);
if ((char)c == 27)
{
break;
}
if ((char)c == 'u')
{
pyrUp(tmp, dst, Size(tmp.cols * 2, tmp.rows * 2));
printf("pryUp : Image x 2 \n");
}
else if ((char)c == 'd')
{
pyrDown(tmp, dst, Size(tmp.cols / 2, tmp.rows / 2));
printf("pyrDown : Image / 2 \n");
}
imshow(window_name, dst);
tmp = dst;
}
return 0;
}
代码说明:
程序运行后,按“u”键则会对图像进行一次“上采样”处理,并显示结果;按“d”键则会对图像进行一次“下采样”处理,并显示结果。按“Esc”键退出程序。
运行结果我录成了视频,大家可以看一看。
视频在线播放地址(注意可以选择高清版哦):http://v.youku.com/v_show/id_XMz ... j.8428770.3416059.1
视频文件下载链接:http://pan.baidu.com/s/1o7IwxUa 密码:vmul