私のプロジェクトでは、この2D DCTイメージを作成する必要があります。 コードに式を正しく翻訳しました。論理的にはすべてうまく見えますが、必要な結果は得られません。私は3x3の行列の結果を確認するためにmatlabの関数で集計しましたが、間違っています。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
知識を共有してくれてありがとう。 "数学.PI"うーん。 – user8311562
[DFTを使用したDFCTの計算](https://stackoverflow.com/a/22779268/2521214)と[DFT/DFFTの計算方法](https://stackoverflow.com/a/26355569/2521214)を参照してください。互換性のあるDCTを使用していることを確認してください...私のメモリがうまくいけば、そのうちの4つがあります。 – Spektre