Быстрое преобразование Фурье пошло не так - PullRequest
0 голосов
/ 28 ноября 2018

Я пытался реализовать БПФ, используя этот код: Rosetta Code FFT

Вот снимок экрана с результатом, который я получил: БПФ ошибся

Вот мой код, где я использовал вышеупомянутое БПФ на изображении:

function fastFourier(img){

let height=img.rows;
let width=img.cols;
let tmp=createArray(height,width);
let temp=createArray(height,width);
let rows=createArray(height,width);
let prettypls=img.clone();

//new complex array
for(i=0;i<height;i++){
  for(j=0;j<width;j++){
  rows[i][j]=new Complex(0, 0);
    }
}

//put pixel values in complex array
if(height%2==0&&width%2==0){
  for ( y = 0; y < height; y++) {
    for ( x = 0; x < width; x++) {
    let pixel = img.ucharPtr(y,x);
    rows[y][x].re=pixel[0];
  }
}

//perform fft
for(y=0;y<height;y++){
  tmp[y]=cfft(rows[y]);
}

//take the magnitudes
for(i=0;i<height;i++){
  for(j=0;j<width;j++){
    temp[i][j]=Math.round(tmp[i][j].re);
  }
}

//do a log transform
temp=logTransform(temp,height,width);

//put the real values into Mat
for(i=0;i<height;i++){
  for(j=0;j<width;j++){
    let pixel = prettypls.ucharPtr(i,j);
    pixel[0]=Math.round(temp[i][j]);
  }
}
cv.imshow('fourierTransform', prettypls);
rows=[];temp=[];tmp=[];prettypls.delete();
}
else alert('Image size must be a power of 2.');
}

Я сделал преобразование журнала, основанное на этом описании БПФ.Вот мой код преобразования журнала:

function logTransform(img,h,w){
//https://homepages.inf.ed.ac.uk/rbf/HIPR2/pixlog.htm
let max=findMax2d(img,h,w);
let c=255/(Math.log(1+max));
for(i=0;i<h;i++){
  for(j=0;j<w;j++){
    img[i][j]=c*Math.log(1+Math.abs(img[i][j]));
  }
}
return img;
}

Понятия не имею, что я сделал не так.Результаты FFT хороши, когда это обычный массив, но использование его с изображениями возвращает вышеуказанные результаты.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Что Флориан намеревается сказать в своем ответе, что вам нужно вычислить БПФ по столбцам полученного результата.

2D-ДПФ является отделимым.Это означает, что его можно вычислить, взяв 1D DFT вдоль каждой строки, а затем снова вдоль каждого столбца результата.Или, что то же самое, сначала вдоль столбцов, а затем вдоль строк.

0 голосов
/ 28 ноября 2018

Вы получаете именно то, что просили: для каждой строки в изображении анализ частот интенсивности в этой строке .Ваш код обрабатывает каждую строку как отдельный массив сэмплов и принимает БПФ этого.

То, что вам, вероятно, нужно, это двухмерное БПФ, как описано здесь: http://www.robots.ox.ac.uk/~az/lectures/ia/lect2.pdf

Прямо сейчас, вы просто вычисляете ряд одномерных БПФ, что не одно и то же.

...