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;
。
这是源代码 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;
。