我必須爲我的項目執行此圖像的2d DCT。 我翻譯了編碼的權利。從邏輯上看,這一切似乎都很好,但它並沒有給出所需的結果。我已經用matlab函數來檢查3x3矩陣的結果,但它們不正確。2d DCT程序不能正常工作
此外,我編碼的內容和方式給出了大量的循環,因此實際的圖像操作需要數小時來計算。
任何減少循環和指出程序錯誤的建議都會很好。 謝謝。
這是我的代碼。所有的
double alpha_p, alpha_q;
double pi = Math.atan(1.0) * 4.0;
//dct begins
System.out.println("it begins");
for (int p = 0; p < M; p++) {
for (int q = 0; q < N; q++) {
if (p == 0)
alpha_p = 1/sqrt(M);
else
alpha_p = sqrt(2/M);
if (q == 0)
alpha_q = 1/sqrt(N);
else
alpha_q = sqrt(2/N);
double toreturn = 0;
for (int m = 0; m < M; m++) {
for (int n = 0; n < N; n++) {
toreturn = toreturn + img[m][n]
* cos(((2 * m + 1) * p * pi)/2 * M)
* cos(((2 * n + 1) * q * pi)/2 * N);
}
}
dctimg[p][q] = alpha_p * alpha_q * toreturn;
System.out.println("euta");
}
}
// dct over
System.out.println("its over");
//inverse dct begins
for (int m = 0; m < M; m++) {
for (int n = 0; n < N; n++) {
double toreturn = 0;
for (int p = 0; p < M; p++) {
for (int q = 0; q < N; q++) {
if (p == 0)
alpha_p = 1/sqrt(M);
else
alpha_p = sqrt(2/M);
if (q == 0)
alpha_q = 1/sqrt(N);
else
alpha_q = sqrt(2/N);
toreturn = toreturn + alpha_p * alpha_q * dctimg[p][q]
* cos(((2 * m + 1) * p * pi)/2 * M)
* cos(((2 * n + 1) * q * pi)/2 * N);
}
}
finalimg[m][n] = toreturn;
}
}
//inverse dct over
'double pi = Math.atan(1.0)* 4.0' ..或者你可以使用'Math.PI' – harold
感謝分享知識。 「Math.PI」嗯。 – user8311562
參見[使用DFFT計算DFCT](https://stackoverflow.com/a/22779268/2521214)和[如何計算DFT/DFFT](https://stackoverflow.com/a/26355569/2521214)。確保你使用的是兼容的DCT ......如果我的記憶效果很好,其中有4個...... – Spektre