ITK 邻域滤波器

         在一种使用输入像素的一个很小的邻域的信息来计算每个输出像素的滤波器形式的图像处理进程中会涉及位置这个概念。这些滤波器的一个典型形式是二维图像中的一个 3×3滤波器。基于这些滤波器的卷积模块可以执行从消除噪声到微分操作、数学形态学范围内的多种不同的任务。
        ITK 平台是以一种基于邻域图像滤波的优雅的方式来实现的。输入图像是使用一个称为itk::NeighborhoodIterator 的特定的迭代器来处理的。这个迭代器具有移动图像中所有像素的能力,并对每个像素可以在当前邻域中标记出像素地址。定义一个操作符,对输入像素应用一个算法操作来产生一个输出像素值。接下来的章节介绍了应用这个构造的滤波器的更常见 的用法(参考第 11 章可以得到更多关于迭代器的信息)。

1 均值滤波器

        本小节的源代码在文件 Examples/Filtering/MeanImageFilter.cxx 中. 通常使用 itk::MeanImageFilter 消除噪声。这个滤波器通过寻找输入像素相应邻域的统计均值来计算每个输出像素值。下面的图表阐述了在二维情况下 MeanImageFilter 的局部效果。左边的邻域的统计均值作为邻域中间像素的输出值。
 
        注意:这个算法对邻域内呈现的奇异值很敏感。由于这个滤波器内在使用了itk::SmartNeighborhoodIterator 和 itk::NeighborhoodOperator ,因此可以对任何维的图像进行处理。用来计算均值的邻域大小可以由用户来设置
//首先必须包含与这个滤波器相关的头文件:
#include "itkMeanImageFilter.h"

//然后必须定义输入和输出图像的像素类型并使用它们来对图像类型进行实例化:
typedef unsigned char InputPixelType;
typedef unsigned char OutputPixelType;
typedef itk::Image< InputPixelType, 2 > InputImageType;
typedef itk::Image< OutputPixelType, 2 > OutputImageType;

//现在可以使用图像类型来对滤波器类型进行实例化并创建滤波器对象:
typedef itk::MeanImageFilter<
InputImageType, OutputImageType > FilterType;
FilterType::Pointer filter = FilterType::New( );

//通过对相应的值传递一个 SizeType 对象来定义沿每个维的邻域大小。每个维的值作为一个矩形框的不完全尺寸来使用。例如:在二维情况下一个大小为 1×2 的 SizeType 将产生一个 3×5 的邻域。
InputImageType::SizeType indexRadius;
indexRadius[0] = 1; // radius along x
indexRadius[1] = 1; // radius along y
filter->SetRadius( indexRadius );

//这个滤波器的输入可以从其他任何滤波器得到,例如一个 reader。输出可以沿流水线传递给其他滤波器,例如一个 writer。下游的任何一个滤波器调用 update 将触发均值滤波器的运行:
filter->SetInput( reader->GetOutput( ) );
writer->SetInput( filter->GetOutput( ) );
writer->Update( );

        如图 6-13 所示阐述了这个滤波器对一个 MRI 脑部切片图像作用的效果,使用的邻域半径为 1×1 ,对应一个 3×3 的典型邻域。从图像中可以看出在邻域亮度值的扩散下边缘迅速退化

2 中值滤波器

        本小节的源代码在文件 Examples/Filtering/MedianImageFilter.cxx 中。
        itk::MedianImageFilter 通常用来作为消除噪声的一种稳健方法。这个滤波器对消除椒盐噪声更加有效。MedianImageFilter 计算每个输入像素周围相关邻域值的中值作为每个输出像素值。下面的图表阐述了在二维情况下这个滤波器的局部效果。左边的邻域的统计中值作为邻域中间像素的输出值。
        由于这个滤波器内在使用了 itk::NeighborhoodIterator itk::NeighborhoodOperator ,因此可以对任何维的图像进行处理。用来计算中值的邻域大小可以由用户来设置。
//首先必须包含与这个滤波器相关的头文件:
#include "itkMedianImageFilter.h"

//然后必须定义输入和输出图像的像素类型,并使用它们来对图像类型进行实例化:
typedef unsigned char InputPixelType;
typedef unsigned char OutputPixelType;
typedef itk::Image< InputPixelType, 2 > InputImageType;
typedef itk::Image< OutputPixelType, 2 > OutputImageType;

//现在可以使用图像类型来对滤波器类型进行实例化并创建滤波器对象。
typedef itk::MedianImageFilter<
InputImageType, OutputImageType > FilterType;
FilterType::Pointer filter = FilterType::New( ); 

//通过对相应的值传递一个 SizeType 对象来定义沿每个维的邻域大小。每个维的值作为一个矩形框的不完全尺寸来使用。例如:在二维情况下一个大小为 1×2 的 SizeType 将产生一个 3×5 的邻域。
InputImageType::SizeType indexRadius;
indexRadius[0] = 1; // radius along x
indexRadius[1] = 1; // radius along y
filter->SetRadius( indexRadius );

//这个滤波器的输入可以从其他任何滤波器得到,例如一个 reader。输出可以沿流水线传递给其他滤波器,例如一个 writer。下游的任何一个滤波器调用 update 将触发中值滤波器的运行。
filter->SetInput( reader->GetOutput( ) );
writer->SetInput( filter->GetOutput( ) );
writer->Update( );

        如图 6-14 所示阐述了这个滤波器对一个 MRI 脑部切片图像作用的效果,使用的邻域半径为 1×1 ,对应于一个 3×3 的典型邻域。这个滤波的图像展示了用中值滤波器的适中趋向来保护边缘。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值