MeVisLabToolboxReference
FMEwork/ITK/Sources/ITK/MLITK/ITKSupport/mlITKKernelSupport.h
Go to the documentation of this file.
00001 // **InsertLicense** code
00002 //----------------------------------------------------------------------------------
00004 
00008 //----------------------------------------------------------------------------------
00009 #ifndef __mlITKKernelSupport_H
00010 #define __mlITKKernelSupport_H
00011 
00013 #include "mlInitSystemITKSupport.h"
00014 
00015 // Include most ML specific things.
00016 #ifndef __mlModuleIncludes_H
00017 #include "mlModuleIncludes.h"
00018 #endif
00019 
00020 #ifndef __mlITKSupport_H
00021 #include "mlITKSupport.h"
00022 #endif
00023 
00024 #ifndef __mlITKFlatStructElement_H
00025 #include "mlITKFlatStructElement.h"
00026 #endif
00027 
00028 #ifndef __mlKernel_H
00029 #include "mlKernel.h"
00030 #endif
00031 
00032 #include <itkNeighborhood.h>
00033 #include <itkFlatStructuringElement.h>
00034 #include <itkNumericTraits.h>
00035 
00036 namespace itk {
00037 
00038 //----------------------------------------------------------------------------------
00041 //----------------------------------------------------------------------------------
00042 template<class TPixel, unsigned int VDimension = 2, class TAllocator = NeighborhoodAllocator<TPixel>, class SuperClss = Neighborhood<TPixel, VDimension, TAllocator > >
00043 class MLITKStructuringElementBase : public SuperClss
00044 {
00045 public:
00047   typedef MLITKStructuringElementBase Self;
00048 
00050   typedef Neighborhood<TPixel, VDimension, TAllocator> Superclass;
00051 
00053   typedef TAllocator AllocatorType;
00054 
00056   itkStaticConstMacro(NeighborhoodDimension, unsigned int, VDimension);
00057 
00059   typedef TPixel PixelType;
00060 
00064 
00065   typedef typename AllocatorType::iterator Iterator;
00066   typedef typename AllocatorType::const_iterator ConstIterator;
00068 
00070 
00071   typedef typename Superclass::SizeType SizeType;
00072   typedef typename Superclass::SizeValueType SizeValueType;
00074 
00076 
00077   typedef typename Superclass::OffsetType OffsetType;
00078   typedef typename OffsetType::OffsetValueType OffsetValueType;
00080 
00082   typedef typename Superclass::RadiusType RadiusType;
00083 
00085   typedef SliceIterator<TPixel, Self> SliceIteratorType;
00086 
00088   MLITKStructuringElementBase(){ }
00089 
00091   MLITKStructuringElementBase(const ML_NAMESPACE::Kernel &kernel)
00092   {
00093     // Initialize structure element from ML kernel.
00094     CreateStructuringElement(kernel);
00095   }
00096 
00098   virtual ~MLITKStructuringElementBase() {}
00099 
00101   MLITKStructuringElementBase(const Self& other)
00102     : SuperClss(other)
00103   {
00104   }
00105 
00107   Self &operator=(const Self& other)
00108   {
00109     Superclass::operator=(other);
00110     return *this;
00111   }
00112 
00114   virtual void setKernelFromString(const std::string &kernelStr)
00115   {
00116     // Create an ML kernel from from the passed string.
00117     ML_NAMESPACE::Kernel kernelFromStr;
00118     kernelFromStr.setKernel(kernelStr);
00119 
00120     // Initialize structure element from ML kernel.
00121     CreateStructuringElement(kernelFromStr);
00122   }
00123 
00125   virtual void CreateStructuringElement(const ML_NAMESPACE::Kernel &kernel)
00126   {
00127     // Reset size to be sure that previous settings are cleared.
00128     SizeType itkKExt;
00129     itkKExt.Fill(0);
00130     this->SetRadius(itkKExt);
00131 
00132     // Get extents of MK kernel.
00133     ML_NAMESPACE::ImageVector kExt = kernel.getExtent();
00134 
00135     // Get maximum extents of MK kernel.
00136     itkKExt = ML_NAMESPACE::ITKSizeFromMLVector<SizeType>(kExt);
00137     this->SetRadius(itkKExt);
00138 
00139     // Get half kernel extent. Note that we rely on odd kernel extents.
00140     ML_NAMESPACE::ImageVector shiftHalf(kernel.getNegativeExtent());
00141 
00142     // Scan all values of the ML kernel and set them in the itk kernel.
00143     ML_NAMESPACE::ImageVector pos(0);
00144     OffsetType offset;
00145     offset.Fill(0);
00146     for (unsigned int n=0; n < kernel.getTabSize(); n++){
00147       pos.set(kernel.getCoordTab()[n]);
00148       for (unsigned int i=0; i<offset.GetOffsetDimension(); i++){
00149         // ITK structure elements are symmetric to the origin. So shift
00150         // ML kernel element from (always positive) position half kernel left.
00151         offset[i] = pos[i]-shiftHalf[i];
00152       }
00153 
00154       // Set itk kernel element.
00155       (*this)[offset] = static_cast<TPixel>(kernel.getValueTab()[n]);
00156     }
00157   }
00158 };
00159 
00160 //----------------------------------------------------------------------------------
00164 //----------------------------------------------------------------------------------
00165 template<class TPixel, unsigned int VDimension = 2, class TAllocator = NeighborhoodAllocator<TPixel> >
00166 class MLITKStructuringElement : public MLITKStructuringElementBase<TPixel, VDimension, TAllocator, Neighborhood<TPixel, VDimension, TAllocator > >
00167 {
00168 public:
00170   typedef MLITKStructuringElement Self;
00171 
00173   typedef Neighborhood<TPixel, VDimension, TAllocator > NeighbourHoodClass;
00174 
00176   typedef MLITKStructuringElementBase<TPixel, VDimension, TAllocator, NeighbourHoodClass > Superclass;
00177 
00179   typedef TAllocator AllocatorType;
00180 
00182   itkStaticConstMacro(NeighborhoodDimension, unsigned int, VDimension);
00183 
00185   typedef TPixel PixelType;
00186 
00190 
00191   typedef typename AllocatorType::iterator Iterator;
00192   typedef typename AllocatorType::const_iterator ConstIterator;
00194 
00196 
00197   typedef typename Superclass::SizeType SizeType;
00198   typedef typename Superclass::SizeValueType SizeValueType;
00200 
00202 
00203   typedef typename Superclass::OffsetType OffsetType;
00204   typedef typename OffsetType::OffsetValueType OffsetValueType;
00206 
00208   typedef typename Superclass::RadiusType RadiusType;
00209 
00211   typedef SliceIterator<TPixel, Self> SliceIteratorType;
00212 
00214   MLITKStructuringElement() : Superclass() { }
00215 
00217   MLITKStructuringElement(const ML_NAMESPACE::Kernel &kernel) : Superclass(kernel){ }
00218 
00220   MLITKStructuringElement(const Self& other): Superclass(other){ }
00221 
00223   Self &operator=(const Self& other)
00224   {
00225     Superclass::operator=(other);
00226     return *this;
00227   }
00228 };
00229 
00230 } // namespace itk
00231 
00232 //--------------------------------------------------------------------------------
00235 //--------------------------------------------------------------------------------
00236 #define ML_ITK_KERNEL_WRAPPER_TYPEDEFS_0(CLASS_NAME, NAMESPACE)                 \
00237                                                                                 \
00238   /*--------------------------------------------------------------------*/      \
00239       \
00240   /*--------------------------------------------------------------------*/      \
00241   typedef itk::MLITKStructuringElement<ITK_INDATATYPE,DIM> MLITKKernelType;     \
00242                                                                                 \
00243   /*--------------------------------------------------------------------*/      \
00244       \
00245   /*--------------------------------------------------------------------*/      \
00246   typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS0, MLITKKernelType> FilterType; \
00247 
00248 
00249 //--------------------------------------------------------------------------------
00252 //--------------------------------------------------------------------------------
00253 #define ML_ITK_KERNEL_WRAPPER_TYPEDEFS_1(CLASS_NAME, NAMESPACE)                 \
00254                                                                                 \
00255   /*--------------------------------------------------------------------*/      \
00256       \
00257   /*--------------------------------------------------------------------*/      \
00258   typedef itk::MLITKStructuringElement<ITK_INDATATYPE,DIM> MLITKKernelType;     \
00259                                                                                 \
00260   /*--------------------------------------------------------------------*/      \
00261       \
00262   /*--------------------------------------------------------------------*/      \
00263   typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS1, MLITKKernelType> FilterType; \
00264 
00265 
00266 
00267 //--------------------------------------------------------------------------------
00270 //--------------------------------------------------------------------------------
00271 #define ML_ITK_FLAT_KERNEL_WRAPPER_TYPEDEFS_0(CLASS_NAME, NAMESPACE)                \
00272                                                                                     \
00273   /*--------------------------------------------------------------------*/          \
00274           \
00275   /*--------------------------------------------------------------------*/          \
00276   typedef itk::FlatStructuringElement<DIM> MLITKFLATKernelType;                     \
00277                                                                                     \
00278   /*--------------------------------------------------------------------*/          \
00279           \
00280   /*--------------------------------------------------------------------*/          \
00281   typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS0, MLITKFLATKernelType > FilterType; \
00282 
00283 
00284 //--------------------------------------------------------------------------------
00287 //--------------------------------------------------------------------------------
00288 #define ML_ITK_FLAT_KERNEL_WRAPPER_TYPEDEFS_1(CLASS_NAME, NAMESPACE)                \
00289                                                                                     \
00290   /*--------------------------------------------------------------------*/          \
00291           \
00292   /*--------------------------------------------------------------------*/          \
00293   typedef itk::FlatStructuringElement<DIM> MLITKFLATKernelType;                     \
00294                                                                                     \
00295   /*--------------------------------------------------------------------*/          \
00296           \
00297   /*--------------------------------------------------------------------*/          \
00298   typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS1, MLITKFLATKernelType > FilterType; \
00299 
00300 
00301 
00302 //--------------------------------------------------------------------------------
00306 //--------------------------------------------------------------------------------
00307 #define ML_ITK_KERNEL_WRAPPER_0_2D(PROJECT_PREFIX, CLASS_NAME, NAMESPACE) \
00308   _ML_ITK_WRAPPER(PROJECT_PREFIX, CLASS_NAME, NAMESPACE, _ML_ITK_DETERMINE_IN_REGION_N, \
00309                   ML_ITK_KERNEL_WRAPPER_TYPEDEFS_0, \
00310                   ML_IMPLEMENT_ALL_ITK_2D_CASES, _ML_ITK_DETERMINE_OUT_REGION_N)
00311 
00312 //--------------------------------------------------------------------------------
00316 //--------------------------------------------------------------------------------
00317 #define ML_ITK_KERNEL_WRAPPER_0_3D(PROJECT_PREFIX, CLASS_NAME, NAMESPACE) \
00318   _ML_ITK_WRAPPER(PROJECT_PREFIX, CLASS_NAME, NAMESPACE, _ML_ITK_DETERMINE_IN_REGION_N, \
00319                   ML_ITK_KERNEL_WRAPPER_TYPEDEFS_0, \
00320                   ML_IMPLEMENT_ALL_ITK_3D_CASES, _ML_ITK_DETERMINE_OUT_REGION_N)
00321 
00322 //--------------------------------------------------------------------------------
00325 //--------------------------------------------------------------------------------
00326 #define ML_ITK_KERNEL_WRAPPER_0_6D(PROJECT_PREFIX, CLASS_NAME, NAMESPACE) \
00327   _ML_ITK_WRAPPER(PROJECT_PREFIX, CLASS_NAME, NAMESPACE, _ML_ITK_DETERMINE_IN_REGION_N, \
00328                   ML_ITK_KERNEL_WRAPPER_TYPEDEFS_0, \
00329                   ML_IMPLEMENT_ALL_ITK_6D_CASES, _ML_ITK_DETERMINE_OUT_REGION_N)
00330 
00331 
00332 //--------------------------------------------------------------------------------
00336 //--------------------------------------------------------------------------------
00337 #define ML_ITK_KERNEL_WRAPPER_1_2D(PROJECT_PREFIX, CLASS_NAME, NAMESPACE) \
00338   _ML_ITK_WRAPPER(PROJECT_PREFIX, CLASS_NAME, NAMESPACE, _ML_ITK_DETERMINE_IN_REGION_N, \
00339                   ML_ITK_KERNEL_WRAPPER_TYPEDEFS_1, \
00340                   ML_IMPLEMENT_ALL_ITK_2D_CASES, _ML_ITK_DETERMINE_OUT_REGION_N)
00341 
00342 //--------------------------------------------------------------------------------
00346 //--------------------------------------------------------------------------------
00347 #define ML_ITK_KERNEL_WRAPPER_1_3D(PROJECT_PREFIX, CLASS_NAME, NAMESPACE) \
00348   _ML_ITK_WRAPPER(PROJECT_PREFIX, CLASS_NAME, NAMESPACE, _ML_ITK_DETERMINE_IN_REGION_N, \
00349                   ML_ITK_KERNEL_WRAPPER_TYPEDEFS_1, \
00350                   ML_IMPLEMENT_ALL_ITK_3D_CASES, _ML_ITK_DETERMINE_OUT_REGION_N)
00351 
00352 //--------------------------------------------------------------------------------
00355 //--------------------------------------------------------------------------------
00356 #define ML_ITK_KERNEL_WRAPPER_1_6D(PROJECT_PREFIX, CLASS_NAME, NAMESPACE) \
00357   _ML_ITK_WRAPPER(PROJECT_PREFIX, CLASS_NAME, NAMESPACE, _ML_ITK_DETERMINE_IN_REGION_N, \
00358                   ML_ITK_KERNEL_WRAPPER_TYPEDEFS_1, \
00359                   ML_IMPLEMENT_ALL_ITK_6D_CASES, _ML_ITK_DETERMINE_OUT_REGION_N)
00360 
00361 
00362 // For flat kernels:
00363 
00364 //--------------------------------------------------------------------------------
00368 //--------------------------------------------------------------------------------
00369 #define ML_ITK_FLAT_KERNEL_WRAPPER_0_2D(PROJECT_PREFIX, CLASS_NAME, NAMESPACE) \
00370   _ML_ITK_WRAPPER(PROJECT_PREFIX, CLASS_NAME, NAMESPACE, _ML_ITK_DETERMINE_IN_REGION_N, \
00371                   ML_ITK_FLAT_KERNEL_WRAPPER_TYPEDEFS_0, \
00372                   ML_IMPLEMENT_ALL_ITK_2D_CASES, _ML_ITK_DETERMINE_OUT_REGION_N)
00373 
00374 //--------------------------------------------------------------------------------
00378 //--------------------------------------------------------------------------------
00379 #define ML_ITK_FLAT_KERNEL_WRAPPER_0_3D(PROJECT_PREFIX, CLASS_NAME, NAMESPACE) \
00380   _ML_ITK_WRAPPER(PROJECT_PREFIX, CLASS_NAME, NAMESPACE, _ML_ITK_DETERMINE_IN_REGION_N, \
00381                   ML_ITK_FLAT_KERNEL_WRAPPER_TYPEDEFS_0, \
00382                   ML_IMPLEMENT_ALL_ITK_3D_CASES, _ML_ITK_DETERMINE_OUT_REGION_N)
00383 
00384 //--------------------------------------------------------------------------------
00387 //--------------------------------------------------------------------------------
00388 #define ML_ITK_FLAT_KERNEL_WRAPPER_0_6D(PROJECT_PREFIX, CLASS_NAME, NAMESPACE) \
00389   _ML_ITK_WRAPPER(PROJECT_PREFIX, CLASS_NAME, NAMESPACE, _ML_ITK_DETERMINE_IN_REGION_N, \
00390                   ML_ITK_FLAT_KERNEL_WRAPPER_TYPEDEFS_0, \
00391                   ML_IMPLEMENT_ALL_ITK_6D_CASES, _ML_ITK_DETERMINE_OUT_REGION_N)
00392 
00393 
00394 //--------------------------------------------------------------------------------
00398 //--------------------------------------------------------------------------------
00399 #define ML_ITK_FLAT_KERNEL_WRAPPER_1_2D(PROJECT_PREFIX, CLASS_NAME, NAMESPACE) \
00400   _ML_ITK_WRAPPER(PROJECT_PREFIX, CLASS_NAME, NAMESPACE, _ML_ITK_DETERMINE_IN_REGION_N, \
00401                   ML_ITK_FLAT_KERNEL_WRAPPER_TYPEDEFS_1, \
00402                   ML_IMPLEMENT_ALL_ITK_2D_CASES, _ML_ITK_DETERMINE_OUT_REGION_N)
00403 
00404 //--------------------------------------------------------------------------------
00408 //--------------------------------------------------------------------------------
00409 #define ML_ITK_FLAT_KERNEL_WRAPPER_1_3D(PROJECT_PREFIX, CLASS_NAME, NAMESPACE) \
00410   _ML_ITK_WRAPPER(PROJECT_PREFIX, CLASS_NAME, NAMESPACE, _ML_ITK_DETERMINE_IN_REGION_N, \
00411                   ML_ITK_FLAT_KERNEL_WRAPPER_TYPEDEFS_1, \
00412                   ML_IMPLEMENT_ALL_ITK_3D_CASES, _ML_ITK_DETERMINE_OUT_REGION_N)
00413 
00414 //--------------------------------------------------------------------------------
00417 //--------------------------------------------------------------------------------
00418 #define ML_ITK_FLAT_KERNEL_WRAPPER_1_6D(PROJECT_PREFIX, CLASS_NAME, NAMESPACE) \
00419   _ML_ITK_WRAPPER(PROJECT_PREFIX, CLASS_NAME, NAMESPACE, _ML_ITK_DETERMINE_IN_REGION_N, \
00420                   ML_ITK_FLAT_KERNEL_WRAPPER_TYPEDEFS_1, \
00421                   ML_IMPLEMENT_ALL_ITK_6D_CASES, _ML_ITK_DETERMINE_OUT_REGION_N)
00422 
00423 
00424 #endif // __MLITKKernelSupport_H
00425