Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
Step6RegionGrowing.txx
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 #include "Step6.h"
13 
14 #include <mitkPointSet.h>
15 #include <mitkProperties.h>
16 
17 #include <itkConnectedThresholdImageFilter.h>
18 #include <itkCurvatureFlowImageFilter.h>
19 
20 #include <mitkImageAccessByItk.h>
21 #include <mitkImageCast.h>
22 #include <mitkLevelWindowProperty.h>
23 
24 template <typename TPixel, unsigned int VImageDimension>
25 void RegionGrowing(itk::Image<TPixel, VImageDimension> *itkImage, Step6 *step6)
26 {
27  typedef itk::Image<TPixel, VImageDimension> ImageType;
28 
29  typedef float InternalPixelType;
30  typedef itk::Image<InternalPixelType, VImageDimension> InternalImageType;
31 
32  mitk::BaseGeometry *geometry = step6->m_FirstImage->GetGeometry();
33 
34  // create itk::CurvatureFlowImageFilter for smoothing and set itkImage as input
35  typedef itk::CurvatureFlowImageFilter<ImageType, InternalImageType> CurvatureFlowFilter;
36  typename CurvatureFlowFilter::Pointer smoothingFilter = CurvatureFlowFilter::New();
37 
38  smoothingFilter->SetInput(itkImage);
39  smoothingFilter->SetNumberOfIterations(4);
40  smoothingFilter->SetTimeStep(0.0625);
41 
42  // create itk::ConnectedThresholdImageFilter and set filtered image as input
43  typedef itk::ConnectedThresholdImageFilter<InternalImageType, ImageType> RegionGrowingFilterType;
44  typedef typename RegionGrowingFilterType::IndexType IndexType;
45  typename RegionGrowingFilterType::Pointer regGrowFilter = RegionGrowingFilterType::New();
46 
47  regGrowFilter->SetInput(smoothingFilter->GetOutput());
48  regGrowFilter->SetLower(step6->GetThresholdMin());
49  regGrowFilter->SetUpper(step6->GetThresholdMax());
50 
51  // convert the points in the PointSet m_Seeds (in world-coordinates) to
52  // "index" values, i.e. points in pixel coordinates, and add these as seeds
53  // to the RegionGrower
54  mitk::PointSet::PointsConstIterator pit, pend = step6->m_Seeds->GetPointSet()->GetPoints()->End();
55  IndexType seedIndex;
56  for (pit = step6->m_Seeds->GetPointSet()->GetPoints()->Begin(); pit != pend; ++pit)
57  {
58  geometry->WorldToIndex(pit.Value(), seedIndex);
59  regGrowFilter->AddSeed(seedIndex);
60  }
61 
62  regGrowFilter->GetOutput()->Update();
63  mitk::Image::Pointer mitkImage = mitk::Image::New();
64  mitk::CastToMitkImage(regGrowFilter->GetOutput(), mitkImage);
65 
66  if (step6->m_ResultNode.IsNull())
67  {
68  step6->m_ResultNode = mitk::DataNode::New();
69  step6->m_DataStorage->Add(step6->m_ResultNode);
70  }
71  step6->m_ResultNode->SetData(mitkImage);
72  // set some additional properties
73  step6->m_ResultNode->SetProperty("name", mitk::StringProperty::New("segmentation"));
74  step6->m_ResultNode->SetProperty("binary", mitk::BoolProperty::New(true));
75  step6->m_ResultNode->SetProperty("color", mitk::ColorProperty::New(1.0, 0.0, 0.0));
76  step6->m_ResultNode->SetProperty("volumerendering", mitk::BoolProperty::New(true));
77  step6->m_ResultNode->SetProperty("layer", mitk::IntProperty::New(1));
78  mitk::LevelWindowProperty::Pointer levWinProp = mitk::LevelWindowProperty::New();
79  mitk::LevelWindow levelwindow;
80  levelwindow.SetAuto(mitkImage);
81  levWinProp->SetLevelWindow(levelwindow);
82  step6->m_ResultNode->SetProperty("levelwindow", levWinProp);
83 
84  step6->m_ResultImage = static_cast<mitk::Image *>(step6->m_ResultNode->GetData());
85 } //RegionGrowing()
86 
87 /**
88 \example Step6RegionGrowing.txx
89 */