Mat DCT_block(Mat& g, Mat& cos_mat, int dir) { Mat dst(g.size(), g.type(), Scalar(0)); int N = g.rows, M = g.cols; Vec2f CK(sqrt(1.0f / N), sqrt(2.0f / N)); Vec2f CL(sqrt(1.0f / M), sqrt(2.0f / M));
for (int k = 0; k < N; k++) { for (int l = 0; l < M; l++) { float ck = (k) ? CK[1] : CK[0]; float cl = (l) ? CL[1] : CL[0]; Point idx(l * M, k * N);
for (int n = 0; n < N; n++) { for (int m = 0; m < M; m++) { //float cos_value = cos_mat.at<float>(idx + Point(m, n)); //float coef = (dir == 0) ? g.at<float>(n, m) : g.at<float>(k, l); //if (dir == 0) dst.at<float>(k, l) += ck * cl * coef * cos_value;//정변환 //else dst.at<float>(n, m) += ck * cl * coef * cos_value;//역변환
float cos_value = *(cos_mat.ptr<float>(idx.y + n) + idx.x + m); float coef = (dir == 0) ? *(g.ptr<float>(m) + n) : *(g.ptr<float>(l) + k) ; if (dir == 0) *(dst.ptr<float>(l) + k) += ck * cl * coef * cos_value;//정변환 else *(dst.ptr<float>(m) +n) += ck * cl * coef * cos_value;//역변환 } } } } return dst; } |