ITK 实例4 MHA格式文件进行三维非线性映射

发布时间 2023-08-16 14:29:25作者: 一杯清酒邀明月
 1 #include "itkImage.h"
 2 #include "itkImageFileReader.h"
 3 #include "itkImageFileWriter.h"
 4 //非线性映射滤波器头文件
 5 #include "itkSigmoidImageFilter.h"
 6 //注:非线性映射算法只能实现像素值(0-255)范围的输入输出映射。
 7 int main( int argc, char * argv[] )
 8 {
 9   /*if( argc < 7 )
10     {
11     std::cerr << "Usage: " << std::endl;
12     std::cerr << argv[0] << "  inputImageFile   outputImageFile";
13     std::cerr << " OutputMin OutputMax SigmoidAlpha SigmoidBeta" << std::endl;
14     return EXIT_FAILURE;
15     }*/
16 //然后必须定义这个滤波器的输入、输出像素和图像类型
17   typedef   unsigned char  InputPixelType;
18   typedef   unsigned char  OutputPixelType;
19  
20   typedef itk::Image< InputPixelType,  3 >   InputImageType;
21   typedef itk::Image< OutputPixelType, 3 >   OutputImageType;
22   
23   typedef itk::ImageFileReader< InputImageType  >  ReaderType;
24   typedef itk::ImageFileWriter< OutputImageType >  WriterType;
25  
26   ReaderType::Pointer reader = ReaderType::New();
27   WriterType::Pointer writer = WriterType::New();
28   //输入图像
29   reader->SetFileName( "CT_215-RescaleIntensity0_255.mha" );
30   //输出图像
31   writer->SetFileName( "CT_215_Sigmoid_out.mha" );
32   //我们使用图像类型来实例化滤波器类型并创建滤波器对象
33   typedef itk::SigmoidImageFilter<
34                InputImageType, OutputImageType >  SigmoidFilterType;
35   SigmoidFilterType::Pointer sigmoidFilter = SigmoidFilterType::New();
36   //输出像素中的最小值和最大值分别使用 SetOutputMinimum( ) 和 SetOutputMaximum( ) 方式来定义
37   const OutputPixelType outputMinimum = atoi( "10" );
38   const OutputPixelType outputMaximum = atoi( "240" );
39  
40   sigmoidFilter->SetOutputMinimum(   outputMinimum  );
41   sigmoidFilter->SetOutputMaximum(   outputMaximum  );
42   
43   const double  alpha = atof( "8" );//宽度
44   const double  beta  = atof( "155.5" );//位置
45   /*使用 SetAlpha() 和 SetBeta() 来设置系数 α 和 β 。注意 α 是和输入亮度窗口成比例的。按
46       照惯例我们可以说这个窗口是间距[-3α , 3α] 。亮度窗口的边界并不明显。如图所示, α
47       平稳地接近它的极值。当你想通过在围绕人口均值周围定义一个间距[-3σ , 3σ] 来设置一个
48       人口测量的范围时,你可以以同样的形式来进行考虑*/
49   sigmoidFilter->SetAlpha(  alpha  );
50   sigmoidFilter->SetBeta(   beta   );
51   /*可以从其他滤波器得到 SigmoidImageFilter 的输入,例如一个图像文件 reader 。输出可
52       以像一个图像文件 writer 一样传递给其他滤波器流水线。任何下游的滤波器调用 update 都可
53       以触发 Sigmoids 滤波器的运行*/
54  
55   sigmoidFilter->SetInput( reader->GetOutput() );
56   writer->SetInput( sigmoidFilter->GetOutput() );
57   writer->Update();
58   
59   return EXIT_SUCCESS;
60 }

 输入数据(CT_215-RescaleIntensity0_255.mha)

 三维非线性映射输出数据(CT_215_Sigmoid_out.mha)