БПФ шкала мощности спектра - PullRequest
1 голос
/ 27 ноября 2011

У меня проблема с масштабированием спектра мощности изображения с использованием БПФ. Код ниже

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 Ответ

2 голосов
/ 27 ноября 2011

Ваш вопрос не ясен на 100%, поэтому я могу быть выключен, и это может быть не то, что вы ищете - я сделаю это в целом, игнорируя диапазон значений, который вы можете получить или использовать.

Предполагая, что у вас есть абсолютный минимум и абсолютное максимальное значение, vmin и vmax, и вы хотите масштабировать весь диапазон до [0; 255] вы можете сделать это так:

// 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 и вместо этого использовать абсолютный максимум vmax и vmin и масштабировать его до 127 вместо 255.


Кстати, я думаю, вы могли бы значительно упростить ваш цикл, возможно, сэкономив некоторое время на обработку (это может быть невозможно в зависимости от присутствия другого кода):

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

Кроме того, как упоминал Оли в комментариях, вам не следует присваивать какое-либо значение singleValue в начале, так как оно все равно перезаписывается позже.

...