ITK系列24_ 区域增长(孤立连接)算法对脑部PNG图像进行二维分割

40 篇文章 2 订阅
34 篇文章 30 订阅

孤立连接

接 下 来 的 例 子 阐 述 了 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系列目录:

1 ITK图像数据表达之图像

2 ITK图像处理之图像滤波

3 ITK图像处理之图像分割

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦我飞也

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值