Я пытаюсь преобразовать этот простой код Matlab на C++ с использованием OpenCV:Имея трудности с FFT и IFFT в OpenCV
localstd=sqrt(abs(ifft2(fft2(output).*gf)));
Это означает, принимая FFT матрицы «выход», умножая его поэлементно с матрицей «gf», а затем взяв ifft этого, а затем возьмем величину этого.
Я пытаюсь следующий простой код:
Mat planes[] = {Mat_<float>(output), Mat::zeros(output.size(), CV_32F)};
Mat complexI;
merge(planes, 2, complexI); // Add to the expanded another plane with zeros
dft(complexI, complexI,cv::DFT_SCALE);
for (int i=0;i<complexI.rows;i++){
for (int j=0;j<complexI.cols;j++){
complexI.at<float>(i,j)*=gf.at<float>(i,j);
}
}
//now the inverse transform
dft(complexI,complexI,cv::DFT_INVERSE);
split(complexI, planes); // planes[0] = Re(DFT(I), planes[1] = Im(DFT(I))
magnitude(planes[0], planes[1], planes[0]);// planes[0] = magnitude
Mat localstd = planes[0];
for (int i=0;i<localstd.rows;i++){
for (int j=0;j<localstd.cols;j++){
localstd.at<float>(i,j)= sqrt(localstd.at<float>(i,j));
}
}
Это очень просто - я применяю FFT, получение комплексных результатов. Затем умножая элемент на элемент с gf, затем, взяв обратное преобразование, разделим результат на две матрицы - вещественные и мнимые - тогда беря их величину.
Однако, хотя это очень просто, и я не вижу никаких ошибок, результаты очень разные, чем то, что я получаю в Matlab. Слишком большое значение объясняется ошибками округления.
Может ли кто-нибудь указать мне, что я могу делать неправильно?
Я использую Matlab2013a, OpenCV 2.4.5 с VS 2012 на окнах 7.
Спасибо заранее,
Гиль.
EDIT: Я добавил sqrt результатов, но все еще существуют большие различия.
Как вы определяете фильтр? –