opencv学习笔记(十四)图像金字塔

来源:互联网 发布:js文本框提示信息 编辑:程序博客网 时间:2024/05/17 04:28

图像金字塔被广泛用于各种视觉应用中。图像金字塔是一个图像集合,集合中所有的图像都源于同一个原始图像,而且是通过对原始图像连续降采样获得,直到达到某个中止条件才停止降采样。
我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。
1 高斯金字塔cvPyrDown()

高斯金字塔用来向下降采样图像,而拉普拉斯金字塔则用来从金字塔低层图像中向上采样重建一个图像。
这里的向下与向上采样,是对图像的尺寸而言的(和金字塔的方向相反),向上就是图像尺寸加倍,向下就是图像尺寸减半。而如果我们按上图中演示的金字塔方向来理解,金字塔向上图像其实在缩小,这样刚好是反过来了。
这里写图片描述

要从金字塔第i层生成第i+1层(我们表示第i+ 1层为Gi+1),我们先要用高斯核对Gi进行卷积,然后删除所有偶数行和偶数列。当然,新得到的图像面积会变为源图像的四分之一。按上述过程对输入图像G0循环执行操作就可产生整个金字塔。同时,向下取样会逐渐丢失图像的信息——图像越来越模糊。

1.1高斯金字塔函数cvPyrDown()

    void cvPyrDown    (        const CvArr*src,        CvArr*dst,        int filter=CV_GAUSSIAN_5x5    );  参数:     src 输入图像。     dst 输出图像,其宽度和高度应是输入图像的一半。     filter 卷积滤波器类型,目前仅支持CV_GAUSSIAN_5x5(默认选项)。

1.2代码实例

#include "highgui.h"  #include "cv.h"  IplImage* doPyrDown(IplImage* in,   int filter =  IPL_GAUSSIAN_5x5)  {      assert(in->width % 2 == 0 && in->height % 2 == 0);            IplImage* out = cvCreateImage(cvSize( in->width/2, in->height/2),in->depth,in->nChannels);      cvPyrDown(in, out);      return (out);  };  int main(int argc, char** argv){      IplImage* img = cvLoadImage("a.jpg");      cvNamedWindow("Input", CV_WINDOW_AUTOSIZE);      cvNamedWindow("Output", CV_WINDOW_AUTOSIZE);      cvShowImage("Input", img);     IplImage* out;    out=doPyrDown(img);      cvShowImage("Output", out);      cvWaitKey(0);       cvReleaseImage(&img);      cvReleaseImage(&out);      cvDestroyWindow("Input");      cvDestroyWindow("Output");      return 0;  }  

2 拉普拉斯金字塔cvPyrUp()

  我们可以通过下面相似的函数(但不是降采样的逆操作!)将现有的图像在每个维度上都放大两倍:  void cvPyrUp  (         const CvArr* src,         CvArr* dst,         int filter=CV_GAUSSIAN_5x5   );  参数:  src   输入图像  dst   输出图像, 宽度和高度应是输入图像的2倍   filter   卷积滤波器的类型,目前仅支持 CV_GAUSSIAN_5x5 。

函数 cvPyrUp 使用Gaussian 金字塔分解对输入图像向上采样。首先通过在图像中插入0偶数行和偶数列(指新增的行列都是0),然后对得到的图像用指定的滤波器进行高斯卷积,其中滤波器乘以4做插值。所以输出图像是输入图像的 4 倍大小。
在这种情况下,图像首先在每个维度上扩大为原来的两倍,新增的行(偶数行)以0填充。然后给指定的滤波器进行卷积(实际上是一个在每一维上都扩大为两倍的过滤器)去估计“丢失”像素的近似值。
我们之前注意到函数PyrUp ( )并不是函数PyrDown()的逆操作。之所以这样是因为PyrDown()是一个会丢失信息的函数。为了恢复原来(更高的分辨率)的图像,我们需要获得由降采样操作丢失的信息。这些数据形成了拉普拉斯金字塔。
换句话说:PryDown( )是一个会丢失信息的函数。为了恢复原来更高的分辨率的图像,我们要获得由降采样操作丢失的信息,这些数据就和拉普拉斯金字塔有关系了。

2.1程序实例

#include "highgui.h"  #include "cv.h"  IplImage* doPyrDown(IplImage* in,   int filter =  IPL_GAUSSIAN_5x5)  {      assert(in->width % 2 == 0 && in->height % 2 == 0);            IplImage* out = cvCreateImage(cvSize( in->width*2, in->height*2),in->depth,in->nChannels);      cvPyrUp(in, out);      return (out);  };  int main(int argc, char** argv){      IplImage* img = cvLoadImage("b.jpg");      cvNamedWindow("Input", CV_WINDOW_AUTOSIZE);      cvNamedWindow("Output", CV_WINDOW_AUTOSIZE);      cvShowImage("Input", img);     IplImage* out;    out=doPyrDown(img);      cvShowImage("Output", out);      cvWaitKey(0);       cvReleaseImage(&img);      cvReleaseImage(&out);      cvDestroyWindow("Input");      cvDestroyWindow("Output");      return 0;  }  
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 数学考30分怎么办 小学生阅读理解能力差怎么办 小学一年级数学差怎么办 小学一年级数学很差怎么办 初中生脸上长斑怎么办 初中生脸上长痘怎么办 初中成绩不好高中怎么办 农村老人去城里怎么办 留守儿童想妈妈怎么办 教师档案丢失了怎么办 转正定级表丢失怎么办 娃娃写作业慢怎么办 写作业眼睛疼怎么办 发生火灾怎么办大班教案 大班健康发生火灾怎么办 学生上课不提问怎么办 入户通知单丢了怎么办 打架后还来找事该怎么办 着火了怎么办教案视频 电脑一小半黑屏怎么办 绝地求生闪退怎么办 win7没浏览器了怎么办 浏览器被删除了怎么办 把快捷方式删了怎么办 ie文件找不到了怎么办 ie文件不存在了怎么办 大学素质分不够怎么办 素拓学分不够怎么办 大学毕业之前素拓分拿不满怎么办 武汉幼儿医保卡怎么办 养老院护工欺老人怎么办 皮肤毛孔粗大有痘印痘坑怎么办 额头上毛孔大怎么办 额头皮肤毛孔大怎么办 脸部粗糙毛孔大怎么办 脸上有痘印毛孔粗大怎么办 毛孔粗大痘印怎么办 教官12123一直加载怎么办 教官嗓子哑了怎么办 喜欢上考场教官怎么办 跟教官打起来怎么办