MeVisLabToolboxReference
|
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