zoukankan      html  css  js  c++  java
  • Opencv中的dft()和idft()示例

    傅里叶变换的公式,大家脑部,本实例是先将一副图像做傅里叶变换,再对傅里叶阵列做逆变换,代码如下:

    #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);
        normalize(mag,mag,1,0,CV_MINMAX);
        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(img2,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;
    }

    运行结果如下,左图是原图像,中间是频谱图,右边是经逆傅里叶变换得到复原图像:

  • 相关阅读:
    easyexcel: The maximum length of cell contents (text) is 32,767 characters
    分库分表情况下添加索引
    如何保证消息顺序执行(Rabbitmq/kafka)
    MySQL Boolean类型的坑
    Redis居然还有比RDB和AOF更强大的持久化方式?
    ThreadLocal的应用场景和注意事项有哪些?
    spring boot 设置tomcat post参数限制
    并发慎用——System.currentTimeMillis()
    Java多线程中static变量的使用
    临时修改session日期格式冲突问题
  • 原文地址:https://www.cnblogs.com/phoenixdsg/p/14852452.html
Copyright © 2011-2022 走看看