13 #ifndef MITKMASKUTIL_CPP 14 #define MITKMASKUTIL_CPP 19 #include <itkExtractImageFilter.h> 20 #include <itkChangeInformationImageFilter.h> 25 template <
class TPixel,
unsigned int VImageDimension>
34 template <
class TPixel,
unsigned int VImageDimension>
43 template <
class TPixel,
unsigned int VImageDimension>
46 if (m_Mask==
nullptr || m_Image==
nullptr)
51 typedef itk::Image< TPixel, VImageDimension >
ImageType;
52 typedef typename ImageType::PointType PointType;
53 typedef typename ImageType::DirectionType DirectionType;
55 bool maskSanity =
true;
60 MITK_ERROR <<
"Something went wrong when casting the mitk mask image to an itk mask image. Do the mask and the input image have the same dimension?";
64 DirectionType imageDirection = m_Image->GetDirection();
65 DirectionType maskDirection = m_Mask->GetDirection();
66 for(
unsigned int i = 0; i < imageDirection.ColumnDimensions; ++i )
68 for(
unsigned int j = 0; j < imageDirection.ColumnDimensions; ++j )
70 double differenceDirection = imageDirection[i][j] - maskDirection[i][j];
71 if ( fabs( differenceDirection ) >
mitk::eps )
73 double differenceDirection = imageDirection[i][j] - maskDirection[i][j];
74 if ( fabs( differenceDirection ) > 0.001 )
77 MITK_INFO <<
"Mask needs to have same direction as image! (Image direction: " << imageDirection <<
"; Mask direction: " << maskDirection <<
")";
84 PointType imageSpacing = m_Image->GetSpacing();
85 PointType maskSpacing = m_Mask->GetSpacing();
86 for (
unsigned int i = 0; i < VImageDimension; i++)
88 if ( fabs( maskSpacing[i] - imageSpacing[i] ) >
mitk::eps )
91 MITK_INFO <<
"Spacing of mask and image is not equal. Mask: " << maskSpacing <<
" image: " << imageSpacing;
97 PointType imageOrigin = m_Image->GetOrigin();
98 PointType maskOrigin = m_Mask->GetOrigin();
100 typedef itk::ContinuousIndex<double, VImageDimension> ContinousIndexType;
101 ContinousIndexType maskOriginContinousIndex, imageOriginContinousIndex;
103 m_Image->TransformPhysicalPointToContinuousIndex(maskOrigin, maskOriginContinousIndex);
104 m_Image->TransformPhysicalPointToContinuousIndex(imageOrigin, imageOriginContinousIndex);
106 for (
unsigned int i = 0; i < ImageType::ImageDimension; ++i )
108 double misalignment = maskOriginContinousIndex[i] - floor( maskOriginContinousIndex[i] + 0.5 );
110 if ( fmod(misalignment,imageSpacing[i]) >
mitk::eps )
113 MITK_INFO <<
"Pixels/voxels of mask and image are not sufficiently aligned! (Misalignment: " << fmod(misalignment,imageSpacing[i]) <<
")";
119 if ( m_Mask!=
nullptr &&
120 !m_Image->GetLargestPossibleRegion().IsInside( m_Mask->GetLargestPossibleRegion() ) )
123 MITK_INFO <<
"Mask region needs to be inside of image region! (Image region: " 124 << m_Image->GetLargestPossibleRegion() <<
"; Mask region: " << m_Mask->GetLargestPossibleRegion() <<
")";
129 template <
class TPixel,
unsigned int VImageDimension>
132 if (m_Mask==
nullptr || m_Image==
nullptr)
134 MITK_ERROR <<
"Set an image and a mask first";
137 bool maskSanity = CheckMaskSanity();
141 MITK_ERROR <<
"Mask and image are not compatible";
144 typedef itk::Image< TPixel, VImageDimension >
ImageType;
145 typedef itk::Image< unsigned short, VImageDimension >
MaskType;
146 typedef itk::ExtractImageFilter< ImageType, ImageType > ExtractImageFilterType;
148 typename ImageType::SizeType imageSize = m_Image->GetBufferedRegion().GetSize();
149 typename ImageType::SizeType maskSize = m_Mask->GetBufferedRegion().GetSize();
151 typename itk::Image<TPixel, VImageDimension>::Pointer extractedImg = itk::Image<TPixel, VImageDimension>::New();
153 bool maskSmallerImage =
false;
154 for (
unsigned int i = 0; i < ImageType::ImageDimension; ++i )
156 if ( maskSize[i] < imageSize[i] )
158 maskSmallerImage =
true;
162 if ( maskSmallerImage )
164 typename ExtractImageFilterType::Pointer extractImageFilter = ExtractImageFilterType::New();
165 typename MaskType::PointType maskOrigin = m_Mask->GetOrigin();
166 typename ImageType::PointType imageOrigin = m_Image->GetOrigin();
167 typename MaskType::SpacingType maskSpacing = m_Mask->GetSpacing();
168 typename ImageType::RegionType extractionRegion;
169 typename ImageType::IndexType extractionRegionIndex;
172 for (
unsigned int i=0; i < maskOrigin.GetPointDimension(); i++)
174 extractionRegionIndex[i] = (maskOrigin[i] - imageOrigin[i]) / maskSpacing[i];
177 extractionRegion.SetIndex(extractionRegionIndex);
178 extractionRegion.SetSize(m_Mask->GetLargestPossibleRegion().GetSize());
180 extractImageFilter->SetInput( m_Image );
181 extractImageFilter->SetExtractionRegion( extractionRegion );
182 extractImageFilter->SetCoordinateTolerance( 0.001 );
183 extractImageFilter->SetDirectionTolerance( 0.001 );
184 extractImageFilter->Update();
185 extractedImg = extractImageFilter->GetOutput();
186 extractedImg->SetOrigin(m_Mask->GetOrigin());
187 extractedImg->SetLargestPossibleRegion(m_Mask->GetLargestPossibleRegion());
188 extractedImg->SetBufferedRegion(m_Mask->GetBufferedRegion());
193 extractedImg = m_Image;
itk::Image< unsigned char, 3 > ImageType
itk::Image< TPixel, VImageDimension >::Pointer ExtractMaskImageRegion()
Crops the image to the LargestPossibleRegion of the mask.
DataCollection - Class to facilitate loading/accessing structured data.
bool CheckMaskSanity()
Checks whether mask and image are compatible for joint access (as via iterators). Spacing and directi...
void SetImage(ImageType *image)
Set image.
mitk::Image::Pointer image
itk::Image< unsigned short, VImageDimension > MaskType
itk::Image< TPixel, VImageDimension > ImageType
void SetMask(MaskType *mask)
Set mask.
MITKCORE_EXPORT const ScalarType eps
mitk::Image::Pointer mask