00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef mitkCompareImageSliceTestHelperhincluded
00019 #define mitkCompareImageSliceTestHelperhincluded
00020
00021
00022 #include "mitkImageCast.h"
00023 #include <itkImageSliceConstIteratorWithIndex.h>
00024 #include <itkImageRegionConstIterator.h>
00025
00026
00027
00028 #define myMITKOverwriteSliceImageFilterAccessByItk(mitkImage, itkImageTypeFunction, pixeltype, dimension, itkimage2) \
00029 if ( typeId == typeid(pixeltype) ) \
00030 { \
00031 typedef itk::Image<pixeltype, dimension> ImageType; \
00032 typedef mitk::ImageToItk<ImageType> ImageToItkType; \
00033 itk::SmartPointer<ImageToItkType> imagetoitk = ImageToItkType::New(); \
00034 imagetoitk->SetInput(mitkImage); \
00035 imagetoitk->Update(); \
00036 itkImageTypeFunction(imagetoitk->GetOutput(), itkimage2); \
00037 }
00038
00039 #define myMITKOverwriteSliceImageFilterAccessAllTypesByItk(mitkImage, itkImageTypeFunction, dimension, itkimage2) \
00040 { \
00041 myMITKOverwriteSliceImageFilterAccessByItk(mitkImage, itkImageTypeFunction, double, dimension, itkimage2) else \
00042 myMITKOverwriteSliceImageFilterAccessByItk(mitkImage, itkImageTypeFunction, float, dimension, itkimage2) else \
00043 myMITKOverwriteSliceImageFilterAccessByItk(mitkImage, itkImageTypeFunction, int, dimension, itkimage2) else \
00044 myMITKOverwriteSliceImageFilterAccessByItk(mitkImage, itkImageTypeFunction, unsigned int, dimension, itkimage2) else \
00045 myMITKOverwriteSliceImageFilterAccessByItk(mitkImage, itkImageTypeFunction, short, dimension, itkimage2) else \
00046 myMITKOverwriteSliceImageFilterAccessByItk(mitkImage, itkImageTypeFunction, unsigned short, dimension, itkimage2) else \
00047 myMITKOverwriteSliceImageFilterAccessByItk(mitkImage, itkImageTypeFunction, char, dimension, itkimage2) else \
00048 myMITKOverwriteSliceImageFilterAccessByItk(mitkImage, itkImageTypeFunction, unsigned char, dimension, itkimage2) \
00049 }
00050
00051
00052 class CompareImageSliceTestHelper
00053 {
00054 private:
00055
00056
00057 static unsigned int m_Dimension0;
00058 static unsigned int m_Dimension1;
00059 static unsigned int m_SliceDimension;
00060 static unsigned int m_SliceIndex;
00061 static bool m_ComparisonResult;
00062 static mitk::Image* m_SliceImage;
00063
00064 public:
00065
00066 template<typename TPixel1, unsigned int VImageDimension1, typename TPixel2, unsigned int VImageDimension2>
00067 static void ItkImageCompare( itk::Image<TPixel1,VImageDimension1>* inputImage, itk::Image<TPixel2,VImageDimension2>* outputImage )
00068 {
00069 m_ComparisonResult = false;
00070
00071 typedef itk::Image<TPixel1, VImageDimension1> SliceImageType;
00072 typedef itk::Image<TPixel2, VImageDimension2> VolumeImageType;
00073
00074 typedef itk::ImageSliceConstIteratorWithIndex< VolumeImageType > OutputSliceIteratorType;
00075 typedef itk::ImageRegionConstIterator< SliceImageType > InputSliceIteratorType;
00076
00077 typename VolumeImageType::RegionType sliceInVolumeRegion;
00078
00079 sliceInVolumeRegion = outputImage->GetLargestPossibleRegion();
00080 sliceInVolumeRegion.SetSize( m_SliceDimension, 1 );
00081 sliceInVolumeRegion.SetIndex( m_SliceDimension, m_SliceIndex );
00082
00083 OutputSliceIteratorType outputIterator( outputImage, sliceInVolumeRegion );
00084 outputIterator.SetFirstDirection(m_Dimension0);
00085 outputIterator.SetSecondDirection(m_Dimension1);
00086
00087 InputSliceIteratorType inputIterator( inputImage, inputImage->GetLargestPossibleRegion() );
00088
00089
00090 outputIterator.GoToBegin();
00091 inputIterator.GoToBegin();
00092 while ( !outputIterator.IsAtEnd() )
00093 {
00094 while ( !outputIterator.IsAtEndOfSlice() )
00095 {
00096 while ( !outputIterator.IsAtEndOfLine() )
00097 {
00098 m_ComparisonResult = outputIterator.Get() == (TPixel2) inputIterator.Get();
00099 if (!m_ComparisonResult) return;
00100 ++outputIterator;
00101 ++inputIterator;
00102 }
00103 outputIterator.NextLine();
00104 }
00105 outputIterator.NextSlice();
00106 }
00107 }
00108
00109 template<typename TPixel, unsigned int VImageDimension>
00110 static void ItkImageSwitch( itk::Image<TPixel,VImageDimension>* itkImage )
00111 {
00112 const std::type_info& typeId=*(m_SliceImage->GetPixelType().GetTypeId());
00113
00114 myMITKOverwriteSliceImageFilterAccessAllTypesByItk( m_SliceImage, ItkImageCompare, 2, itkImage );
00115 }
00116
00117
00118 static bool CompareSlice( mitk::Image* image, unsigned int sliceDimension, unsigned int sliceIndex, mitk::Image* slice )
00119 {
00120 if ( !image || ! slice ) return false;
00121
00122 switch (sliceDimension)
00123 {
00124 default:
00125 case 2:
00126 m_Dimension0 = 0;
00127 m_Dimension1 = 1;
00128 break;
00129 case 1:
00130 m_Dimension0 = 0;
00131 m_Dimension1 = 2;
00132 break;
00133 case 0:
00134 m_Dimension0 = 1;
00135 m_Dimension1 = 2;
00136 break;
00137 }
00138
00139 if ( slice->GetDimension() != 2 || image->GetDimension() != 3 ||
00140 slice->GetDimension(0) != image->GetDimension(m_Dimension0) ||
00141 slice->GetDimension(1) != image->GetDimension(m_Dimension1) )
00142 {
00143 std::cerr << "Slice and image dimensions differ. Sorry, cannot work like this." << std::endl;
00144 return false;
00145 }
00146
00147
00148 m_SliceImage = slice;
00149 m_SliceIndex = sliceIndex;
00150 m_SliceDimension = sliceDimension;
00151 m_ComparisonResult = false;
00152 AccessFixedDimensionByItk( image, ItkImageSwitch, 3 );
00153
00154 return m_ComparisonResult;
00155 }
00156
00157 };
00158
00159
00160
00161 #endif