ITK系列16_ PNG图像进行不带滤波的二维导函数提取

实例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系列目录:

1 ITK图像数据表达之图像

2 ITK图像处理之图像滤波

3 ITK图像处理之图像分割

注:例程配套素材见系列目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦我飞也

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值