FFT比例功率谱

时间:2011-11-27 06:18:58

标签: c++ image-processing fft

我有使用FFT来扩展图像功率谱的问题。代码在

之下
void spectrumFFT(Complex<double> *f, Complex<double> *output, int width, int height){

        Complex<double> *temp = new Complex<double>[width * height];
        Complex<double> *singleValue = new Complex<double>();            

        for(int j = 0; j < height; j++){
            for(int i = 0; i < width; i++){
                 singleValue = f[i + j * width];
                 Complex<double> tempSwap = singleValue->Mag();
                 // tempSwap assign Magnitude value from singleValue

                 temp[i + j * width] = tempSwap;                 
            }
         }

假设临时1-D数组是幅度值的填充。我的问题是如何扩展范围在[0 - 255)之间的最小和最大值。

注意:输入* f已经是2DFFT的计算值,*输出值将填充最小值和最大值。

编程有什么想法吗?

谢谢,

此致 一郎

1 个答案:

答案 0 :(得分:2)

你的问题不是100%明确,所以我可能会关闭,这可能不是你想要的 - 我会做一般的,忽略你实际可能获得或使用的价值范围。

假设您已获得绝对最小值和绝对最大值vminvmax,并且您希望将整个范围缩放为[0;你可以这样做:

// move the lower end to 0
double mod_add = -vmin;
double mod_mul = 255 / (vmax + mod_add);

现在,将一个值重新排列到我们计算的范围:

double scaled = (value + mod_add) * mod_mul;

mod_add会将负数/值移到正范围(绝对最小值将变为0),mod_mul将缩放整个范围(从绝对最小值到绝对最大值)以适合[ 0; 255]。如果没有负值,您可以明显跳过mod_add。如果您希望将0保持在中心(即127),则必须跳过mod_add,而是使用绝对最大值vmaxvmin并将其缩放为127而不是255。


另一方面,我认为你可以大大简化你的循环,可能节省一些处理时间(可能无法取决于那里的其他代码):

const unsigned int num = width * height;
for (unsigned int i = 0; i < num; i++)
    temp[i] = f[i]->Mag();

另外,正如Oli在评论中所提到的,你不应该在开头为singleValue分配任何值,因为它总是在以后被覆盖。