1 /*============================================================================
3 The Medical Imaging Interaction Toolkit (MITK)
5 Copyright (c) German Cancer Research Center (DKFZ)
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
11 ============================================================================*/
14 #include <mitkPointSet.h>
15 #include <mitkProperties.h>
17 #include <itkConnectedThresholdImageFilter.h>
18 #include <itkCurvatureFlowImageFilter.h>
20 #include <mitkImageAccessByItk.h>
21 #include <mitkImageCast.h>
22 #include <mitkLevelWindowProperty.h>
24 template <typename TPixel, unsigned int VImageDimension>
25 void RegionGrowing(itk::Image<TPixel, VImageDimension> *itkImage, Step6 *step6)
27 typedef itk::Image<TPixel, VImageDimension> ImageType;
29 typedef float InternalPixelType;
30 typedef itk::Image<InternalPixelType, VImageDimension> InternalImageType;
32 mitk::BaseGeometry *geometry = step6->m_FirstImage->GetGeometry();
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();
38 smoothingFilter->SetInput(itkImage);
39 smoothingFilter->SetNumberOfIterations(4);
40 smoothingFilter->SetTimeStep(0.0625);
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();
47 regGrowFilter->SetInput(smoothingFilter->GetOutput());
48 regGrowFilter->SetLower(step6->GetThresholdMin());
49 regGrowFilter->SetUpper(step6->GetThresholdMax());
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();
56 for (pit = step6->m_Seeds->GetPointSet()->GetPoints()->Begin(); pit != pend; ++pit)
58 geometry->WorldToIndex(pit.Value(), seedIndex);
59 regGrowFilter->AddSeed(seedIndex);
62 regGrowFilter->GetOutput()->Update();
63 mitk::Image::Pointer mitkImage = mitk::Image::New();
64 mitk::CastToMitkImage(regGrowFilter->GetOutput(), mitkImage);
66 if (step6->m_ResultNode.IsNull())
68 step6->m_ResultNode = mitk::DataNode::New();
69 step6->m_DataStorage->Add(step6->m_ResultNode);
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);
84 step6->m_ResultImage = static_cast<mitk::Image *>(step6->m_ResultNode->GetData());
88 \example Step6RegionGrowing.txx