我尝试通过插入现有类的对象来扩展ITK中的现有类(特别是NormalizedMutualInformation) (GradientImageFilter)为了正确学习图像注册过程。问题是我不知道如何从模板访问图像数据,以便将它们插入过滤器。我所做的是在NormalizedMutualInformation类中声明一个typedef变量:
typedef typename itk :: GradientImageFilter FixedGradient;
是固定图像的过滤器。但是当我尝试设置GradientImageFilter对象的输入数据时,在类的.hxx文件(特别是在Evaluate方法中)中,我使用了NormalizedMutualInformation类的模板参数作为SetInput()方法的参数。它不起作用,但我不知道我应该插入什么参数。我该如何解决这个问题?
答案 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() );
}