gpt4 book ai didi

java - 2d DCT 程序不工作

转载 作者:行者123 更新时间:2023-12-02 12:36:56 26 4
gpt4 key购买 nike

我必须为我的项目对图像进行 2d DCT。我将公式正确地翻译成代码。逻辑上一切似乎都很好,但它没有给出所需的结果。我已经用 matlab 函数对其进行了统计,以检查 3x3 矩阵的结果,但它们不正确。

此外,我的编码内容和编码方式会产生大量循环,因此实际的图像操作需要数小时才能计算。

任何减少循环和程序错误指向的建议都会很棒。谢谢。

这是我的代码。

    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

最佳答案

首先,在DCT公式中,cos的分母为2 * M。这是一个典型的错误。 4/2 * 2 = 4 不是 1

cos(((2 * m + 1) * p * pi)/2 * M) 应该是 cos(((2 * m + 1) * p * pi)/(2 * M))

所有四种情况都需要括号。

<小时/>

我想提到的另一个时刻是sqrt(2/M)。如果 M 具有整数类型(您的代码不清楚)并且它大于 2,则表达式 2/M 为等于0。因为两个操作数都有整数类型,并且 / 仅给出整数部分。要修复此问题,请添加一个 float ,例如 sqrt(2.0/M)

<小时/>

正如您已经注意到的,这里有很多循环,换句话说,2D DCT II 的复杂度是 O(n^4)

在现实生活中,没有人将 DCT 应用于整个实际图像。图像被分成大小为 8x8 的 block ,每个 block 都经过 DCT 处理。这种方法可以将 n 保持在较低水平,并且复杂性变得可以接受。

为了降低算法复杂度,我想链接 here ,其中很好地解释了使用 1D DCT 和 FFT 的方法。

关于java - 2d DCT 程序不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45116919/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com