二值门限处理
本小节的源代码在文件 Examples/Filtering/BinaryThresholdImageFilter.cxx
中。
这个例子阐述了二值阈值图像滤波器的用法。这个滤波器通过在如图 6-1
所示的规则下改变像素值来将一个图像转化成一个二值图像。用户需要指定两个门限:上门限和下门限,也就是两个亮度值:内部和外部。对于输入图像中的每个像素,使用上、下门限来和像素值进行比较。如果像素值在由[下门限,上门限]定义的范围内,则输出像素指定为 InsideValue
;否则输出像素指定为 OutsideValue
。门限处理通常作为一个分割途径的最后一个操作。

//使用 itk::BinaryThresholdImageFilter 需要的第一步是包含它的头文件:
#include "itkBinaryThresholdImageFilter.h"
//下一步是确定输入和输出图像的像素类型:
typedef unsigned char InputPixelType;
typedef unsigned char OutputPixelType;
//现在分别使用像素类型和维来定义输入和输出图像的类型:
typedef itk::Image< InputPixelType, 2 > InputImageType;
typedef itk::Image< OutputPixelType, 2 > OutputImageType;
//使用前面定义的输入和输出图像的类型来对滤波器的类型进行实例化:
typedef itk::BinaryThresholdImageFilter<
InputImageType, OutputImageType > FilterType;
//同样也实例化一个 itk::ImageFileReader 类来从一个文件中读取图像(参考第七章可以得到更多关于读写数据的信息):
typedef itk::ImageFileReader< InputImageType > ReaderType;
//实例化一个 itk::ImageFileWriter 以便将输出图像写到一个文件中:
typedef itk::ImageFileWriter< InputImageType > WriterType;
//滤波器和 reader 都是通过调用它们的 New( )方式来创建的,并将结果指向itk::SmartPointers:
ReaderType::Pointer reader = ReaderType::New( );
FilterType::Pointer filter = FilterType::New( );
//由 reader 得到的图像作为输入传递给 BinaryThresholdImageFilter:
filter->SetInput( reader->GetOutput( ) );
//SetOutsideValue( )方式定义了指向那些亮度值在上、下门限范围之外的像素的亮度值。
//SetInsideValue( )方式定义了指向那些亮度值在上、下门限范围之内的像素的亮度值:
inside the threshold range.
filter->SetOutsideValue( outsideValue );
filter->SetInsideValue( insideValue );
//SetLowerThreshold( )和 SetUpperThreshold( )方式定义了将转化为 InsideValue 的输入图像亮度范围。注意上、下门限值的类型是输入图像像素类型,而 InsideValue 和 OutsideValue的类型是输出图像的像素类型。
filter->SetLowerThreshold( lowerThreshold );
filter->SetUpperThreshold( upperThreshold );
//通过调用 Update( )方式来触发滤波器的运行。如果滤波器的输出作为输入传递给后面的
滤波器,Update( )将调用传递途径中任何较后的滤波器直接触发这个滤波器的更新。
filter->Update( );
这张图表示了这个滤波器实现分割时自身的局限性。这些局限性在噪声图像和类似于 MRI
情况由于场偏磁造成的缺少空间均匀性的图像中显得尤为明显。
下面的类提供了相似的功能:
• itk::ThresholdImageFilter
门限处理概要
本小节的源代码在文件 Examples/Filtering/ThresholdImageFilter.cxx
中。
这个例子阐述了 itk::ThresholdImageFilter
的用法。这个滤波器可以使用三种不同的方式来转化一个图像的亮度级。
第一种:用户定义一个单一的阈值。任何像素值在这个阈值以下的像素将由一个用户定义的值来代替,这里成为 OutsideValue
。像素值在这个阈值以上的像素将保持不变。如图
6-3所示,举例说明了这种类型的门限处理。
第二种:用户定义一个特定的阈值,所有像素值在这个阈值以上的像素将由 OutsideValue来代替。像素值在这个阈值以下的像素将保持不变。如图 6-4
所示。
第三种:用户定义两个门限。所有像素值在这两个门限定义的范围之内的像素将保持不变,像素值在这个范围以外的像素将指定为 OutsideValue
,如图
6-5
所示。
接下来是从滤波器的这三种操作模式中选择一种方式:
(1)ThresholdBelow( )
(2)ThresholdAbove( )
(3)ThresholdOutside( )
//使用这个滤波器的第一步是包含它的头文件:
#include "itkThresholdImageFilter.h"
//然后我们必须确定使用图像的像素类型。这个滤波器是基于一个单一的图像类型来模板化的,因为这个算法仅仅确定了在指定范围之外的像素值,且保持不变来传递剩余的值。
typedef unsigned char PixelType;
//使用像素类型和维来定义图像:
typedef itk::Image< PixelType, 2 > ImageType;
//使用前面定义的图像类型来对滤波器进行实例化:
typedef itk::ThresholdImageFilter< ImageType > FilterType;
//同样也实例化一个 itk::ImageFileReader 类来从一个文件中读取图像:
typedef itk::ImageFileReader< ImageType > ReaderType;
//实例化一个 itk::ImageFileWriter 以便将输出图像写到一个文件中:
typedef itk::ImageFileWriter< ImageType > WriterType;
//滤波器和 reader 都是通过调用它们的 New( )方式来创建的,并将结果指向itk::SmartPointers:
ReaderType::Pointer reader = ReaderType::New( );
FilterType::Pointer filter = FilterType::New( );
//由 reader 得到的图像作为输入传递给 itk::ThresholdImageFilter:
filter->SetInput( reader->GetOutput( ) );
SetOutsideValue( )方式定义了指向那些亮度值在上、下门限范围之外的像素的亮度值:
filter->SetOutsideValue( 0 );
//第二种操作模式可以通过调用 ThresholdBelow( )方式来实现。
//ThresholdBelow( )方式定义了输入图像中要改变为 OutsideValue 的像素的亮度值:
filter->ThresholdBelow( 180 );
//通过调用 Update( )方式来触发滤波器的运行。
filter->Update( );
//第二种操作模式可以通过调用 ThresholdAbove( )方式来实现。
filter->ThresholdAbove( 180 );
filter->Update( );
//第三种操作模式可以通过调用 ThresholdOutside( )来实现。
filter->ThresholdOutside( 170,190 );
filter->Update( ); 108


本小节的例子也说明了这个滤波器实现分割时自身的局限性。这些局限性在噪声图像和类似于 MRI 情况由于场偏磁造成的缺少空间均匀性的图像中显得尤为明显。
下面的类提供了相似的功能:
• itk::BinaryThresholdImageFilter