ITK 实例8 PNG图像进行不带滤波的二维导函数提取

发布时间 2023-08-16 14:34:30作者: 一杯清酒邀明月

使用 itk::DerivativeImageFilter 来计算一幅图像的偏微分——图像沿一个特定的坐标轴方向上的微分。

 1 #include "itkImage.h"
 2 #include "itkImageFileReader.h"
 3 #include "itkImageFileWriter.h"
 4 #include "itkRescaleIntensityImageFilter.h"
 5  
 6 #include "itkDerivativeImageFilter.h"//不带滤波导函数头文件
 7  
 8 int main( int argc, char * argv[] )
 9 {
10   //if( argc < 6 )
11   //  {
12   //  std::cerr << "Usage: " << std::endl;
13   //  std::cerr << argv[0] << "  inputImageFile   outputImageFile  normalizedOutputImageFile ";
14   //  std::cerr << " derivativeOrder direction" << std::endl;
15   //  return EXIT_FAILURE;
16   //  }
17     /*接下来,必须定义输入、输出图像的像素类型,并使用它们实例化图像类型。注意:由
18         于导数值是可正可负的,所以选择的图像应具有符号类型是很重要的*/
19   typedef   float  InputPixelType;
20   typedef   float  OutputPixelType;
21  
22   const unsigned int Dimension = 2;
23  
24   typedef itk::Image< InputPixelType,  Dimension >   InputImageType;
25   typedef itk::Image< OutputPixelType, Dimension >   OutputImageType;
26  
27   typedef itk::ImageFileReader< InputImageType  >  ReaderType;
28   typedef itk::ImageFileWriter< OutputImageType >  WriterType;
29   //现在就可以使用图像类型来定义滤波器类型并创建滤波器对象
30   ReaderType::Pointer reader = ReaderType::New();
31   WriterType::Pointer writer = WriterType::New();
32   //输入图像
33   reader->SetFileName("BrainProtonDensitySlice.png");
34   保存输出某方向(本例由于为二维图,所以为x轴或y轴)导数图像
35   //writer->SetFileName("BrainProtonDensitySlice_Derivative.png");
36  
37   typedef itk::DerivativeImageFilter<
38                InputImageType, OutputImageType >  FilterType;
39  
40   FilterType::Pointer filter = FilterType::New();
41   //使用 SetOrder( ) 方式来选择微分的阶数。使用 SetDirection( ) 方式来选择计算微分的坐标方向
42   filter->SetOrder(atoi("1"));//选择一阶微分
43   filter->SetDirection( atoi("0") );//选择X方向
44   /*可以从任何其他滤波器得到这个滤波器的输入,例如一个 reader 。输出可以像一个 writer
45       一样传递给其他滤波器流水线。任何下游的滤波器调用 update 都可以触发微分滤波器的运
46 */
47   filter->SetInput( reader->GetOutput() );
48   /*writer->SetInput( filter->GetOutput() );*/
49   /*writer->Update();*/
50   
51   typedef itk::Image< unsigned char, Dimension >  WriteImageType;
52  
53   typedef itk::RescaleIntensityImageFilter<
54                                   OutputImageType,
55                                   WriteImageType >    NormalizeFilterType;
56  
57   typedef itk::ImageFileWriter< WriteImageType >       NormalizedWriterType;
58  
59   NormalizeFilterType::Pointer normalizer = NormalizeFilterType::New();
60   NormalizedWriterType::Pointer normalizedWriter = NormalizedWriterType::New();
61  
62   normalizer->SetInput( filter->GetOutput() );
63   normalizedWriter->SetInput( normalizer->GetOutput() );
64  
65   normalizer->SetOutputMinimum(   0 );
66   normalizer->SetOutputMaximum( 255 );
67   //导数图像(含有负数)进行(0-255)线性标准化后图像
68   normalizedWriter->SetFileName("Derivative_normalizer_x_1.png");
69   normalizedWriter->Update();
70  
71   return EXIT_SUCCESS;
72 }

下图阐述了 DerivativeImageFilter 对一个 MRI 脑部图像作用的效果。微分是沿 着 x 轴和y轴方向来计算的。从这个结果可以看出对图像中的噪声的敏感度是很明显的。