2015-10-07 3 views
1

Я пытаюсь расширить существующий класс (в частности NormalizedMutualInformation) в ITK, вставив объект существующего класса (GradientImageFilter), чтобы правильно изучить регистрацию изображения обработать. Проблема в том, что я не знаю, как получить доступ к данным изображения из шаблона, чтобы вставить их в фильтр. Я сделал, чтобы объявить переменную typedef внутри класса NormalizedMutualInformation:Создание объекта класса ITK в новом классе шаблонов ITK

typedef typename itk :: GradientImageFilter FixedGradient;

который является фильтром для фиксированного изображения. Но в файле .hxx (особенно в методе Evaluate) этого класса, когда я пытался установить входные данные для объекта GradientImageFilter, я использовал аргумент шаблона класса NormalizedMutualInformation в качестве аргумента для метода SetInput(). Это не сработало, но я не знаю, какой аргумент я должен вставить. Как я могу решить эту проблему?

+0

Эй, если нет обработки до того момента, когда вы вставляете 'Gradien tImageFilter', подумайте о создании трубопровода. –

ответ

0

Я думаю, вы можете достичь этого, написав составной фильтр. Вы можете получить более подробную информацию об этом в руководстве по программному обеспечению ИТК: http://www.itk.org/ItkSoftwareGuide.pdf

Читать глава 8, раздел 6.

В принципе, вы должны создать новый класс фильтра, то вы должны построить трубопровод в конструкторе фильтр. В вашем случае это будет конвейер, состоящий из GradientImageFilter, а затем NormalizedMutualInformation. Вход в этот новый фильтр должен быть передан в фильтр градиента, а выход принят из нормализованного, как указано в руководстве: «Вход и выход композитного фильтра должны быть перенесены на головку и хвост (соответственно) компонентных фильтров ".)

Вот полный пример кода: 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()); 
} 
Смежные вопросы