孤立连接
接 下 来 的 例 子 阐 述 了 itk::IsolatedConnectedImageFilter 的 用 法 。 这 个 滤 波 器 是itk::ConnectedThresholdImageFilter 的一个相关变量。在这个滤波器中用户提供两个种子和一个最小门限值。这个滤波器将在一个与第一个种子相连而与第二个种子不相连的区域中生长。为了做到这一点,这个滤波器找到了一个能用来作为第一个种子的上门限值的亮度值。使用一个二进位的搜索方法来找到分开两个种子的值。
我们可以通过选取两个适当的位置作为种子对和设定门限的下限来很便捷地对主要的解剖学结构进行分割。很重要的一点是务必紧记在这个和以前的例子中都是对进行平滑过后的图像来进行分割的。由于平滑过后的图像的亮度分布和输入图像的亮度分布会有一定的差别,所以选择的门限值应该在平滑过后的图像中执行。如图所示中从左到右是输入图像和使CurvatureFlowImageFilter 平滑的结果,在它后面是分割的结果。这个滤波器可以在对邻近解剖学结构很难被分开的情况下进行使用。在一个结构中选择
一个种子并在邻近结构中选择另一个种子创建合适的设置用来计算将两个结构分开的门限。
下表所示列出了得到下图所示的图像所使用的参数(区分下图所示的白质和灰质的参数):
实例24 孤立连接算法对脑部PNG图像进行二维分割
#include "itkIsolatedConnectedImageFilter.h"
#include "itkImage.h"
#include "itkCastImageFilter.h"
#include "itkCurvatureFlowImageFilter.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
int main( int argc, char *argv[] )
{
/*if( argc < 7 )
{
std::cerr << "Missing Parameters " << std::endl;
std::cerr << "Usage: " << argv[0];
std::cerr << " inputImage outputImage seedX1 seedY1";
std::cerr << " lowerThreshold seedX2 seedY2" << std::endl;
return EXIT_FAILURE;
}*/
//我们使用一个像素类型和一个特殊维来定义图像的类型:
typedef float InternalPixelType;
const unsigned int Dimension = 2;
typedef itk::Image< InternalPixelType, Dimension > InternalImageType;
//下面几行是对 IsolatedConnectedImageFilter 进行实例化的代码
typedef unsigned char OutputPixelType;
typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
typedef itk::CastImageFilter< InternalImageType, OutputImageType >
CastingFilterType;
CastingFilterType::Pointer caster = CastingFilterType::New();
typedef itk::ImageFileReader< InternalImageType > ReaderType;
typedef itk::ImageFileWriter< OutputImageType > WriterType;
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
reader->SetFileName( "BrainProtonDensitySlice.png" );
writer->SetFileName( " Isolated_baizhi.png" );
typedef itk::CurvatureFlowImageFilter< InternalImageType, InternalImageType >
CurvatureFlowImageFilterType;
CurvatureFlowImageFilterType::Pointer smoothing =
CurvatureFlowImageFilterType::New();
typedef itk::IsolatedConnectedImageFilter<InternalImageType,
InternalImageType> ConnectedFilterType;
//使用 New( ) 方式对这个类的一个文件进行结构化
ConnectedFilterType::Pointer isolatedConnected = ConnectedFilterType::New();
//现在连接管道
smoothing->SetInput( reader->GetOutput() );
isolatedConnected->SetInput( smoothing->GetOutput() );
caster->SetInput( isolatedConnected->GetOutput() );
writer->SetInput( caster->GetOutput() );
/*IsolatedConnectedImageFilter 期望用户指定一个门限和两个种子。在这个例子中,我们
从命令行得到它们*/
smoothing->SetNumberOfIterations( 5 );
smoothing->SetTimeStep( 0.125 );
InternalImageType::IndexType indexSeed1;
//白质种子点
indexSeed1[0] = atoi( "61" );
indexSeed1[1] = atoi( "140" );
//下门限值(要分割的白质的下门限值)
const InternalPixelType lowerThreshold = atof( "150" );
InternalImageType::IndexType indexSeed2;
//灰质种子点
indexSeed2[0] = atoi( "63" );
indexSeed2[1] = atoi( "43" );
/*由于在 ConnectedThresholdImageFilter 中,现在我们就必须指定在区域中能被输出像素所
接受的亮度值以及至少一个种子点来定义最初的区域*/
isolatedConnected->SetLower( lowerThreshold );
isolatedConnected->AddSeed1( indexSeed1 );
isolatedConnected->AddSeed2( indexSeed2 );
isolatedConnected->SetReplaceValue( 255 );
/*writer 上的 Updata() 方法触发管道的运行。通常在出现错误和抛出异议时, 从一个 try / catch
模块调用 updata*/
try
{
writer->Update();
}
catch( itk::ExceptionObject & excep )
{
std::cerr << "Exception caught !" << std::endl;
std::cerr << excep << std::endl;
}
/*这个亮度值允许我们对两个区域进行分割,使用 GetIsolatedValue() 方式可以对区域进行恢复*/
std::cout << "Isolated Value Found = ";
std::cout << isolatedConnected->GetIsolatedValue() << std::endl;
return EXIT_SUCCESS;
}
计算得到白质和灰质的孤立值180:
输入图像 CurvatureFlowImageFilter 平滑 孤立连接分割白质
孤立连接分割灰质 孤立连接分割脑室
ITK系列目录:
注:例程配套素材见系列目录