ITK系列25_ 区域增长(孤立连接)算法对脑部MHA文件进行三维分割

261 阅读2分钟

实例25 孤立 连接算法对脑部MHA文件 进行三维分割

#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 = 3;
  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( "BrainProtonDensity3Slices.mha" );
  writer->SetFileName( "Isolated_baizhi.mha" );


  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(4);
  smoothing->SetTimeStep( 0.125 );

  InternalImageType::IndexType  indexSeed1;
  //白质种子点
  indexSeed1[0] = atoi( "61" );
  indexSeed1[1] = atoi( "140" );
  indexSeed1[2] = atoi("2");
  //下门限值(要分割的白质的下门限值)
  const InternalPixelType lowerThreshold = atof( "150" );

  InternalImageType::IndexType  indexSeed2;
  //灰质种子点
  indexSeed2[0] = atoi( "63" );
  indexSeed2[1] = atoi( "43" );
  indexSeed2[2] = atoi("2");
  /*由于在 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:

输入三维图像(BrainProtonDensity3Slices.mha):

                                

                                    切片1                                     切片2                                        切片3

输出三维白质图像(Isolated_baizhi.mha):

                                        

切片1                                切片2                                   切片3

输出三维脑室图像(Isolated_naoshi.mha):

                                         

切片1                                切片2                                   切片3

输出三维灰质图像(Isolated_naoshi.mha):

                                            

切片1                                切片2                                   切片3

 

ITK系列目录:

1 ITK图像数据表达之图像

2 ITK图像处理之图像滤波

3 ITK图像处理之图像分割

注:例程配套素材见系列目录