zoukankan      html  css  js  c++  java
  • 空间滤波

    1.线性空间滤波

     1 clear,clc;
     2 close all;
     3 f = imread('test.tif'); %读入原图像
     4 subplot(321),imshow(f); %显示原图像
     5 
     6 w = ones(31);
     7 gd = imfilter(f,w);
     8 subplot(322),imshow(gd,[ ]);        %
     9 
    10 gr = imfilter(f,w,'replicate');
    11 subplot(323), imshow(gr,[ ])        %
    12 
    13 gs = imfilter(f,w,'symmetric');
    14 subplot(324),imshow(gs,[ ])         %
    15 
    16 gc = imfilter(f,w,'circular');
    17 subplot(325),imshow(gc,[ ]);        %
    18 
    19 f8 = im2uint8(f);
    20 g8r = imfilter(f8,w,'replicate');
    21 subplot(326),imshow(g8r,[ ]);       %
    View Code

    执行结果如下:

         

    2.非线性空间滤波

    {

    colfilt()函数:

     功能:以列方法进行邻域处理,也可执行常规非线性滤波。
    用法:B = colfilt(A,[m n],block_type,fun)
       该函数生成了一幅图像A,在A中,每一列对应于其中心位于图像内某个位置的邻域所包围的像素。然后将函数应用于该矩阵中。[m n]表示大小为m行n列的邻域。block_type表示了一个字符串,包括'distinct','sliding'两种,其中'sliding'是在输入图像中逐个像素地滑动该m乘n的区域。fun表示引用了一个函数进行处理,函数返回值的大小必须和原图像大小相同。
    举例:I = imread('tire.tif');
               imshow(I)
               I2 = uint8(colfilt(I,[5 5],'sliding',@mean));     %额,这里要说明一点:@mean,有的MATLAB需要加@,有的就不需要加了
               figure, imshow(I2)

    }

    eg:

    1 clear,clc;
    2 close all;
    3 f = imread('test.tif'); %读入原图像
    4 subplot(121),imshow(f); %显示原图像
    5 
    6 gmean = @(A)prod(A,1).^1/size(A,1);      %定义好非线性滤波器函数
    7 gf = padarray(f,[5,5],'replicate');      %用replicate填充输入图像
    8 g = colfilt(gf,[5,5],'sliding', gmean ); %对每个像素都执行这样的滤波操作
    9 subplot(122),imshow(g);
    非线性滤波

    执行结果为:    (显然也看不出什么结果,不过确实有这种方法)

    3.线性空间滤波器

    工具箱支持许多预定义的二维线性空间滤波器,这些滤波器可通过fspecial得到。该函数的模板为w = fspecial('type', parameters );  type用来指示滤波器的类型,parameters用来进一步规定滤波器。

    这里只显示用这个函数实现“拉普拉斯滤波器”的效果:

     1 clear;clc;
     2 close all;
     3 f = imread('test.tif');
     4 figure(1),imshow(f);
     5 w = fspecial('laplacian',0 );     %0是拉普拉斯滤波器的“阿尔法”值,取值区间[0,1],默认值是0.2
     6 res = imfilter(f,w,'replicate');  
     7 figure(2),imshow(res,[]);      %显示用w滤波器的滤波结果
     8 
     9 f2 = im2double(f);                %将f中的整数数值转化为浮点数
    10 g2 = imfilter(f2,w,'replicate');  
    11 figure(3),imshow(g2,[]);       %同样用w滤波器进行滤波
    12 
    13 g = f2 - g2;
    14 figure(4),imshow(g);
    拉普拉斯滤波器

    执行结果如下:

    手工指定的滤波器有时候会出现好效果:

    eg:

     1 clear;clc;
     2 close all;
     3 f = imread('test.tif');
     4 w4 = fspecial('laplacian',0 ); 
     5 w8 = [1,1,1;1,-8,1;1,1,1];
     6 f = im2double(f);
     7 g4 = f - imfilter(f,w4,'replicate');
     8 g8 = f - imfilter(f,w8,'replicate');
     9 imshow(f)
    10 figure,imshow(g4);
    11 figure,imshow(g8);
    View Code

    执行结果为:第一张是原图,显然第三张的滤波效果比第二张好

    4.非线性空间滤波器

    medfilt2()函数课用来进行中值滤波:

     1 clear;clc;
     2 close all;
     3 f = imread('test.tif');
     4 figure,imshow(f);
     5 fn = imnoise(f,'salt & pepper',0.2 );
     6 figure,imshow(fn);
     7 
     8 gm = medfilt2(fn);
     9 figure,imshow(gm);
    10 
    11 gms = medfilt2(fn,'symmetric');
    12 figure,imshow(gms);
    medfilt2函数中值滤波

    执行结果为:   第一张为原图,第二张是加上盐椒噪声之后的图,第三张是使用medfilt2()进行中值滤波之后的图,第四张是为了消除第三张中边缘部分的黑边而加上'symmetric'之后的效果图。

    最后总括一下:1.均值滤波可以去掉突然变化的点噪声,从而滤除一定的噪声,但是会有一定程度的模糊。

           中值滤波容易去除一些孤立的点、线噪声,同时保持图像的边缘。

              中值滤波的公式为:

     2.假设一副数字图像上带有随机加性噪声,请设计一个方案用例判断噪声模型:在图像的平坦区域取一小块图像做直方图,与已有的噪声模型作对比。

  • 相关阅读:
    分布式服务框架的雪崩问题
    分布式系统中的幂等性
    Exception引起的性能问题
    TFS2017新特性(一)
    云平台架构变迁
    MQ基本概念
    SVN版本管理
    1年内4次架构调整,谈Nice的服务端架构变迁之路
    鏖战双十一-阿里直播平台面临的技术挑战
    统一日志平台初探
  • 原文地址:https://www.cnblogs.com/liugl7/p/5294864.html
Copyright © 2011-2022 走看看