diff --git a/Modules/Multilabel/Testing/files.cmake b/Modules/Multilabel/Testing/files.cmake index 97fb1986b7..b019734ed6 100644 --- a/Modules/Multilabel/Testing/files.cmake +++ b/Modules/Multilabel/Testing/files.cmake @@ -1,7 +1,8 @@ set(MODULE_TESTS mitkLabelTest.cpp mitkLabelSetTest.cpp mitkLabelSetImageTest.cpp mitkLabelSetImageIOTest.cpp + mitkLabelSetSurfaceStampTest.cpp ) diff --git a/Modules/Multilabel/Testing/mitkLabelSetImageTest.cpp b/Modules/Multilabel/Testing/mitkLabelSetImageTest.cpp index 597efef47f..5a47d56c2c 100644 --- a/Modules/Multilabel/Testing/mitkLabelSetImageTest.cpp +++ b/Modules/Multilabel/Testing/mitkLabelSetImageTest.cpp @@ -1,414 +1,414 @@ /*=================================================================== 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 class mitkLabelSetImageTestSuite : public mitk::TestFixture { CPPUNIT_TEST_SUITE(mitkLabelSetImageTestSuite); MITK_TEST(TestInitialize); MITK_TEST(TestAddLayer); MITK_TEST(TestGetActiveLabelSet); MITK_TEST(TestGetActiveLabel); MITK_TEST(TestInitializeByLabeledImage); MITK_TEST(TestGetLabelSet); MITK_TEST(TestGetLabel); MITK_TEST(TestSetExteriorLabel); MITK_TEST(TestGetTotalNumberOfLabels); MITK_TEST(TestExistsLabel); MITK_TEST(TestExistsLabelSet); MITK_TEST(TestSetActiveLayer); MITK_TEST(TestRemoveLayer); MITK_TEST(TestRemoveLabels); MITK_TEST(TestMergeLabel); // TODO check it these functionalities can be moved into a process object -// MITK_TEST(TestMergeLabels); -// MITK_TEST(TestConcatenate); -// MITK_TEST(TestClearBuffer); -// MITK_TEST(TestUpdateCenterOfMass); -// MITK_TEST(TestGetVectorImage); -// MITK_TEST(TestSetVectorImage); -// MITK_TEST(TestGetLayerImage); + // MITK_TEST(TestMergeLabels); + // MITK_TEST(TestConcatenate); + // MITK_TEST(TestClearBuffer); + // MITK_TEST(TestUpdateCenterOfMass); + // MITK_TEST(TestGetVectorImage); + // MITK_TEST(TestSetVectorImage); + // MITK_TEST(TestGetLayerImage); CPPUNIT_TEST_SUITE_END(); private: mitk::LabelSetImage::Pointer m_LabelSetImage; public: void setUp() override { // Create a new labelset image m_LabelSetImage = mitk::LabelSetImage::New(); mitk::Image::Pointer regularImage = mitk::Image::New(); unsigned int dimensions[3] = {256,256,312}; regularImage->Initialize(mitk::MakeScalarPixelType(), 3, dimensions); m_LabelSetImage->Initialize(regularImage); } void tearDown() override { // Delete LabelSetImage m_LabelSetImage = 0; } // Reduce contours with nth point void TestInitialize() { // LabelSet image should always has the pixel type mitk::Label::PixelType CPPUNIT_ASSERT_MESSAGE("LabelSetImage has wrong pixel type", - m_LabelSetImage->GetPixelType() == mitk::MakeScalarPixelType()); + m_LabelSetImage->GetPixelType() == mitk::MakeScalarPixelType()); mitk::Image::Pointer regularImage = mitk::Image::New(); unsigned int dimensions[3] = {256,256,312}; regularImage->Initialize(mitk::MakeScalarPixelType(), 3, dimensions); mitk::BaseGeometry::Pointer regularImageGeo = regularImage->GetGeometry(); mitk::BaseGeometry::Pointer labelImageGeo = m_LabelSetImage->GetGeometry(); MITK_ASSERT_EQUAL(labelImageGeo, regularImageGeo, "LabelSetImage has wrong geometry"); // By default one layer containing the exterior label should be added CPPUNIT_ASSERT_MESSAGE("Image was not correctly initialized - number of layers is not one",m_LabelSetImage->GetNumberOfLayers() == 1); CPPUNIT_ASSERT_MESSAGE("Image was not correctly initialized - active layer has wrong ID",m_LabelSetImage->GetActiveLayer() == 0); CPPUNIT_ASSERT_MESSAGE("Image was not correctly initialized - active label is not the exterior label",m_LabelSetImage->GetActiveLabel()->GetValue() == 0); } void TestAddLayer() { CPPUNIT_ASSERT_MESSAGE("Number of layers is not zero",m_LabelSetImage->GetNumberOfLayers() == 1); m_LabelSetImage->AddLayer(); CPPUNIT_ASSERT_MESSAGE("Layer was not added correctly to image - number of layers is not one",m_LabelSetImage->GetNumberOfLayers() == 2); CPPUNIT_ASSERT_MESSAGE("Layer was not added correctly to image - active layer has wrong ID", m_LabelSetImage->GetActiveLayer() == 1); CPPUNIT_ASSERT_MESSAGE("Layer was not added correctly to image - active label is not the exterior label",m_LabelSetImage->GetActiveLabel()->GetValue() == 0); mitk::LabelSet::Pointer newlayer = mitk::LabelSet::New(); mitk::Label::Pointer label1 = mitk::Label::New(); label1->SetName("Label1"); label1->SetValue(1); mitk::Label::Pointer label2 = mitk::Label::New(); label2->SetName("Label2"); label2->SetValue(200); newlayer->AddLabel(label1); newlayer->AddLabel(label2); newlayer->SetActiveLabel(200); unsigned int layerID = m_LabelSetImage->AddLayer(newlayer); CPPUNIT_ASSERT_MESSAGE("Layer was not added correctly to image - number of layers is not two",m_LabelSetImage->GetNumberOfLayers() == 3); CPPUNIT_ASSERT_MESSAGE("Layer was not added correctly to image - active layer has wrong ID",m_LabelSetImage->GetActiveLayer() == layerID); CPPUNIT_ASSERT_MESSAGE("Layer was not added correctly to image - active label is wrong",m_LabelSetImage->GetActiveLabel(layerID)->GetValue() == 200); } void TestGetActiveLabelSet() { mitk::LabelSet::Pointer newlayer = mitk::LabelSet::New(); mitk::Label::Pointer label1 = mitk::Label::New(); label1->SetName("Label1"); label1->SetValue(1); mitk::Label::Pointer label2 = mitk::Label::New(); label2->SetName("Label2"); label2->SetValue(200); newlayer->AddLabel(label1); newlayer->AddLabel(label2); newlayer->SetActiveLabel(200); unsigned int layerID = m_LabelSetImage->AddLayer(newlayer); mitk::LabelSet::Pointer activeLayer = m_LabelSetImage->GetActiveLabelSet(); CPPUNIT_ASSERT_MESSAGE("Wrong layer ID was returned", layerID == 1); CPPUNIT_ASSERT_MESSAGE("Wrong active labelset returned", mitk::Equal(*newlayer, *activeLayer, 0.00001, true)); } void TestGetActiveLabel() { 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 = 200; label2->SetValue(value2); m_LabelSetImage->GetActiveLabelSet()->AddLabel(label1); m_LabelSetImage->GetActiveLabelSet()->AddLabel(label2); m_LabelSetImage->GetActiveLabelSet()->SetActiveLabel(1); CPPUNIT_ASSERT_MESSAGE("Layer was not added correctly to image - active label is wrong",m_LabelSetImage->GetActiveLabel()->GetValue() == value1); m_LabelSetImage->GetActiveLabelSet()->SetActiveLabel(value2); CPPUNIT_ASSERT_MESSAGE("Layer was not added correctly to image - active label is wrong",m_LabelSetImage->GetActiveLabel()->GetValue() == value2); } void TestInitializeByLabeledImage() { mitk::Image::Pointer image = mitk::IOUtil::LoadImage(GetTestDataFilePath("Multilabel/LabelSetTestInitializeImage.nrrd")); m_LabelSetImage->InitializeByLabeledImage(image); CPPUNIT_ASSERT_MESSAGE("Image - number of labels is not 6",m_LabelSetImage->GetNumberOfLabels() == 6); } void TestGetLabelSet() { // Test get non existing lset mitk::LabelSet::ConstPointer lset = m_LabelSetImage->GetLabelSet(10000); CPPUNIT_ASSERT_MESSAGE("Non existing labelset is not NULL", lset.IsNull()); lset = m_LabelSetImage->GetLabelSet(0); CPPUNIT_ASSERT_MESSAGE("Existing labelset is NULL", lset.IsNotNull()); } void TestGetLabel() { 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 = 200; label2->SetValue(value2); m_LabelSetImage->GetActiveLabelSet()->AddLabel(label1); m_LabelSetImage->AddLayer(); m_LabelSetImage->GetLabelSet(1)->AddLabel(label2); CPPUNIT_ASSERT_MESSAGE("Wrong label retrieved for active layer", mitk::Equal(*m_LabelSetImage->GetLabel(1), *label1, 0.0001, true)); CPPUNIT_ASSERT_MESSAGE("Wrong label retrieved for layer 1", mitk::Equal(*m_LabelSetImage->GetLabel(200, 1), *label2, 0.0001, true)); // Try to get a non existing label mitk::Label* label3 = m_LabelSetImage->GetLabel(1000); CPPUNIT_ASSERT_MESSAGE("Non existing label should be NULL", label3 == NULL); // Try to get a label from a non existing layer label3 = m_LabelSetImage->GetLabel(200, 1000); CPPUNIT_ASSERT_MESSAGE("Label from non existing layer should be NULL", label3 == NULL); } void TestSetExteriorLabel() { mitk::Label::Pointer exteriorLabel = mitk::Label::New(); exteriorLabel->SetName("MyExteriorSpecialLabel"); mitk::Label::PixelType value1 = 10000; exteriorLabel->SetValue(value1); m_LabelSetImage->SetExteriorLabel(exteriorLabel); CPPUNIT_ASSERT_MESSAGE("Wrong label retrieved for layer 1", mitk::Equal(*m_LabelSetImage->GetExteriorLabel(), *exteriorLabel, 0.0001, true)); // Exterior label should be set automatically for each new layer m_LabelSetImage->AddLayer(); CPPUNIT_ASSERT_MESSAGE("Wrong label retrieved for layer 1", mitk::Equal(*m_LabelSetImage->GetLabel(10000, 1), *exteriorLabel, 0.0001, true)); } void TestGetTotalNumberOfLabels() { 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 = 200; label2->SetValue(value2); m_LabelSetImage->GetActiveLabelSet()->AddLabel(label1); m_LabelSetImage->AddLayer(); m_LabelSetImage->GetLabelSet(1)->AddLabel(label2); CPPUNIT_ASSERT_MESSAGE("Wrong total number of labels", m_LabelSetImage->GetTotalNumberOfLabels() == 4); // added 2 labels + 2 exterior default labels } void TestExistsLabel() { mitk::Label::Pointer label = mitk::Label::New(); label->SetName("Label2"); mitk::Label::PixelType value = 200; label->SetValue(value); m_LabelSetImage->AddLayer(); m_LabelSetImage->GetLabelSet(1)->AddLabel(label); m_LabelSetImage->SetActiveLayer(0); CPPUNIT_ASSERT_MESSAGE("Existing label was not found", m_LabelSetImage->ExistLabel(value) == true); CPPUNIT_ASSERT_MESSAGE("Non existing label was found", m_LabelSetImage->ExistLabel(10000) == false); } void TestExistsLabelSet() { // Cache active layer mitk::LabelSet::ConstPointer activeLayer = m_LabelSetImage->GetActiveLabelSet(); // Add new layer mitk::LabelSet::Pointer newlayer = mitk::LabelSet::New(); mitk::Label::Pointer label1 = mitk::Label::New(); label1->SetName("Label1"); label1->SetValue(1); mitk::Label::Pointer label2 = mitk::Label::New(); label2->SetName("Label2"); label2->SetValue(200); newlayer->AddLabel(label1); newlayer->AddLabel(label2); newlayer->SetActiveLabel(200); m_LabelSetImage->AddLayer(newlayer); CPPUNIT_ASSERT_MESSAGE("Check for existing layer failed",m_LabelSetImage->ExistLabelSet(0) == true); CPPUNIT_ASSERT_MESSAGE("Check for existing layer failed",m_LabelSetImage->ExistLabelSet(1) == true); CPPUNIT_ASSERT_MESSAGE("Check for existing layer failed",m_LabelSetImage->ExistLabelSet(20) == false); } void TestSetActiveLayer() { // Cache active layer mitk::LabelSet::ConstPointer activeLayer = m_LabelSetImage->GetActiveLabelSet(); // Add new layer mitk::LabelSet::Pointer newlayer = mitk::LabelSet::New(); mitk::Label::Pointer label1 = mitk::Label::New(); label1->SetName("Label1"); label1->SetValue(1); mitk::Label::Pointer label2 = mitk::Label::New(); label2->SetName("Label2"); label2->SetValue(200); newlayer->AddLabel(label1); newlayer->AddLabel(label2); newlayer->SetActiveLabel(200); unsigned int layerID = m_LabelSetImage->AddLayer(newlayer); // Set initial layer as active layer m_LabelSetImage->SetActiveLayer(0); CPPUNIT_ASSERT_MESSAGE("Wrong active labelset returned", mitk::Equal(*activeLayer, *m_LabelSetImage->GetActiveLabelSet(), 0.00001, true)); // Set previously added layer as active layer m_LabelSetImage->SetActiveLayer(layerID); CPPUNIT_ASSERT_MESSAGE("Wrong active labelset returned", mitk::Equal(*newlayer, *m_LabelSetImage->GetActiveLabelSet(), 0.00001, true)); // Set a non existing layer as active layer - nothing should change m_LabelSetImage->SetActiveLayer(10000); CPPUNIT_ASSERT_MESSAGE("Wrong active labelset returned", mitk::Equal(*newlayer, *m_LabelSetImage->GetActiveLabelSet(), 0.00001, true)); } void TestRemoveLayer() { // Cache active layer mitk::LabelSet::ConstPointer activeLayer = m_LabelSetImage->GetActiveLabelSet(); // Add new layers m_LabelSetImage->AddLayer(); mitk::LabelSet::Pointer newlayer = mitk::LabelSet::New(); mitk::Label::Pointer label1 = mitk::Label::New(); label1->SetName("Label1"); label1->SetValue(1); mitk::Label::Pointer label2 = mitk::Label::New(); label2->SetName("Label2"); label2->SetValue(200); newlayer->AddLabel(label1); newlayer->AddLabel(label2); newlayer->SetActiveLabel(200); m_LabelSetImage->AddLayer(newlayer); CPPUNIT_ASSERT_MESSAGE("Wrong active labelset returned", mitk::Equal(*newlayer, *m_LabelSetImage->GetActiveLabelSet(), 0.00001, true)); m_LabelSetImage->RemoveLayer(); CPPUNIT_ASSERT_MESSAGE("Wrong number of layers, after a layer was removed", m_LabelSetImage->GetNumberOfLayers() == 2); CPPUNIT_ASSERT_MESSAGE("Check for existing layer failed",m_LabelSetImage->ExistLabelSet(2) == false); CPPUNIT_ASSERT_MESSAGE("Check for existing layer failed",m_LabelSetImage->ExistLabelSet(1) == true); CPPUNIT_ASSERT_MESSAGE("Check for existing layer failed",m_LabelSetImage->ExistLabelSet(0) == true); m_LabelSetImage->RemoveLayer(); CPPUNIT_ASSERT_MESSAGE("Wrong number of layers, after a layer was removed", m_LabelSetImage->GetNumberOfLayers() == 1); CPPUNIT_ASSERT_MESSAGE("Check for existing layer failed",m_LabelSetImage->ExistLabelSet(1) == false); CPPUNIT_ASSERT_MESSAGE("Check for existing layer failed",m_LabelSetImage->ExistLabelSet(0) == true); CPPUNIT_ASSERT_MESSAGE("Wrong active layer", mitk::Equal(*activeLayer, *m_LabelSetImage->GetActiveLabelSet(), 0.00001, true)); m_LabelSetImage->RemoveLayer(); CPPUNIT_ASSERT_MESSAGE("Wrong number of layers, after a layer was removed", m_LabelSetImage->GetNumberOfLayers() == 0); CPPUNIT_ASSERT_MESSAGE("Check for existing layer failed",m_LabelSetImage->ExistLabelSet(0) == false); CPPUNIT_ASSERT_MESSAGE("Active layers is not NULL although all layer have been removed", m_LabelSetImage->GetActiveLabelSet() == 0); } void TestRemoveLabels() { mitk::Image::Pointer image = mitk::IOUtil::LoadImage(GetTestDataFilePath("Multilabel/LabelSetTestInitializeImage.nrrd")); m_LabelSetImage->InitializeByLabeledImage(image); CPPUNIT_ASSERT_MESSAGE("Image - number of labels is not 6",m_LabelSetImage->GetNumberOfLabels() == 6); // 2ndMin because of the exterior label = 0 CPPUNIT_ASSERT_MESSAGE("Labels with value 1 and 3 was not remove from the image", m_LabelSetImage->GetStatistics()->GetScalarValue2ndMin() == 1); CPPUNIT_ASSERT_MESSAGE("Label with value 7 was not remove from the image", m_LabelSetImage->GetStatistics()->GetScalarValueMax() == 7); CPPUNIT_ASSERT_MESSAGE("Label with ID 3 does not exists after initialization",m_LabelSetImage->ExistLabel(3) == true); CPPUNIT_ASSERT_MESSAGE("Label with ID 7 does not exists after initialization",m_LabelSetImage->ExistLabel(7) == true); std::vector labelsToBeRemoved; labelsToBeRemoved.push_back(1); labelsToBeRemoved.push_back(3); labelsToBeRemoved.push_back(7); m_LabelSetImage->RemoveLabels(labelsToBeRemoved); CPPUNIT_ASSERT_MESSAGE("Wrong number of labels after some have been removed", m_LabelSetImage->GetNumberOfLabels() == 3); // Values within the image are 0, 1, 3, 5, 6, 7 - New Min/Max value should be 5 / 6 // 2ndMin because of the exterior label = 0 CPPUNIT_ASSERT_MESSAGE("Labels with value 1 and 3 was not remove from the image", m_LabelSetImage->GetStatistics()->GetScalarValue2ndMin() == 5); CPPUNIT_ASSERT_MESSAGE("Label with value 7 was not remove from the image", m_LabelSetImage->GetStatistics()->GetScalarValueMax() == 6); } void TestMergeLabel() { mitk::Image::Pointer image = mitk::IOUtil::LoadImage(GetTestDataFilePath("Multilabel/LabelSetTestInitializeImage.nrrd")); m_LabelSetImage = 0; m_LabelSetImage = mitk::LabelSetImage::New(); m_LabelSetImage->InitializeByLabeledImage(image); CPPUNIT_ASSERT_MESSAGE("Image - number of labels is not 6",m_LabelSetImage->GetNumberOfLabels() == 6); // 2ndMin because of the exterior label = 0 CPPUNIT_ASSERT_MESSAGE("Wrong MIN value", m_LabelSetImage->GetStatistics()->GetScalarValueMin() == 0); CPPUNIT_ASSERT_MESSAGE("Wrong MAX value", m_LabelSetImage->GetStatistics()->GetScalarValueMax() == 7); m_LabelSetImage->GetActiveLabelSet()->SetActiveLabel(6); // Merge label 7 with label 0. Result should be that label 7 is not present any more m_LabelSetImage->MergeLabel(7); CPPUNIT_ASSERT_MESSAGE("Label with value 7 was not remove from the image", m_LabelSetImage->GetStatistics()->GetScalarValueMax() == 6); m_LabelSetImage->GetStatistics()->GetScalarValue2ndMax(); // Count all pixels with value 7 = 823 // Count all pixels with value 6 = 507 // Check if merge label has 507 + 823 = 1330 pixels CPPUNIT_ASSERT_MESSAGE("Label with value 7 was not remove from the image", m_LabelSetImage->GetStatistics()->GetCountOfMaxValuedVoxels() == 1330); } }; -MITK_TEST_SUITE_REGISTRATION(mitkLabelSetImage) +MITK_TEST_SUITE_REGISTRATION(mitkLabelSetImage) \ No newline at end of file diff --git a/Modules/Multilabel/Testing/mitkLabelSetSurfaceStampTest.cpp b/Modules/Multilabel/Testing/mitkLabelSetSurfaceStampTest.cpp new file mode 100644 index 0000000000..051dfbab18 --- /dev/null +++ b/Modules/Multilabel/Testing/mitkLabelSetSurfaceStampTest.cpp @@ -0,0 +1,84 @@ +/*=================================================================== + +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 + +class mitkLabelSetSurfaceStampTestSuite : public mitk::TestFixture +{ + CPPUNIT_TEST_SUITE(mitkLabelSetSurfaceStampTestSuite); + + MITK_TEST(testIfPossible); + + CPPUNIT_TEST_SUITE_END(); + +private: + mitk::LabelSetImage::Pointer m_LabelSetImage; + +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() + { + 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); + filter->SetForceOverwrite(true); + filter->SetInput(m_LabelSetImage); + filter->Update(); + mitk::IOUtil::Save(filter->GetOutput(),"d:/tmp/output.nrrd"); + } + + // Reduce contours with nth point + void TestGetActiveLabel() + { + } +}; + +MITK_TEST_SUITE_REGISTRATION(mitkLabelSetSurfaceStamp) \ No newline at end of file diff --git a/Modules/Multilabel/mitkLabelSetSurfaceStamp.cpp b/Modules/Multilabel/mitkLabelSetSurfaceStamp.cpp index ebbe3b3d6b..8d4d22880b 100644 --- a/Modules/Multilabel/mitkLabelSetSurfaceStamp.cpp +++ b/Modules/Multilabel/mitkLabelSetSurfaceStamp.cpp @@ -1,195 +1,111 @@ /*=================================================================== 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 "mitkImageAccessByItk.h" #include "mitkImageCast.h" #include #include #include #include #include #include #include +#include mitk::LabelSetSurfaceStamp::LabelSetSurfaceStamp() { this->SetNumberOfIndexedInputs(1); this->SetNumberOfRequiredInputs(1); } mitk::LabelSetSurfaceStamp::~LabelSetSurfaceStamp() { } void mitk::LabelSetSurfaceStamp::GenerateData() { - this->SetOutput(0,this->GetInput(0)); + 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; } - if ( (inputImage->GetDimension() > 4) || (inputImage->GetDimension() < 2) ) - { - MITK_ERROR << "mitk::LabelSetSurfaceStamp:GenerateData works only with 2D, 2D+t, 3D, 3D+t and 4D images, sorry."; - return; - } - // This is necessary because only these dimensions are supported from the corresponding filter. - switch(inputImage->GetDimension()) - { - case 2: - { - //AccessFixedDimensionByItk_1(inputImage, ItkImageProcessing, 2, m_Surface); break; - } - case 3: - { - AccessFixedDimensionByItk_1(inputImage, ItkImageProcessing, 3, m_Surface); break; - } - case 4: - { - AccessFixedDimensionByItk_1(inputImage, ItkImageProcessing, 4, m_Surface); break; - } - default: break; - } + 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 ) +void mitk::LabelSetSurfaceStamp::ItkImageProcessing( itk::Image* itkImage, mitk::Surface::Pointer surface, mitk::Image::Pointer resultImage ) { typedef itk::Image ImageType; mitk::LabelSetImage::Pointer LabelSetInputImage = dynamic_cast(GetInput()); try { - vtkPolyData *polydata = surface->GetVtkPolyData(); - - vtkSmartPointer transform = vtkSmartPointer::New(); - transform->SetMatrix(surface->GetGeometry()->GetVtkTransform()->GetMatrix()); - transform->Update(); - - vtkSmartPointer transformer = vtkSmartPointer::New(); - transformer->SetInputData(polydata); - transformer->SetTransform(transform); - transformer->Update(); - - typedef double Coord; - typedef itk::QuadEdgeMesh< Coord, VImageDimension > MeshType; - - MeshType::Pointer mesh = MeshType::New(); - mesh->SetCellsAllocationMethod(MeshType::CellsAllocatedDynamicallyCellByCell); - int numberOfPoints = polydata->GetNumberOfPoints(); - mesh->GetPoints()->Reserve(numberOfPoints); - - vtkPoints* points = polydata->GetPoints(); - - MeshType::PointType point; - for (int i = 0; i < numberOfPoints; i++) - { - double* aux = points->GetPoint(i); - point[0] = aux[0]; - point[1] = aux[1]; - point[2] = aux[2]; - mesh->SetPoint(i, point); - } - - // Load the polygons into the itk::Mesh - typedef MeshType::CellAutoPointer CellAutoPointerType; - typedef MeshType::CellType CellType; - typedef itk::TriangleCell< CellType > TriangleCellType; - typedef MeshType::PointIdentifier PointIdentifierType; - typedef MeshType::CellIdentifier CellIdentifierType; - - // Read the number of polygons - CellIdentifierType numberOfPolygons = 0; - numberOfPolygons = polydata->GetNumberOfPolys(); - - PointIdentifierType numberOfCellPoints = 3; - - for (CellIdentifierType i = 0; i < numberOfPolygons; i++) - { - vtkIdList *cellIds; - vtkCell *vcell = polydata->GetCell(i); - cellIds = vcell->GetPointIds(); - - CellAutoPointerType cell; - auto triangleCell = new TriangleCellType; - PointIdentifierType k; - for (k = 0; k < numberOfCellPoints; k++) - { - triangleCell->SetPointId(k, cellIds->GetId(k)); - } - - cell.TakeOwnership(triangleCell); - mesh->SetCell(i, cell); - } - - typedef itk::TriangleMeshToBinaryImageFilter TriangleMeshToBinaryImageFilterType; - - TriangleMeshToBinaryImageFilterType::Pointer filter = TriangleMeshToBinaryImageFilterType::New(); - filter->SetInput(mesh); - filter->SetInfoImage(itkImage); - filter->SetInsideValue(1); - filter->SetOutsideValue(0); - filter->Update(); - - //GoTrough - auto resultImage = filter->GetOutput(); - resultImage->DisconnectPipeline(); + typename ImageType::Pointer itkResultImage = ImageType::New(); + mitk::CastToItkImage(resultImage, itkResultImage); typedef itk::ImageRegionConstIterator< ImageType > SourceIteratorType; typedef itk::ImageRegionIterator< ImageType > TargetIteratorType; - SourceIteratorType sourceIter(resultImage, resultImage->GetLargestPossibleRegion()); + 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() { 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/mitkLabelSetSurfaceStamp.h index 75106c0d4a..49a1ea4666 100644 --- a/Modules/Multilabel/mitkLabelSetSurfaceStamp.h +++ b/Modules/Multilabel/mitkLabelSetSurfaceStamp.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 #include "MitkMultilabelExports.h" //MITK #include #include "mitkImageToImageFilter.h" #include #include namespace mitk { class MITKMULTILABEL_EXPORT LabelSetSurfaceStamp : public ImageToImageFilter { public: mitkClassMacro( LabelSetSurfaceStamp , ImageToImageFilter ); - itkFactorylessNewMacro(Self) - itkCloneMacro(Self) + itkFactorylessNewMacro(Self); + itkCloneMacro(Self); - itkGetConstMacro(Surface,Surface::Pointer); + itkGetConstMacro(Surface,Surface::Pointer); itkSetMacro(Surface,Surface::Pointer); itkGetConstMacro(ForceOverwrite,bool); itkSetMacro(ForceOverwrite,bool); private: /*! \brief standard constructor */ LabelSetSurfaceStamp(); /*! \brief standard destructor */ ~LabelSetSurfaceStamp(); /*! \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); + void ItkImageProcessing( itk::Image* itkImage, mitk::Surface::Pointer surface, mitk::Image::Pointer resultImage ); Surface::Pointer m_Surface; bool m_ForceOverwrite; }; } //END mitk namespace #endif