图像压缩算法:C++实现黑白图像的压缩
图像压缩算法:C++实现黑白图像的压缩
本文介绍一种简单的图像压缩算法,适用于黑白图像。该算法通过删除相邻重复的行和列来压缩图像,最终得到一个压缩后的图像。
问题描述
有一个H行W列像素组成的图像, 从上往下数第i行, 从左往右数第j列的像素用ai,j来表示。
图像只由黑白两种颜色组成,ai,j=0表示黑色,ai,j=1表示白色。现在想要压缩这个图像,打算按照如下方法压缩:
如果存在相邻的两行完全一样,就删除其中一行。如果存在相邻的两列完全一样,就删除其中一列。重复以上操作直到无法再进行删除为止,可以证明最终结果和删除顺序无关。
输入
第一行,2个整数 H, W。
接下来H行,每行W个整数。表示图像。0表示黑色,1表示白色,数与数之间用空格分隔。
输出
输出压缩后的图像,数与数之间用空格分隔。
样例输入
3 3
1 1 0
1 1 0
0 0 1
样例输出
1 0
0 1
C++代码实现
#include <iostream>
#include <vector>
using namespace std;
int main() {
int H, W;
cin >> H >> W;
vector<vector<int>> image(H, vector<int>(W));
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
cin >> image[i][j];
}
}
vector<vector<int>> compressedImage;
for (int i = 0; i < H; i++) {
if (i > 0 && image[i] == image[i - 1]) {
continue;
}
compressedImage.push_back(image[i]);
}
vector<vector<int>> transposedImage(W, vector<int>());
for (int i = 0; i < compressedImage.size(); i++) {
for (int j = 0; j < W; j++) {
transposedImage[j].push_back(compressedImage[i][j]);
}
}
vector<vector<int>> compressedTransposedImage;
for (int i = 0; i < W; i++) {
if (i > 0 && transposedImage[i] == transposedImage[i - 1]) {
continue;
}
compressedTransposedImage.push_back(transposedImage[i]);
}
for (int i = 0; i < compressedTransposedImage[0].size(); i++) {
for (int j = 0; j < compressedTransposedImage.size(); j++) {
cout << compressedTransposedImage[j][i] << " ";
}
cout << endl;
}
return 0;
}
代码解析
- 输入图像: 首先,代码读取图像的尺寸H和W,并从标准输入中读取图像数据。
- 压缩行: 代码遍历图像的每一行,检查相邻两行是否完全相同,如果相同则删除其中一行。
- 转置矩阵: 为了压缩列,代码将压缩后的图像进行转置。
- 压缩列: 代码遍历转置后的矩阵的每一列,检查相邻两列是否完全相同,如果相同则删除其中一列。
- 输出结果: 最后,代码将压缩后的转置矩阵再次转置,并输出最终的压缩图像。
总结
本算法通过简单的比较和删除操作实现了黑白图像的压缩,可以有效地减少图像数据量。对于更复杂的图像压缩算法,可以考虑使用Huffman编码、Lempel-Ziv算法等更高级的压缩技术。
原文地址: https://www.cveoy.top/t/topic/ql2H 著作权归作者所有。请勿转载和采集!