zoukankan      html  css  js  c++  java
  • jQuery火箭图标返回顶部代码

    除了之前说的从空间滤波器中获得频率域滤波器,还可以从频率域中直接生成滤波器,这些滤波器被规定为距滤波器中心点的距离不同的函数。可以创建一个用于实现频率滤波器的网格数组,最主要的是需要计算任何点到频率矩形中一个指定点的距离函数,FFT(快速傅里叶)算法是假设变换的原点位于频率矩形的左上角,因此需要将原点平移到频率矩形的中心,用fftshift。网格数组如下:

    %(频域滤波函数) 提供了距离计算及其所需的网格数组
    function [U,V] = dftuv(M,N)
    u=0:(M-1);
    v=0:(N-1);
    idx = find(u>M/2);
    u(idx) = u(idx)-M;
    idy=find(v>N/2);
    v(idy)=v(idy)- N;
    [V,U] = meshgrid(v,u);
    end
    

    一、低通(平滑)频率域滤波器

    常见的频率域低通滤波器有三个,理想低通滤波器(ILPF),巴特沃斯低通滤波器(BLPF),高斯低通滤波器(GLPF)。

    1)理想低通滤波器的传递函数如下:

    其中,D0为正数,D(u,v)为点(u,v)到滤波器中心的距离,满足D(u,v)=D0的点的轨迹为一个圆。如果用滤波器乘以一幅图像的傅里叶变换,我们会看到一个理想滤波器会切断(乘以0)该圆之外的所有F(u,v)分量,而保留圆上和圆内的所有分量不变(乘以1)。

    可以用之前的mesh将滤波器显示出来:

                 

    2)n阶巴特沃斯低通滤波器,在距离滤波器中心D0处具有截止频率,传递函数为:

    与理想低通滤波器不同的是,巴特沃斯低通滤波器的传递函数在D0点并没有一个尖锐的不连续,对于具有平滑传递函数的滤波器,通常将截止频率轨迹定义在H(u,v)降低为其最大值的一个指定的比例的点处。用mesh同样可以将该滤波器显示出来:

                      

    3)高斯低通滤波器的传递函数如下:

    其中,为标准差。该滤波器可以用mesh显示出来

                       

    4)低通滤波器的例子

    用高斯低通滤波器对一幅500*500的图像进行滤波,效果如下:

    该例子的代码如下:

    %用高斯低通滤波器进行滤波
    f=imread('G:数字图像处理(冈萨雷斯)DIP3E_CH04_Original_ImagesDIP3E_Original_Images_CH04Fig0441(a)(characters_test_pattern).tif');
    subplot(221);imshow(f); title('原图')
    f = im2double(f);
    %[f,revertclass] = tofloat(f);
    PQ = paddedsize(size(f));
    [U,V] = dftuv(PQ(1),PQ(2));
    D = hypot(U,V);
    D0 = 0.05*PQ(2);
    F = fft2(f,PQ(1),PQ(2));
    H = exp(-(D.^2)/(2*(D0^2)));
    g = dftfilt(f,H);
    g = im2uint8(g);
    %g = revertclass(g);
    subplot(222);imshow(fftshift(H));  title('高斯低通滤波器图像'); %显示滤波器图像
    subplot(223);imshow(log(1+abs(fftshift(F))),[]);title('滤波器的谱');
    subplot(224);imshow(g);title('滤波器后的图像')
    

     各种滤波器的传递函数不同,但是滤波的过程是一样的,因此,可以将这几种滤波器封装成一个函数,如下:

    %频率域低通滤波函数,生成几个低通滤波器的传递函数
    function [H,D] = lpfilter(type,M,N,D0,n)
    [U,V] = dftuv(M,N);
    D = sqrt(U.^2+V.^2);
    switch type
        case 'ideal'
            H=double(D<=D0);
        case 'btw'
            if nargin ==4
                n=1;
            end
            H=1./(1+(D./D0).^(2*n));
        case 'gaussian'
            H=exp(-(D.^2)./(2*(D0^2)));
        otherwise
            error('unkown filter type');
            
    end
            
            
    

    二、高通(锐化)频率域滤波器 

    就像低通滤波模糊一幅图像那样,高通滤波是相反的过程,会锐化图像,其原理是衰减傅里叶变换的低频部分而保持高频部分相对不变。若给定低通滤波器的传递函数Hlp(u,v),则相应高通滤波器的传递函数为:

    与低通滤波器相对应的高通滤波器的传递函数如下:

         

    基于前面的公式,可以使用前面的函数lpfilter来构建一个生成高通滤波器的函数,如下所示:

    %生成高通滤波器的函数
    function H = hpfilter(type,M,N,D0,n)
    if nargin ==4
        n=1;
    end
    Hlp = lpfilter(type,M,N,D0,n);
    H = 1-Hlp;
    end
    

    下图显示了三个高通滤波器的透视图和图像,

    代码也比较简单,

    %高通滤波器的透视图和图像
     
    H1 = fftshift(hpfilter('ideal',500,500,50)); %理想高通滤波器
    H2 = fftshift(hpfilter('btw',500,500,50));   %巴特沃斯高通滤波器
    H3 = fftshift(hpfilter('gaussian',500,500,50));  %高斯高通滤波器
    subplot(231);mesh(double(H1(1:10:500,1:10:500)));title('理想高通滤波器') ;         %线框图
    colormap([0 0 0]);               %黑色
    axis off
         
    subplot(232);mesh(double(H2(1:10:500,1:10:500)));title('巴特沃斯高通滤波器') ;         %线框图
    colormap([0 0 0]);               %黑色
    axis off
        
    subplot(233);mesh(double(H3(1:10:500,1:10:500)));title('高斯高通滤波器') ;         %线框图
    colormap([0 0 0]);               %黑色
    axis off
    
    subplot(234);imshow(H1,[]); title('理想高通滤波器');        %高通滤波器对应的图像
    subplot(235);imshow(H2,[]); title('巴特沃斯高通滤波器'); 
    subplot(236);imshow(H3,[]); title('高斯高通滤波器'); 
    

    1)高通滤波例子

    高通滤波时,图像的边缘和其他灰度变化剧烈的地方得到了增强,但由于图像的平均值由F(0,0)给出,因此,高通滤波器偏离了傅里叶变换的原点,图像会失去大部分原始图像的亮度,变得比较黑。

    代码如下:

    %高斯高通滤波   
    f=imread('G:数字图像处理(冈萨雷斯)DIP3E_CH04_Original_ImagesDIP3E_Original_Images_CH04Fig0441(a)(characters_test_pattern).tif');
    PQ = paddedsize(size(f));   %补0填充
    D0 = 0.05*PQ(1);    %截止频率
    H1 = hpfilter('ideal',PQ(1),PQ(2),D0);   %理想高通滤波器
    H2 = hpfilter('btw',PQ(1),PQ(2),D0);   %巴特沃斯高通滤波器
    H3 = hpfilter('gaussian',PQ(1),PQ(2),D0);   %高斯高通滤波器
    
    %H = 1+1.5*H;
    g1 = dftfilt(f,H1);     %滤波
    g2 = dftfilt(f,H2);     
    g3 = dftfilt(f,H3);     
    subplot(221);imshow(f);title('原图');
    %g = g+f;
    subplot(222);imshow(g1);title('理想高通滤波');
    subplot(223);imshow(g2);title('巴特沃斯高通滤波');
    subplot(224);imshow(g3);title('高斯高通滤波');
    

    高通滤波器偏离了直流项,因此将图像的平均值降低为0 。解决的方法之一是给高通滤波器加一个偏移量,如果把偏移量与将滤波器乘以一个大于1的常数结合起来,那么这种方法就称为高频强调滤波。高频强调滤波比较麻烦的地方就是ab参数需要根据实际情况进行不断尝试才会发现比较合适的参数。其传递函数为:

    a是偏移量,b是乘数。

    经过高频强调滤波后的结果如下,将原来的高通滤波器都改成相应的高频强调滤波器(a=1,b=1.5):

    最明显的就是理想高通滤波器有振铃效应,但是边缘都被增强了。除了用高频强调滤波,我发现直接在高通滤波后的图像上叠加原图也可以达到不错的效果,因为高通滤波后的图像均值接近0,所以叠加了原图像可以增强亮度和细节,而且振铃效应也没有那么强烈。如下所示:

    2)结合使用高频强调滤波和直方图均衡

    例子源于数字图像处理例3.8,增强一幅数字的胸部X射线图像。

    上述操作的代码如下:

    %联合使用高频强调滤波和直方图均衡
    
    f=imread('G:数字图像处理(冈萨雷斯)DIP3E_CH04_Original_ImagesDIP3E_Original_Images_CH04Fig0459(a)(orig_chest_xray).tif');
    PQ = paddedsize(size(f));      %获取填充范围
    D0 = 0.05*PQ(1);              %截止频率
    HBW = hpfilter('btw',PQ(1),PQ(2),D0,2);       %二阶巴特沃斯高通滤波器
    H = 0.5+2*HBW;               %高频强调滤波,比直接的高通滤波准确
    gbw = dftfilt(f,HBW,'fltpoint');            
    gbw = gscale(gbw);
    
    ghf = dftfilt(f,H,'fltpoint');            %滤波
    ghf = gscale(ghf);           %该函数考虑的负值,可以保留细节
    ghe = histeq(ghf,256);       %直方图均衡化(由较窄灰度级范围内的灰度表征的图像是直方图均衡的理想选择)
    subplot(221);    imshow(f);title('原图');
    subplot(222);    imshow(gbw);title('高通滤波后');
    subplot(223);    imshow(ghf);title('高频强调滤波后');
    subplot(224);    imshow(ghe,[]);title('高频后再直方图均衡化后');
    %  figure;imhist(ghf);
    
  • 相关阅读:
    Codeforces Round #361 (Div. 2) E. Mike and Geometry Problem 离散化+逆元
    bzoj 1270: [BeijingWc2008]雷涛的小猫 简单dp+滚动数组
    codevs 1540 银河英雄传说 并查集
    tyvj 1027 木瓜地 简单模拟
    Codeforces Round #341 (Div. 2) C. Mike and Chocolate Thieves 二分
    UVA 10574
    BZOJ 1296: [SCOI2009]粉刷匠 分组DP
    Good Bye 2015 C. New Year and Domino 二维前缀
    Good Bye 2015 B. New Year and Old Property 计数问题
    Good Bye 2015 A. New Year and Days 签到
  • 原文地址:https://www.cnblogs.com/libai123456/p/11441075.html
Copyright © 2011-2022 走看看