本文主要是介绍使用C++将处理后的信号保存为PNG和TIFF格式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima...
1. PNG格式保存
使用stb_image_write库
stb_image_write是一个单文件、轻量级的库,能够让你方便地将图像保存为PNG格式。它的优点在于简单且无外部依赖,非常适合用来进行快速的图像保存。
1.1 安装和包含库
为了使用stb_image_write,首先需要下载stb库并包含stb_image_write.h头文件。你可以在下面找到需要使用库。
stb_image安装及使用
环境:win7 VS2015
1. 下载stb_image :
github地址:https://github.com/nothings/stb
2. opengl项目配置:
因为stb_image库实现都js写在头文件中,不需要编译成库,项目中直接引用头文件目录即可。
a. 项目属性 ----> C/C++ —> 附加包含目录 —> your_path\stb-master
3. 代码:
该程序主要实现了加载图片,修改图片宽高并导出。
#include <IOStream> #define STB_IMAGE_IMPLEMENTAT编程ION #include "stb_image.h" #define STB_IMAGE_WRITE_IMPLEMENTATION #include "stb_image_write.h" #define STB_IMAGE_RESIZE_IMPLEMENTATION #include "stb_image_resize.h" #include <string> #include <stdio.h> #include <stdlib.h> #include <vector> using namespace std; int main() { std::cout << "Hello, STB_Image" << std::endl; string inputPath = "../res/11.jpg"; int iw, ih, n; // 加载图片获取宽、高、颜色通道信息 unsigned char *idata = stbi_load(inputPath.c_str(), &iw, &ih, &n, 0); int ow = iw / 2; int oh = ih / 2; auto *odata = (unsigned char *)malloc(ow * oh * n); // 改变图片尺寸 stbir_resize(idata, iw, ih, 0, odata, ow, oh, 0, STBIR_TYPE_UINT8, n, STBIR_ALPHA_CHANNEL_NONE, 0, STBIR_EDGE_CLAMP, STBIR_EDGE_CLAMP, STBIR_FILTER_BOX, STBIR_FILTER_BOX, STBIR_COLORSPACE_SRGB, nullptr ); string outputPath = "../res/11out.jpg"; // 写入图片 stbi_write_png(outputPath.c_str(), ow, oh, n, odata, 0); stbi_image_free(idata); stbi_image_free(odata); return 0; }
【注意】建议将这些单独写在一个.cpp文件否则会报一堆错误:
#define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" #define STB_IMAGE_WRITE_IMPLEMENTATION #include "stb_image_write.h"
1.2 代码解析
以下是如何将信号保存为PNG文件的过程:
- 获取当前目录路径:首先,通过
QDir
和QFileInfo
获取当前工作目录的路径。 - 幅值计算与归一化:对于每个像素点,计算其幅值(复数的模),然后进行归一化。归一化的目的是将信号的幅值映射到图像格式所要求的范围内。
- 保存为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图像的路径,Nr
和Na
分别是图像的行数和列数,data_w
是处理后的信号数据。
下面讲的opencv也可以保存png这种格式。
2. TIFF格式保存
使用OpenCV库
OpenCV是一个强大的计算机视觉库,广泛用于图像处理、计算机视觉以及机器学习任务。OpenCV不仅支持图像读取、处理,还支持将处理结果保存为python多种格式,包括TIFF。
2.1 安装OpenCV
在Windows或其他操作系统上,可以参考下面这个教程进行安装配置。
Windows上Qt配置OpenCV的详细教程(避坑必看)_C 语言_China编程(www.chinasem.cn)
2.2 代码解析
与PNG保存类似,保存为TIFF的过程也需要计算幅值并进行归一化。不同的是,这里使用的是OpenCV的cv::Mat
类来处理图像数据。
- 创建
cv::Mat
对象:将处理后的信号数据封装成一个OpenCV矩阵对象cv::Mat
。cv::Mat
是OpenCV中最常用的图像数据结构,它支持多种数据类型,并且能够高效地进行图像操作。 - 设置TIFF保存参数:使用
std::vector<int>
来设置TIFF图像的压缩方式。TIFF格式支持多种压缩方式,代码中使用了无压缩方式。 - 保存为TIFF:使用OpenCV的
cv::imwrite
函数将图像数据保存为TIFF文件。
std::vector<OJUGCWcBoI;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; }
以上就是使用C++将处理后的信号保存为PNG和TIFF格式的详细内容,更多关于C++信号保存为PNG和TIFF格式的资料请关注编程China编程(www.chinasem.cn)其它相关文章!
这篇关于使用C++将处理后的信号保存为PNG和TIFF格式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!