zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    JSON 串 自定义解析字段
    JspWriter与PrintWriter的关系
    Map 根据value 排序
    Log4j NDC MDC
    stray '/241' in program 错误
    【Qt开发】修改源码文件的编码格式的小技巧 .
    Tomcat 虚拟目录映射
    《疯狂Java讲义精粹》读书笔记4 基本包装类
    《疯狂Java讲义精粹》读书笔记8 不可变类
    《疯狂Java讲义精粹》读书笔记9 接口
  • 原文地址:https://www.cnblogs.com/phoenixdsg/p/13028939.html
Copyright © 2011-2022 走看看