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; }
- opencv学习笔记(十四)图像金字塔
- OpenCV学习笔记-图像金字塔
- OpenCV学习笔记-图像金字塔
- OpenCV学习笔记-图像金字塔
- OpenCV学习笔记-图像金字塔
- opencv学习笔记--图像金字塔
- OpenCv学习笔记(一):图像金字塔之初步理解
- OpenCV学习笔记(七) 图像金字塔 阈值 边界
- OpenCV学习笔记15-图像金字塔
- 【OpenCV图像处理】十四、图像金字塔
- 【学习OpenCV】图像金字塔
- 【OpenCV学习笔记】十四、图像几何变换
- opencv学习(5)---图像金字塔
- opencv学习-imgprocess-图像金字塔
- Opencv学习笔记(八):高斯图像金字塔PyrDown,PyrUP
- Python下opencv使用笔记(八)(图像金字塔)
- 学习OpenCV范例(十三)——图像金字塔
- Python+OpenCV学习(14)---Laplace金字塔进行图像融合
- 《Spark商业案例与性能调优实战100课》第1课:商业案例之通过RDD实现分析大数据电影点评系统中电影的用户行为信息
- Windows 平台运行spark-shell 报"java.lang.NullPointerException, not found: value sqlContext" error 解决办法
- [1]《微交互》读感 —— 往小处想,改变世界!
- WindowsPowerShell 出现无法识别cmdlet、函数、脚本等错误
- Java注解处理器 - 五分钟快速入门
- opencv学习笔记(十四)图像金字塔
- HTTP返回码
- MySQL binlog 组提交与 XA(两阶段提交)
- Windows平台下,将mdb文件快速向MySQL中导入数据的方法
- java学习之路 之 基本语法-程序流程控制-(if-else)语句练习题
- 交叉编译详解 三 使用脚本自动生成交叉编译链
- 两阶段提交协议与三阶段提交协议
- 机器学习入门之基本概念
- MXNet 中文教程:图像分类