Skip to content

Instantly share code, notes, and snippets.

@gergely-xyz
Created November 7, 2019 08:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gergely-xyz/ffbcc7bd1eaae2727f50ceb6d443464e to your computer and use it in GitHub Desktop.
Save gergely-xyz/ffbcc7bd1eaae2727f50ceb6d443464e to your computer and use it in GitHub Desktop.
#include <iostream>
#include <opencv2/opencv.hpp>
#include <stdint.h>
const char* MAIN_WIN = "Main window";
const char* DFT_WIN = "Fourier transform";
void takeDft(cv::Mat& source, cv::Mat& destination) {
cv::Mat originalComplex[2] = { source, cv::Mat::zeros(source.size(), CV_32F) };
cv::Mat dftReady;
cv::merge(originalComplex, 2, dftReady);
cv::Mat dftOfOriginal;
cv::dft(dftReady, dftOfOriginal, cv::DFT_COMPLEX_OUTPUT);
destination = dftOfOriginal;
}
void invertDft(cv::Mat& source, cv::Mat& destination) {
dft(source, destination, cv::DFT_INVERSE | cv::DFT_REAL_OUTPUT | cv::DFT_SCALE);
}
void showDft(cv::Mat& source) {
cv::Mat splitArray[2] = { cv::Mat::zeros(source.size(), CV_32F), cv::Mat::zeros(source.size(), CV_32F) };
cv::split(source, splitArray);
cv::Mat dftMagnitude;
cv::magnitude(splitArray[0], splitArray[1], dftMagnitude);
dftMagnitude += cv::Scalar::all(1);
cv::log(dftMagnitude, dftMagnitude);
cv::normalize(dftMagnitude, dftMagnitude, 0, 1, cv::NORM_MINMAX);
int centerX = dftMagnitude.cols / 2;
int centerY = dftMagnitude.rows / 2;
cv::Mat q1(dftMagnitude, cv::Rect(0, 0, centerX, centerY));
cv::Mat q2(dftMagnitude, cv::Rect(centerX, 0, centerX, centerY));
cv::Mat q3(dftMagnitude, cv::Rect(0, centerY, centerX, centerY));
cv::Mat q4(dftMagnitude, cv::Rect(centerX, centerY, centerX, centerY));
cv::Mat swapMap;
q1.copyTo(swapMap);
q4.copyTo(q1);
swapMap.copyTo(q4);
q2.copyTo(swapMap);
q3.copyTo(q2);
swapMap.copyTo(q3);
cv::namedWindow(DFT_WIN, cv::WINDOW_FREERATIO);
cv::imshow(DFT_WIN, dftMagnitude);
}
int main(int argv, char** argc) {
cv::Mat original = cv::imread("space.jpg", cv::IMREAD_GRAYSCALE);
cv::Mat originalFloat;
original.convertTo(originalFloat, CV_32FC1, 1.0 / 255.0);
cv::Mat dftOfOriginal;
takeDft(originalFloat, dftOfOriginal);
cv::Mat inverted;
invertDft(dftOfOriginal, inverted);
cv::namedWindow(MAIN_WIN, cv::WINDOW_FREERATIO);
cv::resizeWindow(MAIN_WIN, 1280, 720);
cv::moveWindow(MAIN_WIN, 100, 100);
showDft(dftOfOriginal);
cv::imshow(MAIN_WIN, inverted);
cv::waitKey();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment