傅里叶变换的公式,大家脑部,本实例是先将一副图像做傅里叶变换,再对傅里叶阵列做逆变换,代码如下:
#include <iostream> #include<opencv2/opencv.hpp> using namespace cv; using namespace std; void dftshift(Mat& ds) { int cx=ds.cols/2;//图像的中心点x坐标 int cy=ds.rows/2;//图像的中心点y坐标 Mat q0=ds(Rect(0,0,cx,cy));//左上 Mat q1=ds(Rect(cx,0,cx,cy));//右上 Mat q2=ds(Rect(0,cy,cx,cy));//左下 Mat q3=ds(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); } void myimshow(const Mat& complexImg) { Mat mag; //对复数图像计算幅值 Mat planes[2]; split(complexImg,planes); magnitude(planes[0],planes[1],mag); //对幅值去对数log Mat mag_log; mag +=Scalar::all(1); cv::log(mag,mag_log); //对幅值图像做归一化处理 Mat mag_norm; cv::normalize(mag_log,mag_norm,0,1,CV_MINMAX); imshow("dft magnitud",mag_norm); } void myimshow2(const Mat& complexImg) { Mat mag; //对复数图像计算幅值 Mat planes[2]; split(complexImg,planes); magnitude(planes[0],planes[1],mag); mag /=mag.rows*mag.cols; imshow("inverce dft magnitud",mag); } int main() { //1.读入灰度图像,不要读入彩色图像 // Mat img=imread("D:/Qt/MyImage/baboon.jpg",0); Mat img=Mat::zeros(300,300,CV_32F);//定义输入图像的实部300×300的0矩阵, //单通道。也可以从外部读入一灰度图像。 //下面一行语句,在图像*6×6Rect区域赋值为1 img(Rect(img.cols/2-3,img.rows/2-3,6,6))=Scalar::all(1); imshow("original image",img); //2.将单通道图像转换成双通道图像 Mat img2; img.convertTo(img2,CV_32FC2); //3.调用dft函数实现傅里叶变换 Mat img_dft; dft(img,img_dft,DFT_COMPLEX_OUTPUT); //4.显示傅里叶频谱图 dftshift(img_dft);//傅里叶普的中心化 myimshow(img_dft); //5.调用idft()函数,执行逆傅里叶变换 Mat iimg; idft(img_dft,iimg); myimshow2(iimg); waitKey(); return 0; }
运行结果如下,左图是原图像,中间是频谱图,右边是经逆傅里叶变换得到复原图像: