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;
}