-->

使用IOS加快框架2D信号处理的非幂的两张图片?(Using IOS Accelerate Fram

2019-06-24 17:03发布

//编辑...

我编辑我的问题稍微解决与非幂的两张图像具体工作的问题。 我有一个与像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方法的工作版本!)

Answer 1:

我要说的是,为了执行上的任意图像大小的工作,你所要做的就是大小您输入的数值数组适当为2的下一个动力。

困难的部分就是把你的原始图像数据,什么来填充。 你真正要做的,从图像的图像或数据挖掘是至关重要的。

在下面的链接的PDF,要特别注意段落略高于12.4.2 http://www.mathcs.org/java/programs/FFT/FFTInfo/c12-4.pdf

虽然上面谈到沿着2轴操作,我们可以potentialy执行之前的第二维度类似的想法,并按照在第二维度。 如果进出口正确的,那么这个例子可以应用(这绝不是一个确切的算法尚未):

说,我们有一个图像是由900 900:首先,我们可以在图像分割成512垂直条,256,128,和4.我们将随后处理4点1维FFT对于每一行,一个用于第一512个像素,下一以下256个​​像素,下一以下128,则最后的剩余4.由于FFT的输出基本上是频率的流行度,则这些可以简单地相加(从频率ONLY的角度来看,不角度偏移)。 然后,我们可以推动这个相同的techniquie向第二维。 在这一点上,我们会考虑到每个输入像素,而不必实际垫。

这真的只是精神食粮,我还没有尝试过这个自己,的确应该好好研究这个自己。 如果你是真正在做这方面的工作,现在,你可以在这一点上比我有更多的时间虽然。



文章来源: Using IOS Accelerate Framework for 2D Signal Processing on Non-Power-of-Two images?