diff --git a/Modules/ContourModel/Algorithms/mitkImageToContourModelFilter.cpp b/Modules/ContourModel/Algorithms/mitkImageToContourModelFilter.cpp index 5468ca98c7..b780fab934 100644 --- a/Modules/ContourModel/Algorithms/mitkImageToContourModelFilter.cpp +++ b/Modules/ContourModel/Algorithms/mitkImageToContourModelFilter.cpp @@ -1,76 +1,142 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkImageToContourModelFilter.h" +#include "mitkImageAccessByItk.h" + +#include mitk::ImageToContourModelFilter::ImageToContourModelFilter() + : m_SliceGeometry(0) { } mitk::ImageToContourModelFilter::~ImageToContourModelFilter() { } void mitk::ImageToContourModelFilter::SetInput ( const mitk::ImageToContourModelFilter::InputType* input ) { this->SetInput( 0, input ); } void mitk::ImageToContourModelFilter::SetInput ( unsigned int idx, const mitk::ImageToContourModelFilter::InputType* input ) { if ( idx + 1 > this->GetNumberOfInputs() ) { this->SetNumberOfRequiredInputs(idx + 1); } if ( input != static_cast ( this->ProcessObject::GetInput ( idx ) ) ) { this->ProcessObject::SetNthInput ( idx, const_cast ( input ) ); this->Modified(); } } const mitk::ImageToContourModelFilter::InputType* mitk::ImageToContourModelFilter::GetInput( void ) { if (this->GetNumberOfInputs() < 1) return NULL; return static_cast(this->ProcessObject::GetInput(0)); } const mitk::ImageToContourModelFilter::InputType* mitk::ImageToContourModelFilter::GetInput( unsigned int idx ) { if (this->GetNumberOfInputs() < 1) return NULL; return static_cast(this->ProcessObject::GetInput(idx)); } void mitk::ImageToContourModelFilter::GenerateData() { + mitk::Image::ConstPointer sliceImage = this->GetInput(); + + if ( !sliceImage ) + { + MITK_ERROR << "mitk::ImageToContourModelFilter: No input available. Please set the input!" << std::endl; + itkExceptionMacro("mitk::ImageToContourModelFilter: No input available. Please set the input!"); + return; + } + + if ( sliceImage->GetDimension() > 2 || sliceImage->GetDimension() < 2) + { + MITK_ERROR << "mitk::ImageToContourModelFilter::GenerateData() works only with 2D images. Please assure that your input image is 2D!" << std::endl; + itkExceptionMacro("mitk::ImageToContourModelFilter::GenerateData() works only with 2D images. Please assure that your input image is 2D!"); + return; + } + + m_SliceGeometry = sliceImage->GetGeometry(); + + AccessFixedDimensionByItk(sliceImage, Itk2DContourExtraction, 2); +} + +template +void mitk::ImageToContourModelFilter::Itk2DContourExtraction (itk::Image* sliceImage) +{ + typedef itk::Image ImageType; + typedef itk::ContourExtractor2DImageFilter ContourExtractor; + + typedef itk::PolyLineParametricPath<2> PolyLineParametricPath2D; + typedef PolyLineParametricPath2D::VertexListType ContourPath; + + typename ContourExtractor::Pointer contourExtractor = ContourExtractor::New(); + contourExtractor->SetInput(sliceImage); + contourExtractor->SetContourValue(0.5); + + contourExtractor->Update(); + + unsigned int foundPaths = contourExtractor->GetNumberOfOutputs(); + this->SetNumberOfIndexedOutputs(foundPaths); + + for (unsigned int i = 0; i < foundPaths; i++) + { + const ContourPath* currentPath = contourExtractor->GetOutput(i)->GetVertexList(); + + mitk::Point3D currentPoint; + mitk::Point3D currentWorldPoint; + + mitk::ContourModel::Pointer contour = this->GetOutput(i); + + for (unsigned int j = 0; j < currentPath->Size(); j++) + { + + currentPoint[0] = currentPath->ElementAt(j)[0]; + currentPoint[1] = currentPath->ElementAt(j)[1]; + currentPoint[2] = 0; + + m_SliceGeometry->IndexToWorld(currentPoint, currentWorldPoint); + + contour->AddVertex(currentWorldPoint); + }//for2 + + contour->Close(); + }//for1 } diff --git a/Modules/ContourModel/Algorithms/mitkImageToContourModelFilter.h b/Modules/ContourModel/Algorithms/mitkImageToContourModelFilter.h index 0c6f66c1b3..d8bb7fbb83 100644 --- a/Modules/ContourModel/Algorithms/mitkImageToContourModelFilter.h +++ b/Modules/ContourModel/Algorithms/mitkImageToContourModelFilter.h @@ -1,69 +1,75 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _mitkImageToContourModelFilter_h__ #define _mitkImageToContourModelFilter_h__ #include "mitkCommon.h" #include #include "mitkContourModel.h" #include "mitkContourModelSource.h" #include namespace mitk { /** * * \brief Base class for all filters with mitk::Image as input and mitk::ContourModel * * \ingroup ContourModelFilters * \ingroup Process */ class MitkContourModel_EXPORT ImageToContourModelFilter : public ContourModelSource { public: mitkClassMacro(ImageToContourModelFilter, ContourModelSource); itkFactorylessNewMacro(Self) itkCloneMacro(Self) typedef mitk::Image InputType; using Superclass::SetInput; virtual void SetInput( const InputType *input); virtual void SetInput( unsigned int idx, const InputType * input); const InputType* GetInput(void); const InputType* GetInput(unsigned int idx); protected: ImageToContourModelFilter(); virtual ~ImageToContourModelFilter(); void GenerateData(); + template + void Itk2DContourExtraction (itk::Image* sliceImage); + + private: + const Geometry3D* m_SliceGeometry; + }; } #endif diff --git a/Modules/ContourModel/CMakeLists.txt b/Modules/ContourModel/CMakeLists.txt index 6c41d28911..a7cceae9fc 100644 --- a/Modules/ContourModel/CMakeLists.txt +++ b/Modules/ContourModel/CMakeLists.txt @@ -1,7 +1,8 @@ MITK_CREATE_MODULE( INCLUDE_DIRS Algorithms DataManagement IO Rendering DEPENDS MitkCore + PACKAGE_DEPENDS ITK|ITKReview WARNINGS_AS_ERRORS ) add_subdirectory(Testing)