[OpenCV] 数字图像处理 C++ 学习——09图像金字塔上采样(PyrUp)和降采样(PyrDown) 附完整代码

文章目录

前言

本博客主要学习图像金字塔技术中的上采样和降采样操作。这些操作用于改变图像的分辨率,是多尺度图像处理的基础。通过上采样(拉普拉斯金字塔)可以放大图像,恢复或接近原始图像,而降采样(高斯金字塔)可以缩小图像,减少图像的细节,从而降低图像处理的计算复杂度。本博客将详细讲解上采样和降采样的原理,并提供完整的实现代码,通过具体示例来展示这些操作的实际效果。

1.理论基础

图像金字塔是一种通过连续降低图像分辨率来创建一系列图像的技术。每一个层次的图像都是前一层次图像的降采样版本。图像金字塔分为两种类型:高斯金字塔和拉普拉斯金字塔。

(1)高斯金字塔 (Gaussian Pyramid)

高斯金字塔是一种通过对图像进行高斯模糊处理,然后进行降采样来减少图像分辨率的金字塔。每一层图像都是上一层图像的一半分辨率。高斯金字塔通常用于图像压缩和多分辨率图像分析。

构建过程

  1. 应用高斯模糊:对原始图像使用高斯滤波器,模糊图像。
  2. 降采样:将模糊后的图像尺寸减半,得到高斯金字塔的下一层。

(2)拉普拉斯金字塔(Laplacian Pyramid)

拉普拉斯金字塔是一种基于高斯金字塔构建的图像金字塔,用于捕捉图像中的边缘和细节信息。每一层的拉普拉斯金字塔图像是对应的高斯金字塔层图像与其上一层上采样图像的差值。

构建过程

  1. 创建高斯金字塔:首先构建一个高斯金字塔。
  2. 上采样和求差
    • 从高斯金字塔的低分辨率层开始,将该层图像上采样至高分辨率。
    • 将上采样图像与相应的高分辨率层图像相减,得到拉普拉斯金字塔的图像。
    • 每一层拉普拉斯金字塔的图像代表了原始图像在相应尺度上的细节。

2.代码实现

(1)图像读取

文章使用到的图像,供下载学习使用sherlock2.jpg

可参考[OpenCV] 数字图像处理 C++ 学习------01图像的读取、加载和保存附完整代码(小白入门篇)

cpp 复制代码
	cv::Mat inputimage;
	inputimage = imread("sherlock2.jpg");
	if (inputimage.empty()) {
		printf("could not find the image...\n");
		return;
	}
	namedWindow("input image", cv::WINDOW_AUTOSIZE);
	cv::imshow("input image", inputimage);

(2)图像上采样(PyrUp)和降采样(PyrDown)

降采样是指将图像的分辨率降低至原来的一半。上采样是指将图像的分辨率提高至原来的一倍。

cpp 复制代码
	//降采样
	cv::Mat downsampledImage;
	cv::pyrDown(inputimage, downsampledImage);  // 构建高斯金字塔的下一层
	cv::imshow("Downsampled Image", downsampledImage);
	//上采样
	cv::Mat upsampledImage;
	cv::pyrUp(inputimage, upsampledImage); // 上采样操作
	cv::imshow("Upsampled Image", upsampledImage

上采样结果:

(3)高斯金字塔

pyrDown() 函数简化高斯金字塔的构建过程,自动执行高斯模糊和降采样步骤,直接调用 pyrDown() 就可以构建高斯金字塔的每一层。

高斯金字塔结果:

(4)拉普拉斯金字塔

对原始图像进行降采样和上采样后计算它们的差异,生成了拉普拉斯金字塔图像,用于突出显示图像中的边缘和细节。

cpp 复制代码
	//拉普拉斯金字塔
	cv::Mat laplacianImage;
	cv::pyrDown(inputimage, downsampledImage);
	cv::pyrUp(downsampledImage, upsampledImage, inputimage.size());
	// 计算拉普拉斯金字塔图像
	cv::subtract(inputimage, upsampledImage, laplacianImage);
	cv::imshow("Laplacian Pyramid Image", laplacianImage);

拉普拉斯金字塔结果:

3.完整代码

cpp 复制代码
#include<opencv2/opencv.hpp>
#include<highgui.hpp>

using namespace cv;
using namespace std;

void iamge_Pyramid()
{
	cv::Mat inputimage;
	inputimage = imread("sherlock2.jpg");
	if (inputimage.empty()) {
		printf("could not find the image...\n");
		return;
	}
	namedWindow("input image", cv::WINDOW_AUTOSIZE);
	cv::imshow("input image", inputimage);
	//降采样
	cv::Mat downsampledImage;
	cv::pyrDown(inputimage, downsampledImage);  // 构建高斯金字塔的下一层
	cv::imshow("Downsampled Image", downsampledImage);
	//上采样
	cv::Mat upsampledImage;
	cv::pyrUp(inputimage, upsampledImage); // 上采样操作
	cv::imshow("Upsampled Image", upsampledImage);

	//高斯金字塔
	cv::imshow("Gaussian Pyramid - Downsampled Image", downsampledImage);
	//拉普拉斯金字塔
	cv::Mat laplacianImage;
	cv::pyrDown(inputimage, downsampledImage);
	cv::pyrUp(downsampledImage, upsampledImage, inputimage.size());
	// 计算拉普拉斯金字塔图像
	cv::subtract(inputimage, upsampledImage, laplacianImage);
	cv::imshow("Laplacian Pyramid Image", laplacianImage);

	cv::waitKey(0);
}
int main() 
{
	iamge_Pyramid();
    return 0;
}
相关推荐
Damon小智5 分钟前
合合信息DocFlow产品解析与体验:人人可搭建的AI自动化单据处理工作流
图像处理·人工智能·深度学习·机器学习·ai·自动化·docflow
半盏茶香15 分钟前
扬帆数据结构算法之雅舟航程,漫步C++幽谷——LeetCode刷题之移除链表元素、反转链表、找中间节点、合并有序链表、链表的回文结构
数据结构·c++·算法
哎呦,帅小伙哦23 分钟前
Effective C++ 规则41:了解隐式接口和编译期多态
c++·effective c++
DARLING Zero two♡1 小时前
【初阶数据结构】逆流的回环链桥:双链表
c语言·数据结构·c++·链表·双链表
9毫米的幻想1 小时前
【Linux系统】—— 编译器 gcc/g++ 的使用
linux·运维·服务器·c语言·c++
Cando学算法1 小时前
Codeforces Round 1000 (Div. 2)(前三题)
数据结构·c++·算法
字节高级特工1 小时前
【优选算法】5----有效三角形个数
c++·算法
荣--2 小时前
HiJobQueue:一个简单的线程安全任务队列
c++·编码
hunter2062063 小时前
用opencv生成视频流,然后用rtsp进行拉流显示
人工智能·python·opencv
好评笔记9 小时前
AIGC视频生成模型:Stability AI的SVD(Stable Video Diffusion)模型
论文阅读·人工智能·深度学习·机器学习·计算机视觉·面试·aigc