256级灰阶图像压缩为16级灰阶的C++实现方案
以下是实现该功能的 C++ 代码: ```cpp #include <iostream> #include <vector> #include <algorithm> #include <string> #include <cmath> // 定义一个结构体来存储灰阶和其对应的出现次数 struct GrayLevel { int level; int count; GrayLevel(int l, int c) : level(l), count(c) {} // 重载比较运算符,用于排序 bool operator<(const GrayLevel& other) const { if (count != other.count) { return count > other.count; } return level < other.level; } }; // 将十六进制字符串转换为十进制整数 int hexToDec(const std::string& hex) { int result = 0; for (char c : hex) { if (c >= '0' && c <= '9') { result = result * 16 + (c - '0'); } else { result = result * 16 + (c - 'A' + 10); } } return result; } // 将十进制整数转换为十六进制字符 char decToHex(int dec) { if (dec >= 0 && dec <= 9) { return '0' + dec; } return 'A' + (dec - 10); } int main() { int n; std::cin >> n; // 统计每种灰阶的数量 std::vector<int> grayCount(256, 0); std::vector<std::string> image(n); for (int i = 0; i < n; ++i) { std::cin >> image[i]; for (size_t j = 0; j < image[i].length(); j += 2) { std::string hex = image[i].substr(j, 2); int level = hexToDec(hex); ++grayCount[level]; } } // 找出数量最多的前 16 种灰阶 std::vector<GrayLevel> grayLevels; for (int i = 0; i < 256; ++i) { if (grayCount[i] > 0) { grayLevels.emplace_back(i, grayCount[i]); } } std::sort(grayLevels.begin(), grayLevels.end()); std::vector<int> selectedLevels(16); for (int i = 0; i < 16; ++i) { selectedLevels[i] = grayLevels[i].level; } // 输出选定的 16 种灰阶的十六进制编码 for (int level : selectedLevels) { std::cout << decToHex(level / 16) << decToHex(level % 16); } std::cout << std::endl; // 压缩图像 for (const std::string& row : image) { for (size_t j = 0; j < row.length(); j += 2) { std::string hex = row.substr(j, 2); int level = hexToDec(hex); int minDiff = 256; int closestIndex = 0; for (int i = 0; i < 16; ++i) { int diff = std::abs(level - selectedLevels[i]); if (diff < minDiff) { minDiff = diff; closestIndex = i; } } std::cout << decToHex(closestIndex); } std::cout << std::endl; } return 0; } ``` ### 代码解释: 1. **结构体 `GrayLevel`**:用于存储灰阶和其对应的出现次数,同时重载了比较运算符,以便对灰阶进行排序。 2. **函数 `hexToDec`**:将十六进制字符串转换为十进制整数。 3. **函数 `decToHex`**:将十进制整数转换为十六进制字符。 4. **主函数 `main`**: - 读取输入的行数 `n`。 - 统计每种灰阶的数量。 - 找出数量最多的前 16 种灰阶。 - 输出选定的 16 种灰阶的十六进制编码。 - 压缩图像,将每个像素转换为最近的 16 种灰阶之一,并输出压缩后的图像。 ######[AI问答 | 1080点数解答 | 2026-02-14 20:19:02]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)320
- Java 利用 Apache Commons Imaging 压缩 PNG 图片至指定大小,附代码及注意事项(阿里通义 | 524点数解答 | 2024-02-27 13:54:15)287
- 工程师必备:十大APP性能优化方案大揭秘(百度文心 | 300点数解答 | 2023-11-09 18:31:04)316
- 含不规则缺陷原材料的最优切割方案建模与损失率、利用率计算(DeepSeek | 2367点数解答 | 2025-05-10 23:47:30)237
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)289
- iOS开发:手把手教你完整实现代理模式,含声明与实现步骤!(阿里通义 | 268点数解答 | 2023-11-08 00:39:55)237
- JavaScript 开发:用 Animation 实现自定义动画的简易教程 (阿里通义 | 333点数解答 | 2023-11-09 01:50:07)229
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)426
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)337
- Vue.js 与 Matter.js 碰撞:轻松实现物理模拟全攻略 (讯飞星火 | 522点数解答 | 2024-05-29 22:26:06)402
- JS实现移动端网页快捷键创建方式及注意事项(阿里通义 | 284点数解答 | 2024-06-05 19:02:59)236
- 车载系统 UML 类图设计:涵盖 Car、Engine、娱乐系统等的完整类定义与关系解析 (字节豆包 | 760点数解答 | 2024-08-15 22:51:04)290