- 操作系统:ubuntu22.04
 - OpenCV版本:OpenCV4.9
 - IDE:Visual Studio Code
 - 编程语言:C++11
 
算法描述
在计算机视觉和图像处理中,构建图像金字塔(Image Pyramid)是一种常用的技术,它生成一系列分辨率逐渐降低的图像副本。图像金字塔在很多应用中都非常有用,比如目标检测、特征匹配、尺度不变特征提取等。
图像金字塔的类型
- 高斯金字塔(Gaussian Pyramid): 
  
- 通常用于生成不同尺度下的图像副本。
 - 每一层金字塔都是前一层的低通滤波版本。
 
 - 拉普拉斯金字塔(Laplacian Pyramid): 
  
- 通常用于图像融合、图像压缩等。
 - 每一层是相邻两层高斯金字塔之间的差异。
 
 
函数原型
函数构建图像的高斯金字塔。
 该函数构造一个图像向量,并通过递归地应用 pyrDown 到之前构建的金字塔层来构建高斯金字塔,从 dst[0] == src 开始。
void cv::buildPyramid	
(
	InputArray 	src,
	OutputArrayOfArrays 	dst,
	int 	maxlevel,
	int 	borderType = BORDER_DEFAULT 
)	
 
参数
- 参数src: 源图像。请参阅 pyrDown 的文档以获取支持的图像类型列表。
 - 参数dst: 目的地向量,包含 maxlevel + 1 个与 src 同类型的图像。dst[0] 将与 src 相同。dst[1] 是金字塔的下一层,它是 src 的平滑和缩小版,依此类推。
 - 参数maxlevel:最后一层(最小的一层)金字塔的 0 基索引。必须是非负数。
 - 参数borderType:像素外推方法,参见 BorderTypes(不支持 BORDER_CONSTANT)
 
示例代码
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
int main(int argc, char** argv)
{
    // 加载图像
    cv::Mat src = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/fruit_small.jpg", cv::IMREAD_COLOR);
    if (!src.data)
    {
        std::cerr << "错误: 无法打开或找到图像。" << std::endl;
        return -1;
    }
    // 创建金字塔
    int maxlevel = 3; // 金字塔层数
    std::vector<cv::Mat> pyramid(maxlevel + 1);
    // 构建高斯金字塔
    pyramid[0] = src; // 第一层为原始图像
    for (int i = 1; i <= maxlevel; ++i)
    {
        cv::pyrDown(pyramid[i - 1], pyramid[i]); // 使用pyrDown构建下一层
    }
    // 显示原始图像和金字塔中的每一层
    cv::namedWindow("原始图像", cv::WINDOW_NORMAL);
    cv::imshow("原始图像", src);
    for (int i = 0; i <= maxlevel; ++i)
    {
        std::stringstream windowNameStream;
        windowNameStream << "金字塔第 " << (i + 1) << " 层";
        std::string windowName = windowNameStream.str();
        cv::namedWindow(windowName, cv::WINDOW_NORMAL);
        cv::imshow(windowName, pyramid[i]);
    }
    cv::waitKey(0);
    return 0;
}
 
运行结果
原始图像:
 
 金字塔第一层:
 
 金字塔第二层:
 
 金字塔第三层:

 金字塔第四层:



















