代碼步驟:
讀入圖像->傅里葉變換->傅里葉逆變換->讀取圖像
int main()
{
cv::Mat img = cv::imread("lena.jpg");
DFTtransform(img);
cv::imshow("DFT img", img);
cv::waitKey();
system("pause");
return 0;
}
//DFTtransform實現
void DFTtransform(cv::Mat& image)
{
image.convertTo(image, CV_32F);
std::vector<cv::Mat> channels;
split(image, channels); //分離RGB通道
cv::Mat image_B = channels[0];
//expand input image to optimal size
int m1 = cv::getOptimalDFTSize(image_B.rows); //選取最適合做fft的寬和高
int n1 = cv::getOptimalDFTSize(image_B.cols);
cv::Mat padded;
//填充0
cv::copyMakeBorder(image_B, padded, 0, m1 - image_B.rows, 0, n1 - image_B.cols, cv::BORDER_CONSTANT, cv::Scalar::all(0));
cv::Mat planes[] = { cv::Mat_<float>(padded), cv::Mat::zeros(padded.size(), CV_32F) };
cv::Mat complexI;
cv::merge(planes, 2, complexI); //planes[0], planes[1]是實部和虛部
cv::dft(complexI, complexI, cv::DFT_SCALE | cv::DFT_COMPLEX_OUTPUT);
cv::split(complexI, planes);
//定義幅度譜和相位譜
cv::Mat ph, mag, idft;
cv::phase(planes[0], planes[1], ph);
cv::magnitude(planes[0], planes[1], mag); //由實部planes[0]和虛部planes[1]得到幅度譜mag和相位譜ph
/*
如果需要對實部planes[0]和虛部planes[1],或者幅度譜mag和相位譜ph進行操作,在這裏進行更改
*/
cv::polarToCart(mag, ph, planes[0], planes[1]); //由幅度譜mag和相位譜ph恢復實部planes[0]和虛部planes[1]
cv::merge(planes, 2, idft);
cv::dft(idft, idft, cv::DFT_INVERSE | cv::DFT_REAL_OUTPUT);
image_B = idft(cv::Rect(0, 0, image.cols & -2, image.rows & -2));
image_B.copyTo(channels[0]);
merge(channels, image);
image.convertTo(image, CV_8U);
}