• 图像处理之理想低通滤波器、巴特沃斯低通滤波器和高斯低通滤波器的matlab实现去噪


    一、前言

    在一幅图像中,低频部分对应图像变化缓慢的部分即图像大致外观和轮廓。高频部分对应图像变换剧烈的部分即图像细节(注意图像的噪声属于高频部分)

    低通滤波器的功能是让低频率通过而滤掉或衰减高频,其作用是过滤掉包含在高频中的噪声。即低通滤波的效果是图像去噪声平滑增强,但同时也抑制了图像的边界即过滤掉图像细节,造成图像不同程序上的模糊。对于大小为M*N的图像,频率点(u,v)与频域中心的距离为D(u,v),其表达式为:
    在这里插入图片描述
    低通滤波器一共有三种,分别为理想低通滤波器、巴特沃斯低通滤波器和高斯低通滤波器。理想低通滤波器的滤波非常尖锐,高斯低通滤波器的滤波则非常平滑。巴特沃斯滤波器介于两者之间,当巴特沃斯低通滤波器的阶数较高时,接近于理想低通滤波器;当巴特沃斯低通滤波器的阶数较高时,则接近于高斯低通滤波器。

    二、理想低通滤波器(ILPF)

    1、基本定义

    理想低通滤波器的产生公式为:
    在这里插入图片描述
    在这里插入图片描述

    其中D0为理想低通滤波器的截止频率。理想低通滤波器在半径为D0的范围内,所有频率都可以没有衰减地通过滤波器,该半径之外的所有频率都完全被衰减掉。理想低通滤波器具有平滑图像的作用,但是有很严重的振铃现象。

    补充1:图像处理中,对一幅图像进行滤波处理,若选用的频域滤波器具有陡峭的变化,则会使滤波图像产生“振铃”。所谓“振铃”,即指输出图像的灰度剧烈变化处产生的震荡,就好像钟被敲击后产生的空气震荡。如下图所示:
    在这里插入图片描述
    参考博客:图像处理中的振铃现象产生原因

    2、matlab实现理想低通滤波器去除高斯噪声

    (1)实现代码:

    close all;
    clear all;
    clc;
    I = imread('football.jpg');
    I=rgb2gray(I);
    
    subplot(131),imshow(I);
    title('原始图像');
    
    I=imnoise(I,'gaussian');%加入高斯白噪声
    subplot(132),imshow(I);
    title('加入噪声后所得图像');
    
    % 函数fft2()用于计算二维傅立叶变换
    % 函数fftshift()是对函数fft2()作傅里叶变换后得到的频谱进行平移,将变换后的图像频谱中心从矩阵的原点移到矩阵的中心
    % 作二维傅里叶变换前一定要用函数im2double()把原始图像的数据类型由uint8转化为double类型
    % 否则会因为unit8数据类型只能表示0-255的整数而出现数据截断,进而出现错误结果
    s=fftshift(fft2(im2double(I)));
    [a,b]=size(s);
    a0=round(a/2);
    b0=round(b/2);
    d0=50; % 将理想低通滤波器的截止频率D0设置为50
    for i=1:a %双重for循环计算频率点(i,j)与频域中心的距离D(i,j)=sqrt((i-round(a/2)^2+(j-round(b/2)^2))
        for j=1:b 
            distance=sqrt((i-a0)^2+(j-b0)^2);
            if distance<=d0  % 根据理想低通滤波器产生公式,D(i,j)<=D0,置为1
                h=1;
            else
                h=0;        % 根据理想低通滤波器产生公式,D(i,j)>D0,置为0
            end
            s(i,j)=h*s(i,j);% 频域图像乘以滤波器的系数
        end
    end
    % real函数取元素的实部
    s=real(ifft2(ifftshift(s)));% 最后进行二维傅里叶反变换转换为时域图像
    subplot(133),imshow(s,[]);
    title('理想低通滤波所得图像'); 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    (2)实现效果:
    在这里插入图片描述
    三、巴特沃斯低通滤波器(BLPF)

    1、基本定义

    巴特沃斯低通滤波器的产生公式为:

    在这里插入图片描述
    在这里插入图片描述
    其中D0为巴特沃斯低通滤波器的截止频率,参数n为巴特沃斯低通滤波器的阶数,n越大则滤波器的形状越陡峭即振铃现象越明显。

    2、matlab实现巴特沃斯低通滤波器去除高斯噪声

    (1)实现代码:

    close all;
    clear all;
    clc;
    I = imread('football.jpg');
    I=rgb2gray(I);
    
    subplot(131),imshow(I);
    title('原始图像');
    
    I=imnoise(I,'gaussian');%加入高斯白噪声
    subplot(132),imshow(I);
    title('加入噪声后所得图像');
    
    % 函数fft2()用于计算二维傅立叶变换
    % 函数fftshift()是对函数fft2()作傅里叶变换后得到的频谱进行平移,将变换后的图像频谱中心从矩阵的原点移到矩阵的中心
    % 作二维傅里叶变换前一定要用函数im2double()把原始图像的数据类型由uint8转化为double类型
    % 否则会因为unit8数据类型只能表示0-255的整数而出现数据截断,进而出现错误结果
    s=fftshift(fft2(im2double(I)));
    [N1,N2]=size(s);%求二维傅里叶变换后图像大小
    n=2;            % 将巴特沃斯低通滤波器的阶数n设置为2
    d0=30;          % 将巴特沃斯低通滤波器的截止频率D0设置为30
    n1=round(N1/2);
    n2=round(N2/2);
    for i=1:N1      %双重for循环计算频率点(i,j)与频域中心的距离D(i,j)=sqrt((i-round(N1/2)^2+(j-round(N2/2)^2))
        for j=1:N2 
            distance=sqrt((i-n1)^2+(j-n2)^2);
            if distance==0 
                h=0; 
            else
                h=1/(1+(distance/d0)^(2*n));% 根据巴特沃斯低通滤波器公式为1/(1+[D(i,j)/D0]^2n)
            end
            s(i,j)=h*s(i,j);% 频域图像乘以滤波器的系数
        end
    end
    % real函数取元素的实部
    s=real(ifft2(ifftshift(s)));% 最后进行二维傅里叶反变换转换为时域图像
    subplot(133),imshow(s,[]);
    title('Butterworth低通滤波图像');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    (2)实现效果:
    在这里插入图片描述
    四、高斯低通滤波器(GLPF)

    1、基本定义

    高斯低通滤波器的产生公式为:
    在这里插入图片描述
    在这里插入图片描述
    其中D0为高斯低通滤波器的截止频率,注意高斯低通滤波器不会产生振铃现象。

    2、matlab实现高斯低通滤波器去除高斯噪声

    (1)实现代码:

    close all;
    clear all;
    clc;
    I = imread('football.jpg');
    I=rgb2gray(I);
    
    subplot(131),imshow(I);
    title('原始图像');
    
    I=imnoise(I,'gaussian');%加入高斯白噪声
    subplot(132),imshow(I);
    title('加入噪声后所得图像');
    
    % 函数fft2()用于计算二维傅立叶变换
    % 函数fftshift()是对函数fft2()作傅里叶变换后得到的频谱进行平移,将变换后的图像频谱中心从矩阵的原点移到矩阵的中心
    % 作二维傅里叶变换前一定要用函数im2double()把原始图像的数据类型由uint8转化为double类型
    % 否则会因为unit8数据类型只能表示0-255的整数而出现数据截断,进而出现错误结果
    s=fftshift(fft2(im2double(I)));
    [a,b]=size(s);
    d0=30; % 将高斯低通滤波器的截止频率D0设置为30
    a0=round(a/2);
    b0=round(b/2);
    for i=1:a
        for j=1:b
            distance=sqrt((i-a0)^2+(j-b0)^2);    % 根据高斯低通滤波器公式H(u,v)=e^-[D^2(u,v)/2*D0^2] 
            h=exp(-(distance*distance)/(2*(d0^2))); % exp表示以e为底的指数函数
            s(i,j)=h*s(i,j);% 频域图像乘以滤波器的系数
        end
    end
    
    s=real(ifft2(ifftshift(s)));% 最后进行二维傅里叶反变换转换为时域图像
    subplot(133),imshow(s,[]); 
    title('高斯低通滤波图像');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    (2)实现效果:
    在这里插入图片描述

    补充2:对图像噪声的简单理解:噪声在图像上常表现为引起较强视觉效果的孤立像素点或像素块。一般, 噪声信号与研究的对象不相关,它以无用的信息形式出现,扰乱图像的可观测信息。通俗的说,噪声点其实在视觉上看上去让人感觉很难受,直观理解就是其和周围的像素点差异比较大,显得比较突兀,视觉看起来很不舒服。

    参考博客:
    (1) 通过matlab编程,对以下图像分别添加高斯噪声和椒盐噪声(参数自定),并使用理想低通滤波器、高斯低通滤波器和巴特沃斯低通滤波器进行去噪
    (2)用matlab编程实现数字图像理想低通滤波、高斯低通滤波和巴特沃斯低通滤波去噪算法

    由于刚刚开始学习图像处理,对于很多知识理解不到位。如有错误,恳请指正,任重而道远,慢慢加油!

  • 相关阅读:
    代码随想录Day25 回溯算法 LeetCode T51 N皇后问题
    【广州华锐互动】VR虚拟党建云展馆:带你沉浸式领略红色文化
    “购物返现积分兑换”——区块链思维的购物返利方式
    微信小程序接入lottie动画
    安徽工业大学计算机考研资料汇总
    CVPR 2022 Oral 大连理工提出的SCI 快速、超强的低光照图像增强方法 亲测效果
    基于Vue+ElementUI+MySQL+Express的学生管理系统(3)
    42张图,带你真正搞懂redis数据类型的底层
    什么是war包?war包该怎么运行?
    TypeScript配置文件设置详解
  • 原文地址:https://blog.csdn.net/qq_44111805/article/details/126305064