ITK 实例6 PNG图像进行带滤波的二维梯度强度提取

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

  微分是对一个数字数据的不规则操作。实际中可以方便地定义一个执行微分的比例。在执行这样的滤波时使用一个高斯核被认为是最便捷的选择。通过选择一个特定的高斯标准差(σ) ,就可以选择一个相应的比例来去除通常被认为是噪声的高频部分。
  itk::GradientMagnitudeRecursiveGaussianImageFilter 计算在每个像素的图像梯度。这个计算过程等同于首先通过将图像和一个高斯核卷积来平滑图像,然后应用一个差分操作。 s 的值是由用户选择的。这些是通过使用一个 IIR ( Infinite Impulse Response 无限脉冲响应)和高斯核的派生卷积来实现的。传统的卷积将产生一个更精确的结果,但是 IIR 方式更加迅速,尤其是使用大的 σ 值。        

  GradientMagnitudeRecursiveGaussianImageFilter 通过使用高斯核和它的导函数的自然分离来对任何维的图像进行操作。

  如下图所示阐述了这个滤波器对一个 MRI 脑部图像切片作用的效果,使用的 σ 值分别为 1 ( 左图)、 3 (中图)、 5 (右图)滤波器对一个 MRI 脑部图像切片作用的效果。

 1 #include "itkImageFileReader.h"
 2 #include "itkImageFileWriter.h"
 3 #include "itkRescaleIntensityImageFilter.h"
 4 #include "itkGradientMagnitudeRecursiveGaussianImageFilter.h"//带滤波梯度强度的头文件
 5  
 6 int main( int argc, char * argv[] )
 7 {
 8   /*if( argc < 4 )
 9     {
10     std::cerr << "Usage: " << std::endl;
11     std::cerr << argv[0] << "  inputImageFile   outputImageFile   sigma" << std::endl;
12     return EXIT_FAILURE;
13     }*/
14   //类型必须基于输入和输出图像的像素进行实例化
15   typedef    float    InputPixelType;
16   typedef    float    OutputPixelType;
17   //使用它们就可以对输入、输出图像进行实例化
18   typedef itk::Image< InputPixelType,  2 >   InputImageType;
19   typedef itk::Image< OutputPixelType, 2 >   OutputImageType;
20   //现在同时使用输入和输出图像类型来实例化滤波器类型
21   typedef itk::ImageFileReader< InputImageType >  ReaderType;
22   typedef itk::GradientMagnitudeRecursiveGaussianImageFilter<
23                         InputImageType, OutputImageType >  FilterType;
24   //通过调用 New( ) 方式来创建一个滤波器对象并将结果指向一个 itk::SmartPointer
25   ReaderType::Pointer reader = ReaderType::New();
26   //输入图像
27   reader->SetFileName("BrainProtonDensitySlice.png");
28  
29   FilterType::Pointer filter = FilterType::New();
30   //输入图像可以从另一个滤波器的输出得到。这里,源自于一个图像 reader 来得到
31   filter->SetInput( reader->GetOutput() );
32   //对高斯滤波核的标准差进行赋值
33   const double sigma = atof("1");
34   //现在设置高斯滤波核的标准差
35   filter->SetSigma( sigma );
36   //最后,通过调用 Update( ) 方式来执行滤波器
37   filter->Update();
38   
39   typedef unsigned char                   WritePixelType;
40   typedef itk::Image< WritePixelType, 2 > WriteImageType;
41  
42   typedef itk::RescaleIntensityImageFilter<
43                    OutputImageType, WriteImageType > RescaleFilterType;
44  
45   RescaleFilterType::Pointer rescaler = RescaleFilterType::New();
46  
47   rescaler->SetOutputMinimum(   0 );
48   rescaler->SetOutputMaximum( 255 );
49  
50   typedef itk::ImageFileWriter< WriteImageType >  WriterType;
51  
52   WriterType::Pointer writer = WriterType::New();
53   //输出强度图像
54   writer->SetFileName("GradientMagnitude_RG_1.png");
55   /*如果这个滤波器的输出已经连接到流水线中的其他滤波器,更新任何下游的滤波器将同
56       样触发这个滤波器的一个更新。例如,梯度强度滤波器可能连接到一个图像 writer*/
57   rescaler->SetInput( filter->GetOutput() );
58   writer->SetInput( rescaler->GetOutput() );
59   writer->Update();
60  
61   return EXIT_SUCCESS;
62 }

 输入图像    

 梯度强度图(σ=1)

 梯度强度图(σ=3)     

 梯度强度图(σ=5)

  由于梯度强度图像的动态范围往往比输入图像的动态范围要小,所以必须注意选择用来表达输出图像的图像类型。