#include<iostream>
#include<opencv2/opencv.hpp>
#include<cmath>
using namespace cv;
using namespace std;
void My_DFT(Mat input_image, Mat& output_image, Mat& transform_array);
int main()
{
Mat image, image_gray, image_output, image_transform;
image = imread("G:/image/xs.jpg");
if (image.empty())
{
cout << "读取错误" << endl;
return -1;
}
imshow("image", image);
cvtColor(image, image_gray, COLOR_BGR2GRAY);
imshow("image_gray", image_gray);
My_DFT(image_gray, image_output, image_transform);
imshow("image_output", image_output);
waitKey(0);
return 0;
}
void My_DFT(Mat input_image, Mat& output_image, Mat& transform_image)
{
int m = getOptimalDFTSize(input_image.rows);
int n = getOptimalDFTSize(input_image.cols);
copyMakeBorder(input_image, input_image, 0, m - input_image.rows, 0, n - input_image.cols, BORDER_CONSTANT, Scalar::all(0));
Mat planes[] = { Mat_<float>(input_image), Mat::zeros(input_image.size(), CV_32F) };
merge(planes, 2, transform_image);
dft(transform_image, transform_image);
split(transform_image, planes);
magnitude(planes[0], planes[1], output_image);
output_image += Scalar(1);
log(output_image, output_image);
normalize(output_image, output_image, 0, 1, NORM_MINMAX);
output_image = output_image(Rect(0, 0, output_image.cols & -2, output_image.rows & -2));
int cx = output_image.cols / 2;
int cy = output_image.rows / 2;
Mat q0(output_image, Rect(0, 0, cx, cy));
Mat q1(output_image, Rect(cx, 0, cx, cy));
Mat q2(output_image, Rect(0, cy, cx, cy));
Mat q3(output_image, 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);
}