不使用OPENCV库,用C++写一个图像渐进编码

时间: 2024-03-01 20:51:11 浏览: 17
以下是一个不使用OpenCV库的C++图像渐进编码示例: ```c++ #include <iostream> #include <fstream> #include <vector> #include <cmath> using namespace std; // 将图像保存为二进制文件 void save_image(string filename, vector<vector<int>>& image) { ofstream file(filename, ios::out | ios::binary); int width = image[0].size(); int height = image.size(); file.write((char*)&width, sizeof(int)); file.write((char*)&height, sizeof(int)); for (int i = 0; i < height; i++) { file.write((char*)&image[i][0], sizeof(int) * width); } file.close(); } // 从二进制文件中加载图像 void load_image(string filename, vector<vector<int>>& image) { ifstream file(filename, ios::in | ios::binary); int width, height; file.read((char*)&width, sizeof(int)); file.read((char*)&height, sizeof(int)); image.resize(height); for (int i = 0; i < height; i++) { image[i].resize(width); file.read((char*)&image[i][0], sizeof(int) * width); } file.close(); } // 缩小图像 void downsample(vector<vector<int>>& image, vector<vector<int>>& downsampled) { int width = image[0].size(); int height = image.size(); int w = width / 2; int h = height / 2; downsampled.resize(h); for (int i = 0; i < h; i++) { downsampled[i].resize(w); for (int j = 0; j < w; j++) { downsampled[i][j] = (image[i * 2][j * 2] + image[i * 2][j * 2 + 1] + image[i * 2 + 1][j * 2] + image[i * 2 + 1][j * 2 + 1]) / 4; } } } // 放大图像 void upsample(vector<vector<int>>& image, vector<vector<int>>& upsampled) { int width = image[0].size(); int height = image.size(); int w = width * 2; int h = height * 2; upsampled.resize(h); for (int i = 0; i < h; i++) { upsampled[i].resize(w); for (int j = 0; j < w; j++) { int i1 = i / 2, j1 = j / 2; if (i % 2 == 0 && j % 2 == 0) { upsampled[i][j] = image[i1][j1]; } else if (i % 2 == 0) { upsampled[i][j] = (image[i1][j1] + image[i1][j1 + 1]) / 2; } else if (j % 2 == 0) { upsampled[i][j] = (image[i1][j1] + image[i1 + 1][j1]) / 2; } else { upsampled[i][j] = (image[i1][j1] + image[i1][j1 + 1] + image[i1 + 1][j1] + image[i1 + 1][j1 + 1]) / 4; } } } } // 保存图像渐进编码结果 void save_result(string filename, vector<vector<vector<int>>>& result) { ofstream file(filename, ios::out | ios::binary); int level = result.size(); file.write((char*)&level, sizeof(int)); for (int i = 0; i < level; i++) { int width = result[i][0].size(); int height = result[i].size(); file.write((char*)&width, sizeof(int)); file.write((char*)&height, sizeof(int)); for (int j = 0; j < height; j++) { file.write((char*)&result[i][j][0], sizeof(int) * width); } } file.close(); } // 加载图像渐进编码结果 void load_result(string filename, vector<vector<vector<int>>>& result) { ifstream file(filename, ios::in | ios::binary); int level; file.read((char*)&level, sizeof(int)); result.resize(level); for (int i = 0; i < level; i++) { int width, height; file.read((char*)&width, sizeof(int)); file.read((char*)&height, sizeof(int)); result[i].resize(height); for (int j = 0; j < height; j++) { result[i][j].resize(width); file.read((char*)&result[i][j][0], sizeof(int) * width); } } file.close(); } int main() { vector<vector<int>> image; load_image("test.bin", image); // 加载图像 int level = 3; // 分成3层 vector<vector<vector<int>>> result(level); result[0] = image; for (int i = 1; i < level; i++) { vector<vector<int>> downsampled; downsample(result[i - 1], downsampled); // 缩小图像 result[i] = downsampled; } save_result("result.bin", result); // 保存渐进编码结果 vector<vector<vector<int>>> decoded(level); decoded[level - 1] = result[level - 1]; for (int i = level - 2; i >= 0; i--) { vector<vector<int>> upsampled; upsample(decoded[i + 1], upsampled); // 放大图像 decoded[i] = upsampled; } save_image("decoded.bin", decoded[0]); // 保存解码结果 return 0; } ``` 以上代码使用了vector容器和C++标准库中的fstream库来处理图像数据和文件输入输出。在encode()函数中,图像被分成level层,每一层都可以进行编码和传输;在decode()函数中,图像被重建成原始分辨率。在实际应用中,可以根据需要自定义编码和传输的方式。

相关推荐

最新推荐

recommend-type

opencv3/C++图像边缘提取方式

今天小编就为大家分享一篇opencv3/C++图像边缘提取方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

opencv3/C++ 使用Tracker实现简单目标跟踪

今天小编就为大家分享一篇opencv3/C++ 使用Tracker实现简单目标跟踪,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

使用Python和OpenCV检测图像中的物体并将物体裁剪下来

主要介绍了使用Python和OpenCV检测图像中的物体并将物体裁剪下来,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

opencv3/C++实现视频读取、视频写入

今天小编就为大家分享一篇opencv3/C++实现视频读取、视频写入,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

Python使用Opencv实现图像特征检测与匹配的方法

主要介绍了Python使用Opencv实现图像特征检测与匹配的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

云原生架构与soa架构区别?

云原生架构和SOA架构是两种不同的架构模式,主要有以下区别: 1. 设计理念不同: 云原生架构的设计理念是“设计为云”,注重应用程序的可移植性、可伸缩性、弹性和高可用性等特点。而SOA架构的设计理念是“面向服务”,注重实现业务逻辑的解耦和复用,提高系统的灵活性和可维护性。 2. 技术实现不同: 云原生架构的实现技术包括Docker、Kubernetes、Service Mesh等,注重容器化、自动化、微服务等技术。而SOA架构的实现技术包括Web Services、消息队列等,注重服务化、异步通信等技术。 3. 应用场景不同: 云原生架构适用于云计算环境下的应用场景,如容器化部署、微服务
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。