В общем, не знаю правильно ли получил или нет, но получилось следующее
Результат с модулем
код следующий:
cv::Mat MainWindow::fourierSpectrum(Mat img)
{
src = img; //imread(path.toStdString(), 1); //читаем открытое изображение
cvtColor(src, src_gray, CV_RGB2GRAY);
int M = getOptimalDFTSize( src_gray.rows );
int N = getOptimalDFTSize( src_gray.cols );
Mat padded;
copyMakeBorder(src_gray, padded, 0, M - src_gray.rows, 0, N - src_gray.cols, BORDER_CONSTANT, Scalar::all(0));
Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)};
Mat complexImg;
merge(planes, 2, complexImg);
dft(complexImg, complexImg, DFT_COMPLEX_OUTPUT);
cv::multiply(cv::abs(complexImg), complexImg, complexImg);
idft(complexImg,complexImg);
split(complexImg, planes);
magnitude(planes[0], planes[1], planes[0]);
Mat mag = planes[0];
mag += Scalar::all(1);
//log(mag, mag); //если это не закомментить получается спектр, показанный в вопросе
normalize(mag, mag, 0, 255, CV_MINMAX);
mag.copyTo(src_gray);
return src_gray;
}
Немного фана: нарисовав сердечко и применив данное преобразование с добавлением красного цвета
cvtColor(src_gray, src_gray, CV_GRAY2RGB);
src_gray += CV_RGB(255,0,0);
получается довольно забавный эффект
Может кому пригодится.
P.S> если из кода убрать cv::abs получается следующая картинка:
Результат без модуля
P.S.S> Загруженные на хабр картинки в чёрных тонах почему-то искажаются....