• MATLAB数字图像处理 实验三:空域频域图像去噪与锐化


    一、实验目的

    1、熟悉空域和频域增强方法,理解并掌握常用平滑和锐化方法

    二、实验环境

    Matlab 2020B

    三、实验内容

    题目

    1)对一幅带有噪声图像采用空域和频域的滤波方法实现平滑处理,空域和频域至少选择一种方法自己编写代码实现,并比较、分析不同窗口大小的滤波方法对其结果的影响(图自选);
    2)对1)经过平滑处理过后的图像进行锐化处理,要求分别采用空域和频域的滤波方法实现锐化处理,空域和频域至少选择一种方法自己编写代码实现;
    3)写出实验报告。报告要求:有实验目的,实验内容,实验过程,实验小结和较详细的图文说明。

    相关知识

    利用空域滤波方法实现的平滑处理时,最基本的两种办法为中值滤波与均值滤波。
    中值滤波是非线性滤波器,需要取当前像素点为中心点,选取邻域(4邻域、8邻域或其他形式、其他窗口大小的邻域),将当前像素值改为这个窗口区域中的中位数(中值)。
    均值滤波是线性滤波器。取某一像素点为中心点,选取邻域(4邻域、8邻域或其他形式、其他窗口大小的区域),将当前像素值改为这个区域中的数值的平均值或加权平均值。
    在均值滤波中,可以使用平均值。使用滑动平均值(Moving Average)时,对于某一点,对其截取出8邻域,并以其8邻域灰度级的平均值作为该点的灰度级值。即:
    ∑ i = 1 3 ∑ j = 1 3 1 9 p ( i , j ) \sum_{i=1}^3\sum_{j=1}^3\frac 19p(i,j) i=13j=1391p(i,j)
    使用加权平均值时,其周围邻域中每一个点都被赋予了不同的权值作为掩膜。即:
    ∑ i = 1 N ∑ j = 1 M w ( i , j ) p ( i , j ) \sum_{i=1}^N\sum_{j=1}^Mw(i,j)p(i,j) i=1Nj=1Mw(i,j)p(i,j)
    常用的掩膜除了滑动平均值,还包括Sobel算子: ( − 1 0 1 − 2 0 2 − 1 0 1 ) (101202101)

    121000121 用于计算在 x x x轴方向上的梯度 ∂ P ∂ x \frac{\partial P}{\partial x} xP ( − 1 − 2 − 1 0 0 0 1 2 1 ) (121000121)
    101202101
    用于计算在 y y y轴方向上的梯度 ∂ P ∂ y \frac{\partial P}{\partial y} yP
    需要说明的是,对图像在频域空间上也可以实现平滑处理。对于一张空域图像,利用傅里叶变换可以将图像变为频域图像。
    F ( u ) = ∫ − ∞ ∞ f ( x ) e − j 2 π u x d x F(u)=\int_{-\infty}^{\infty}f(x)e^{-j2\pi ux}dx F(u)=f(x)ej2πuxdx
    利用逆傅里叶变换也可以将频域图像变回空域图像。
    f ( u ) = ∫ − ∞ ∞ F ( u ) e j 2 π u x d u f(u)=\int_{-\infty}^{\infty}F(u)e^{j2\pi ux}du f(u)=F(u)ej2πuxdu
    由于图像是离散的,所以需要利用离散傅列变换。在2维空间的离散傅里叶变换公式如下:
    F ( u , v ) = 1 M N ∑ x = 0 M − 1 ∑ y = 0 N − 1 f ( x , y ) e − j 2 π ( u x / M + v y / N ) F(u,v)=\frac 1{MN}\sum_{x=0}^{M-1}\sum_{y=0}^{N-1}f(x,y)e^{-j2\pi(ux/M+vy/N)} F(u,v)=MN1x=0M1y=0N1f(x,y)ej2π(ux/M+vy/N)
    2维空间的离散傅里叶变换的逆变换公式如下:
    f ( x , y ) = ∑ u = 0 M − 1 ∑ v = 0 N − 1 F ( u , v ) e j 2 π ( u x / M + v y / N ) f(x,y)=\sum_{u=0}^{M-1}\sum_{v=0}^{N-1}F(u,v)e^{j2\pi(ux/M+vy/N)} f(x,y)=u=0M1v=0N1F(u,v)ej2π(ux/M+vy/N)
    在频域空间中也可以设置滤波器,常用的平滑滤波器是低通滤波器,低通滤波器保留了低频率的成分,丢失了高频率的成分,使得图像保留了颜色等特征而丢失了部分细节。
    在进行图像增强时,也可以使用空域滤波的方法和频域滤波的方法。
    使用空域滤波的方法对图像进行增强时,可以先将原图像平滑,将原图和平滑后的图像作差,得到一个掩膜。将掩膜赋予一个权重再加到原图像中,得到新图像即为锐化、增强之后的图像。同样的,这一个掩膜可以通过上文中的Sobel算子得到,也可以用于进一步计算梯度幅度。
    使用频域滤波的方法对图像进行增强时,使用高通滤波器,过滤掉图像的颜色而提取出图像的轮廓。同样的,将图像的轮廓加权后与原图相加,得到增强后的图像。
    需要说明的是,为了给图像添加噪声,可以利用imnoise函数。当参数指定为”gaussian”时,添加高斯噪声。当参数指定为”possion”时,添加了泊松噪声。

    部分核心代码

    I=imread('couplenew.png');
    I=im2gray(I);
    I=im2double(I);
    G=imnoise(I,'gaussian');
    imshow(G)
    [h,w]=size(I);
    res=zeros(h,w);
    for i=2:h-1
        for j=2:w-1
                res(i,j)=(G(i-1,j-1)+G(i,j-1)+G(i+1,j-1)+G(i-1,j)+G(i,j)+G(i+1,j)+G(i-1,j+1)+G(i,j+1)+G(i+1,j+1))/9;
        end
    end
    subplot(1,3,1);imshow(I);title('原图')
    subplot(1,3,2);imshow(G);title('噪声')
    subplot(1,3,3);imshow(res);title('新图')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    利用imnoise函数添加噪声,并实现了滑动平均值实现了图像的平滑,平滑的范围针对的是八邻域。

    I=imread('couplenew.png');
    I=im2gray(I);
    I=im2double(I);
    imshow(I)
    [h,w]=size(I);
    res=zeros(h,w);
    for i=2:h-1
        for j=2:w-1
             res(i,j)=(-I(i-1,j-1)-I(i,j-1)-I(i+1,j-1)-I(i-1,j)+9*I(i,j)-I(i+1,j)-I(i-1,j+1)-I(i,j+1)-I(i+1,j+1));
        end
    end
    imshow(res)
    subplot(1,3,1);imshow(I);title('原图')
    subplot(1,3,3);imshow(res);title('新图')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    读入图像,使用空域的方法对其增强。

    I=imread('couplenew.png');
    I=im2gray(I);
    I=im2double(I);
    G=imnoise(I,'gaussian');
    imshow(G)
    [h,w]=size(I);
    res2=zeros(h,w);
    for i=2:h-1
        for j=2:w-1
                res2(i,j)=(G(i,j-1)+G(i-1,j)+G(i,j)+G(i+1,j)+G(i,j+1))/5;
        end
    end
    subplot(1,3,1);imshow(I);title('原图')
    subplot(1,3,2);imshow(G);title('噪声')
    subplot(1,3,3);imshow(res2);title('新图')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    利用imnoise函数添加噪声,并实现了滑动平均值实现了图像的平滑,平滑的范围针对的是四邻域。

    I=imread('couplenew.png');
    I=im2gray(I);
    I=im2double(I);
    G=imnoise(I,'gaussian');
    [h,w]=size(I);
    res=zeros(h,w);
    for i=2:h-1
        for j=2:w-1
            neighbor=G(i-1:i+1,j-1:j+1);  %截取邻域
            res(i,j)=median(neighbor(:));   %中值滤波
        end
    end
    subplot(1,3,1);imshow(I);title('原图')
    subplot(1,3,2);imshow(G);title('噪声')
    subplot(1,3,3);imshow(res);title('新图')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    利用imnoise函数添加噪声,并实现了中值滤波实现了图像的平滑。

    I=imread('couplenew.png');
    I=im2gray(I);
    I=im2double(I);
    G=imnoise(I,'gaussian');
    [h,w]=size(I);
    B=ones(3,3)/9;
    res=conv2(G,B);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    利用imnoise函数添加噪声,并对图像进行卷积运算。

    I=imread('couplenew.png');
    I=im2gray(I);
    I=im2double(I);
    G=imnoise(I,'gaussian');
    [h,w]=size(I);
    B=ones(3,3)/9;
    res1=conv2(G,B);
    B=ones(5,5)/25;
    res2=conv2(G,B);
    B=ones(7,7)/49;
    res3=conv2(G,B);
    subplot(1,4,1);imshow(G);title('带噪声的原图')
    subplot(1,4,2);imshow(res1);title('3*3窗口')
    subplot(1,4,3);imshow(res2);title('5*5窗口')
    subplot(1,4,4);imshow(res3);title('7*7窗口')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    比较了不同窗口大小的均值滤波。

    I=imread('couplenew.png');
    I=im2gray(I);
    I=im2double(I);
    G=I;
    [h,w]=size(I);
    res=zeros(h,w);
    for i=2:h-1
        for j=2:w-1
            gx=-G(i-1,j-1)-2*G(i-1,j)-G(i-1,j+1)+G(i+1,j-1)+2*G(i+1,j)+G(i+1,j+1);
            gy=-G(i-1,j-1)-2*G(i,j-1)-G(i+1,j-1)+G(i-1,j+1)+2*G(i,j+1)+G(i+1,j+1);
     
             res(i,j)=sqrt(gx.^2+gy.^2);
        end
    end
    res=res-G;
    subplot(1,2,1);imshow(G);
    subplot(1,2,2);imshow(res);
    disp(res)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    同样利用拉普拉斯算子对图像锐化

    I=imread('couplenew.png');
    I=im2gray(I);
    I=im2double(I);
    G=imnoise(I,'gaussian');
    [h,w]=size(G);
    mask=zeros(h,w);
    for i=1:h
        for j=1:w
            if ((h/2-i).^2+(w/2-j).^2>100*100)
                mask(i,j)=1;
            end
        end
    end
    F=fft2(G);          %傅里叶变换
    F1=log(abs(F)+1);   %取模并进行缩放
     
    Fs=fftshift(F);      %将频谱图中零频率成分移动至频谱图中心
    Fs=Fs.*mask;
    S=log(abs(Fs)+1);    %取模并进行缩放
    fr=real(ifft2(ifftshift(Fs)));  %频率域反变换到空间域,并取实部
    ret=im2uint8(mat2gray(fr));     %更改图像类型
    subplot(2,2,1);imshow(G);title('原始图像');
    subplot(2,2,2);imshow(F1,[]);title('傅里叶正变换');
    subplot(2,2,3);imshow(S,[]);title('频移后的频谱图');
    subplot(2,2,4);imshow(ret),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

    完成了对图像的傅里叶变换,进行平滑操作。

    I=imread('couplenew.png');
    I=im2gray(I);
    I=im2double(I);
    [h,w]=size(I);
    mask=zeros(h,w);
    for i=1:h
        for j=1:w
            if ((h/2-i).^2+(w/2-j).^2>50*50)
                mask(i,j)=1;
            end
        end
    end
    F=fft2(I);          %傅里叶变换
    F1=log(abs(F)+1);   %取模并进行缩放
     
    Fs=fftshift(F);      %将频谱图中零频率成分移动至频谱图中心
    Fs=Fs.*mask;
    S=log(abs(Fs)+1);    %取模并进行缩放
    fr=real(ifft2(ifftshift(Fs)));  %频率域反变换到空间域,并取实部
    res=I+fr;
    subplot(2,2,1);imshow(I);title('原始图像');
    subplot(2,2,2);imshow(S,[]);title('频移后的频谱图');
    subplot(2,2,3);imshow(fr),title('傅里叶逆变换');
    subplot(2,2,4);imshow(res);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

    基于傅里叶变换的高通滤波器对图像提取出线条轮廓,将线条轮廓加到原图,对图像进行锐化。

    实验结果

    图1 滑动平均实验结果
    成功地实现了对原图添加高斯噪声。对在添加过高斯噪声的图像进行滑动平均值。
    图2 四邻域平均实验结果
    成功地对原图添加了高斯噪声。对在添加高斯噪声的图像进行均值滤波,选取的是四邻域。可以看到,在此图像中利用四邻域进行均值滤波的效果不如八邻域。
    图3 中值滤波实验结果
    成功地对原图添加了高斯噪声。对在添加高斯噪声的图像进行中值滤波。在进行中值滤波后,可以明显看到在图像背景的纯白色区域上,噪声被很好地去除了。而在图像前景区域,细节丢失得较为严重。
    图4 卷积实验结果
    成功地对原图添加了高斯噪声。对在添加高斯噪声的图像进行均值滤波,使用卷积运算,卷积核为 ( 1 9 1 9 1 9 1 9 1 9 1 9 1 9 1 9 1 9 ) (191919191919191919)

    919191919191919191 。其实现的效果与图1的均值滤波是类似的。
    图5 不同窗口大小的滤波方法
    比较了不同窗口大小的滤波,有33的窗口、55的窗口、7*7的窗口。都是使用均值滤波。
    图6 傅里叶变换实验结果
    使用具有噪声的图像,将其进行傅里叶正变换后频移,频移后乘以一个掩膜(低通滤波器)。将乘以掩膜后的图像进行傅里叶逆变换,得到处理后的新图像。
    图7 锐化实验结果
    利用拉普拉斯算子,对图1的输出图像进行锐化, P − ∇ 2 P P-\nabla^2P P2P,使用掩膜 ( 1 1 1 1 − 8 1 1 1 1 ) (111181111)
    111181111
    ,得到锐化后的新图,可以明显看出人物的轮廓像是被描粗了一遍,比平滑后的图像更为明显,人物与原图效果较为接近。但是,背景上加的噪点也被增强了。
    图8 锐化实验结果2
    利用基于频域的方法进行锐化实验,对图1的输出图像进行锐化。利用高通滤波器,可以看到图8.3中能看到人物的轮廓。将轮廓加到原图后形成了图8.4,人物轮廓明显被增强了。

    实验结果分析

    实验需要比较分析不同窗口大小的滤波方法的效果。在图5中,对原图添加高斯噪声,并分别选择使用33的窗口、55的窗口、7*7的窗口进行均值滤波的处理。可以明显地看出,更大的窗口能更好地过滤掉背景上随机出现的高斯噪声。但是,也会导致图像变得模糊,丢失了很多边缘、线条上的细节。使用越大的窗口,图像的模糊化也就会越严重。

    四、实验小结

  • 相关阅读:
    [Gstreamer] 环境变量
    Mathematica中的常用基本操作
    一种更优雅书写Python代码的方式
    scipy.optimize.linprog()函数--求解线性规划问题
    Java Static
    SQL入门教程
    根文件系统介绍
    Html + Express 实现大文件分片上传、断点续传、秒传
    什么是需求分析,如何进行需求分析?
    Qt 的d指针
  • 原文地址:https://blog.csdn.net/qq_46640863/article/details/125820465