14 #include <itkBinaryBallStructuringElement.h> 15 #include <itkBinaryCrossStructuringElement.h> 16 #include <itkBinaryDilateImageFilter.h> 17 #include <itkBinaryErodeImageFilter.h> 18 #include <itkBinaryFillholeImageFilter.h> 19 #include <itkBinaryMorphologicalClosingImageFilter.h> 20 #include <itkBinaryMorphologicalOpeningImageFilter.h> 32 auto timeSteps =
static_cast<int>(image->GetTimeSteps());
37 timeSelector->SetInput(image);
39 for (
int t = 0; t < timeSteps; ++t)
41 MITK_INFO <<
" Processing time step " << t;
43 timeSelector->SetTimeNr(t);
44 timeSelector->Update();
47 img3D->DisconnectPipeline();
49 AccessByItk_3(img3D, itkClosing, img3D, factor, structuralElement);
52 image->SetVolume(accessor.
GetData(), t);
57 AccessByItk_3(image, itkClosing, image, factor, structuralElement);
69 auto timeSteps =
static_cast<int>(image->GetTimeSteps());
74 timeSelector->SetInput(image);
76 for (
int t = 0; t < timeSteps; ++t)
78 MITK_INFO <<
" Processing time step " << t;
80 timeSelector->SetTimeNr(t);
81 timeSelector->Update();
84 img3D->DisconnectPipeline();
86 AccessByItk_3(img3D, itkErode, img3D, factor, structuralElement);
89 image->SetVolume(accessor.
GetData(), t);
94 AccessByItk_3(image, itkErode, image, factor, structuralElement);
106 auto timeSteps =
static_cast<int>(image->GetTimeSteps());
111 timeSelector->SetInput(image);
113 for (
int t = 0; t < timeSteps; ++t)
115 MITK_INFO <<
" Processing time step " << t;
117 timeSelector->SetTimeNr(t);
118 timeSelector->Update();
121 img3D->DisconnectPipeline();
123 AccessByItk_3(img3D, itkDilate, img3D, factor, structuralElement);
126 image->SetVolume(accessor.
GetData(), t);
131 AccessByItk_3(image, itkDilate, image, factor, structuralElement);
143 auto timeSteps =
static_cast<int>(image->GetTimeSteps());
148 timeSelector->SetInput(image);
150 for (
int t = 0; t < timeSteps; ++t)
152 MITK_INFO <<
" Processing time step " << t;
154 timeSelector->SetTimeNr(t);
155 timeSelector->Update();
158 img3D->DisconnectPipeline();
160 AccessByItk_3(img3D, itkOpening, img3D, factor, structuralElement);
163 image->SetVolume(accessor.
GetData(), t);
168 AccessByItk_3(image, itkOpening, image, factor, structuralElement);
178 auto timeSteps =
static_cast<int>(image->GetTimeSteps());
183 timeSelector->SetInput(image);
185 for (
int t = 0; t < timeSteps; ++t)
187 MITK_INFO <<
" Processing time step " << t;
189 timeSelector->SetTimeNr(t);
190 timeSelector->Update();
193 img3D->DisconnectPipeline();
198 image->SetVolume(accessor.
GetData(), t);
209 template <
typename TPixel,
unsigned int VDimension>
210 void mitk::MorphologicalOperations::itkClosing(
211 itk::Image<TPixel, VDimension> *sourceImage,
216 typedef itk::Image<TPixel, VDimension>
ImageType;
217 typedef itk::BinaryBallStructuringElement<TPixel, VDimension> BallType;
218 typedef itk::BinaryCrossStructuringElement<TPixel, VDimension> CrossType;
219 typedef typename itk::BinaryMorphologicalClosingImageFilter<ImageType, ImageType, BallType> BallClosingFilterType;
220 typedef typename itk::BinaryMorphologicalClosingImageFilter<ImageType, ImageType, CrossType> CrossClosingFilterType;
224 BallType ball = CreateStructuringElement<BallType>(structuralElementFlags, factor);
226 typename BallClosingFilterType::Pointer closingFilter = BallClosingFilterType::New();
227 closingFilter->SetKernel(ball);
228 closingFilter->SetInput(sourceImage);
229 closingFilter->SetForegroundValue(1);
230 closingFilter->UpdateLargestPossibleRegion();
236 CrossType cross = CreateStructuringElement<CrossType>(structuralElementFlags, factor);
238 typename CrossClosingFilterType::Pointer closingFilter = CrossClosingFilterType::New();
239 closingFilter->SetKernel(cross);
240 closingFilter->SetInput(sourceImage);
241 closingFilter->SetForegroundValue(1);
242 closingFilter->UpdateLargestPossibleRegion();
248 template <
typename TPixel,
unsigned int VDimension>
249 void mitk::MorphologicalOperations::itkErode(
250 itk::Image<TPixel, VDimension> *sourceImage,
255 typedef itk::Image<TPixel, VDimension>
ImageType;
256 typedef itk::BinaryBallStructuringElement<TPixel, VDimension> BallType;
257 typedef itk::BinaryCrossStructuringElement<TPixel, VDimension> CrossType;
258 typedef typename itk::BinaryErodeImageFilter<ImageType, ImageType, BallType> BallErodeFilterType;
259 typedef typename itk::BinaryErodeImageFilter<ImageType, ImageType, CrossType> CrossErodeFilterType;
263 BallType ball = CreateStructuringElement<BallType>(structuralElementFlags, factor);
265 typename BallErodeFilterType::Pointer erodeFilter = BallErodeFilterType::New();
266 erodeFilter->SetKernel(ball);
267 erodeFilter->SetInput(sourceImage);
268 erodeFilter->SetErodeValue(1);
269 erodeFilter->UpdateLargestPossibleRegion();
275 CrossType cross = CreateStructuringElement<CrossType>(structuralElementFlags, factor);
277 typename CrossErodeFilterType::Pointer erodeFilter = CrossErodeFilterType::New();
278 erodeFilter->SetKernel(cross);
279 erodeFilter->SetInput(sourceImage);
280 erodeFilter->SetErodeValue(1);
281 erodeFilter->UpdateLargestPossibleRegion();
287 template <
typename TPixel,
unsigned int VDimension>
288 void mitk::MorphologicalOperations::itkDilate(
289 itk::Image<TPixel, VDimension> *sourceImage,
294 typedef itk::Image<TPixel, VDimension>
ImageType;
295 typedef itk::BinaryBallStructuringElement<TPixel, VDimension> BallType;
296 typedef itk::BinaryCrossStructuringElement<TPixel, VDimension> CrossType;
297 typedef typename itk::BinaryDilateImageFilter<ImageType, ImageType, BallType> BallDilateFilterType;
298 typedef typename itk::BinaryDilateImageFilter<ImageType, ImageType, CrossType> CrossDilateFilterType;
302 BallType ball = CreateStructuringElement<BallType>(structuralElementFlags, factor);
304 typename BallDilateFilterType::Pointer dilateFilter = BallDilateFilterType::New();
305 dilateFilter->SetKernel(ball);
306 dilateFilter->SetInput(sourceImage);
307 dilateFilter->SetDilateValue(1);
308 dilateFilter->UpdateLargestPossibleRegion();
314 CrossType cross = CreateStructuringElement<CrossType>(structuralElementFlags, factor);
316 typename CrossDilateFilterType::Pointer dilateFilter = CrossDilateFilterType::New();
317 dilateFilter->SetKernel(cross);
318 dilateFilter->SetInput(sourceImage);
319 dilateFilter->SetDilateValue(1);
320 dilateFilter->UpdateLargestPossibleRegion();
326 template <
typename TPixel,
unsigned int VDimension>
327 void mitk::MorphologicalOperations::itkOpening(
328 itk::Image<TPixel, VDimension> *sourceImage,
333 typedef itk::Image<TPixel, VDimension>
ImageType;
334 typedef itk::BinaryBallStructuringElement<TPixel, VDimension> BallType;
335 typedef itk::BinaryCrossStructuringElement<TPixel, VDimension> CrossType;
336 typedef typename itk::BinaryMorphologicalOpeningImageFilter<ImageType, ImageType, BallType> BallOpeningFiltertype;
337 typedef typename itk::BinaryMorphologicalOpeningImageFilter<ImageType, ImageType, CrossType> CrossOpeningFiltertype;
341 BallType ball = CreateStructuringElement<BallType>(structuralElementFlags, factor);
343 typename BallOpeningFiltertype::Pointer openingFilter = BallOpeningFiltertype::New();
344 openingFilter->SetKernel(ball);
345 openingFilter->SetInput(sourceImage);
346 openingFilter->SetForegroundValue(1);
347 openingFilter->SetBackgroundValue(0);
348 openingFilter->UpdateLargestPossibleRegion();
354 CrossType cross = CreateStructuringElement<CrossType>(structuralElementFlags, factor);
356 typename CrossOpeningFiltertype::Pointer openingFilter = CrossOpeningFiltertype::New();
357 openingFilter->SetKernel(cross);
358 openingFilter->SetInput(sourceImage);
359 openingFilter->SetForegroundValue(1);
360 openingFilter->SetBackgroundValue(0);
361 openingFilter->UpdateLargestPossibleRegion();
367 template <
typename TPixel,
unsigned int VDimension>
368 void mitk::MorphologicalOperations::itkFillHoles(itk::Image<TPixel, VDimension> *sourceImage,
371 typedef itk::Image<TPixel, VDimension>
ImageType;
372 typedef typename itk::BinaryFillholeImageFilter<ImageType> FillHoleFilterType;
374 typename FillHoleFilterType::Pointer fillHoleFilter = FillHoleFilterType::New();
375 fillHoleFilter->SetInput(sourceImage);
376 fillHoleFilter->SetForegroundValue(1);
377 fillHoleFilter->UpdateLargestPossibleRegion();
382 template <
class TStructuringElement>
383 TStructuringElement mitk::MorphologicalOperations::CreateStructuringElement(
StructuralElementType structuralElementFlag,
int factor)
385 TStructuringElement strElem;
386 typename TStructuringElement::SizeType size;
388 switch (structuralElementFlag)
392 size.SetElement(0, factor);
393 size.SetElement(1, factor);
397 size.SetElement(0, factor);
398 size.SetElement(2, factor);
402 size.SetElement(1, factor);
403 size.SetElement(2, factor);
411 strElem.SetRadius(size);
412 strElem.CreateStructuringElement();
#define AccessByItk_3(mitkImage, itkImageTypeFunction, arg1, arg2, arg3)
itk::Image< unsigned char, 3 > ImageType
#define AccessByItk_1(mitkImage, itkImageTypeFunction, arg1)
static void Closing(mitk::Image::Pointer &image, int factor, StructuralElementType structuralElement)
Perform morphological operation on 2D, 3D or 3D+t segmentation.
mitk::Image::Pointer image
static void Opening(mitk::Image::Pointer &image, int factor, StructuralElementType structuralElement)
Perform morphological operation on 2D, 3D or 3D+t segmentation.
void CastToMitkImage(const itk::SmartPointer< ItkOutputImageType > &itkimage, itk::SmartPointer< mitk::Image > &mitkoutputimage)
Cast an itk::Image (with a specific type) to an mitk::Image.
ImageReadAccessor class to get locked read access for a particular image part.
static void Dilate(mitk::Image::Pointer &image, int factor, StructuralElementType structuralElement)
Perform morphological operation on 2D, 3D or 3D+t segmentation.
const void * GetData() const
Gives const access to the data.
static void FillHoles(mitk::Image::Pointer &image)
Perform morphological operation on 2D, 3D or 3D+t segmentation.
static void Erode(mitk::Image::Pointer &image, int factor, StructuralElementType structuralElement)
Perform morphological operation on 2D, 3D or 3D+t segmentation.