//编辑...
我编辑我的问题稍微解决与非幂的两张图像具体工作的问题。 我有一个与像256×256或1024×1024尺寸的正方形灰度图像工作的基本结构,但不能看到如何推广到任意大小的图像。 在FFT功能似乎要你包括宽度和高度的log 2,但随后它不清楚如何来解压缩得到的数据,或者如果数据不是才刚刚炒。 我想显而易见的事情将是一个更大的,全黑图像中居中npot图像,然后看数据时,这些位置将忽略任何值。 但是,不知道是否有一个不太尴尬的方式与npot数据进行工作。
//...END编辑
我有一点麻烦与加快Framework文档。 我通常会使用FFTW3,但我遇到了麻烦,要编译一个实际的iOS设备上(见这个问题 )。 任何人都可以点我使用加速,做类似下面的一个超级简单的实现:
1)打开的图像数据转换成可以被传递到加速的FFT方法的适当的数据结构。
在FFTW3,在其最简单的,使用的灰度图像,这涉及将无符号字节变成“fftw_complex”阵列,这简直是两个浮体,一个保持真正的值和其他的假想(并且其中所述假想是一个结构初始化为零对于每个像素)。
2)注意到该数据结构并在其上执行FFT。
3)打印出的幅值和相位。
4)执行在其上的IFFT。
5)重新创建从IFFT得到的数据的原始图像。
虽然这是一个非常简单的例子,我使用从苹果公司的网站上的文件有问题。 所谓此答案由皮是非常有帮助的,但我仍然对如何使用加速做使用灰度(或彩色)2D图像这个基本功能有些困惑。
总之,该处理2D图像的任何指针或特别是一些简单的工作代码将是非常有帮助的!
\\\编辑\\\
好吧,服用一段时间潜入文档和SO以及一些非常有用的代码后pkmital的GitHub库 ,我有,我想,既然1我会发布),我花了一段时间来身影一些工作代码它和2),因为我有几个剩余的问题...
初始化FFT“规划”。 假设一个正方形幂的的两个图像:
#include <Accelerate/Accelerate.h>
...
UInt32 N = log2(length*length);
UInt32 log2nr = N / 2;
UInt32 log2nc = N / 2;
UInt32 numElements = 1 << ( log2nr + log2nc );
float SCALE = 1.0/numElements;
SInt32 rowStride = 1;
SInt32 columnStride = 0;
FFTSetup setup = create_fftsetup(MAX(log2nr, log2nc), FFT_RADIX2);
通过在一个字节数组对于正方形幂的2的灰度图像并把它变成一个COMPLEX_SPLIT:
COMPLEX_SPLIT in_fft;
in_fft.realp = ( float* ) malloc ( numElements * sizeof ( float ) );
in_fft.imagp = ( float* ) malloc ( numElements * sizeof ( float ) );
for ( UInt32 i = 0; i < numElements; i++ ) {
if (i < t->width * t->height) {
in_fft.realp[i] = t->data[i] / 255.0;
in_fft.imagp[i] = 0.0;
}
}
运行在转换后的图像数据的FFT,然后抓住幅度和相位:
COMPLEX_SPLIT out_fft;
out_fft.realp = ( float* ) malloc ( numElements * sizeof ( float ) );
out_fft.imagp = ( float* ) malloc ( numElements * sizeof ( float ) );
fft2d_zop ( setup, &in_fft, rowStride, columnStride, &out_fft, rowStride, columnStride, log2nc, log2nr, FFT_FORWARD );
magnitude = (float *) malloc(numElements * sizeof(float));
phase = (float *) malloc(numElements * sizeof(float));
for (int i = 0; i < numElements; i++) {
magnitude[i] = sqrt(out_fft.realp[i] * out_fft.realp[i] + out_fft.imagp[i] * out_fft.imagp[i]) ;
phase[i] = atan2(out_fft.imagp[i],out_fft.realp[i]);
}
现在,你可以在out_fft数据运行IFFT,以获得原始图像...
COMPLEX_SPLIT out_ifft;
out_ifft.realp = ( float* ) malloc ( numElements * sizeof ( float ) );
out_ifft.imagp = ( float* ) malloc ( numElements * sizeof ( float ) );
fft2d_zop (setup, &out_fft, rowStride, columnStride, &out_ifft, rowStride, columnStride, log2nc, log2nr, FFT_INVERSE);
vsmul( out_ifft.realp, 1, SCALE, out_ifft.realp, 1, numElements );
vsmul( out_ifft.imagp, 1, SCALE, out_ifft.imagp, 1, numElements );
或者你可以在幅度上运行的IFFT得到一个自相关...
COMPLEX_SPLIT in_ifft;
in_ifft.realp = ( float* ) malloc ( numElements * sizeof ( float ) );
in_ifft.imagp = ( float* ) malloc ( numElements * sizeof ( float ) );
for (int i = 0; i < numElements; i++) {
in_ifft.realp[i] = (magnitude[i]);
in_ifft.imagp[i] = 0.0;
}
fft2d_zop ( setup, &in_fft, rowStride, columnStride, &out_ifft, rowStride, columnStride, log2nc, log2nr, FFT_INVERSE );
vsmul( out_ifft.realp, 1, SCALE, out_ifft.realp, 1, numElements );
vsmul( out_ifft.imagp, 1, SCALE, out_ifft.imagp, 1, numElements );
最后,你可以把IFFT结果返回到一个图像阵列:
for ( UInt32 i = 0; i < numElements; i++ ) {
t->data[i] = (int) (out_ifft.realp[i] * 255.0);
}
我还没有想出如何使用加速框架来处理非幂的两张图片。 如果我在设定分配足够的内存,那么我可以做一个FFT,然后进行IFFT让我的原始图像。 但是,如果试图做一个自相关(与FFT的大小),然后我的形象变得靠不住的结果。 我不知道的垫的最佳方式适当地将图像,所以希望有人如何做到这一点的想法。 (或分享vDSP_conv方法的工作版本!)