JT转换怪异的realInverse和realFoward



我遇到了一个奇怪的问题。希望你能帮助我!我试着在android上使用JTransforms(一个java FFT库)来处理图像。首先,我对R_pad进行FFT(realFoward,为了节省内存,我没有使用realFowardFull),然后使用IFFT(realInverse)来恢复R_pad。

double[][] R_pad = ImagePad(R, picw, pich, kernelxsize, kernelysize);
int R_pad_size1 = R_pad.length;
int R_pad_size2 = R_pad[0].length;  
Log.d("R_pad", "R_pad origin:"+ R_pad[20][13]);
Log.d("R_pad", "R_pad origin:"+ R_pad[40][82]);
// do fft to R_pad
DoubleFFT_2D fft_pad = new DoubleFFT_2D(R_pad_size1,R_pad_size2);       
fft_pad.realForward(R_pad);
// do ifft
fft_pad.realInverse(R_pad, true);
Log.d("R_pad", "R_pad after1:" + R_pad[20][13]);
Log.d("R_pad", "R_pad after1:" + R_pad[40][82]);

根据理论,R_pad应该仍然与原来的R_pad相同。然而,我对一些元素进行了采样,发现它们完全不同(并不接近)。

所以我写了一个小矩阵,看看这是否是这个库的问题。

double[][] test = new double[][] {{121.0,151.0,132.0,190.0,90.0,71.0,0,0},{201.0,184.0,35.0,92.0,67.0,33.0,0,0},{93.0,104.0,27.0,35.0,88.0,204.0,0,0},{98.0,60.0,94.0,99.0,192.0,45.0,0,0}};
DoubleFFT_2D fft_test = new DoubleFFT_2D(4,8);
for(int j = 0; j <4; j++){
   for (int i = 0; i < 8; i++){ 
      Log.d("test fft", "test fft:"+test[j][i]);
   }
}
fft_test.realForward(test);
fft_test.realInverse(test,true);
for(int j = 0; j <4; j++){
   for (int i = 0; i < 8; i++){
      Log.d("test fft", "test fft:"+test[j][i]);
   }
}

这次的结果是正确的!我很困惑我对第一个节目哪里错了。我确信R_pad的宽度和高度是2048和1024,都是2的幂(realForward和realInverse需要)。有人能帮我吗?非常感谢!

这是JTransforms的网站!https://sites.google.com/site/piotrwendykier/software/jtransforms

从jTransforms文档中,在对二维双数组的realForward和realInverse方法的描述中:

"只有当两个维度的大小都是两个数字的幂时,这种方法才有效"

这就是为什么你的第二个例子很好,因为4和8都是2的幂。

因此,我认为你应该将每个维度的长度为2的幂,或者使用complexForward和complexInverse。

相关内容

最新更新