diff --git a/Modules/Multilabel/Testing/files.cmake b/Modules/Multilabel/Testing/files.cmake index b019734ed6..f9fd59ebd2 100644 --- a/Modules/Multilabel/Testing/files.cmake +++ b/Modules/Multilabel/Testing/files.cmake @@ -1,8 +1,8 @@ set(MODULE_TESTS mitkLabelTest.cpp mitkLabelSetTest.cpp mitkLabelSetImageTest.cpp mitkLabelSetImageIOTest.cpp - mitkLabelSetSurfaceStampTest.cpp + mitkLabelSetImageSurfaceStampFilterTest.cpp ) diff --git a/Modules/Multilabel/Testing/mitkLabelSetSurfaceStampTest.cpp b/Modules/Multilabel/Testing/mitkLabelSetImageSurfaceStampFilterTest.cpp similarity index 50% rename from Modules/Multilabel/Testing/mitkLabelSetSurfaceStampTest.cpp rename to Modules/Multilabel/Testing/mitkLabelSetImageSurfaceStampFilterTest.cpp index 051dfbab18..a991b89c71 100644 --- a/Modules/Multilabel/Testing/mitkLabelSetSurfaceStampTest.cpp +++ b/Modules/Multilabel/Testing/mitkLabelSetImageSurfaceStampFilterTest.cpp @@ -1,84 +1,94 @@ /*=================================================================== 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 #include #include #include #include -#include +#include #include +#include -class mitkLabelSetSurfaceStampTestSuite : public mitk::TestFixture +class mitkLabelSetImageSurfaceStampFilterTestSuite : public mitk::TestFixture { - CPPUNIT_TEST_SUITE(mitkLabelSetSurfaceStampTestSuite); + CPPUNIT_TEST_SUITE(mitkLabelSetImageSurfaceStampFilterTestSuite); - MITK_TEST(testIfPossible); + MITK_TEST(Result_Match_Expectation); CPPUNIT_TEST_SUITE_END(); private: mitk::LabelSetImage::Pointer m_LabelSetImage; + mitk::Surface::Pointer m_Surface; public: void setUp() override { mitk::Image::Pointer regularImage = mitk::ImageGenerator::GenerateRandomImage(50,50,50,1,1,1,1,0.3,0.2); - unsigned int dimensions[3] = {50,50,50}; - m_LabelSetImage = dynamic_cast(mitk::IOUtil::LoadBaseData("d:/tmp/output1.nrrd").GetPointer()); - } - - void tearDown() override - { - // Delete LabelSetImage - m_LabelSetImage = 0; - } - - void testIfPossible() - { + m_LabelSetImage = dynamic_cast(mitk::IOUtil::LoadBaseData(GetTestDataFilePath("Multilabel/EmptyMultiLabelSegmentation.nrrd")).GetPointer()); mitk::Label::Pointer label1 = mitk::Label::New(); label1->SetName("Label1"); mitk::Label::PixelType value1 = 1; label1->SetValue(value1); mitk::Label::Pointer label2 = mitk::Label::New(); label2->SetName("Label2"); mitk::Label::PixelType value2 = 2; label2->SetValue(value2); - //mitk::IOUtil::Save(m_LabelSetImage,"d:/tmp/output1.nrrd"); m_LabelSetImage->GetActiveLabelSet()->AddLabel(label1); m_LabelSetImage->GetActiveLabelSet()->AddLabel(label2); - //m_LabelSetImage = dynamic_cast(mitk::IOUtil::LoadBaseData("d:/tmp/output1.nrrd").GetPointer()); - mitk::Surface::Pointer surface = mitk::IOUtil::LoadSurface(GetTestDataFilePath("BallBinary30x30x30Reference.vtp")); - mitk::LabelSetSurfaceStamp::Pointer filter = mitk::LabelSetSurfaceStamp::New(); - filter->SetSurface(surface); + m_Surface = mitk::IOUtil::LoadSurface(GetTestDataFilePath("BallBinary30x30x30Reference.vtp")); + } + + void tearDown() override + { + // Delete LabelSetImage + m_LabelSetImage = 0; + } + + void Result_Match_Expectation() + { + mitk::LabelSetImageSurfaceStampFilter::Pointer filter = mitk::LabelSetImageSurfaceStampFilter::New(); + filter->SetSurface(m_Surface); filter->SetForceOverwrite(true); filter->SetInput(m_LabelSetImage); filter->Update(); - mitk::IOUtil::Save(filter->GetOutput(),"d:/tmp/output.nrrd"); + mitk::LabelSetImage::Pointer result = dynamic_cast(filter->GetOutput()); + mitk::IOUtil::Save(result,"d:/tmp/output.nrrd"); + + mitk::LabelSetImage::Pointer expectedResult = dynamic_cast(mitk::IOUtil::LoadBaseData(GetTestDataFilePath("Multilabel/StampResultBasedOnEmptyML.nrrd")).GetPointer()); + mitk::LabelSetImage::Pointer expectedResult2 = dynamic_cast(mitk::IOUtil::LoadBaseData(GetTestDataFilePath("Multilabel/StampResultBasedOnEmptyML.nrrd")).GetPointer()); + mitk::IOUtil::Save(expectedResult,"d:/tmp/output2.nrrd"); + + mitk::Image::Pointer p1 = dynamic_cast(expectedResult.GetPointer()); + mitk::Image::Pointer p2 = dynamic_cast(expectedResult2.GetPointer()); + + MITK_INFO << "Equality: " << mitk::Equal(p1, p2,10,true); + MITK_ASSERT_EQUAL(expectedResult, result, "Result after stamping should be equal to the saved version"); } // Reduce contours with nth point void TestGetActiveLabel() { } }; -MITK_TEST_SUITE_REGISTRATION(mitkLabelSetSurfaceStamp) \ No newline at end of file +MITK_TEST_SUITE_REGISTRATION(mitkLabelSetImageSurfaceStampFilter) \ No newline at end of file diff --git a/Modules/Multilabel/files.cmake b/Modules/Multilabel/files.cmake index 65d7bca1f7..e04a19e388 100644 --- a/Modules/Multilabel/files.cmake +++ b/Modules/Multilabel/files.cmake @@ -1,19 +1,19 @@ set(CPP_FILES mitkLabel.cpp mitkLabelSet.cpp mitkLabelSetImage.cpp mitkLabelSetImageConverter.cpp mitkLabelSetImageIO.cpp mitkLabelSetImageSerializer.cpp mitkLabelSetImageSource.cpp + mitkLabelSetImageSurfaceStampFilter.cpp mitkLabelSetImageToSurfaceFilter.cpp mitkLabelSetImageToSurfaceThreadedFilter.cpp mitkLabelSetImageVtkMapper2D.cpp mitkMultilabelActivator.cpp mitkMultilabelObjectFactory.cpp - mitkLabelSetSurfaceStamp.cpp ) set(RESOURCE_FILES ) diff --git a/Modules/Multilabel/mitkLabelSetSurfaceStamp.cpp b/Modules/Multilabel/mitkLabelSetImageSurfaceStampFilter.cpp similarity index 83% rename from Modules/Multilabel/mitkLabelSetSurfaceStamp.cpp rename to Modules/Multilabel/mitkLabelSetImageSurfaceStampFilter.cpp index 8d4d22880b..c4d5f14002 100644 --- a/Modules/Multilabel/mitkLabelSetSurfaceStamp.cpp +++ b/Modules/Multilabel/mitkLabelSetImageSurfaceStampFilter.cpp @@ -1,111 +1,107 @@ /*=================================================================== 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 "mitkLabelSetSurfaceStamp.h" -#include +#include "mitkLabelSetImageSurfaceStampFilter.h" + #include "mitkImageAccessByItk.h" #include "mitkImageCast.h" #include #include -#include -#include -#include -#include #include #include -mitk::LabelSetSurfaceStamp::LabelSetSurfaceStamp() +mitk::LabelSetImageSurfaceStampFilter::LabelSetImageSurfaceStampFilter() { this->SetNumberOfIndexedInputs(1); this->SetNumberOfRequiredInputs(1); } -mitk::LabelSetSurfaceStamp::~LabelSetSurfaceStamp() +mitk::LabelSetImageSurfaceStampFilter::~LabelSetImageSurfaceStampFilter() { } -void mitk::LabelSetSurfaceStamp::GenerateData() +void mitk::LabelSetImageSurfaceStampFilter::GenerateData() { GenerateOutputInformation(); this->SetNthOutput(0,this->GetInput(0)); mitk::Image::Pointer inputImage = this->GetInput(0); if (m_Surface.IsNull()) { MITK_ERROR << "Input surface is NULL."; return; } mitk::SurfaceToImageFilter::Pointer surfaceToImageFilter = mitk::SurfaceToImageFilter::New(); surfaceToImageFilter->MakeOutputBinaryOn(); surfaceToImageFilter->SetInput(m_Surface); surfaceToImageFilter->SetImage(inputImage); surfaceToImageFilter->Update(); mitk::Image::Pointer resultImage = surfaceToImageFilter->GetOutput(); AccessByItk_2(inputImage, ItkImageProcessing, m_Surface, resultImage); } template -void mitk::LabelSetSurfaceStamp::ItkImageProcessing( itk::Image* itkImage, mitk::Surface::Pointer surface, mitk::Image::Pointer resultImage ) +void mitk::LabelSetImageSurfaceStampFilter::ItkImageProcessing( itk::Image* itkImage, mitk::Surface::Pointer surface, mitk::Image::Pointer resultImage ) { typedef itk::Image ImageType; mitk::LabelSetImage::Pointer LabelSetInputImage = dynamic_cast(GetInput()); try { typename ImageType::Pointer itkResultImage = ImageType::New(); mitk::CastToItkImage(resultImage, itkResultImage); typedef itk::ImageRegionConstIterator< ImageType > SourceIteratorType; typedef itk::ImageRegionIterator< ImageType > TargetIteratorType; SourceIteratorType sourceIter(itkResultImage, itkResultImage->GetLargestPossibleRegion()); sourceIter.GoToBegin(); TargetIteratorType targetIter(itkImage, itkImage->GetLargestPossibleRegion()); targetIter.GoToBegin(); int activeLabel = (LabelSetInputImage->GetActiveLabel(LabelSetInputImage->GetActiveLayer()))->GetValue(); while (!sourceIter.IsAtEnd()) { int sourceValue = static_cast(sourceIter.Get()); int targetValue = static_cast(targetIter.Get()); if ((sourceValue != 0) && (m_ForceOverwrite || !LabelSetInputImage->GetLabel(targetValue)->GetLocked())) // skip exterior and locked labels { targetIter.Set(activeLabel); } ++sourceIter; ++targetIter; } } catch (itk::ExceptionObject& e) { mitkThrow() << e.GetDescription(); } this->Modified(); } -void mitk::LabelSetSurfaceStamp::GenerateOutputInformation() +void mitk::LabelSetImageSurfaceStampFilter::GenerateOutputInformation() { mitk::Image::Pointer inputImage = (mitk::Image*) this->GetInput(); mitk::Image::Pointer output = this->GetOutput(); itkDebugMacro(<<"GenerateOutputInformation()"); if(inputImage.IsNull()) return; } \ No newline at end of file diff --git a/Modules/Multilabel/mitkLabelSetSurfaceStamp.h b/Modules/Multilabel/mitkLabelSetImageSurfaceStampFilter.h similarity index 85% rename from Modules/Multilabel/mitkLabelSetSurfaceStamp.h rename to Modules/Multilabel/mitkLabelSetImageSurfaceStampFilter.h index 49a1ea4666..1a48c8248d 100644 --- a/Modules/Multilabel/mitkLabelSetSurfaceStamp.h +++ b/Modules/Multilabel/mitkLabelSetImageSurfaceStampFilter.h @@ -1,71 +1,71 @@ /*=================================================================== 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 __mitkLabelSetSurfaceStamp_h -#define __mitkLabelSetSurfaceStamp_h +#ifndef __mitkLabelSetImageSurfaceStampFilter_h +#define __mitkLabelSetImageSurfaceStampFilter_h #include "MitkMultilabelExports.h" //MITK #include #include "mitkImageToImageFilter.h" #include #include namespace mitk { - class MITKMULTILABEL_EXPORT LabelSetSurfaceStamp : public ImageToImageFilter + class MITKMULTILABEL_EXPORT LabelSetImageSurfaceStampFilter : public ImageToImageFilter { public: - mitkClassMacro( LabelSetSurfaceStamp , ImageToImageFilter ); + mitkClassMacro( LabelSetImageSurfaceStampFilter , ImageToImageFilter ); itkFactorylessNewMacro(Self); itkCloneMacro(Self); itkGetConstMacro(Surface,Surface::Pointer); itkSetMacro(Surface,Surface::Pointer); itkGetConstMacro(ForceOverwrite,bool); itkSetMacro(ForceOverwrite,bool); private: /*! \brief standard constructor */ - LabelSetSurfaceStamp(); + LabelSetImageSurfaceStampFilter(); /*! \brief standard destructor */ - ~LabelSetSurfaceStamp(); + ~LabelSetImageSurfaceStampFilter(); /*! \brief Method generating the output information of this filter (e.g. image dimension, image type, etc.). The interface ImageToImageFilter requires this implementation. Everything is taken from the input image. */ virtual void GenerateOutputInformation() override; /*! \brief Method generating the output of this filter. Called in the updated process of the pipeline. This method generates the smoothed output image. */ virtual void GenerateData() override; /*! \brief Internal templated method calling the ITK bilteral filter. Here the actual filtering is performed. */ template void ItkImageProcessing( itk::Image* itkImage, mitk::Surface::Pointer surface, mitk::Image::Pointer resultImage ); Surface::Pointer m_Surface; bool m_ForceOverwrite; }; } //END mitk namespace #endif