Opencv实现频域理想滤波器

#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;
}
原文地址:https://www.cnblogs.com/phoenixdsg/p/13028939.html