1 #include <cpPlugins/Plugins/RGBImageToOtherChannelsFilter.h>
2 #include <cpPlugins/Interface/Image.h>
4 #include <cpExtensions/Algorithms/RGBImageToOtherChannelsFilter.h>
5 #include <cpExtensions/Algorithms/RGBExtractFunction.h>
6 #include <cpExtensions/Algorithms/RGBToHSVFunction.h>
7 #include <cpExtensions/Algorithms/RGBToYPbPrFunction.h>
9 // -------------------------------------------------------------------------
10 cpPlugins::Plugins::RGBImageToOtherChannelsFilter::
11 RGBImageToOtherChannelsFilter( )
14 typedef cpPlugins::Interface::Parameters TParameters;
16 this->m_ClassName = "cpPlugins::RGBImageToOtherChannelsFilter";
17 this->m_ClassCategory = "ImageToImageFilter";
18 this->SetNumberOfInputs( 1 );
19 this->SetNumberOfOutputs( 1 );
20 this->_MakeOutput< cpPlugins::Interface::Image >( 0 );
22 this->m_DefaultParameters.Configure( TParameters::String, "OutChannel" );
23 this->m_Parameters = this->m_DefaultParameters;
26 // -------------------------------------------------------------------------
27 cpPlugins::Plugins::RGBImageToOtherChannelsFilter::
28 ~RGBImageToOtherChannelsFilter( )
32 // -------------------------------------------------------------------------
33 #define cpPlugins_Plugins_RGBImageToOtherChannelsFilter( P, D, I, O, r, f ) \
34 cpPlugins_Image_Input_Demangle( P< char >, D, I, O, r, f ); \
35 else cpPlugins_Image_Input_Demangle( P< short >, D, I, O, r, f ); \
36 else cpPlugins_Image_Input_Demangle( P< int >, D, I, O, r, f ); \
37 else cpPlugins_Image_Input_Demangle( P< long >, D, I, O, r, f ); \
38 else cpPlugins_Image_Input_Demangle( \
39 P< unsigned char >, D, I, O, r, f \
41 else cpPlugins_Image_Input_Demangle( \
42 P< unsigned short >, D, I, O, r, f \
44 else cpPlugins_Image_Input_Demangle( \
45 P< unsigned int >, D, I, O, r, f \
47 else cpPlugins_Image_Input_Demangle( \
48 P< unsigned long >, D, I, O, r, f \
51 // -------------------------------------------------------------------------
52 std::string cpPlugins::Plugins::RGBImageToOtherChannelsFilter::
55 cpPlugins::Interface::Image* image =
56 this->_Input< cpPlugins::Interface::Image >( 0 );
58 return( "RGBImageToOtherChannelsFilter: No input image." );
60 itk::DataObject* itk_image = NULL;
62 cpPlugins_Plugins_RGBImageToOtherChannelsFilter(
63 itk::RGBPixel, 2, image, itk_image, r, _DemangleOutput
65 else cpPlugins_Plugins_RGBImageToOtherChannelsFilter(
66 itk::RGBPixel, 3, image, itk_image, r, _DemangleOutput
68 else cpPlugins_Plugins_RGBImageToOtherChannelsFilter(
69 itk::RGBPixel, 4, image, itk_image, r, _DemangleOutput
71 else r = "RGBImageToOtherChannelsFilter: Input image type not supported.";
75 // -------------------------------------------------------------------------
77 std::string cpPlugins::Plugins::RGBImageToOtherChannelsFilter::
78 _DemangleOutput( itk::DataObject* image )
80 typedef typename I::PixelType _P;
82 std::string outc = this->m_Parameters.GetValueAsString( "OutChannel" );
85 using namespace cpExtensions::Algorithms;
87 r = this->_RealGD< I, RGBToHSVFunction< _P > >( image );
88 else if( outc == "YPbPr" )
89 r = this->_RealGD< I, RGBToYPbPrFunction< _P > >( image );
90 else if( outc == "Copy" )
91 r = this->_RealGD< I, RGBExtractFunction< _P > >( image );
94 std::string( "RGBImageToOtherChannelsFilter: Conversor not available: " ) +
99 // -------------------------------------------------------------------------
100 template< class I, class C >
101 std::string cpPlugins::Plugins::RGBImageToOtherChannelsFilter::
102 _RealGD( itk::DataObject* image )
104 typedef itk::Image< itk::RGBPixel< double >, I::ImageDimension > _O;
106 cpExtensions::Algorithms::RGBImageToOtherChannelsFilter< I, _O, C >
110 _F* filter = dynamic_cast< _F* >( this->m_RealProcessObject.GetPointer( ) );
113 this->m_RealProcessObject = _F::New( );
114 filter = dynamic_cast< _F* >( this->m_RealProcessObject.GetPointer( ) );
117 filter->SetInput( dynamic_cast< I* >( image ) );
121 cpPlugins::Interface::Image* out =
122 this->_Output< cpPlugins::Interface::Image >( 0 );
125 out->SetITKImage< _O >( filter->GetOutput( ) );
129 return( "RGBImageToOtherChannelsFilter: output not correctly created." );