首页 > 代码库 > 图像金字塔及其在 OpenCV 中的应用范例(上)

图像金字塔及其在 OpenCV 中的应用范例(上)

前言

  图像金字塔是计算机图形学中非常重要的一个概念。

  本文将详细介绍这个概念,以及它的实现与应用。

图像金字塔的定义

  图像金字塔是一组图像的集合,集合中的所有图像都是通过对某一图像连续降采样得到的一组图像序列。

  有两种经典的金字塔:高斯金字塔和拉普拉斯金字塔,前者采用向下采样,后者是向上采样需要的缺失的信息。

  向下采样(生成高斯金字塔)的具体操作为:

    1. 对图像进行高斯卷积

    2. 删除所有的偶数行和偶数列

  向上采样的缺失信息(生成拉普拉斯金字塔)的具体操作为:

    1. 首先将维数扩大两倍

    2. 将扩大位的值置为0

    3. 对新的图像进行高斯卷积

    4. 用新的层次的高斯金字塔减去 3 中形成的图像

采用 OpenCV 实现向下,向上采样

 1 // 此头文件包含图像IO函数的声明 2 #include "highgui.h" 3 // 此头文件包含基本的图像处理函数和高级计算机视觉算法 4 #include "cv.h" 5 #include <iostream> 6  7 int main (void) { 8  9     // 将D盘目录下名为" 1.jpg "的图像加载至内存并获得一个指向该图像内存块的指针img10     IplImage * img = cvLoadImage ("D:\\1.jpg");11 12     // 创建一个窗口显示平滑处理前的图像13     cvNamedWindow ("采样前", CV_WINDOW_AUTOSIZE);14 15     // 将图像装载进窗口并显示此窗口16     cvShowImage ("采样前", img);17 18     // 创建两个新的图像内存块,以存放采样结果。19     IplImage * up = cvCreateImage (20         cvSize(2*img->width, 2*img->height),21         img->depth,22         img->nChannels23     );24     IplImage * down = cvCreateImage (25         cvSize(img->width/2, img->height/2),26         img->depth,27         img->nChannels28     );29 30     // 采样31     cvPyrUp (img, up, IPL_GAUSSIAN_5x5);  32     cvPyrDown (img, down, IPL_GAUSSIAN_5x5);  33    34 35     // 创建窗口显示采样后的图像36     cvNamedWindow ("向上采样", CV_WINDOW_AUTOSIZE);37     cvNamedWindow ("向下采样", CV_WINDOW_AUTOSIZE);38 39     // 将图像装载进窗口并显示窗口40     cvShowImage ("向上采样", up);41     cvShowImage ("向下采样", down);42 43     // 该函数的参数为 0 时,程序将等待用户触发一个按键操作。44     // 若参数为正整数,则程序将暂停该整数个毫秒单位直至用户有任何按键。45     cvWaitKey (0);46 47     // 释放图像内存块48     cvReleaseImage (&img);49     cvReleaseImage (&up);50     cvReleaseImage (&down);51 52     // 关闭窗口同时释放窗口内存块53     cvDestroyWindow ("采样前");54     cvDestroyWindow ("向上采样");55     cvDestroyWindow ("向下采样");56 57     return 0;58 }

运行结果

  

小结

  下篇,将讲解图像金字塔的一个经典应用 - 图像分割。

  

图像金字塔及其在 OpenCV 中的应用范例(上)