ITK系列18_ 区域增长(连接门限)对脑部MHA文件进行三维分割

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

实例18 连接门限对脑部MHA文件进行三维分割

#include "itkConnectedThresholdImageFilter.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 seedX seedY lowerThreshold upperThreshold" << std::endl;
    return EXIT_FAILURE;
    }*/
  /*我们基于一个特殊的像素类型和维来定义图像类型。由于平滑滤波器的需要,在这里我
  们使用浮点型数据定义像素*/
  typedef   float           InternalPixelType;
  const     unsigned int    Dimension = 3;
  typedef itk::Image< InternalPixelType, Dimension >  InternalImageType;

  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" );
  reader->SetFileName("BrainProtonDensity3Slices.mha");
  writer->SetFileName( "ConnectedThreshold_baizhi.mha" );

  //使用图像类型作为模板参数来对平滑滤波器进行实例化
  typedef itk::CurvatureFlowImageFilter< InternalImageType, InternalImageType >
  CurvatureFlowImageFilterType;
  //调用 New() 方式来创建滤波器并将接指向 itk::SmartPointer
  //平滑滤波器实例化对象smoothing
  CurvatureFlowImageFilterType::Pointer smoothing =
                         CurvatureFlowImageFilterType::New();
  //声明区域生长滤波器的类型,本例中使用 ConnectedThresholdImageFilter
  typedef itk::ConnectedThresholdImageFilter< InternalImageType,
                                    InternalImageType > ConnectedFilterType;
  //使用 New( ) 方式构造这种类的一个滤波器
  //连接门限滤波器实例化对象connectedThreshold
  ConnectedFilterType::Pointer connectedThreshold = ConnectedFilterType::New();
  //读取图像进行平滑滤波
  smoothing->SetInput( reader->GetOutput() );
  //滤波后进行连接门限
  connectedThreshold->SetInput( smoothing->GetOutput() );
  /*由于只有一小部分图像文件格式支持浮点型数据类型,所以使
  用 cast filter 将浮点型数据类型转换成整型*/
  caster->SetInput( connectedThreshold->GetOutput() );
  //处理后输出数据到writer
  writer->SetInput( caster->GetOutput() );
  /*CurvatureFlowImageFilter(平滑滤波器)需要定义两个参数。下面是一个二维图像的常见值。
  当然它们也需要根据输入图像存在的噪声的数量进行适当的调整*/
  smoothing->SetNumberOfIterations( 5 );//越大滤波效果越好
  smoothing->SetTimeStep( 0.125 );
  /*ConnectedThresholdImageFilter(连通门限图像滤波)有两个主要的
  参数(lowerThreshold和upperThreshold)需要定义,
  它们分别是为了确定是否包含在区域中的亮度值而制定的标准的上门限和下门限。
  这两个值设定得太接近势必会降低区域生长的机动性,而设定得太远必将整个图像都卷入区域中*/
  const InternalPixelType lowerThreshold = atof( "150" );
  const InternalPixelType upperThreshold = atof( "180" );

  connectedThreshold->SetLower(  lowerThreshold  );
  connectedThreshold->SetUpper(  upperThreshold  );
  /*这个滤波器的输出是一个二值图像,这个二值图像除了分割出的区域外到处都是零值像
  素。区域中的亮度值是由 SetReplaceValue() 方式来选择的*/
  connectedThreshold->SetReplaceValue( 255 );
  
  InternalImageType::IndexType  index;

  /*这个算法的实例化需要用户提供一个种子点index。将这个点选在被分割的解剖学结构的典型
 区域是很便捷的。种子是以一种 itk::Index 的形式传递给 SetSeed() 方式的*/
  //白质种子点
  index[0] = atoi( "60" );
  index[1] = atoi( "116" );
  index[2] = atoi("2");
  connectedThreshold->SetSeed( index );
  /*writer 上的 Updata() 方法引发了管道的运行。通常在出现错误和抛出异议时, 从一个
  try / catch 模块调用 updata :*/
  try
    {
    writer->Update();
    }
  catch( itk::ExceptionObject & excep )
    {
    std::cerr << "Exception caught !" << std::endl;
    std::cerr << excep << std::endl;
    }
    return EXIT_SUCCESS;
}

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

                      

                        切片1                                     切片2                                        切片3

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

                      

                        切片1                                     切片2                                        切片3

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

                            

                         切片1                                     切片2                                        切片3

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

                         

                       切片1                                     切片2                                        切片3

 

ITK系列目录:

1 ITK图像数据表达之图像

2 ITK图像处理之图像滤波

3 ITK图像处理之图像分割

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

亦我飞也

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

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

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

打赏作者

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

抵扣说明:

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

余额充值