zoukankan      html  css  js  c++  java
  • matlab中imfilter的用法

    来源:https://blog.csdn.net/qq_15971883/article/details/78334380

    转载自:http://blog.csdn.net/u013066730/article/details/56554332

    以及http://blog.csdn.net/u010740725/article/details/51557202

    功能:对任意类型数组或多维图像进行滤波。
    用法:B = imfilter(A,H)
       B = imfilter(A,H,option1,option2,...)
       或写作g = imfilter(f, w, filtering_mode, boundary_options, size_options)
    其中,f为输入图像,w为滤波掩模,g为滤波后图像。filtering_mode用于指定在滤波过程中是使用“相关”还是“卷积”。boundary_options用于处理边界充零问题,边界的大小由滤波器的大小确定。具体参数选项见下表:

      选项 描述
    filtering_mode ‘corr’ 通过使用相关来完成,该值为默认。
      ‘conv’ 通过使用卷积来完成
    boundary_options ‘X’ 输入图像的边界通过用值X(无引号)来填充扩展
    其默认值为0
      ‘replicate’ 图像大小通过复制外边界的值来扩展
      ‘symmetric’ 图像大小通过镜像反射其边界来扩展
      ‘circular’ 图像大小通过将图像看成是一个二维周期函数的一个周期来扩展
    size_options ‘full’ 输出图像的大小与被扩展图像的大小相同
      ‘same’ 输出图像的大小与输入图像的大小相同。这可通过将滤波掩模的中心点的偏移限制到原图像中包含的点来实现,该值为默认值。

     

    举例:

    例1:

    originalRGB = imread('peppers.png');

    imshow(originalRGB)
    h = fspecial('motion', 50, 45);%创建一个滤波器
    filteredRGB = imfilter(originalRGB, h);

    figure, imshow(filteredRGB)

    例2:

    %生成一个8x8的均值滤波器

    originalRGB = imread('peppers.png');

    imshow(originalRGB)

    w = fspecial('average',8);

    filteredRGB = imfilter(originalRGB, w);

    figure, imshow(filteredRGB)

     

    例3:

    单色图像的平滑

    单色图像(如灰度图像)平滑的过程:定义一个系数为1的模板,用这个空间模板的系数去乘以所有像素的值,并将结果除以模板中元素的总数。

    彩色图像的平滑:

    1、抽取图像:I(R、G、B)三幅分量。

        >>fR = I(:,:,1);

        >>fG = I(:,:,2);

        >>fB = I(:,:,3);

    2、 (1): 分别对(R、G、B)这三幅图像分量进行滤波。例如:平均滤波器 w = fspecial('average', 25); 来进行平滑处理。     

        >>fR_filtered = imfilter(fR, w, 'replicate');      

        >>fG_filtered = imfilter(fG, w, 'replicate');      

        >>fB_filtered = imfilter(fB, w, 'replicate');

        (2):也可以对(R、G、B)这三个图像分量一起处理,不用进行第三步。

    >>fc_filtered = imfilter(I, w, 'replicate');   

    3、重建滤波后的 RGB 的图像。

        >>fc_filtered = cat(3, fR_filtered, fG_filtered, fB_filtered)

    例子程序:

    close all

    clear all

    clc

    I = imread('olivian.jpg');      %读取一张噪声图像

    %提取图像的三个(R、G、B)分量图像

    R = I(:,:,1);

    G = I(:,:,2);

    B = I(:,:,3);

    %生成一个8x8的均值滤波器

    w = fspecial('average',8);

    fR = imfilter(R,w,'replicate');

    fG = imfilter(G,w,'replicate');

    fB = imfilter(B,w,'replicate');

    fc_filtered = cat(3,fR,fG,fB);   %将这四个句子可以改为:fc_filtered = imfilter(I, w, 'replicate');

    figure

    subplot(121);

    imshow(I);title('彩色噪声图像');

    subplot(122);

    imshow(fc_filtered,'Border','tight');title('彩色图像平滑处理'); 

    一维相关与卷积

      图1(a)显示了一维函数f和模板w。假设f的原点定为最左侧的点。为执行两个函数的相关,可移动w使其最右侧的点与f的原点重合,如图1(b)所示。需要注意的是,这两个函数之间有一些点未重叠。为处理该问题,最普遍的方法是在f中填充足够多的0(对应表1-1中边界选项boundary_options的默认值P),以保证在w通过f的整个过程中,始终存在对应的点。如图1(c)所示。
      现在准备执行相关操作。相关操作结果第一个值是在图1(c)所示位置上两个函数对应位置乘积的累加和。接着将w向右移动一个位置并重复上述过程,如图1(d)所示。经过4次移动后,如图1(e)所示。以此类推,直至w全部通过f,最终得到如图1(f)所示。得到的w与f的相关如图1(g)所示。
      在图1(g)所示的相关中,符号’full’是由MATLAB图像处理工具箱使用的标记,用来指示相关操作按上述方式计算时使用了经过充零后的图像。同样,工具箱还提供了另一个’same’选项,可以产生大小与f相同的相关。这种计算同样也使用经过充零后的图像,但开始位置位于与f的原点对准的模板的中线点。最后的计算时使f的最后一个点与模板的中心点对准。

    这里写图片描述

     

    图1 一维相关操作说明

     

    这里写图片描述

     

    图2 一维卷积操作说明


      为了执行卷积,将w旋转180度,使其最右侧的点与f的原点重叠,如图2(b)所示。然后重复在相关操作中使用的滑动计算过程,如图2(c)到图2(f)所示。’full’和’same’卷积结果分别如图2(g)和图2-2(h)所示。

     二维相关与卷积

      上述情况很容易推广到二维图像中,如图3所示。原点位于图像f(x,y)的左上角。为了执行相关计算,设置w(x,y)的最右下角点,使之与f(x,y)的原点重合,如图3(c)所示。与一维情况类似,这里我们使用了零填充。然后在所有可能的位置上移动w(x,y),使得它的至少一个像素会与原始图像f(x,y)中的某个像素重叠。这个’full’相关的结果如图3(d)所示。为得到图3(e)中所示的’same’相关,我们要求w(x,y)的所有偏移都能实现中心像素覆盖原始的f(x,y)。

    这里写图片描述

     

    图3 二维相关操作示例


      对于卷积,我们将w(x,y)旋转180度,其他处理方式与相关操作相同,参见图4(a)到图4(c)。

    这里写图片描述

     

    图4二维卷积操作示例

  • 相关阅读:
    ASP.NET MVC之从控制器传递数据到视图
    ASP.NET MVC之从视图传递数据到控制器
    JQuery和ASP.NET之间的传值
    ASP.NET前台html页面AJAX提交数据后台ashx页面接收数据
    Variadic Templates 可变参数模板
    C++类型转换
    C++优化string,实现写时拷贝
    C++实现一个线程安全的单例模式
    C++ 实现简单的string
    C++实现简单的线程安全队列
  • 原文地址:https://www.cnblogs.com/MCSFX/p/11721569.html
Copyright © 2011-2022 走看看