CSP 202212-3 JPEG 解码

黎 浩然/ 20 8 月, 2023/ 算法/ALGORITHMS/ 0 comments

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

vector<vector<int>> idct(vector<vector<int>> input) {
    vector<vector<int>> output(8, vector<int>(8, 0));
    for (int x = 0; x < 8; ++x) {
        for (int y = 0; y < 8; ++y) {
            double sum = 0.0;
            for (int u = 0; u < 8; ++u) {
                for (int v = 0; v < 8; ++v) {
                    double cu = (u == 0) ? sqrt(1.0 / 8) : sqrt(2.0 / 8);
                    double cv = (v == 0) ? sqrt(1.0 / 8) : sqrt(2.0 / 8);
                    sum += cu * cv * input[u][v] *
                           cos((2 * x + 1) * u * acos(-1) / (2 * 8)) *
                           cos((2 * y + 1) * v * acos(-1) / (2 * 8));
                }
            }
            output[x][y] = (int)round(sum);
        }
    }
    return output;
}

vector<vector<int>> fill(vector<int> data) {
    vector<vector<int>> M(8, vector<int>(8, 0));
    int idx = 0;
    for (int i = 0; i < 2 * 8 - 1; ++i) {
        if (i % 2) {
            for (int j = max(0, i - 8 + 1); j <= min(8 - 1, i); ++j) {
                M[j][i - j] = data[idx++];
                if (idx == data.size()) {
                    return M;
                }
            }
        } else {
            for (int j = min(8 - 1, i); j >= max(0, i - 8 + 1); --j) {
                M[j][i - j] = data[idx++];
                if (idx == data.size()) {
                    return M;
                }
            }
        }
    }
    return M;
}

int main() {
    vector<vector<int>> Q(8, vector<int>(8, 0));
    int data_num, T;
    for (int i = 0; i < 8; ++i) {
        for (int j = 0; j < 8; ++j) {
            cin >> Q[i][j];
        }
    }
    cin >> data_num >> T;
    vector<int> data(data_num);
    for (int i = 0; i < data_num; ++i) {
        cin >> data[i];
    }
    vector<vector<int>> M = fill(data);
    if (T == 0) {
        for (int i = 0; i < 8; ++i) {
            for (int j = 0; j < 8; ++j) {
                cout << M[i][j] << " ";
            }
            cout << endl;
        }
        return 0;
    }

    for (int i = 0; i < 8; ++i) {
        for (int j = 0; j < 8; ++j) {
            M[i][j] *= Q[i][j];
        }
    }
    if (T == 1) {
        for (int i = 0; i < 8; ++i) {
            for (int j = 0; j < 8; ++j) {
                cout << M[i][j] << " ";
            }
            cout << endl;
        }
        return 0;
    }

    vector<vector<int>> res = idct(M);
    for (int i = 0; i < 8; ++i) {
        for (int j = 0; j < 8; ++j) {
            res[i][j] += 128;
            if (res[i][j] < 0) {
                res[i][j] = 0;
            } else if (res[i][j] > 255) {
                res[i][j] = 255;
            }
        }
    }
    for (int i = 0; i < 8; ++i) {
        for (int j = 0; j < 8; ++j) {
            cout << res[i][j] << " ";
        }
        cout << endl;
    }

    return 0;
}

Share this Post

Leave a Comment

您的邮箱地址不会被公开。 必填项已用 * 标注

*
*