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

提示

数据范围:1≤H,W≤50

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<int> row_compress(H, 0);
    for (int i = 0; i < H; i++) {
        for (int j = 0; j < W; j++) {
            if (image[i][j] != image[i][0]) {
                row_compress[i] = 1;
                break;
            }
        }
    }
    
    vector<int> column_compress(W, 0);
    for (int j = 0; j < W; j++) {
        for (int i = 0; i < H; i++) {
            if (image[i][j] != image[0][j]) {
                column_compress[j] = 1;
                break;
            }
        }
    }
    
    for (int i = 0; i < H; i++) {
        if (row_compress[i] == 0) {
            for (int j = 0; j < W; j++) {
                if (column_compress[j] == 0) {
                    cout << image[i][j] << " ";
                }
            }
            cout << endl;
        }
    }
    
    return 0;
}

代码解析

  1. 首先读取图像的尺寸H和W,并使用二维向量image存储图像数据。
  2. 使用向量row_compress和column_compress分别记录每行和每列是否需要压缩。
  3. 遍历图像,如果某一行或某一列的所有像素值都相同,则将对应位置的row_compress或column_compress设为0,表示需要压缩。
  4. 最后,遍历图像,输出未被压缩的行和列的像素值。

算法优化

该算法的时间复杂度为O(H*W),可以考虑使用更快的算法来提高效率,例如使用哈希表来存储每行和每列的像素值,并判断是否重复。

总结

本算法通过删除相邻的相同行或列来压缩图像,实现简单易懂,代码简洁易于理解。 可以根据实际需求进行优化,提高算法效率。

图像压缩算法 - C++ 实现

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

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