傅里叶变换和频域滤波

傅里叶变换

#include "opencv2/opencv.hpp"

using namespace cv;

#define PI2 2*3.141592654

int main()
{
    Mat image = imread("lena.png");
    resize(image, image, Size(100,100));

    cvtColor(image,image,CV_RGB2GRAY);
    imshow("src",image);
    image.convertTo(image,CV_32FC1);
    for(int i=0; i<image.rows; i++)        //中心化
    {
        float *p = image.ptr<float>(i);
        for(int j=0; j<image.cols; j++)
        {
            p[j] = p[j] * pow(-1, i+j);
        }
    }

    ////////////////////////////////////////二维基本傅里叶变换//////////////////////////////////////////////////

    Mat dftRe = Mat::zeros(image.size(), CV_32FC1);
    Mat dftIm = Mat::zeros(image.size(), CV_32FC1);
    for(int u=0; u<image.rows; u++)
    {
        float *pRe = dftRe.ptr<float>(u);
        float *pIm = dftIm.ptr<float>(u);
        for(int v=0; v<image.cols; v++)
        {
            float sinDft=0, cosDft=0;
            for(int i=0; i<image.rows; i++)
            {
                float *q = image.ptr<float>(i);
                for(int j=0; j<image.cols; j++)
                {
                    float temp = PI2 *((float)u*i/image.rows + (float)v*j/image.cols);
                    sinDft -= q[j] * sin(temp);
                    cosDft += q[j] * cos(temp);
                }
            }
            pRe[v] = sinDft;
            pIm[v] = cosDft;
        }
    }
    divide(dftRe, image.rows*image.rows, dftRe);
    divide(dftIm, image.rows*image.rows, dftIm);
    multiply(dftIm, dftIm, dftIm);
    multiply(dftRe, dftRe, dftRe);
    add(dftRe, dftIm, dftRe);
    pow(dftRe, 0.5, dftRe);
    imshow("mydft", dftRe);

    ///////////////////////////////////////快速傅里叶变换/////////////////////////////////////////////////////
    //int oph = getOptimalDFTSize(image.rows);
    //int opw = getOptimalDFTSize(image.cols);
    //Mat padded;
    //copyMakeBorder(image, padded, 0, oph-image.rows, 0, opw-image.cols, BORDER_CONSTANT, Scalar::all(0));

    //Mat temp[] = {padded, Mat::zeros(image.size(),CV_32FC1)};
    //Mat complexI;
    //merge(temp, 2, complexI);

    //dft(complexI, complexI);    //傅里叶变换

    ////显示频谱图
    //split(complexI, temp);
    //Mat aa;
    //magnitude(temp[0], temp[1], aa);
    //divide(aa, oph*opw, aa);
    //imshow("aa",aa);

    /////////////////////////////////////////////频域滤波///////////////////////////////////////////////////////
    ////生成频域滤波核
    //Mat gaussianBlur(image.size(), CV_32FC2);
    //Mat gaussianSharpen(image.size(), CV_32FC2);
    //float D0 = 2*50*50.;
    //for(int i=0; i<oph; i++)
    //{
    //    float *p = gaussianBlur.ptr<float>(i);
    //    float *q = gaussianSharpen.ptr<float>(i);
    //    for(int j=0; j<opw; j++)
    //    {
    //        float d = pow(i-oph/2, 2) + pow(j-opw/2, 2);
    //        p[2*j] = expf(-d / D0);
    //        p[2*j+1] = expf(-d / D0);

    //        q[2*j] = 1 - expf(-d / D0);
    //        q[2*j+1] = 1 - expf(-d / D0);
    //    }
    //}

    ////高斯低通滤波, 高斯高通滤波
    //multiply(complexI, gaussianBlur, gaussianBlur);
    //multiply(complexI, gaussianSharpen, gaussianSharpen);

    ////傅里叶反变换
    //dft(gaussianBlur, gaussianBlur, CV_DXT_INVERSE);
    //dft(gaussianSharpen, gaussianSharpen, CV_DXT_INVERSE);

    //Mat dstBlur[2], dstSharpen[2];
    //split(gaussianBlur, dstBlur);
    //split(gaussianSharpen, dstSharpen);

    //for(int i=0; i<oph; i++)        //中心化
    //{
    //    float *p = dstBlur[0].ptr<float>(i);
    //    float *q = dstSharpen[0].ptr<float>(i);
    //    for(int j=0; j<opw; j++)
    //    {
    //        p[j] = p[j] * pow(-1, i+j);
    //        q[j] = q[j] * pow(-1, i+j);
    //    }
    //}
    //normalize(dstBlur[0], dstBlur[0], 1, 0, CV_MINMAX);
    //normalize(dstSharpen[0], dstSharpen[0], 1, 0, CV_MINMAX);
    //imshow("dstBlur",dstBlur[0]);
    //imshow("dstSharpen",dstSharpen[0]);

    waitKey(0);

    return 1;
}
时间: 2024-11-05 16:24:39

傅里叶变换和频域滤波的相关文章

傅里叶变换,频域滤波

#include "opencv2/opencv.hpp" using namespace cv; #define PI2 2*3.141592654 int main() { Mat image = imread("lena.png"); resize(image, image, Size(100,100)); cvtColor(image,image,CV_RGB2GRAY); imshow("src",image); image.conve

Python下opencv使用笔记(十)(图像频域滤波与傅里叶变换)

前面曾经介绍过空间域滤波,空间域滤波就是用各种模板直接与图像进行卷积运算,实现对图像的处理,这种方法直接对图像空间操作,操作简单,所以也是空间域滤波. 频域滤波说到底最终可能是和空间域滤波实现相同的功能,比如实现图像的轮廓提取,在空间域滤波中我们使用一个拉普拉斯模板就可以提取,而在频域内,我们使用一个高通滤波模板(因为轮廓在频域内属于高频信号),可以实现轮廓的提取,后面也会把拉普拉斯模板频域化,会发现拉普拉斯其实在频域来讲就是一个高通滤波器. 既然是频域滤波就涉及到把图像首先变到频域内,那么把图

opencv的频域滤波

频域滤波流程总结如下: 给定一幅大小为M×N的输入图像f(x,y),从式(6.1-25)和式(6.1-26)得到填充参数P和Q.典型地,我们选择P=2M和Q=2N: 对f(x,y)添加必要数量的0,形成大小为P×Q填充后的图像 用(-1)(x+y)乘以fp(x,y),进行频谱中心化的预处理: 计算中心化预处理过的fp(x,y)的傅里叶变换,得到Fp(u,v); 生成一个实的.对称的滤波函数H(u,v),其大小为P×Q,频谱零点位于(P/2,Q/2)处.用阵列相乘形成乘积G(u,v)=F(u,v)

灰度图像--频域滤波 同态滤波

学习DIP第27天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意.有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!! 文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro

灰度图像--频域滤波 概论

学习DIP第25天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意.有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!! 开篇废话 这两天写了一下频域滤波的代码,并且发现以前博客里代码的一个BUG,产生BUG的原因是一维

从图像空间域滤波到频域滤波

频域滤波的快速实现是工程领域的里程碑.频域滤波最让工程师兴奋的原因来自于这个公式: f(x)*g(y)<-->F(u)G(v) 这说明空间域中的复杂的卷积算子,变换到频域中就成了简单的乘法,这样不仅计算简单,而且工程上易于实现.在FFT和快速DCT(余弦变换)的数字实现之前,频域变换的计算是很头疼的事情,在计算效率上并不比普通卷积快多少:在FFT和快读DCT实现之后,频域信号处理几乎无处不在. 空间域滤波的算子可以变成频域滤波算子.假设当前图像尺寸为512x512,滤波算子大小为3x3,显然直

数字图像处理-频域滤波

频域滤波 频域滤波是在频率域对图像做处理的一种方法.步骤如下: 1.理想的高/低通滤波器 顾名思义,高通滤波器为:让高频信息通过,过滤低频信息:低通滤波相反.滤波器大小和频谱大小相同, 理想的低通滤波器模板为: 其中,D0表示通带半径,D(u,v)是到频谱中心的距离(欧式距离),计算公式如下: M和N表示频谱图像的大小,(M/2,N/2)即为频谱中心 理想的高通滤波器与此相反,1减去低通滤波模板即可. 代码如下:(D0=20) """理想的高/低通滤波器""

灰度图像--频域滤波 傅里叶变换之离散时间傅里叶变换(DTFT)

学习DIP第22天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意........ 开篇废话 本来是不想写DTFT的,原因1,与前面傅里叶变换(FT)推导过程相似,原因2,在图像处理中DTFT应用不是很广泛,但后来想想还是写出来,原因1,不写出来我觉得心里不踏实,原因2,DTFT是DFT的近亲,不写的话家族不完整,下一篇写DFT,其实写到这个阶段,要写的东西就

灰度图像--频域滤波 傅里叶变换之离散傅里叶变换(DFT)

学习DIP第23天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意.有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!! 开篇废话 一如既往的开篇废话,今天介绍离散傅里叶变换(DFT),学习到这,不敢说对傅里叶有多了解,