频域滤波之傅立叶变换的一个例子

作者: 在河之简 | 来源:发表于2015-11-28 21:36 被阅读560次

    DFT:discrete Fouriter Transform离散傅立叶变换
    傅立叶表换具有唯一性。傅立叶变换揭示了信号的时域特性和频域特性之间的确定的内在联系。
    在图像里面时域特性表现为空域特性。

    一个例子

    下面是用傅立叶与逆傅立叶变换操作图像

    % 下面求图像的傅立叶变换频谱
    f=imread('E:\资料\onedrive\code\test\image\Fig0403(a)(image).tif');
    F=fft2(f);
    S=abs(F);     % 去F的频谱
    w=2;h=3;i=0;
    i=i+1;subplot(w,h,i);imshow(f,[]);
    i=i+1;subplot(w,h,i);imshow(S,[]);
    % imshow(K)与imshow(K,[])的区别;
    % imshow(K)直接显示K;
    % imshow(K,[])显示K,并将K的最大值和最小值分别作为纯白(255)和纯黑(0),中间的K值映射为0到255之间的标准灰度值。
    
    %fftshift移动零频点到频谱中间,重新排列fft,fft2和fftn的输出结果。
    Fc = fftshift(F);
    i=i+1;subplot(w,h,i);imshow(abs(Fc),[]);
     
    %log变换将像素范围压缩;
    
    S2=log(1+abs(Fc));
    i=i+1;subplot(w,h,i);imshow(S2,[]);
    
    f=real(ifft2(F));% 逆傅立叶变换;逆变换后取得实部就好
    %这次变换中傅立叶变换后没有做什么操作,所以逆傅立叶变换后还是原来的结果;
    
    i=i+1;subplot(w,h,i);imshow(f,[]);
    

    显示的优化

    从上面的代码我们看到,在一个窗口输出多个图片,需要自己设置位置什么的,但是刚开始我们不知道最终要显示多少行多少列的图片,而且随着图片的增加需要经常修改显示的参数。同时如果调换显示顺序和插入显示都需要调整很多代码,基于这些不便,我自己写了个imshow函数。程序会一直保存你要输出的图像,直到输入0,把图像全部输出出来,同时能够实现自适应。

    function myImshow(img)
    persistent myNumOfImg %记录最终需要的图片个数;
    persistent M %记录所有的图片
    if isempty(myNumOfImg)
        myNumOfImg=0;
        M=cell(5);
    end
        
    if isequal(img,0) %表示结束
        h=ceil(sqrt(myNumOfImg)); %宽
        w=ceil(myNumOfImg*1.0/h);  %高
        for i=1:myNumOfImg
            subplot(w,h,i);
            imshow(M{i},[]);
        end
        
    else
        myNumOfImg=myNumOfImg+1;
        M{myNumOfImg}=img;    
    end
    

    运行示例

    clear all;
    close all;
    f=imread('E:\资料\onedrive\code\test\image\Fig0403(a)(image).tif');
    F=fft2(f);
    S=abs(F);     % 去F的频谱
    myImshow(f);
    myImshow(S);
    
    %fftshift移动零频点到频谱中间,重新排列fft,fft2和fftn的输出结果。
    Fc = fftshift(F);
    % i=i+1;subplot(w,h,i);imshow(abs(Fc),[]);
    myImshow(abs(Fc));
    %log变换将像素范围压缩;
    
    S2=log(1+abs(Fc));
    % i=i+1;subplot(w,h,i);imshow(S2,[]);
    myImshow(S2);
    f=real(ifft2(F));% 逆傅立叶变换;
    %这次变换中傅立叶变换后没有做什么操作,所以逆傅立叶变换后还是原来的结果;
    
    myImshow(f);
    myImshow(0);
    

    运行结果

    untitled.png

    相关参考

    http://yunniyu.blog.163.com/blog/static/22208431201261665217676
    如何在matlab里面实现静态变量
    matlab中cell的使用方法
    这个说明可以使用cell来建立三维数组,低两维的维数可以不一样
    matlab如何清空程序运行过程中产生的矩阵
    因为这里我们的程序用到了静态变量,所以需要学会清空

    相关文章

      网友评论

        本文标题:频域滤波之傅立叶变换的一个例子

        本文链接:https://www.haomeiwen.com/subject/pbadhttx.html