#include #include #include #include #include #include #include #include // ------------------------------------------------------------------------- cpPluginsITKBinaryFunctorFilters::BinaryArithmeticImageFilter:: BinaryArithmeticImageFilter( ) : Superclass( ) { typedef cpInstances::DataObjects::Image _TImage; this->_ConfigureInput< _TImage >( "Input1", true, false ); this->_ConfigureInput< _TImage >( "Input2", true, false ); this->_ConfigureOutput< _TImage >( "Output" ); std::vector< std::string > choices; choices.push_back( "Add" ); choices.push_back( "Subtract" ); choices.push_back( "Multiply" ); choices.push_back( "Divide" ); choices.push_back( "DivideOrZero" ); choices.push_back( "Pow" ); this->m_Parameters.ConfigureAsChoices( "Operator", choices ); } // ------------------------------------------------------------------------- cpPluginsITKBinaryFunctorFilters::BinaryArithmeticImageFilter:: ~BinaryArithmeticImageFilter( ) { } // ------------------------------------------------------------------------- void cpPluginsITKBinaryFunctorFilters::BinaryArithmeticImageFilter:: _GenerateData( ) { auto o = this->GetInputData( "Input1" ); cpPlugins_Demangle_Image_IntPixels_AllDims_1( o, _GD0 ) this->_Error( "Invalid input image." ); } // ------------------------------------------------------------------------- template< class _TImage > void cpPluginsITKBinaryFunctorFilters::BinaryArithmeticImageFilter:: _GD0( _TImage* image1 ) { typedef itk::AddImageFilter< _TImage, _TImage > _TAdd; typedef itk::SubtractImageFilter< _TImage, _TImage > _TSubtract; typedef itk::MultiplyImageFilter< _TImage, _TImage > _TMultiply; typedef itk::DivideImageFilter< _TImage, _TImage, _TImage > _TDivide; typedef itk::DivideOrZeroOutImageFilter< _TImage, _TImage > _TDivideOrZero; typedef itk::PowImageFilter< _TImage, _TImage > _TPow; auto image2 = this->GetInputData< _TImage >( "Input2" ); if( image2 == NULL ) this->_Error( "Incompatible second input image." ); std::string op = this->m_Parameters.GetSelectedChoice( "Operator" ); if( op == "Add" ) this->_GD1< _TAdd, _TImage >( image1, image2 ); else if( op == "Subtract" ) this->_GD1< _TSubtract, _TImage >( image1, image2 ); else if( op == "Multiply" ) this->_GD1< _TMultiply, _TImage >( image1, image2 ); else if( op == "Divide" ) this->_GD1< _TDivide, _TImage >( image1, image2 ); else if( op == "DivideOrZero" ) this->_GD1< _TDivideOrZero, _TImage >( image1, image2 ); else if( op == "Pow" ) this->_GD1< _TPow, _TImage >( image1, image2 ); } // ------------------------------------------------------------------------- template< class _TFilter, class _TImage > void cpPluginsITKBinaryFunctorFilters::BinaryArithmeticImageFilter:: _GD1( _TImage* image1, _TImage* image2 ) { // Configure filter auto filter = this->_CreateITK< _TFilter >( ); filter->SetInput1( image1 ); filter->SetInput2( image2 ); filter->Update( ); // Connect output this->GetOutput( "Output" )->SetITK( filter->GetOutput( ) ); } // eof - $RCSfile$