C++实现Matlab的fft2函数

这篇是《C++实现Matlab的psf2otf函数》 的姊妹篇,属于基础工具类代码,用途比较多。这里还是使用OpenCV实现。
关于这个函数的介绍,做过图像处理的人都知道,可以参考Matlab的官方文档及其源代码。

////////////////////////////////////////////////////////////////////////////////
/** * FileName : filter.cpp * Version : 0.10 * Author : WinCoder * Date : 2015-10-11 20:50:10 * Comment : Implenment Matlab fft2 function. */
Mat fft2(Mat I,Size size)
{
    Mat If = Mat::zeros(I.size(),I.type());

    Size dftSize;

    // compute the size of DFT transform
    dftSize.width  = getOptimalDFTSize(size.width);
    dftSize.height = getOptimalDFTSize(size.height);
    // No padded
    //dftSize = size;


    // allocate temporary buffers and initialize them with 0's
    Mat tempI(dftSize, I.type(), Scalar::all(0));

    //copy I to the top-left corners of temp
    Mat roiI(tempI,Rect(0,0,I.cols,I.rows));
    I.copyTo(roiI);

    if(I.channels()==1)
    {
        dft(tempI,If,DFT_COMPLEX_OUTPUT);
    }
    else
    {
        vector<Mat> channels;
        split(tempI,channels);
        for(int n= 0;n<I.channels();n++)
        {
            dft(channels[n],channels[n],DFT_COMPLEX_OUTPUT);
        }

        cv::merge(channels,If);
    }

    return If(Range(0,size.height),Range(0,size.width));
}

说明

这个程序使用了依然借助OpenCV库,听说C开源的FFT库fftw也很好用,但是我没用过。
这个程序可以处理单通道灰度图像,也可以处理多通道的图像,可以像matlab那样简单实用fft2函数那样。

还是要说明的这里仍是全复数输出(full-complex output),即针对灰度图像输出是2通道,彩色图像是6通道的。可以用

cout<<If.channels()<<endl;

查看通道数。

测试

测试了几个例子,代码正确。

参考资料

OpenCV官文离散傅立叶变换

转载请保留以下信息

作者 日期 联系方式
风吹夏天 2015年10月11日 [email protected]

你可能感兴趣的:(matlab,opencv,dft,fft2)