使用 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轴方向来计算的。从这个结果可以看出对图像中的噪声的敏感度是很明显的。