ITK
4.1.0
Insight Segmentation and Registration Toolkit
|
00001 /*========================================================================= 00002 * 00003 * Copyright Insight Software Consortium 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); 00006 * you may not use this file except in compliance with the License. 00007 * You may obtain a copy of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0.txt 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, 00013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 * See the License for the specific language governing permissions and 00015 * limitations under the License. 00016 * 00017 *=========================================================================*/ 00018 #ifndef __itkJoinImageFilter_h 00019 #define __itkJoinImageFilter_h 00020 00021 #include "itkBinaryFunctorImageFilter.h" 00022 #include "itkPixelTraits.h" 00023 00024 namespace itk 00025 { 00026 namespace Functor 00027 { 00047 template< class TPixel1, class TPixel2 > 00048 class JoinFunctor 00049 { 00050 public: 00051 JoinFunctor() {} 00052 ~JoinFunctor() {} 00054 00056 typedef JoinFunctor Self; 00057 00059 typedef typename PixelTraits< TPixel1 >::ValueType ValueType1; 00060 typedef typename PixelTraits< TPixel2 >::ValueType ValueType2; 00061 typedef typename JoinTraits< ValueType1, ValueType2 >::ValueType JoinValueType; 00062 00064 itkStaticConstMacro(Dimension1, unsigned int, 00065 PixelTraits< TPixel1 >::Dimension); 00066 itkStaticConstMacro(Dimension2, unsigned int, 00067 PixelTraits< TPixel2 >::Dimension); 00068 itkStaticConstMacro(JoinDimension, unsigned int, 00069 Dimension1 + Dimension2); 00071 00073 typedef Vector< JoinValueType, itkGetStaticConstMacro(JoinDimension) > JoinType; 00074 00075 bool operator!=(const JoinFunctor &) const 00076 { 00077 return false; 00078 } 00079 00080 bool operator==(const JoinFunctor & other) const 00081 { 00082 return !( *this != other ); 00083 } 00084 00086 inline JoinType operator()(const TPixel1 & A, const TPixel2 & B) const 00087 { 00088 JoinType out; 00089 00090 // Copy A into the output, casting as necessary 00091 this->FirstCopier(out, 0, A); 00092 00093 // Copy B into the output, starting where A left off,casting as necessary 00094 this->SecondCopier(out, Dimension1, B); 00095 00096 return out; 00097 } 00098 00099 private: 00106 struct CopierDispatchBase {}; 00107 template< unsigned int VDimension > 00108 struct CopierDispatch:public CopierDispatchBase {}; 00109 00120 void FirstCopier(JoinType & out, unsigned int idx, const TPixel1 & A) const 00121 { 00122 FirstCopier(CopierDispatch< Dimension1 >(), out, idx, A); 00123 } 00124 00126 void FirstCopier(CopierDispatchBase, 00127 JoinType & out, unsigned int idx, const TPixel1 & A) const 00128 { 00129 for ( unsigned int i = 0; i < Dimension1; i++, idx++ ) 00130 { 00131 out[idx] = static_cast< JoinValueType >( A[i] ); 00132 } 00133 } 00135 00137 void FirstCopier(CopierDispatch< 1 >, 00138 JoinType & out, unsigned int idx, const TPixel1 & A) const 00139 { out[idx] = static_cast< JoinValueType >( A ); } 00140 00146 void SecondCopier(JoinType & out, unsigned int idx, const TPixel2 & B) const 00147 { 00148 SecondCopier(CopierDispatch< Dimension2 >(), out, idx, B); 00149 } 00150 00152 void SecondCopier(CopierDispatchBase, 00153 JoinType & out, unsigned int idx, const TPixel2 & B) const 00154 { 00155 for ( unsigned int i = 0; i < Dimension2; i++, idx++ ) 00156 { 00157 out[idx] = static_cast< JoinValueType >( B[i] ); 00158 } 00159 } 00161 00163 void SecondCopier(CopierDispatch< 1 >, 00164 JoinType & out, unsigned int idx, const TPixel2 & B) const 00165 { 00166 out[idx] = static_cast< JoinValueType >( B ); 00167 } 00168 }; //class JoinFunction 00170 00171 template< typename TImage1, typename TImage2 > 00172 struct MakeJoin { 00173 typedef JoinFunctor< typename TImage1::PixelType, 00174 typename TImage2::PixelType > FunctorType; 00175 typedef Image< typename FunctorType::JoinType, 00176 ::itk::GetImageDimension< TImage1 >::ImageDimension > ImageType; 00177 }; 00178 } //namespace functor 00179 00208 template< class TInputImage1, class TInputImage2 > 00209 class ITK_EXPORT JoinImageFilter: 00210 public BinaryFunctorImageFilter< TInputImage1, 00211 TInputImage2, 00212 typename 00213 Functor::MakeJoin< TInputImage1, 00214 TInputImage2 >::ImageType, 00215 typename 00216 Functor::MakeJoin< TInputImage1, 00217 TInputImage2 >::FunctorType > 00218 { 00219 public: 00221 itkStaticConstMacro(OutputImageDimension, unsigned int, 00222 TInputImage1::ImageDimension); 00223 00225 typedef JoinImageFilter Self; 00226 00228 typedef typename Functor::MakeJoin< TInputImage1, 00229 TInputImage2 >::FunctorType FunctorType; 00230 typedef typename Functor::MakeJoin< TInputImage1, 00231 TInputImage2 >::ImageType OutputImageType; 00232 typedef typename FunctorType::JoinType OutputImagePixelType; 00233 00235 typedef BinaryFunctorImageFilter< TInputImage1, TInputImage2, OutputImageType, 00236 FunctorType > Superclass; 00237 00238 typedef SmartPointer< Self > Pointer; 00239 typedef SmartPointer< const Self > ConstPointer; 00240 00242 itkNewMacro(Self); 00243 00245 itkTypeMacro(JoinImageFilter, BinaryFunctorImageFilter); 00246 00247 #ifdef ITK_USE_CONCEPT_CHECKING 00248 00249 itkConceptMacro( Input1HasPixelTraitsCheck, 00250 ( Concept::HasPixelTraits< typename TInputImage1::PixelType > ) ); 00251 itkConceptMacro( Input2HasPixelTraitsCheck, 00252 ( Concept::HasPixelTraits< typename TInputImage2::PixelType > ) ); 00253 itkConceptMacro( Input1Input2HasJoinTraitsCheck, 00254 ( Concept::HasJoinTraits< typename PixelTraits< typename TInputImage1::PixelType >::ValueType, 00255 typename PixelTraits< typename TInputImage2::PixelType >::ValueType > ) ); 00256 00258 #endif 00259 protected: 00260 JoinImageFilter() {} 00261 virtual ~JoinImageFilter() {} 00262 private: 00263 JoinImageFilter(const Self &); //purposely not implemented 00264 void operator=(const Self &); //purposely not implemented 00265 }; 00266 } // end namespace itk 00268 00269 #endif 00270