图像压缩算法: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;
}

代码解析

  1. 输入图像: 首先,代码读取图像的尺寸H和W,并从标准输入中读取图像数据。
  2. 压缩行: 代码遍历图像的每一行,检查相邻两行是否完全相同,如果相同则删除其中一行。
  3. 转置矩阵: 为了压缩列,代码将压缩后的图像进行转置。
  4. 压缩列: 代码遍历转置后的矩阵的每一列,检查相邻两列是否完全相同,如果相同则删除其中一列。
  5. 输出结果: 最后,代码将压缩后的转置矩阵再次转置,并输出最终的压缩图像。

总结

本算法通过简单的比较和删除操作实现了黑白图像的压缩,可以有效地减少图像数据量。对于更复杂的图像压缩算法,可以考虑使用Huffman编码、Lempel-Ziv算法等更高级的压缩技术。

图像压缩算法:C++实现黑白图像的压缩

原文地址: https://www.cveoy.top/t/topic/ql2H 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录