Java 2d DCT程序不工作

Java 2d DCT程序不工作,java,image-processing,dct,Java,Image Processing,Dct,我必须为我的项目做2d DCT图像。 我把公式翻译成代码。从逻辑上看,这一切似乎都很好,但它没有给出所需的结果。我已经用matlab函数计算了3x3矩阵的结果,但它们是不正确的 此外,我所编码的内容和方式会产生大量循环,因此实际的图像操作需要数小时的计算 任何减少程序错误的循环和指向的建议都是很好的。 谢谢 这是我的密码 double alpha_p, alpha_q; double pi = Math.atan(1.0) * 4.0; //dct begins

我必须为我的项目做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

cos2*m+1*p*pi/2*m应该是cos2*m+1*p*pi/2*m

在所有四种情况下都需要括号

我想提到的另一个时刻是sqrt2/M。如果M有一个整数类型,那么代码不清楚它,并且它大于2,那么表达式2/M等于0。因为两个操作数都有整数类型,并且/只给出整数部分。要修复它,请添加一个类似于sqrt2.0/M的浮点

正如您已经注意到的,有很多循环,换句话说,2D DCT II的复杂性在^4

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


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

double pi=Math.atan1.0*4.0。。或者你可以用Math.PIThanks来分享知识。Math.PI Hmmm.请参阅和。确保您使用的是兼容的DCT。。。如果我记性好的话,一共有四个……谢谢埃内格先生解释得很好的回答。我意识到了错误。我还将尝试通过应用于8x8块来降低复杂性。一件好事是,现在我得到了连续DCT和IDCT后的原始像素值。但是,DCT系数与matlab测试结果不匹配。我试着用3x3矩阵做这个测试。我们必须解决这个问题。你知道matlab使用什么块大小作为标准吗?@user8311562,我从头开始描述DST2,并使用MathLab online J=dct2[11 12 13;14 15 16;17 18 19];在同一输入上测试它;。结果是一样的,也许我们错过了另一个错误。我不确定,但我认为函数dst2不使用块,它是一个纯转换。另一个问题是为什么它这么快?答案是MathLab对矩阵运算进行了高度优化,很难达到这样的性能。谢谢Enegue。一切都解决了。