#include
#include
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)
{
//此处将double误写成 uchar* 了
Vec2f *pr=result.ptr(i);
for(int j=0;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;
}