其他分享
首页 > 其他分享> > Opencv中的dft()和idft()示例

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);
    mag /=mag.rows*mag.cols;
    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(img,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;
}

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

 

 

标签:idft,Mat,img,示例,dft,planes,Opencv,mag,图像
来源: https://www.cnblogs.com/phoenixdsg/p/14852452.html