- 操作系统: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;
}
运行结果
原始图像:
金字塔第一层:
金字塔第二层:
金字塔第三层:
金字塔第四层: