10.2高斯金字塔-向上取样

实验原理

在OpenCV中,高斯金字塔(Gaussian Pyramid)和上采样(Upsampling)是图像处理中的常见技术,它们经常用于图像的多分辨率分析。高斯金字塔主要用于图像的多尺度表示,而上采样则是将图像放大到更高分辨率的过程。以下是如何在OpenCV C++中实现高斯金字塔及其上采样的详细步骤和示例代码。

高斯金字塔
高斯金字塔是通过对图像进行连续的下采样和模糊处理来构建的。高斯金字塔是一种图像的多分辨率表示方法,它通过对图像进行下采样(降低分辨率)来形成一系列不同分辨率的图像集合。每个下采样层都比上一层分辨率更低,而这个过程通常通过高斯滤波器完成。具体步骤如下:

1.初始化:从原始图像开始。
2.高斯模糊:对当前层的图像进行高斯模糊处理,以减少高频噪声。
3.下采样:将模糊后的图像尺寸减半,通常是通过丢弃每隔一个像素来实现的。
4.重复:对得到的新图层重复上述过程,直到达到所需的层次数。

向上取样(上采样)
向上取样是指将低分辨率的图像恢复到较高分辨率的过程。通常是在高斯金字塔的上下文中进行的,以便在构建拉普拉斯金字塔时能够恢复图像的细节信息(向上取样通常用于重建图像的细节)。上采样的步骤如下:

1.上采样:将图像尺寸增加一倍,通常是通过插入零值像素来实现的。
2.高斯滤波:对上采样后的图像进行高斯滤波,以去除插值产生的高频噪声。

pyrDown函数

pyrDown 是 OpenCV 中用于构建高斯金字塔的一个函数。该函数通过下采样(通常是指图像尺寸减半)来生成较小的图像,常用于图像金字塔的构建中。下面是对 pyrDown 函数的详细解释以及一个示例代码。

函数原型

void pyrDown(InputArray src, OutputArray dst, const Size &dstsize=Size(), int borderType=BORDER_DEFAULT);
参数说明
src: 输入图像,可以是单通道或多通道图像。
dst: 输出图像,是经过下采样处理后的图像。输出图像的类型应与输入图像相同。
dstsize: 可选参数,默认情况下,如果未指定,则输出图像的尺寸将是输入图像尺寸的一半。
borderType: 可选参数,默认值为 BORDER_DEFAULT。当输入图像的尺寸不是输出图像尺寸的两倍时,此参数决定了如何处理边缘像素。常用的边界类型有 BORDER_REFLECT、BORDER_CONSTANT 等。

下采样过程
pyrDown 函数通常包括以下步骤:

1.高斯模糊:对输入图像进行高斯模糊,以减少高频噪声,避免下采样过程中出现伪影。
2.下采样:将高斯模糊后的图像尺寸减半,通常是通过丢弃每隔一个像素来实现的。

示例代码

下面是一个使用 pyrDown 构建高斯金字塔的示例代码:

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main(int argc, char** argv)
{// 读取图像Mat img = imread("04.jpg", IMREAD_COLOR);if (img.empty()){cout << "Error: Image cannot be loaded!" << endl;return -1;}int levels = 3;  // 定义金字塔层数vector<Mat> pyr(levels);// 创建高斯金字塔pyr[0] = img;for (int i = 1; i < levels; ++i){pyrDown(pyr[i - 1], pyr[i]);}// 显示每一层for (int i = 0; i < levels; ++i){namedWindow("Level " + to_string(i), WINDOW_NORMAL);imshow("Level " + to_string(i), pyr[i]);}waitKey(0);  // 等待按键退出return 0;
}说明:
1.读取图像:读取一个图像文件,并检查是否成功加载。
2.创建高斯金字塔:使用 pyrDown 函数逐层创建高斯金字塔。这里假设每层都是前一层尺寸的一半。
3.显示图像:使用 imshow 函数显示高斯金字塔的每一层。注意事项
如果输入图像的宽度或高度不是2的幂次方,那么在下采样过程中可能会出现尺寸不匹配的情况。这时可以通过调整 dstsize 参数或者在调用 pyrDown 之前调整输入图像的尺寸来解决。
pyrDown 使用了一个默认的高斯核进行模糊处理。如果你需要自定义高斯核,可以先手动对图像进行高斯模糊,然后再进行下采样。

运行结果

pyrUp函数

pyrUp 是 OpenCV 提供的一个函数,用于从较小的图像生成较大的图像,即上采样操作。这个函数通常用于图像金字塔的构建中,与 pyrDown 函数相对应。下面是对 pyrUp 函数的详细解释以及一个示例代码。

函数原型

void pyrUp(InputArray src, OutputArray dst, const Size &dsize=Size(), int borderType=BORDER_DEFAULT);
参数说明
src: 输入图像,可以是单通道或多通道图像。
dst: 输出图像,是经过上采样处理后的图像。输出图像的类型应与输入图像相同。
dsize: 可选参数,默认情况下,如果未指定,则输出图像的尺寸将是输入图像尺寸的两倍。你可以指定不同的尺寸来改变输出图像的大小。
borderType: 可选参数,默认值为 BORDER_DEFAULT。当输入图像放大到目标尺寸时,此参数决定了如何处理边缘像素。常用的边界类型有 BORDER_REFLECT、BORDER_CONSTANT 等。

上采样过程
pyrUp 函数通常包括以下步骤:

1.高斯模糊:尽管 pyrUp 主要用于上采样,但它也会使用一个高斯核来平滑图像,这有助于避免放大过程中可能出现的高频噪声。
2.上采样:将图像尺寸放大,通常是通过插值算法来估计新增像素的值。

示例代码

下面是一个使用 pyrUp 构建拉普拉斯金字塔的示例代码:

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main(int argc, char** argv)
{// 读取图像Mat img = imread("path/to/your/image.jpg", IMREAD_COLOR);if (img.empty()){cout << "Error: Image cannot be loaded!" << endl;return -1;}// 创建一个小的图像Mat smallImg;pyrDown(img, smallImg);// 将小图像上采样回原尺寸Mat upsampledImg;pyrUp(smallImg, upsampledImg, img.size());// 显示原始图像和上采样的图像namedWindow("Original Image", WINDOW_NORMAL);imshow("Original Image", img);namedWindow("Upsampled Image", WINDOW_NORMAL);imshow("Upsampled Image", upsampledImg);waitKey(0);  // 等待按键退出return 0;
}说明:
1.读取图像:读取一个图像文件,并检查是否成功加载。
2.创建小图像:使用 pyrDown 函数创建一个较小的图像。
3.上采样图像:使用 pyrUp 函数将小图像上采样回原图像的尺寸。
4.显示图像:使用 imshow 函数显示原始图像和上采样后的图像。
注意事项
在使用 pyrUp 时,通常会将图像放大到特定的尺寸,通常是原始尺寸的两倍。但是,也可以指定不同的尺寸来适应不同的需求。
上采样过程中,图像质量可能会有所损失,因为从较小的图像中恢复丢失的信息是有限的。因此,在进行图像放大时,可能会观察到一些模糊效果。

运行结果

示例代码1

下面是一个使用OpenCV C++构建高斯金字塔并执行上采样的示例代码:

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main(int argc, char** argv)
{// 读取图像Mat img = imread("path/to/your/image.jpg", IMREAD_COLOR);if (img.empty()){cout << "Error: Image cannot be loaded!" << endl;return -1;}int levels = 3;  // 定义金字塔层数vector<Mat> pyr(levels);// 创建高斯金字塔pyr[0] = img;for (int i = 1; i < levels; ++i){pyrDown(pyr[i-1], pyr[i]);}// 上采样并显示每一层Mat upsampled;for (int i = levels - 1; i >= 0; --i){if (i < levels - 1){// 上采样当前层pyrUp(pyr[i], upsampled, pyr[i-1].size());imshow("Upsampled Level " + to_string(i), upsampled);}else{imshow("Original Level " + to_string(i), pyr[i]);}}waitKey(0);  // 等待按键退出return 0;
}说明:
读取图像:读取一个图像文件,并检查是否成功加载。
创建高斯金字塔:使用 pyrDown 函数逐层创建高斯金字塔。
上采样并显示:从最底层开始,使用 pyrUp 函数上采样每一层,并显示结果。
注意事项:
在上采样过程中,pyrUp 函数要求输出图像的大小必须指定。这是因为上采样不仅仅是简单地插入零值,还需要根据目标大小进行插值。
pyrDown 和 pyrUp 函数默认使用了特定的高斯核来进行模糊处理和插值。

运行结果1

此代码会报错尚未处理!

示例代码2

以下是一个C++示例,展示了如何使用OpenCV构建高斯金字塔,并演示如何从高斯金字塔的一层向上取样回到原图分辨率:

#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;void buildGaussianPyramid(const Mat &src, vector<Mat>& gaussianPyramid, int levels) {// 初始化高斯金字塔的第一层gaussianPyramid.push_back(src.clone());// 构建剩余的高斯金字塔层for (int i = 0; i < levels - 1; ++i) {Mat nextLevel;pyrDown(gaussianPyramid[i], nextLevel);gaussianPyramid.push_back(nextLevel);}
}void upSampleFromGaussian(const vector<Mat>& gaussianPyramid, vector<Mat>& upsampledLayers) {// 初始化向上取样后的第一层为原图upsampledLayers.push_back(gaussianPyramid.front().clone());// 从第二层开始向上取样for (size_t i = 1; i < gaussianPyramid.size(); ++i) {Mat expanded;pyrUp(gaussianPyramid[i], expanded, gaussianPyramid[i - 1].size());upsampledLayers.push_back(expanded);}
}int main(int argc, char** argv) {// 加载图像Mat img = imread("07.jpg", IMREAD_GRAYSCALE);if (!img.data) {cout << "Error opening image" << endl;return -1;}// 设置金字塔的层数int levels = 5;// 构建高斯金字塔vector<Mat> gaussianPyramid;buildGaussianPyramid(img, gaussianPyramid, levels);// 从高斯金字塔向上取样vector<Mat> upsampledLayers;upSampleFromGaussian(gaussianPyramid, upsampledLayers);// 显示高斯金字塔的每一层for (size_t i = 0; i < gaussianPyramid.size(); ++i){cv::namedWindow("Gaussian Level " + to_string(i), cv::WINDOW_NORMAL);imshow("Gaussian Level " + to_string(i), gaussianPyramid[i]);waitKey(0);}// 显示向上取样后的每一层for (size_t i = 0; i < upsampledLayers.size(); ++i) {cv::namedWindow("Upsampled Level " + to_string(i), cv::WINDOW_NORMAL);imshow("Upsampled Level " + to_string(i), upsampledLayers[i]);waitKey(0);}return 0;
}代码解释
1. buildGaussianPyramid 函数用于构建高斯金字塔。它接受原始图像和金字塔的层数,然后使用 pyrDown 函数逐层下采样。
2. upSampleFromGaussian 函数用于从高斯金字塔向上取样。它接受高斯金字塔的所有层,并使用 pyrUp 函数将每一层恢复到其上一层的大小。
3. 主函数中加载图像,并设置金字塔的层数。
4. 构建高斯金字塔并显示每一层。
5. 从高斯金字塔向上取样并显示每一层的结果。

运行结果2

实验代码3

#include "pch.h"
#include <iostream>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>using namespace cv;
using namespace std;
//#pragma comment(lib, "opencv_world450d.lib")  //引用引入库 int main()
{Mat img, r1, r2 ;img = imread("9.jpeg", IMREAD_COLOR); 	//读取原始图像if (img.empty()){cout << "图像读取错误!" << endl;}pyrDown(img, r1);  	//图像向下取样pyrUp(r1, r2);namedWindow("original", WINDOW_NORMAL);imshow("original", img);  	//显示图像namedWindow("PyrDown1", WINDOW_NORMAL);imshow("PyrDown1", r1);namedWindow("PyrUp", WINDOW_NORMAL);imshow("PyrUp", r2);waitKey(0);destroyAllWindows(); //销毁所有窗口
}

运行结果3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1536899.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Porcupine - 语音关键词唤醒引擎

文章目录 一、关于 Porcupine特点用例尝试一下 语言支持性能 二、Demo1、Python Demo2、iOS DemoBackgroundService DemoForegroundApp Demo 3、网页 Demo3.1 Vanilla JavaScript 和 HTML3.2 Vue Demos 三、SDK - Python 一、关于 Porcupine Porcupine 是一个高度准确和轻量级…

数据结构之线性表(python)

华子目录 线性表的定义前驱与后继 1.顺序表&#xff08;顺序存储结构&#xff09;python列表与数组的区别列表数组 1.1插入数据实例 1.2删除元素实例 1.3查找元素1.4修改元素1.5综合示例 2.单链表2.1单链表的初始化2.2插入元素示例注意 2.3删除元素示例 2.4修改元素2.5查找元素…

图解Self-Attention和代码实现,大语言模型基础思维导图

文章目录 1 Self-Attention的概念注意优缺点 2 Self-Attention的原理Q,K,V, and Self-Attention计算公式代码实现 Self-Attention的计算细节输入是如何Embedding的&#xff1f;Word EmbeddingsSentence EmbeddingsPre-trained Embeddings SelfAttention是如何计算的计算图 4 Se…

无畏契约 (Valorant)YOLO 模型数据集

4万数据集 无畏契约 Valorant YOLO 模型 数据集 截图大小&#xff1a;256x256 截图数量&#xff1a;40000包含保安拌线&#xff0c;被闪被黑&#xff0c;蝰蛇大招内 模型类别&#xff1a;2类 头身类 1身0头 人物&#xff1a;黄色色盲 已添加部分负样本&#xff0c;防止识别除敌…

数据结构——“二叉搜索树”

二叉搜索树是一个很重要的数据结构&#xff0c;它的特殊结构可以在很短的时间复杂度找到我们想要的数据。最坏情况下的时间复杂度是O(n)&#xff0c;最好是O(logn)。接下来看一看它的接口函数的实现。 为了使用方便&#xff0c;这里采用模版的方式&#xff1a; 一、节点 temp…

docker部署Stirling-PDF

github网址&#xff1a; GitHub - Stirling-Tools/Stirling-PDF: #1 Locally hosted web application that allows you to perform various operations on PDF files 1、官方docker镜像无法拉取&#xff0c;使用别人阿里云私人镜像仓库下载Stirling-PDF镜像&#xff1a; regi…

微服务以及注册中心

一、什么是微服务 微服务是指开发一个单个小型的但有业务功能的服务&#xff0c;每个服务都有自己的处理和轻量通讯机制&#xff0c;可以部署在单个或多个服务器上。微服务也指一种松耦合的、有一定的有界上下文的面向服务架构。也就是说&#xff0c;如果每个服务都要同时修改…

Objects as Points基于中心点的目标检测方法CenterNet—CVPR2019

Anchor Free目标检测算法—CenterNet Objects as Points论文解析 Anchor Free和Anchor Base方法的区别在于是否在检测的过程中生成大量的先验框。CenterNet直接预测物体的中心点的位置坐标。 CenterNet本质上类似于一种关键点的识别。识别的是物体的中心点位置。 有了中心点之…

AI助力遥感影像智能分析计算,基于高精度YOLOv5全系列参数【n/s/m/l/x】模型开发构建卫星遥感拍摄场景下地面建筑物智能化分割检测识别系统

随着科技的飞速发展&#xff0c;卫星遥感技术已成为获取地球表面信息的重要手段之一。卫星遥感图像以其覆盖范围广、数据量大、信息丰富等特点&#xff0c;在环境监测、城市规划、灾害评估等多个领域发挥着不可替代的作用。然而&#xff0c;面对海量的卫星图像数据&#xff0c;…

wx小程序渗透思路

免责声明:本文仅做分享! 目录 WX小程序源代码 wx小程序目录位置: 反编译: e0e1-wx.py工具 unveilr.exe工具 查看源代码: 微信开发者工具: WX抓包 Fiddler抓包 官网下载 下载证书 操作: bp proxifier bp:(代理抓包) proxifier:(本地代理) WX小程序源代码 其实就…

程序修改题(41-50)

第四十一题 题目 给定程序modi1.c的主函数中&#xff0c;将a、b、c三个结点链成一个单向链表&#xff0c;并给各结点的数据域赋值&#xff0c;函数fun()的作用是:累加链表结点数据域中的数据作为函数值返回。 #include <stdio.h> typedef struct list { int data…

【数据结构-扫描线】力扣57. 插入区间

给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表 intervals&#xff0c;其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束&#xff0c;并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval [start, end] 表示另一个区间的开始和…

李宏毅结构化学习 02

文章目录 一、上篇博文复习二、Separable Case三、Non-separable Case四、Considering Errors五、Regularization六、Structured SVM七、Cutting Plane Algorithm for Structured SVM八、Multi-class and binary SVM九、Beyond Structured SVM 一、上篇博文复习 图中x表示输入的…

Android Framework(六)WMS-窗口显示流程——窗口内容绘制与显示

文章目录 窗口显示流程明确目标 窗户内容绘制与显示流程窗口Surface状态完整流程图 应用端处理finishDrawingWindow 的触发 system_service处理WindowState状态 -- COMMIT_DRAW_PENDING本次layout 流程简述 窗口显示流程 目前窗口的显示到了最后一步。 在 addWindow 流程中&…

基于Python的自然语言处理系列(10):使用双向LSTM进行文本分类

在前一篇文章中&#xff0c;我们介绍了如何使用RNN进行文本分类。在这篇文章中&#xff0c;我们将进一步优化模型&#xff0c;使用双向多层LSTM来替代RNN&#xff0c;从而提高模型在序列数据上的表现。LSTM通过引入一个额外的记忆单元&#xff08;cell state&#xff09;来解决…

24.Redis实现全局唯一ID

是一种分布式系统下用来生成全局唯一ID的工具。 特点 1.唯一性 2.高可用 3.高性能 4.递增性&#xff0c;数据也要保持一种递增&#xff0c;有利于数据库进行查询。 5.安全性 全局唯一ID的生成策略 1.UUID(没有顺序&#xff0c;字符串类型&#xff0c;效率不高) 2.Redis…

【电路笔记】-差分运算放大器

差分运算放大器 文章目录 差分运算放大器1、概述2、差分运算放大器表示2.1 差分模式2.2 减法器模式3、差分放大器示例3.1 相关电阻3.2 惠斯通桥3.3 光/温度检测4、仪表放大器5、总结1、概述 在之前的文章中,我们讨论了反相运算放大器和同相运算放大器,我们考虑了在运算放大器…

floodfill算法(二)

目录 一、太平洋大西洋水流问题 1. 题目链接&#xff1a;417. 太平洋大西洋水流问题 2. 题目描述&#xff1a; 3. 解法 &#x1f334;算法思路&#xff1a; &#x1f334;算法代码&#xff1a; 二、扫雷游戏 1. 题目链接&#xff1a;529. 扫雷游戏 2. 题目描述&#xf…

softmax回归的从零实现(附代码)

softmax回归是一个多分类模型&#xff0c;但是他跟线性回归一样将输入特征与权重做线性叠加&#xff0c;与线性不同的是他有多个输出&#xff0c;输出的个数对应分类标签的个数&#xff0c;比如四个特征和三种输出动物类别&#xff0c;则权重包含12个标量&#xff08;带下标的w…

深度学习之线性代数预备知识点

概念定义公式/案例标量(Scalar)一个单独的数值&#xff0c;表示单一的量。例如&#xff1a;5, 3.14, -2向量 (Vector)一维数组&#xff0c;表示具有方向和大小的量。 &#xff0c;表示三维空间中的向量 模(Magnitude)向量的长度&#xff0c;也称为范数&#xff08;通常为L2范数…