在ITK的新模板类中创建ITK类的对象

时间:2015-10-07 07:44:30

标签: itk

我尝试通过插入现有类的对象来扩展ITK中的现有类(特别是NormalizedMutualInformation) (GradientImageFilter)为了正确学习图像注册过程。问题是我不知道如何从模板访问图像数据,以便将它们插入过滤器。我所做的是在NormalizedMutualInformation类中声明一个typedef变量:

typedef typename itk :: GradientImageFilter FixedGradient;

是固定图像的过滤器。但是当我尝试设置GradientImageFilter对象的输入数据时,在类的.hxx文件(特别是在Evaluate方法中)中,我使用了NormalizedMutualInformation类的模板参数作为SetInput()方法的参数。它不起作用,但我不知道我应该插入什么参数。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我认为你可以通过编写复合滤波器来实现这一目标。您可以在ITK软件指南中获得有关它的更多信息:http://www.itk.org/ItkSoftwareGuide.pdf

阅读第8章第6节。

基本上,您必须创建一个NEW过滤器类,然后必须在过滤器的构造函数中构建管道。在你的情况下,它将是一个由GradientImageFilter和NormalizedMutualInformation组成的管道。这个新滤波器的输入应该传递给梯度滤波器,输出取自normalizedmutual,如手册所示:“复合滤波器的输入和输出需要分别嫁接到头部和尾部(分别) 组件过滤器。“

以下是完整的代码示例:http://www.itk.org/Doxygen46/html/Filtering_2CompositeFilterExample_8cxx-example.html

示例的有趣部分是复合过滤器的构造函数,管道的程序集参与其中:

template <class TImageType>
CompositeExampleImageFilter<TImageType>
::CompositeExampleImageFilter()
{
  m_Threshold = 1;
  m_GradientFilter = GradientType::New();
  m_ThresholdFilter = ThresholdType::New();
  m_ThresholdFilter->SetInput( m_GradientFilter->GetOutput() );
  m_RescaleFilter = RescalerType::New();
  m_RescaleFilter->SetInput( m_ThresholdFilter->GetOutput() );
  m_RescaleFilter->SetOutputMinimum(
                                  NumericTraits<PixelType>::NonpositiveMin());
  m_RescaleFilter->SetOutputMaximum(NumericTraits<PixelType>::max());
}

然后是魔术发生的GenerateData方法:

template <class TImageType>
void
CompositeExampleImageFilter<TImageType>::
GenerateData()
{
  m_GradientFilter->SetInput( this->GetInput() );
  m_ThresholdFilter->ThresholdBelow( this->m_Threshold );
  m_RescaleFilter->GraftOutput( this->GetOutput() );
  m_RescaleFilter->Update();
  this->GraftOutput( m_RescaleFilter->GetOutput() );
}