zhulei420
发贴: 1
积分: 0
|
于 2009-04-26 20:10
private void initMatrix(int quality) { int i; int j;
for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { quantum[i][j] = (1 + ((1 + i + j) * quality)); } }
for (j = 0; j < N; j++) { double nn = (double) (N); c[0][j] = 1.0 / Math.sqrt(nn); cT[j][0] = c[0][j]; }
for (i = 1; i < 8; i++) { for (j = 0; j < 8; j++) { double jj = (double) j; double ii = (double) i; c[i][j] = Math.sqrt(2.0 / 8.0) * Math.cos(((2.0 * jj + 1.0) * ii * Math.PI) / (2.0 * 8.0)); cT[j][i] = c[i][j]; } } } public int[][] forwardDCT(int input[][]) { int output[][] = new int[N][N]; double temp[][] = new double[N][N]; double temp1; int i; int j; int k; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { temp[i][j] = 0.0; for (k = 0; k < N; k++) { temp[i][j] += (((int) (input[i][k]) - 128) * cT[k][j]); } } }
for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { temp1 = 0.0;
for (k = 0; k < N; k++) { temp1 += (c[i][k] * temp[k][j]); } output[i][j] = (int) Math.round(temp1); } } return output; }
public int[][] inverseDCT(int input[][]) { int output[][] = new int[N][N]; double temp[][] = new double[N][N]; double temp1; int i; int j; int k; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { temp[i][j] = 0.0; for (k = 0; k < N; k++) { temp[i][j] += input[i][k] * c[k][j]; } } }
for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { temp1 = 0.0;
for (k = 0; k < N; k++) { temp1 += cT[i][k] * temp[k][j]; } temp1 += 128.0;
if (temp1 < 0) { output[i][j] = 0; } else if (temp1 > 255) { output[i][j] = 255; } else { output[i][j] = (int) Math.round(temp1); } } }
return output; }
|