From efd16ff652f13a1e42aa186b907aa10edfaeff8d Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Mon, 14 Sep 2026 13:07:02 -0500 Subject: [PATCH 1/2] STYLE: Move evolving level-set examples to Segmentation/LevelSetsv4 These were the last examples under the VtkGlue if(ITK_VERSION_MAJOR LESS 5) block, which is now empty and removed. They are unbuilt on both sides of this move. --- src/Bridge/VtkGlue/CMakeLists.txt | 5 ----- src/Bridge/VtkGlue/index.rst | 2 -- .../CMakeLists.txt | 0 .../VisualizeEvolvingDense2DLevelSetAsElevationMap/Code.cxx | 0 .../Documentation.rst | 0 .../cells.png.cid | 0 .../levelsets.gif.cid | 0 .../levelsets.png.cid | 0 .../VisualizeEvolvingDense2DLevelSetZeroSet/CMakeLists.txt | 0 .../VisualizeEvolvingDense2DLevelSetZeroSet/Code.cxx | 0 .../Documentation.rst | 0 .../VisualizeEvolvingDense2DLevelSetZeroSet/cells.png.cid | 0 .../levelsets.gif.cid | 0 .../levelsets.png.cid | 0 14 files changed, 7 deletions(-) rename src/{Bridge/VtkGlue => Segmentation/LevelSetsv4}/VisualizeEvolvingDense2DLevelSetAsElevationMap/CMakeLists.txt (100%) rename src/{Bridge/VtkGlue => Segmentation/LevelSetsv4}/VisualizeEvolvingDense2DLevelSetAsElevationMap/Code.cxx (100%) rename src/{Bridge/VtkGlue => Segmentation/LevelSetsv4}/VisualizeEvolvingDense2DLevelSetAsElevationMap/Documentation.rst (100%) rename src/{Bridge/VtkGlue => Segmentation/LevelSetsv4}/VisualizeEvolvingDense2DLevelSetAsElevationMap/cells.png.cid (100%) rename src/{Bridge/VtkGlue => Segmentation/LevelSetsv4}/VisualizeEvolvingDense2DLevelSetAsElevationMap/levelsets.gif.cid (100%) rename src/{Bridge/VtkGlue => Segmentation/LevelSetsv4}/VisualizeEvolvingDense2DLevelSetAsElevationMap/levelsets.png.cid (100%) rename src/{Bridge/VtkGlue => Segmentation/LevelSetsv4}/VisualizeEvolvingDense2DLevelSetZeroSet/CMakeLists.txt (100%) rename src/{Bridge/VtkGlue => Segmentation/LevelSetsv4}/VisualizeEvolvingDense2DLevelSetZeroSet/Code.cxx (100%) rename src/{Bridge/VtkGlue => Segmentation/LevelSetsv4}/VisualizeEvolvingDense2DLevelSetZeroSet/Documentation.rst (100%) rename src/{Bridge/VtkGlue => Segmentation/LevelSetsv4}/VisualizeEvolvingDense2DLevelSetZeroSet/cells.png.cid (100%) rename src/{Bridge/VtkGlue => Segmentation/LevelSetsv4}/VisualizeEvolvingDense2DLevelSetZeroSet/levelsets.gif.cid (100%) rename src/{Bridge/VtkGlue => Segmentation/LevelSetsv4}/VisualizeEvolvingDense2DLevelSetZeroSet/levelsets.png.cid (100%) diff --git a/src/Bridge/VtkGlue/CMakeLists.txt b/src/Bridge/VtkGlue/CMakeLists.txt index f45960e7b..34e885e37 100644 --- a/src/Bridge/VtkGlue/CMakeLists.txt +++ b/src/Bridge/VtkGlue/CMakeLists.txt @@ -9,9 +9,4 @@ if(ENABLE_QUICKVIEW) #compare_to_baseline(EXAMPLE_NAME VTKImageToITKImage # BASELINE_PREFIX OutputBaseline # ) - - if(ITK_VERSION_MAJOR LESS 5) - add_example(VisualizeEvolvingDense2DLevelSetAsElevationMap) - add_example(VisualizeEvolvingDense2DLevelSetZeroSet) - endif() endif() diff --git a/src/Bridge/VtkGlue/index.rst b/src/Bridge/VtkGlue/index.rst index afcc1865b..0b75280d6 100644 --- a/src/Bridge/VtkGlue/index.rst +++ b/src/Bridge/VtkGlue/index.rst @@ -8,6 +8,4 @@ VtkGlue ConvertAnRGBitkImageTovtkImageData/Documentation.rst ConvertRGBvtkImageDataToAnitkImage/Documentation.rst ConvertvtkImageDataToAnitkImage/Documentation.rst - VisualizeEvolvingDense2DLevelSetAsElevationMap/Documentation.rst - VisualizeEvolvingDense2DLevelSetZeroSet/Documentation.rst VTKImageToITKImage/Documentation.rst diff --git a/src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetAsElevationMap/CMakeLists.txt b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/CMakeLists.txt similarity index 100% rename from src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetAsElevationMap/CMakeLists.txt rename to src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/CMakeLists.txt diff --git a/src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetAsElevationMap/Code.cxx b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/Code.cxx similarity index 100% rename from src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetAsElevationMap/Code.cxx rename to src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/Code.cxx diff --git a/src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetAsElevationMap/Documentation.rst b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/Documentation.rst similarity index 100% rename from src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetAsElevationMap/Documentation.rst rename to src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/Documentation.rst diff --git a/src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetAsElevationMap/cells.png.cid b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/cells.png.cid similarity index 100% rename from src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetAsElevationMap/cells.png.cid rename to src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/cells.png.cid diff --git a/src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetAsElevationMap/levelsets.gif.cid b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/levelsets.gif.cid similarity index 100% rename from src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetAsElevationMap/levelsets.gif.cid rename to src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/levelsets.gif.cid diff --git a/src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetAsElevationMap/levelsets.png.cid b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/levelsets.png.cid similarity index 100% rename from src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetAsElevationMap/levelsets.png.cid rename to src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/levelsets.png.cid diff --git a/src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetZeroSet/CMakeLists.txt b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/CMakeLists.txt similarity index 100% rename from src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetZeroSet/CMakeLists.txt rename to src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/CMakeLists.txt diff --git a/src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetZeroSet/Code.cxx b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/Code.cxx similarity index 100% rename from src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetZeroSet/Code.cxx rename to src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/Code.cxx diff --git a/src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetZeroSet/Documentation.rst b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/Documentation.rst similarity index 100% rename from src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetZeroSet/Documentation.rst rename to src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/Documentation.rst diff --git a/src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetZeroSet/cells.png.cid b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/cells.png.cid similarity index 100% rename from src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetZeroSet/cells.png.cid rename to src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/cells.png.cid diff --git a/src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetZeroSet/levelsets.gif.cid b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/levelsets.gif.cid similarity index 100% rename from src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetZeroSet/levelsets.gif.cid rename to src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/levelsets.gif.cid diff --git a/src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetZeroSet/levelsets.png.cid b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/levelsets.png.cid similarity index 100% rename from src/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetZeroSet/levelsets.png.cid rename to src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/levelsets.png.cid From 8ccbb03b859be34b6dc94dd0f16d69537b07f9bf Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Mon, 14 Sep 2026 13:09:23 -0500 Subject: [PATCH 2/2] ENH: Write the evolving LevelSetsv4 examples' output instead of rendering The examples rendered each iteration through VTK visualization classes that ITK no longer contains. Each now evolves the level set and writes the result: the level-set values, or the zero set via ZeroCrossingImageFilter. --- src/Segmentation/LevelSetsv4/CMakeLists.txt | 2 ++ .../CMakeLists.txt | 6 ++-- .../Code.cxx | 30 +++++++--------- .../Documentation.rst | 21 +++-------- .../levelsets.gif.cid | 1 - .../levelsets.png.cid | 1 - .../CMakeLists.txt | 7 ++-- .../Code.cxx | 36 ++++++++++--------- .../Documentation.rst | 22 +++--------- .../levelsets.gif.cid | 1 - .../levelsets.png.cid | 1 - src/Segmentation/LevelSetsv4/index.rst | 2 ++ 12 files changed, 53 insertions(+), 77 deletions(-) delete mode 100644 src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/levelsets.gif.cid delete mode 100644 src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/levelsets.png.cid delete mode 100644 src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/levelsets.gif.cid delete mode 100644 src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/levelsets.png.cid diff --git a/src/Segmentation/LevelSetsv4/CMakeLists.txt b/src/Segmentation/LevelSetsv4/CMakeLists.txt index 9e7a449f6..feda596af 100644 --- a/src/Segmentation/LevelSetsv4/CMakeLists.txt +++ b/src/Segmentation/LevelSetsv4/CMakeLists.txt @@ -1,3 +1,5 @@ +add_example(VisualizeEvolvingDense2DLevelSetZeroSet) +add_example(VisualizeEvolvingDense2DLevelSetAsElevationMap) add_example(VisualizeStaticDense2DLevelSetAsElevationMap) add_example(VisualizeStaticDense2DLevelSetZeroSet) add_example(VisualizeStaticWhitaker2DLevelSetLayers) diff --git a/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/CMakeLists.txt b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/CMakeLists.txt index 4ef6049b5..671fcdb7b 100644 --- a/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/CMakeLists.txt +++ b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/CMakeLists.txt @@ -17,7 +17,7 @@ target_link_libraries( install( TARGETS ${PROJECT_NAME} - DESTINATION bin/ITKSphinxExamples/Bridge/VtkGlue + DESTINATION bin/ITKSphinxExamples/Segmentation/LevelSetsv4 COMPONENT Runtime ) @@ -26,7 +26,7 @@ install( Code.cxx CMakeLists.txt DESTINATION - share/ITKSphinxExamples/Code/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetAsElevationMap + share/ITKSphinxExamples/Code/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap COMPONENT Code ) @@ -35,7 +35,7 @@ add_test( NAME VisualizeEvolvingDense2DLevelSetAsElevationMapTest COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${PROJECT_NAME} - ${CMAKE_CURRENT_BINARY_DIR}/cells.png 100 + ${CMAKE_CURRENT_BINARY_DIR}/cells.png 100 Output.mha ) set_tests_properties( VisualizeEvolvingDense2DLevelSetAsElevationMapTest diff --git a/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/Code.cxx b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/Code.cxx index c683cce30..02db5e5dd 100644 --- a/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/Code.cxx +++ b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/Code.cxx @@ -18,7 +18,6 @@ #include "itkBinaryImageToLevelSetImageAdaptor.h" #include "itkImageFileReader.h" -#include "itkLevelSetIterationUpdateCommand.h" #include "itkLevelSetContainer.h" #include "itkLevelSetEquationChanAndVeseInternalTerm.h" #include "itkLevelSetEquationChanAndVeseExternalTerm.h" @@ -27,18 +26,19 @@ #include "itkLevelSetEvolution.h" #include "itkLevelSetEvolutionNumberOfIterationsStoppingCriterion.h" #include "itkLevelSetDenseImage.h" -#include "itkVTKVisualize2DLevelSetAsElevationMap.h" +#include "itkImageFileWriter.h" #include "itkSinRegularizedHeavisideStepFunction.h" int main(int argc, char * argv[]) { - if (argc != 3) + if (argc != 4) { std::cerr << "Missing Arguments" << std::endl; std::cerr << argv[0] << std::endl; std::cerr << "1- Input Image" << std::endl; std::cerr << "2- Number of Iterations" << std::endl; + std::cerr << "3- Output Image" << std::endl; return EXIT_FAILURE; } @@ -140,13 +140,6 @@ main(int argc, char * argv[]) auto criterion = StoppingCriterionType::New(); criterion->SetNumberOfIterations(numberOfIterations); - // Create the visualizer - using VisualizationType = itk::VTKVisualize2DLevelSetAsElevationMap; - auto visualizer = VisualizationType::New(); - visualizer->SetInputImage(input); - visualizer->SetLevelSet(levelSet); - visualizer->SetScreenCapture(true); - // Create evolution class using LevelSetEvolutionType = itk::LevelSetEvolution; auto evolution = LevelSetEvolutionType::New(); @@ -154,14 +147,17 @@ main(int argc, char * argv[]) evolution->SetStoppingCriterion(criterion); evolution->SetLevelSetContainer(levelSetContainer); - using IterationUpdateCommandType = itk::LevelSetIterationUpdateCommand; - auto iterationUpdateCommand = IterationUpdateCommandType::New(); - iterationUpdateCommand->SetFilterToUpdate(visualizer); - iterationUpdateCommand->SetUpdatePeriod(5); - - evolution->AddObserver(itk::IterationEvent(), iterationUpdateCommand); - evolution->Update(); + try + { + itk::WriteImage(levelSet->GetImage(), argv[3]); + } + catch (const itk::ExceptionObject & error) + { + std::cerr << "Error: " << error << std::endl; + return EXIT_FAILURE; + } + return EXIT_SUCCESS; } diff --git a/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/Documentation.rst b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/Documentation.rst index cc6ffc63f..c9e158c7f 100644 --- a/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/Documentation.rst +++ b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/Documentation.rst @@ -4,7 +4,6 @@ Visualize an Evolving Dense 2D Level Set as Elevation Map ========================================================= .. index:: - single: VTKVisualize2DLevelSetAsElevationMap single: BinaryImageToLevelSetImageAdaptor single: SinRegularizedHeavisideStepFunction single: LevelSetDenseImage @@ -13,13 +12,13 @@ Visualize an Evolving Dense 2D Level Set as Elevation Map single: LevelSetEquationChanAndVeseExternalTerm single: LevelSetEvolutionNumberOfIterationsStoppingCriterion single: LevelSetEvolution - single: LevelSetIterationUpdateCommand - Synopsis -------- -Visualize an evolving dense level-set function 2D rendered as an elevation map. +Evolve a dense level-set function with the Chan and Vese region terms and write +the final function values as an image. Rendered as a height field, these values +form an elevation map whose zero level is the evolved contour. Results @@ -31,18 +30,6 @@ Results Input image -.. figure:: levelsets.* - :scale: 100% - :alt: Evolving level-sets rendered as an elevation map - - Evolving level-sets - -.. only:: html - - .. image:: levelsets.gif - :scale: 100% - :alt: Evolving level-sets animation - Code ---- @@ -57,4 +44,4 @@ C++ Classes demonstrated -------------------- -.. [breathelink:: itk::VTKVisualize2DLevelSetAsElevationMap] +.. breathelink:: itk::LevelSetEvolution diff --git a/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/levelsets.gif.cid b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/levelsets.gif.cid deleted file mode 100644 index eeef77626..000000000 --- a/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/levelsets.gif.cid +++ /dev/null @@ -1 +0,0 @@ -bafkreifiaeawclmxlfrf6xk6zdmmjfpelkie46cwfv2i4xk2ebn7kslh4i diff --git a/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/levelsets.png.cid b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/levelsets.png.cid deleted file mode 100644 index 5ff8bee35..000000000 --- a/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetAsElevationMap/levelsets.png.cid +++ /dev/null @@ -1 +0,0 @@ -bafkreibfkdk45ylffokvawtcepltk6b23p5kz3m6smmivspaq2a3a73bla diff --git a/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/CMakeLists.txt b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/CMakeLists.txt index b1555c2ed..978edad39 100644 --- a/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/CMakeLists.txt +++ b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/CMakeLists.txt @@ -11,13 +11,14 @@ target_link_libraries( PRIVATE ITK::ITKImageIO ITK::ITKCommonModule + ITK::ITKImageFeatureModule ITK::ITKLevelSetsv4Module ) install( TARGETS ${PROJECT_NAME} - DESTINATION bin/ITKSphinxExamples/Bridge/VtkGlue + DESTINATION bin/ITKSphinxExamples/Segmentation/LevelSetsv4 COMPONENT Runtime ) @@ -26,7 +27,7 @@ install( Code.cxx CMakeLists.txt DESTINATION - share/ITKSphinxExamples/Code/Bridge/VtkGlue/VisualizeEvolvingDense2DLevelSetZeroSet + share/ITKSphinxExamples/Code/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet COMPONENT Code ) @@ -35,7 +36,7 @@ add_test( NAME VisualizeEvolvingDense2DLevelSetZeroSetTest COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${PROJECT_NAME} - ${CMAKE_CURRENT_BINARY_DIR}/cells.png 100 + ${CMAKE_CURRENT_BINARY_DIR}/cells.png 100 Output.png ) set_tests_properties( VisualizeEvolvingDense2DLevelSetZeroSetTest diff --git a/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/Code.cxx b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/Code.cxx index 6c2b5b62f..dd4abd29f 100644 --- a/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/Code.cxx +++ b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/Code.cxx @@ -18,7 +18,6 @@ #include "itkBinaryImageToLevelSetImageAdaptor.h" #include "itkImageFileReader.h" -#include "itkLevelSetIterationUpdateCommand.h" #include "itkLevelSetContainer.h" #include "itkLevelSetEquationChanAndVeseInternalTerm.h" #include "itkLevelSetEquationChanAndVeseExternalTerm.h" @@ -27,18 +26,20 @@ #include "itkLevelSetEvolution.h" #include "itkLevelSetEvolutionNumberOfIterationsStoppingCriterion.h" #include "itkLevelSetDenseImage.h" -#include "itkVTKVisualizeImageLevelSetIsoValues.h" +#include "itkImageFileWriter.h" +#include "itkZeroCrossingImageFilter.h" #include "itkSinRegularizedHeavisideStepFunction.h" int main(int argc, char * argv[]) { - if (argc != 3) + if (argc != 4) { std::cerr << "Missing Arguments" << std::endl; std::cerr << argv[0] << std::endl; std::cerr << "1- Input Image" << std::endl; std::cerr << "2- Number of Iterations" << std::endl; + std::cerr << "3- Output Image" << std::endl; return EXIT_FAILURE; } @@ -140,13 +141,6 @@ main(int argc, char * argv[]) auto criterion = StoppingCriterionType::New(); criterion->SetNumberOfIterations(numberOfIterations); - // Create the visualizer - using VisualizationType = itk::VTKVisualizeImageLevelSetIsoValues; - auto visualizer = VisualizationType::New(); - visualizer->SetInputImage(input); - visualizer->SetLevelSet(levelSet); - visualizer->SetScreenCapture(true); - // Create evolution class using LevelSetEvolutionType = itk::LevelSetEvolution; auto evolution = LevelSetEvolutionType::New(); @@ -154,14 +148,24 @@ main(int argc, char * argv[]) evolution->SetStoppingCriterion(criterion); evolution->SetLevelSetContainer(levelSetContainer); - using IterationUpdateCommandType = itk::LevelSetIterationUpdateCommand; - auto iterationUpdateCommand = IterationUpdateCommandType::New(); - iterationUpdateCommand->SetFilterToUpdate(visualizer); - iterationUpdateCommand->SetUpdatePeriod(5); + evolution->Update(); - evolution->AddObserver(itk::IterationEvent(), iterationUpdateCommand); + using ZeroSetImageType = itk::Image; + using ZeroCrossingFilterType = itk::ZeroCrossingImageFilter; + auto zeroCrossing = ZeroCrossingFilterType::New(); + zeroCrossing->SetInput(levelSet->GetImage()); + zeroCrossing->SetForegroundValue(255); + zeroCrossing->SetBackgroundValue(0); - evolution->Update(); + try + { + itk::WriteImage(zeroCrossing->GetOutput(), argv[3]); + } + catch (const itk::ExceptionObject & error) + { + std::cerr << "Error: " << error << std::endl; + return EXIT_FAILURE; + } return EXIT_SUCCESS; } diff --git a/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/Documentation.rst b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/Documentation.rst index 952c9e4c3..7c4df43b1 100644 --- a/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/Documentation.rst +++ b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/Documentation.rst @@ -4,7 +4,6 @@ Visualize an Evolving Dense 2D Level-Set Zero-Set ================================================= .. index:: - single: VTKVisualizeImageLevelSetIsoValues single: BinaryImageToLevelSetImageAdaptor single: SinRegularizedHeavisideStepFunction single: LevelSetDenseImage @@ -13,13 +12,14 @@ Visualize an Evolving Dense 2D Level-Set Zero-Set single: LevelSetEquationChanAndVeseExternalTerm single: LevelSetEvolutionNumberOfIterationsStoppingCriterion single: LevelSetEvolution - single: LevelSetIterationUpdateCommand - + single: ZeroCrossingImageFilter Synopsis -------- -Visualize the evolving zero-set of a dense level-set function 2D rendered. +Evolve a dense level-set function with the Chan and Vese region terms, extract +the zero set of the result with itk::ZeroCrossingImageFilter, and write the +contour as an image. Results @@ -31,18 +31,6 @@ Results Input image -.. figure:: levelsets.* - :scale: 100% - :alt: Evolving level-sets - - Evolving level-sets - -.. only:: html - - .. image:: levelsets.gif - :scale: 100% - :alt: Evolving level-sets animation - Code ---- @@ -57,4 +45,4 @@ C++ Classes demonstrated -------------------- -.. [breathelink:: itk::VTKVisualizeImageLevelSetIsoValues] +.. breathelink:: itk::LevelSetEvolution diff --git a/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/levelsets.gif.cid b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/levelsets.gif.cid deleted file mode 100644 index 97c5c389a..000000000 --- a/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/levelsets.gif.cid +++ /dev/null @@ -1 +0,0 @@ -bafkreicxozgqar2qalgdxpjnu4vkbksgwff24utta6gybdexal3xa2aig4 diff --git a/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/levelsets.png.cid b/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/levelsets.png.cid deleted file mode 100644 index 96944861f..000000000 --- a/src/Segmentation/LevelSetsv4/VisualizeEvolvingDense2DLevelSetZeroSet/levelsets.png.cid +++ /dev/null @@ -1 +0,0 @@ -bafkreifw55gmpkyzw6rxkflxfcmi5abdr7o6zajsb2fjcrkead4cqxvhhe diff --git a/src/Segmentation/LevelSetsv4/index.rst b/src/Segmentation/LevelSetsv4/index.rst index 671980a97..ebb4c0a5f 100644 --- a/src/Segmentation/LevelSetsv4/index.rst +++ b/src/Segmentation/LevelSetsv4/index.rst @@ -4,6 +4,8 @@ LevelSetsv4 .. toctree:: :maxdepth: 1 + VisualizeEvolvingDense2DLevelSetAsElevationMap/Documentation.rst + VisualizeEvolvingDense2DLevelSetZeroSet/Documentation.rst VisualizeStaticDense2DLevelSetAsElevationMap/Documentation.rst VisualizeStaticDense2DLevelSetZeroSet/Documentation.rst VisualizeStaticMalcolm2DLevelSetLayers/Documentation.rst