如何使用C++将处理后的信号保存为PNG和TIFF格式

在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示。C++提供了多种库来处理图像数据,本文将介绍如何使用stb_image_write库保存为PNG格式图像以及使用OpenCV库保存为TIFF格式图像。

1. PNG格式保存

使用stb_image_write

stb_image_write是一个单文件、轻量级的库,能够让你方便地将图像保存为PNG格式。它的优点在于简单且无外部依赖,非常适合用来进行快速的图像保存。

1.1 安装和包含库

为了使用stb_image_write,首先需要下载stb库并包含stb_image_write.h头文件。你可以在下面找到需要使用库。

引擎开发二: stb_image库及使用_stbimage下载-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/u012278016/article/details/105784912【注意】建议将这些单独写在一个.cpp文件否则会报一堆错误:

#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"
1.2 代码解析

以下是如何将信号保存为PNG文件的过程:

  1. 获取当前目录路径:首先,通过QDirQFileInfo获取当前工作目录的路径。
  2. 幅值计算与归一化:对于每个像素点,计算其幅值(复数的模),然后进行归一化。归一化的目的是将信号的幅值映射到图像格式所要求的范围内。
  3. 保存为PNG:最后,使用stbi_write_png函数将数据保存为PNG文件。
if (stbi_write_png(write_to_Path, Nr, Na, 1, data_w, Nr * sizeof(unsigned short))) {cout << "灰度图像保存成功: " << write_to_Path << endl;
} else {cout << "灰度图像保存失败" << endl;
}

在这段代码中,write_to_Path是保存PNG图像的路径,NrNa分别是图像的行数和列数,data_w是处理后的信号数据。

下面讲的opencv也可以保存png这种格式。

2. TIFF格式保存

使用OpenCV库

OpenCV是一个强大的计算机视觉库,广泛用于图像处理、计算机视觉以及机器学习任务。OpenCV不仅支持图像读取、处理,还支持将处理结果保存为多种格式,包括TIFF。

2.1 安装OpenCV

在Windows或其他操作系统上,可以参考下面这个教程进行安装配置。

Windows上Qt配置OpenCV(最简单版本无需自己编译-避坑必看)_qt opencv安装 不编译-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/kdnnnd/article/details/132840038

2.2 代码解析

与PNG保存类似,保存为TIFF的过程也需要计算幅值并进行归一化。不同的是,这里使用的是OpenCV的cv::Mat类来处理图像数据。

  1. 创建cv::Mat对象:将处理后的信号数据封装成一个OpenCV矩阵对象cv::Matcv::Mat是OpenCV中最常用的图像数据结构,它支持多种数据类型,并且能够高效地进行图像操作。
  2. 设置TIFF保存参数:使用std::vector<int>来设置TIFF图像的压缩方式。TIFF格式支持多种压缩方式,代码中使用了无压缩方式。
  3. 保存为TIFF:使用OpenCV的cv::imwrite函数将图像数据保存为TIFF文件。
std::vector<int> compression_params;
compression_params.push_back(cv::IMWRITE_TIFF_COMPRESSION);
compression_params.push_back(1); // 无压缩bool result = cv::imwrite(write_to_Path, image);
if (result) {cout << "TIFF图像保存成功: " << write_to_Path << std::endl;
} else {cout << "TIFF图像保存失败" << std::endl;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

查出 product 表中所有 detail 字段包含 xxx 的完整记录

您可以使用以下 SQL 查询语句来查出 product 表中所有 detail 字段包含 oss.kxlist.com 的完整记录&#xff1a; SELECT * FROM product WHERE INSTR(detail, oss.kxlist.com) > 0;下面是detail字段包含的完整内容 <p><img style"max-width:100%;" src…

微服务 day01 注册与发现 Nacos OpenFeign

目录 1.认识微服务&#xff1a; 单体架构&#xff1a; 微服务架构&#xff1a; 2.服务注册和发现 1.注册中心&#xff1a; 2.服务注册&#xff1a; 3.服务发现&#xff1a; 发现并调用服务&#xff1a; 方法1&#xff1a; 方法2&#xff1a; 方法3:OpenFeign OpenFeig…

Shell原理简介与Linux中的权限问题

一、Shell命令及运行原理 1.1通常说的计算机体系结构指的是什么 通常意义上的计算机体系结构指的是芯片&#xff1a; 如锐龙amd&#xff0c;英特尔酷睿intel core 他们分为 x86&#xff1a;32位 x86_64&#xff1a;64位 两种 1.2广义上的Linux系统分为哪些部分&#xf…

在rtthread中,scons构建时,它是怎么知道是从rtconfig.h找宏定义,而不是从其他头文件找?

在rtthread源码中&#xff0c;每一个bsp芯片板级目录下都有一个 SConstruct scons构建脚本的入口&#xff0c; 在这里把rtthread tools/目录下的所有模块都添加到了系统路径中&#xff1a; 在tools下所有模块中&#xff0c;最重要的是building.py模块&#xff0c;在此脚本里面…

C# Winform 使用委托实现C++中回调函数的功能

C# Winform 使用委托实现C中回调函数的功能 在项目中遇到了使用C#调用C封装的接口&#xff0c;其中C接口有一个回调函数的参数。参考对比后&#xff0c;在C#中是使用委托(delegate)来实现类似的功能。 下面使用一个示例来介绍具体的使用方式&#xff1a; 第一步&#xff1a;…

深度学习之神经网络框架搭建及模型优化

神经网络框架搭建及模型优化 目录 神经网络框架搭建及模型优化1 数据及配置1.1 配置1.2 数据1.3 函数导入1.4 数据函数1.5 数据打包 2 神经网络框架搭建2.1 框架确认2.2 函数搭建2.3 框架上传 3 模型优化3.1 函数理解3.2 训练模型和测试模型代码 4 最终代码测试4.1 SGD优化算法…

2025.2.9 每日学习记录2:技术报告写了一半+一点点读后感

0.近期主任务线 1.完成小论文准备 目标是3月份完成实验点1的全部实验和论文。 2.准备教资笔试 打算留个十多天左右&#xff0c;一次性备考笔试的三个科目 1.实习申请技术准备&#xff1a;微调、Agent、RAG 1.今日完成任务 1.电子斗蛐蛐&#xff08;文本书写领域&am…

9 Pydantic复杂数据结构的处理

在构建现代 Web 应用时&#xff0c;我们往往需要处理复杂的输入和输出数据结构。例如&#xff0c;响应数据可能包含嵌套字典、列表、元组&#xff0c;甚至是多个嵌套对象。Pydantic 是一个强大的数据验证和序列化库&#xff0c;可以帮助我们轻松地处理这些复杂的数据结构&#…

链表(LinkedList) 1

上期内容我们讲述了顺序表&#xff0c;知道了顺序表的底层是一段连续的空间进行存储(数组)&#xff0c;在插入元素或者删除元素需要将顺序表中的元素整体移动&#xff0c;时间复杂度是O(n)&#xff0c;效率比较低。因此&#xff0c;在Java的集合结构中又引入了链表来解决这一问…

torch_bmm验算及代码测试

文章目录 1. torch_bmm2. pytorch源码 1. torch_bmm torch.bmm的作用是基于batch_size的矩阵乘法,torch.bmm的作用是对应batch位置的矩阵相乘&#xff0c;比如&#xff0c; mat1的第1个位置和mat2的第1个位置进行矩阵相乘得到mat3的第1个位置mat1的第2个位置和mat2的第2个位置…

shell+kafka实现服务器健康数据搜集

今天有一个徒弟问我&#xff0c;分发、代理服务器都装有kafka&#xff0c;如何快速收集服务器的健康数据&#xff0c;每10秒就收集一次&#xff1f; 我当时听完之后&#xff0c;楞了一下&#xff0c;然后说出了我的见解&#xff1a;认为最快速的方法无法就是建议shell脚本直接采…

macbook2015升级最新MacOS 白苹果变黑苹果

原帖&#xff1a;https://www.bilibili.com/video/BV13V411c7xz/MAC OS系统发布了最新的Sonoma&#xff0c;超酷的动效锁屏壁纸&#xff0c;多样性的桌面小组件&#xff0c;但是也阉割了很多老款机型的升级权利&#xff0c;所以我们可以逆向操作&#xff0c;依旧把老款MAC设备强…

建筑物损坏程度分割数据集labelme格式2816张5类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;2816 标注数量(json文件个数)&#xff1a;2816 标注类别数&#xff1a;5 标注类别名称:["minor-damage","destroyed&quo…

ReactNative进阶(五十九):存量 react-native 项目适配 HarmonyOS NEXT

文章目录 一、前言二、ohos_react_native2.1 Fabric2.2 TurboModule2.2.1 ArkTSTurboModule2.2.2 cxxTurboModule&#xff1a; 三、拓展阅读 一、前言 2024年10月22日19:00&#xff0c;华为在深圳举办“原生鸿蒙之夜暨华为全场景新品发布会”&#xff0c;主题为“星河璀璨&…

Golang GORM系列:GORM CRUM操作实战

在数据库管理中&#xff0c;CRUD操作是应用程序的主干&#xff0c;支持数据的创建、检索、更新和删除。强大的Go对象关系映射库GORM通过抽象SQL语句的复杂性&#xff0c;使这些操作变得轻而易举。本文是掌握使用GORM进行CRUD操作的全面指南&#xff0c;提供了在Go应用程序中有效…

【Windows】PowerShell 缓存区大小调节

PowerShell 缓存区大小调节 方式1 打开powershell 窗口属性调节方式2&#xff0c;修改 PowerShell 配置文件 方式1 打开powershell 窗口属性调节 打开 CMD&#xff08;按 Win R&#xff0c;输入 cmd&#xff09;。右键标题栏 → 选择 属性&#xff08;Properties&#xff09;…

Json-RPC框架项目(一)

目录 1. 项目介绍: 2. 技术选择; 3. 第三方库介绍; 4. 项目功能; 5. 模块功能; 6. 项目实现: 1. 项目介绍: RPC是远程过程调用, 像调用本地接口一样调用远程接口, 进行完成业务处理, 计算任务等, 一个完整的RPC包括: 序列化协议, 通信协议, 连接复用, 服务注册, 服务发…

深度整理总结MySQL——MySQL加锁工作原理

MySQL加锁工作原理 前言前置知识- 锁为什么加在索引上锁的粒度优化提高并发性避免全表扫描优化死锁处理解决幻读问题 什么SQL语句会加行级锁MySQL是如何加行级锁场景模拟代码唯一索引等值查询退化为记录锁为什么会退化为记录锁分析加了什么锁为什么会退化为间隙锁为什么我可以插…

Deepseek系列从v3到R易背面经版

deepseek v3 base要点 MTP : Multi-Token Prediction 训练时&#xff1a; 1. 把前一个block中input tokens经过embedding layer和transformer block的输出&#xff0c;进入output head之前的内容记为h&#xff0c;与下一个block的input tokens经过embedding layer输出的内容都…

大模型融入推荐系统

结合项目实际给用户推荐&#xff0c;比如是商家项目&#xff0c;用户问了几个关于商品的信息&#xff0c;大模型就可以根据根据用户画像&#xff0c;给用户推荐商品。 我们现在做的是针对于用户学习的推荐&#xff0c;首先我们要对我们的数据进行处理&#xff0c;提取出我们数…