实例16 PNG图像进行不带滤波的二维导函数提取
使用 itk::DerivativeImageFilter 来计算一幅图像的偏微分——图像沿一个特定的坐标轴方向上的微分。
#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkRescaleIntensityImageFilter.h"
#include "itkDerivativeImageFilter.h"//不带滤波导函数头文件
int main( int argc, char * argv[] )
{
//if( argc < 6 )
// {
// std::cerr << "Usage: " << std::endl;
// std::cerr << argv[0] << " inputImageFile outputImageFile normalizedOutputImageFile ";
// std::cerr << " derivativeOrder direction" << std::endl;
// return EXIT_FAILURE;
// }
/*接下来,必须定义输入、输出图像的像素类型,并使用它们实例化图像类型。注意:由
于导数值是可正可负的,所以选择的图像应具有符号类型是很重要的*/
typedef float InputPixelType;
typedef float OutputPixelType;
const unsigned int Dimension = 2;
typedef itk::Image< InputPixelType, Dimension > InputImageType;
typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
typedef itk::ImageFileReader< InputImageType > ReaderType;
typedef itk::ImageFileWriter< OutputImageType > WriterType;
//现在就可以使用图像类型来定义滤波器类型并创建滤波器对象
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
//输入图像
reader->SetFileName("BrainProtonDensitySlice.png");
保存输出某方向(本例由于为二维图,所以为x轴或y轴)导数图像
//writer->SetFileName("BrainProtonDensitySlice_Derivative.png");
typedef itk::DerivativeImageFilter<
InputImageType, OutputImageType > FilterType;
FilterType::Pointer filter = FilterType::New();
//使用 SetOrder( ) 方式来选择微分的阶数。使用 SetDirection( ) 方式来选择计算微分的坐标方向
filter->SetOrder(atoi("1"));//选择一阶微分
filter->SetDirection( atoi("0") );//选择X方向
/*可以从任何其他滤波器得到这个滤波器的输入,例如一个 reader 。输出可以像一个 writer
一样传递给其他滤波器流水线。任何下游的滤波器调用 update 都可以触发微分滤波器的运
行*/
filter->SetInput( reader->GetOutput() );
/*writer->SetInput( filter->GetOutput() );*/
/*writer->Update();*/
typedef itk::Image< unsigned char, Dimension > WriteImageType;
typedef itk::RescaleIntensityImageFilter<
OutputImageType,
WriteImageType > NormalizeFilterType;
typedef itk::ImageFileWriter< WriteImageType > NormalizedWriterType;
NormalizeFilterType::Pointer normalizer = NormalizeFilterType::New();
NormalizedWriterType::Pointer normalizedWriter = NormalizedWriterType::New();
normalizer->SetInput( filter->GetOutput() );
normalizedWriter->SetInput( normalizer->GetOutput() );
normalizer->SetOutputMinimum( 0 );
normalizer->SetOutputMaximum( 255 );
//导数图像(含有负数)进行(0-255)线性标准化后图像
normalizedWriter->SetFileName("Derivative_normalizer_x_1.png");
normalizedWriter->Update();
return EXIT_SUCCESS;
}
下图阐述了 DerivativeImageFilter 对一个 MRI 脑部图像作用的效果。微分是沿 着 x 轴和y轴方向来计算的。从这个结果可以看出对图像中的噪声的敏感度是很明显的。
输入图像 X方向一阶微分图 X方向二阶微分图 X方向三阶微分图
输入图像 Y方向一阶微分图 Y方向二阶微分图 Y方向三阶微分图
ITK系列目录:
注:例程配套素材见系列目录