]> Creatis software - cpPlugins.git/blob - lib/cpPlugins/Plugins/RGBImageToOtherChannelsFilter.cxx
contour widget example done
[cpPlugins.git] / lib / cpPlugins / Plugins / RGBImageToOtherChannelsFilter.cxx
1 #include <cpPlugins/Plugins/RGBImageToOtherChannelsFilter.h>
2 #include <cpPlugins/Interface/Image.h>
3
4 #include <cpExtensions/Algorithms/RGBImageToOtherChannelsFilter.h>
5 #include <cpExtensions/Algorithms/RGBExtractFunction.h>
6 #include <cpExtensions/Algorithms/RGBToHSVFunction.h>
7 #include <cpExtensions/Algorithms/RGBToYPbPrFunction.h>
8
9 // -------------------------------------------------------------------------
10 cpPlugins::Plugins::RGBImageToOtherChannelsFilter::
11 RGBImageToOtherChannelsFilter( )
12   : Superclass( )
13 {
14   typedef cpPlugins::Interface::Parameters TParameters;
15
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 );
21
22   this->m_DefaultParameters.Configure( TParameters::String, "OutChannel" );
23   this->m_Parameters = this->m_DefaultParameters;
24 }
25
26 // -------------------------------------------------------------------------
27 cpPlugins::Plugins::RGBImageToOtherChannelsFilter::
28 ~RGBImageToOtherChannelsFilter( )
29 {
30 }
31
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                                   \
40     );                                                                  \
41   else cpPlugins_Image_Input_Demangle(                                  \
42     P< unsigned short >, D, I, O, r, f                                  \
43     );                                                                  \
44   else cpPlugins_Image_Input_Demangle(                                  \
45     P< unsigned int >, D, I, O, r, f                                    \
46     );                                                                  \
47   else cpPlugins_Image_Input_Demangle(                                  \
48     P< unsigned long >, D, I, O, r, f                                   \
49     )
50
51 // -------------------------------------------------------------------------
52 std::string cpPlugins::Plugins::RGBImageToOtherChannelsFilter::
53 _GenerateData( )
54 {
55   cpPlugins::Interface::Image* image =
56     this->GetInput< cpPlugins::Interface::Image >( 0 );
57   if( image == NULL )
58     return( "RGBImageToOtherChannelsFilter: No input image." );
59
60   itk::DataObject* itk_image = NULL;
61   std::string r = "";
62   cpPlugins_Plugins_RGBImageToOtherChannelsFilter(
63     itk::RGBPixel, 2, image, itk_image, r, _DemangleOutput
64     );
65   else cpPlugins_Plugins_RGBImageToOtherChannelsFilter(
66     itk::RGBPixel, 3, image, itk_image, r, _DemangleOutput
67     );
68   else cpPlugins_Plugins_RGBImageToOtherChannelsFilter(
69     itk::RGBPixel, 4, image, itk_image, r, _DemangleOutput
70     );
71   else r = "RGBImageToOtherChannelsFilter: Input image type not supported.";
72   return( r );
73 }
74
75 // -------------------------------------------------------------------------
76 template< class I >
77 std::string cpPlugins::Plugins::RGBImageToOtherChannelsFilter::
78 _DemangleOutput( itk::DataObject* image )
79 {
80   typedef typename I::PixelType _P;
81
82   std::string outc = this->m_Parameters.GetValueAsString( "OutChannel" );
83   std::string r = "";
84
85   using namespace cpExtensions::Algorithms;
86   if( outc == "HSV" )
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 );
92   else
93     r =
94       std::string( "RGBImageToOtherChannelsFilter: Conversor not available: " ) +
95       outc;
96   return( r );
97 }
98
99 // -------------------------------------------------------------------------
100 template< class I, class C >
101 std::string cpPlugins::Plugins::RGBImageToOtherChannelsFilter::
102 _RealGD( itk::DataObject* image )
103 {
104   typedef itk::Image< itk::RGBPixel< double >, I::ImageDimension > _O;
105   typedef
106     cpExtensions::Algorithms::RGBImageToOtherChannelsFilter< I, _O, C >
107     _F;
108
109   // Configure filter
110   _F* filter = dynamic_cast< _F* >( this->m_RealProcessObject.GetPointer( ) );
111   if( filter == NULL )
112   {
113     this->m_RealProcessObject = _F::New( );
114     filter = dynamic_cast< _F* >( this->m_RealProcessObject.GetPointer( ) );
115
116   } // fi
117   filter->SetInput( dynamic_cast< I* >( image ) );
118   filter->Update( );
119
120   // Connect output
121   cpPlugins::Interface::Image* out =
122     this->GetOutput< cpPlugins::Interface::Image >( 0 );
123   if( out != NULL )
124   {
125     out->SetITKImage< _O >( filter->GetOutput( ) );
126     return( "" );
127   }
128   else
129     return( "RGBImageToOtherChannelsFilter: output not correctly created." );
130
131   return( "" );
132 }
133
134 // eof - $RCSfile$