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

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

  图像梯度的强度广泛地应用在图像分析中,主要用来帮助检测对象轮廓和分离均匀区域。 itk::GradientMagnitudeImageFilter 使用一个简单的有限差分方式来计算图像中每个像素位置的梯度强度。例如:在二维情况下计算等同于将图像使用模块类型,如下所示:然后计算它们的平方和并计算和的平方根。

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

 输入图像        

 梯度强度图

  上图阐述了梯度强度滤波器对一个 MRI 脑部图像切片作用的效果。这个图片展示了这个滤波器对噪声数据的灵敏性(即对噪声灵敏)。由于梯度强度图像的动态范围往往比输入图像的动态范围要小,所以必须注意选择用来表达输出图像的图像类型。通常,这个规则会产生异常,例如,合成图像包含高对比对象。这个滤波器在计算梯度前不会对图像进行任何滤波。因此这个结果对噪声非常敏感,而且并不一定是尺度空间分析的最佳选择。