#include <iostream> #include<opencv2/opencv.hpp> using namespace cv; using namespace std; void idealFilter(const Mat&imgDft,Mat&result,int R) { int cols=imgDft.cols; int rows=imgDft.rows; if(result.empty()) result.create(rows,cols,imgDft.type()); result *=0; for(int i=0;i<rows;i++) { //此处将double误写成 uchar* 了 Vec2f *pr=result.ptr<Vec2f>(i); for(int j=0;j<cols;j++) { float r=sqrt((j-cols/2.)*(j-cols/2.)+(i-rows/2.)*(i-rows/2.)); if(r<=R) { pr[j][0]=1; pr[j][1]=1; } } } } //flag参数:为0时,就做log处理,否则就不做处理 void displayMagnitude(const Mat & complexImg,int flag=0) { Mat planes[2],mI; split(complexImg,planes); magnitude(planes[0],planes[1],mI); /**/ if(flag==0) { mI+=Scalar::all(1); log(mI,mI); } normalize(mI,mI,1,0,NORM_MINMAX); imshow("frequency image",mI); } 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 displayImgChannel(const Mat&img,int channel) { Mat c; extractChannel(img,c,channel); imshow("display channle image",c); } /// 1、先实现傅里叶变换 /// 2.傅里叶逆变换 /// 3.创建滤波器 /// 4.在频域实现滤波 int main() { Mat img=imread("D:/CodeWorks/MyImage/CH03/Fig0333.tif",0); imshow("original image",img); /// 1、先实现傅里叶变换 img.convertTo(img,CV_32F); Mat dftImg,idftImg,mag,ifilter; dft(img,dftImg,DFT_COMPLEX_OUTPUT); dftshift(dftImg); /// 3.创建滤波器 idealFilter(dftImg,ifilter,50); displayImgChannel(ifilter,0); /// 4.在频域实现滤波 Mat ms; //ms=dftImg.mul(ifilter); mulSpectrums(dftImg,ifilter,ms,DFT_COMPLEX_OUTPUT); /// 2.傅里叶逆变换 dft(ms,idftImg,DFT_INVERSE|DFT_SCALE); displayMagnitude(idftImg,1); waitKey(); return 0; }