zoukankan      html  css  js  c++  java
  • Matlab实现基于频域对二维信号的低通滤波

    基于频域的低通滤波(二维信号——图像)

    算法分析

    1. 傅里叶变换,将灰度图由f(x,y)->F(u,v)(空域转频域),得到图像在频域中的频谱(在频谱中低频信号分布在频谱的四个角落,其余部分为高频信号,这样的分布难以滤出高频或低频信号)

    2. 中心化,将频谱F(u,v)中心化,将低频点移到频谱中心(这样就可以通过设置一个截止频率D0,来过滤信号)

    3. 遍历频谱图,使用巴特沃兹低通滤波器和高斯高斯低通滤波器进行低通滤波,计算滤波器函数h(u,v)与F(u,v)的乘积G(u,v),直到频谱图遍历完 巴特沃兹低通滤波器和高斯低通滤波器,计算公式

    4. 反中心化, 对滤波后的频谱G(u,v)的低频点移回到频谱的四周

    5. 傅里叶反变换,将第4步的结果傅里叶反变换G(u,v)->g(x,y),取g(x,y)实数部分作为最后滤波之后的结果,虚数部分是浮点运算存在的误差造成的(虚数部分的绝对值很小,可以忽略不计),得到滤波后的空域图像

    伪代码

    x = 读入灰度图,若是对彩色图处理,将彩色图先转为灰度图
    y = 图像加噪
    f = 将y的数据类型转换成double,便于运算
    F = 二维傅里叶变换(这里可以直接调用fft2函数),得到图像在频域里的频谱
    F1 = 对频谱你中心化,将低频频谱由四周转换到中心,距离中心越远的频率越高
    [M, N] = 求得频谱的大小
    n = 巴特沃斯低通滤波器的阶数
    D0 = 设置截止频率
    m = 频谱中心行坐标
    n = 频谱中心列坐标
    遍历频谱
            D = 计算频谱中当前点与频谱中心点的距离
            h1 = 根据步骤3的公式1计算巴特沃兹低通滤波器
            h2 = 根据步骤3的公式2计算高斯低通滤波器
            G1(i,j) = 计算巴特沃兹低通滤波器当前像素点灰度值的乘积
            G2(i,j) = 计算高斯低通滤波器当前像素点灰度值的乘积
    G1 = 将巴特沃兹低通滤波后的频谱反中心化
    G11 = 将频谱G1二维傅里叶反变换后,取实部
    G2 = 将高斯低通滤波后的频谱反中心化
    G22 = 将频谱G2二维傅里叶反变换后,取实部
    %将巴特沃兹低通滤波后的空域图像G11和高斯低通滤波后的空域图像G22显示出来
    

    代码

    A = imread('lena.png');
    x = rgb2gray(A);
    y=imnoise(x,'gaussian',0,0.02);  %加入均值为0,方差为0.02的高斯噪声
    f = double(y); %将数据类型转换成double
    F = fft2(f); %二维傅里叶变换
    F1 = fftshift(F); %中心化,将低频频谱由四周转换到中心,距离中心越远的频率越高
    [M, N] = size(F);
    n = 2;  %巴特沃斯低通滤波器的阶数
    D0 = 50;  %设置截止频率为50
    m = fix(M/2);
    n = fix(N/2);
    for i=1:M  
        for j=1:N
            D = sqrt((i-m)^2+(j-n)^2);
            h1 = 1 / (1 + (D / D0)^(2 * n));  %计算巴特沃兹低通滤波器
            h2 = exp(-(D.^2)./(2 * (D0^2)));  %计算高斯低通滤波器
            G1(i,j) = h1 * F1(i,j);  
            G2(i,j) = h2 * F1(i,j);
        end
    end
    G1 = ifftshift(G1);  %将巴特沃兹低通滤波后的频谱反中心化
    G11 = uint8(real(ifft2(G1)));  %取二维傅里叶反变换后的实部
    G2 = ifftshift(G2);  %将高斯低通滤波后的频谱反中心化
    G22 = uint8(real(ifft2(G2)));  %取二维傅里叶反变换后的实部
    subplot(2,4,1),imshow(x),title('原图');
    subplot(2,4,2),imshow(y),title('加入高斯噪声后');
    subplot(2,4,3),imshow(G11),title('二阶巴特沃斯低通滤波后图像');
    subplot(2,4,4),imshow(G22),title('高斯低通滤波后图像');
    subplot(2,4,5),imshow(log(1+abs(F)),[ ]),title('加噪图像的频谱');
    subplot(2,4,6),imshow(log(1+abs(F1)),[ ]),title('频谱中心化');
    subplot(2,4,7),imshow(log(1+abs(G1)),[ ]),title('巴特沃兹低通滤波器频谱反中心化');
    subplot(2,4,8),imshow(log(1+abs(G2)),[ ]),title('高斯低通滤波器频谱反中心化');
    

    实验结果

    实验分析

    • 由图所示,直接调用fft2函数将空域转到频域时,低频点分布在频谱的四周,不管是低通还是高通滤波都比较难限制,所以我们可以通过调用fftshift将频谱中心化,把低频信号移动到频谱中心,这样我们可以通过指定D0(截止频率),通过设置低通滤波器计算频谱上的一点到频谱中心的距离D(U,V) 与D0比较,大于D0舍弃,只保留小于D0的低频点

    • 经过以上在频域中低通滤波,将频域反变换回空域时要将低频信号和高频信号反中心化回去,再进行反变换

    • 原理总结:傅里叶变换后可以得到信号中有哪些频率的信号,将需要滤除的频率成分的幅值置为0,然后再经过傅里叶反变化就得到滤波的目的

    • 为什么要将时域转换到频域?在时域中无法转换的数学函数,转换到频域能简单的实现

  • 相关阅读:
    PHP面试系列之Linux(一) ----- Linux基础
    Redis入门(一)---安装
    获取主机ip地址
    Ubuntu安装Apache
    Ubuntu安装MySQL/MariaDB
    Ubuntu安装PHP7
    shell一次性执行多条命令
    将宿主主机上的目录挂载到Docker中
    bind 仿造 重写bind
    echars 饼状图 轮循 水平翻转
  • 原文地址:https://www.cnblogs.com/Vicky1361/p/13922108.html
Copyright © 2011-2022 走看看