Обратное преобразование Фурье в OpenCV

Я новичок в OpenCV и алгоритмах обработки изображений. Мне нужно сделать обратное дискретное преобразование Фурье в OpenCV на С++, но я не знаю, как это сделать. Я искал в Интернете, и я не нашел ответа. Я выполняю преобразование Фурье в своей программе с помощью этого кода с этой страницы: http://opencv.itseez.com/doc/tutorials/core/discrete_fourier_transform/discrete_fourier_transform.html. Я пытался сделать обратное этому коду, но я не знаю, где я делаю неправильно. Мой код здесь (я думаю, что весь код неверен):

void doFourierInverse(const Mat &src, Mat &dst) {
  normalize(src, dst, 0, -1, CV_MINMAX); 

  int cx = dst.cols/2;
  int cy = dst.rows/2;

  Mat q0(dst, Rect(0, 0, cx, cy));   
  Mat q1(dst, Rect(cx, 0, cx, cy));  
  Mat q2(dst, Rect(0, cy, cx, cy));  
  Mat q3(dst, Rect(cx, cy, cx, cy)); 

  Mat tmp;         
  q0.copyTo(tmp);
  q3.copyTo(q0);
  tmp.copyTo(q3);

  q1.copyTo(tmp);      
  q2.copyTo(q1);
  tmp.copyTo(q2);

  dst = dst(Rect(0, 0, dst.cols & -2, dst.rows & -2));

  exp(dst, dst);
  dst -= Scalar::all(1);  

  Mat planes[2];

  polarToCart(dst, Mat::zeros(dst.rows, dst.cols, dst.type()), planes[0], planes[1]);

  merge(planes, 2, dst);    

  idft(dst, dst, DFT_INVERSE | DFT_SCALE); 

  split(dst, planes);   

  dst = planes[0];
}

person rwrx_    schedule 22.04.2012    source источник
comment
Как вы думаете, что именно не так с вашим кодом и/или результатами, которые он дает?   -  person Paul R    schedule 22.04.2012
comment
Я думаю, что функция polarToCart не является хорошей обратной величиной функции.   -  person rwrx_    schedule 23.04.2012


Ответы (1)


На самом деле, вам не нужно менять местами разные квадранты, это необходимо только в том случае, если вы человек и хотите получить более естественную визуализацию результата БПФ (т. е. с нулевой частотой в середине, отрицательными частотами слева/снизу и положительными). частоты вверх/вправо).

Чтобы инвертировать БПФ, вам нужно передать результат прямого преобразования «как есть» (или после частотной фильтрации, которую вы хотели) той же функции dft(), только добавив флаг DFT_INVERSE. Если вы помните свою математику о БПФ, прямые и обратные преобразования имеют очень тесные перегибы в формулировке...

--- ИЗМЕНИТЬ ---

Что именно не работает? Следующий код выполняет БПФ вперед-назад, и все работает нормально, как и ожидалось.

// Load an image
cv::Mat inputImage = cv::imread(argv[argc-1], 0);

// Go float
cv::Mat fImage;
inputImage.convertTo(fImage, CV_32F);

// FFT
std::cout << "Direct transform...\n";
cv::Mat fourierTransform;
cv::dft(fImage, fourierTransform, cv::DFT_SCALE|cv::DFT_COMPLEX_OUTPUT);

// Some processing
doSomethingWithTheSpectrum();

// IFFT
std::cout << "Inverse transform...\n";
cv::Mat inverseTransform;
cv::dft(fourierTransform, inverseTransform, cv::DFT_INVERSE|cv::DFT_REAL_OUTPUT);

// Back to 8-bits
cv::Mat finalImage;
inverseTransform.convertTo(finalImage, CV_8U);
person sansuiso    schedule 23.04.2012
comment
Спасибо, я написал свой ответ на ваш пост в другом посте из-за кода. - person rwrx_; 23.04.2012
comment
как мы применяем фильтр нижних или верхних частот, как будто мы хотим удалить низкие частоты, мы удаляем частоты, которые находятся в середине естественной визуализации БПФ - person Fallak Asad; 10.08.2015
comment
Флаг cv::DFT_SCALE следует переместить на обратный вызов ДПФ (второй вызов) - person Amro; 20.07.2017