java 中的离散余弦变换 (DCT)

Discrete cosine Transform (DCT) in java

这是源代码 DCT .. !!!未知的 4x4 DCT 数组将通过在每个块上经过 yyang 2x2 变换将 4x4 数组分成几个块来完成...!!!我想问一下,如何显示一个已经完成的数组,但大小为 4x4 转换,而不是 2x2 的大小..!!!因为它只是以2x2为条件进行变换,一旦变换就恢复到原来的数组大小4x4。请帮助...!!!

public class Main {
private static final int N = 4;
private static double[][] f = new double[4][4];
private static Random generator = new Random();

public static void main(String[] args) {
    // Generate random integers between 0 and 255
    int value;
    for (int x=0;x<N;x++) 
    {
        for (int y=0;y<N;y++) 
        {
          value = generator.nextInt(255);
          f[x][y] = value;
          System.out.print(f[x][y]+" ");
        }
         System.out.println();
    }




     DCT dctApplied = new DCT();
    double[][] F = dctApplied.applyDCT(f);
    System.out.println("From f to F");
    System.out.println("-----------");

        for (int i=0;i<2;i++)
        {
          for (int j=0;j<2;j++) 
          {

         try {
             System.out.print(F[i][j]+" ");
             } 
             catch (Exception e)
             {
                System.out.println(e);
             }

         }
             System.out.println(" ");
        }

}

}

这是源代码 DCT

public class DCT {
private static final int N = 2;
private static final int M = 2;

private double[] c = new double[N];

public DCT() 
{
      this.initializeCoefficients();
}

private void initializeCoefficients() 
{
    for (int i=1;i<N;i++) 
    {
        c[i]=1;
    }
    c[0]=1/Math.sqrt(2.0);
}

public double[][] applyDCT(double[][] f)
    {
     double[][] F = new double[4][4];  

    for (int row = 0; row < (f.length); row += 2) {
    for (int column = 0; column < f[0].length; column+=2) {
     for (int u=0;u<N;u++) 
     {
        for (int v=0;v<N;v++) 
         {
           double sum = 0.0;
           for (int i=0;i<N;i++)
           {
             for (int j=0;j<N;j++) 
             {
              f[i][j]=f[row+i][column+j];
               sum+=Math.cos(((2*i+1)/(2.0*N))*u*Math.PI)*Math.cos(((2*j+1)/(2.0*N))*v*Math.PI)*f[i][j];
             }
           }
               sum*=((2*c[u]*c[v])/Math.sqrt(M*N));
               F[u][v]=sum;
        }
    }
    }
     }
    return F;
}

}

显示上面的源代码是否被执行。 所以这个程序作为一个 4x4 数组 F,然后在 F 4x4 4x4 数组上执行 DCT,但将其分成 2x2 大小的块。所以,4x4 数组将由 4 个部分 2x2 组成,然后每个部分都完成转换,数组 F 将是 f。然而,当显示数组 f 时,它只出现红色条纹!可能有错误,所以我请帮助......!

这是我想要的程序概述示例:

这是一个简单的函数,可以打印任何二维矩阵:

    public void printMatrix(double[][] matrix) {
        int rows = matrix.length;
        int cols = matrix[0].length;

        String s = "";

        for (int row = 0; row < rows; row++) {
            for (int col = 0; col < cols; col++) {
                s += matrix[row][col] + "\t";
            }

            s += "\n";
        }

        System.out.println(s);
    }

所以你可以这样称呼它:

printMatrix(F);

试试这个。在您的代码中稍微更改一下:

主要class:

将要打印 F[][]for 循环的测试部分更改为 i<4(代替 i<2)和 j<4(在j<2).

的位置

在 DCT 中 class:

for 循环内将 F[u][v] = sum; 更改为 F[u+row][v+column] = sum;