diff --git a/src/Bridge/VtkGlue/CMakeLists.txt b/src/Bridge/VtkGlue/CMakeLists.txt index 46249be9d..f45960e7b 100644 --- a/src/Bridge/VtkGlue/CMakeLists.txt +++ b/src/Bridge/VtkGlue/CMakeLists.txt @@ -13,10 +13,5 @@ if(ENABLE_QUICKVIEW) if(ITK_VERSION_MAJOR LESS 5) add_example(VisualizeEvolvingDense2DLevelSetAsElevationMap) add_example(VisualizeEvolvingDense2DLevelSetZeroSet) - add_example(VisualizeStaticDense2DLevelSetAsElevationMap) - add_example(VisualizeStaticDense2DLevelSetZeroSet) - add_example(VisualizeStaticWhitaker2DLevelSetLayers) - add_example(VisualizeStaticShi2DLevelSetLayers) - add_example(VisualizeStaticMalcolm2DLevelSetLayers) endif() endif() diff --git a/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetAsElevationMap/CMakeLists.txt b/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetAsElevationMap/CMakeLists.txt deleted file mode 100644 index c72ad8b9d..000000000 --- a/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetAsElevationMap/CMakeLists.txt +++ /dev/null @@ -1,66 +0,0 @@ -cmake_minimum_required(VERSION 3.22.1) - -project(VisualizeStaticDense2DLevelSetAsElevationMap) - -find_package(ITK REQUIRED) -itk_generate_factory_registration() - -find_package(VTK REQUIRED) -set(_vtk_prefix "") -if(VTK_VERSION VERSION_LESS "8.90.0") - set(_vtk_prefix "vtk") -endif() -find_package( - VTK - REQUIRED - COMPONENTS - ${_vtk_prefix}InteractionImage - ${_vtk_prefix}RenderingCore - ${_vtk_prefix}RenderingGL2PSOpenGL2 -) -if(VTK_VERSION VERSION_LESS "8.90.0") - include(${VTK_USE_FILE}) -endif() - -add_executable(${PROJECT_NAME} Code.cxx) -target_link_libraries( - ${PROJECT_NAME} - PRIVATE - ITK::ITKImageIO - ITK::ITKCommonModule - ITK::ITKImageIntensityModule - ITK::ITKLevelSetsv4Module - ITK::ITKThresholdingModule - ${VTK_LIBRARIES} -) - -if(NOT VTK_VERSION VERSION_LESS "8.90.0") - vtk_module_autoinit( - TARGETS VisualizeStaticDense2DLevelSetAsElevationMap - MODULES ${VTK_LIBRARIES} - ) -endif() - -install( - TARGETS - ${PROJECT_NAME} - DESTINATION bin/ITKSphinxExamples/Bridge/VtkGlue - COMPONENT Runtime -) - -install( - FILES - Code.cxx - CMakeLists.txt - DESTINATION - share/ITKSphinxExamples/Code/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetAsElevationMap - COMPONENT Code -) - -enable_testing() -add_test( - NAME VisualizeStaticDense2DLevelSetAsElevationMapTest - COMMAND - ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${PROJECT_NAME} - ${CMAKE_CURRENT_BINARY_DIR}/cells.png 0 -) diff --git a/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetAsElevationMap/levelsets.png.cid b/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetAsElevationMap/levelsets.png.cid deleted file mode 100644 index ad0fe0480..000000000 --- a/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetAsElevationMap/levelsets.png.cid +++ /dev/null @@ -1 +0,0 @@ -bafkreidxkuox2akyly32w34hewhfug6xwqbna4nul5catzmd37zxs7moju diff --git a/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetZeroSet/CMakeLists.txt b/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetZeroSet/CMakeLists.txt deleted file mode 100644 index 1afe12f2a..000000000 --- a/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetZeroSet/CMakeLists.txt +++ /dev/null @@ -1,65 +0,0 @@ -cmake_minimum_required(VERSION 3.22.1) - -project(VisualizeStaticDense2DLevelSetZeroSet) - -find_package(ITK REQUIRED) -itk_generate_factory_registration() - -find_package(VTK REQUIRED) -set(_vtk_prefix "") -if(VTK_VERSION VERSION_LESS "8.90.0") - set(_vtk_prefix "vtk") -endif() -find_package( - VTK - REQUIRED - COMPONENTS - ${_vtk_prefix}RenderingCore - ${_vtk_prefix}RenderingGL2PSOpenGL2 -) -if(VTK_VERSION VERSION_LESS "8.90.0") - include(${VTK_USE_FILE}) -endif() - -add_executable(${PROJECT_NAME} Code.cxx) -target_link_libraries( - ${PROJECT_NAME} - PRIVATE - ITK::ITKImageIO - ITK::ITKCommonModule - ITK::ITKImageIntensityModule - ITK::ITKLevelSetsv4Module - ITK::ITKThresholdingModule - ${VTK_LIBRARIES} -) - -if(NOT VTK_VERSION VERSION_LESS "8.90.0") - vtk_module_autoinit( - TARGETS VisualizeStaticDense2DLevelSetZeroSet - MODULES ${VTK_LIBRARIES} - ) -endif() - -install( - TARGETS - ${PROJECT_NAME} - DESTINATION bin/ITKSphinxExamples/Bridge/VtkGlue - COMPONENT Runtime -) - -install( - FILES - Code.cxx - CMakeLists.txt - DESTINATION - share/ITKSphinxExamples/Code/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetZeroSet - COMPONENT Code -) - -enable_testing() -add_test( - NAME VisualizeStaticDense2DLevelSetZeroSetTest - COMMAND - ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${PROJECT_NAME} - ${CMAKE_CURRENT_BINARY_DIR}/cells.png 0 -) diff --git a/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetZeroSet/levelsets.png.cid b/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetZeroSet/levelsets.png.cid deleted file mode 100644 index 791d10c26..000000000 --- a/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetZeroSet/levelsets.png.cid +++ /dev/null @@ -1 +0,0 @@ -bafkreifss6f6rf52dqksukr55nd2rdlylurtbnyq76islwd2iq336pcqvm diff --git a/src/Bridge/VtkGlue/VisualizeStaticMalcolm2DLevelSetLayers/Documentation.rst b/src/Bridge/VtkGlue/VisualizeStaticMalcolm2DLevelSetLayers/Documentation.rst deleted file mode 100644 index 7e4942183..000000000 --- a/src/Bridge/VtkGlue/VisualizeStaticMalcolm2DLevelSetLayers/Documentation.rst +++ /dev/null @@ -1,50 +0,0 @@ -:name: VisualizeStaticMalcolm2DLevelSetLayers - -Visualize a Static Sparse Malcolm 2D Level-Set Layers -===================================================== - -.. index:: - single: vtkVisualize2DSparseLevelSetLayers - single: BinaryImageToLevelSetImageAdaptor - single: MalcolmSparseLevelSetImage - -Synopsis --------- - -Visualize a static sparse Malcolm level-set function 2D's layers. From the input -image, first an otsu thresholding technique is used to get a binary mask, which -is then converted to a sparse level-set function. - -Note that Malcolm's representation is composed of a single layer (value = {0}); - - -Results -------- - -.. figure:: cells.png - :scale: 100% - :alt: Input image (cells) - - Input image - -.. figure:: levelsets.png - :scale: 100% - :alt: Static level-sets zero-sets - - Static level-sets - - -Code ----- - -C++ -... - -.. literalinclude:: Code.cxx - :lines: 18- - - -Classes demonstrated --------------------- - -.. [breathelink:: itk::VTKVisualize2DSparseLevelSetLayers] diff --git a/src/Bridge/VtkGlue/VisualizeStaticMalcolm2DLevelSetLayers/levelsets.png.cid b/src/Bridge/VtkGlue/VisualizeStaticMalcolm2DLevelSetLayers/levelsets.png.cid deleted file mode 100644 index d4dfea62a..000000000 --- a/src/Bridge/VtkGlue/VisualizeStaticMalcolm2DLevelSetLayers/levelsets.png.cid +++ /dev/null @@ -1 +0,0 @@ -bafkreifzglkksrmutkyvdixsbr4wwjknhakmai2aarefnwknuawwyjcpyq diff --git a/src/Bridge/VtkGlue/VisualizeStaticShi2DLevelSetLayers/CMakeLists.txt b/src/Bridge/VtkGlue/VisualizeStaticShi2DLevelSetLayers/CMakeLists.txt deleted file mode 100644 index 43b825d6c..000000000 --- a/src/Bridge/VtkGlue/VisualizeStaticShi2DLevelSetLayers/CMakeLists.txt +++ /dev/null @@ -1,64 +0,0 @@ -cmake_minimum_required(VERSION 3.22.1) - -project(VisualizeStaticShi2DLevelSetLayers) - -find_package(ITK REQUIRED) -itk_generate_factory_registration() - -find_package(VTK REQUIRED) -set(_vtk_prefix "") -if(VTK_VERSION VERSION_LESS "8.90.0") - set(_vtk_prefix "vtk") -endif() -find_package( - VTK - REQUIRED - COMPONENTS - ${_vtk_prefix}RenderingCore - ${_vtk_prefix}RenderingGL2PSOpenGL2 -) -if(VTK_VERSION VERSION_LESS "8.90.0") - include(${VTK_USE_FILE}) -endif() - -add_executable(${PROJECT_NAME} Code.cxx) -target_link_libraries( - ${PROJECT_NAME} - PRIVATE - ITK::ITKImageIO - ITK::ITKImageIntensityModule - ITK::ITKLevelSetsv4Module - ITK::ITKThresholdingModule - ${VTK_LIBRARIES} -) - -if(NOT VTK_VERSION VERSION_LESS "8.90.0") - vtk_module_autoinit( - TARGETS VisualizeStaticShi2DLevelSetLayers - MODULES ${VTK_LIBRARIES} - ) -endif() - -install( - TARGETS - ${PROJECT_NAME} - DESTINATION bin/ITKSphinxExamples/Bridge/VtkGlue - COMPONENT Runtime -) - -install( - FILES - Code.cxx - CMakeLists.txt - DESTINATION - share/ITKSphinxExamples/Code/Bridge/VtkGlue/VisualizeStaticShi2DLevelSetLayers - COMPONENT Code -) - -enable_testing() -add_test( - NAME VisualizeStaticShi2DLevelSetLayersTest - COMMAND - ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${PROJECT_NAME} - ${CMAKE_CURRENT_BINARY_DIR}/cells.png 0 -) diff --git a/src/Bridge/VtkGlue/VisualizeStaticShi2DLevelSetLayers/Documentation.rst b/src/Bridge/VtkGlue/VisualizeStaticShi2DLevelSetLayers/Documentation.rst deleted file mode 100644 index 905ac3709..000000000 --- a/src/Bridge/VtkGlue/VisualizeStaticShi2DLevelSetLayers/Documentation.rst +++ /dev/null @@ -1,50 +0,0 @@ -:name: VisualizeStaticShi2DLevelSetLayers - -Visualize a Static Sparse Shi 2D Level-Set Layers -================================================= - -.. index:: - single: vtkVisualize2DSparseLevelSetLayers - single: BinaryImageToLevelSetImageAdaptor - single: ShiSparseLevelSetImage - -Synopsis --------- - -Visualize a static sparse Shi level-set function 2D's layers. From the input -image, first an otsu thresholding technique is used to get a binary mask, which -is then converted to a sparse level-set function. - -Note that Shi's representation is composed of 4 layers (values = {-3, -1, +1, +3}) - - -Results -------- - -.. figure:: cells.png - :scale: 100% - :alt: Input image (cells) - - Input image - -.. figure:: levelsets.png - :scale: 100% - :alt: Static level-sets zero-sets - - Static level-sets - - -Code ----- - -C++ -... - -.. literalinclude:: Code.cxx - :lines: 18- - - -Classes demonstrated --------------------- - -.. [breathelink:: itk::VTKVisualize2DSparseLevelSetLayers] diff --git a/src/Bridge/VtkGlue/VisualizeStaticShi2DLevelSetLayers/levelsets.png.cid b/src/Bridge/VtkGlue/VisualizeStaticShi2DLevelSetLayers/levelsets.png.cid deleted file mode 100644 index c9e0fad76..000000000 --- a/src/Bridge/VtkGlue/VisualizeStaticShi2DLevelSetLayers/levelsets.png.cid +++ /dev/null @@ -1 +0,0 @@ -bafkreieqtjuwbwk6o2pmr3a7tyyvo6gp35jnzmpumb4kp7excbewwxmot4 diff --git a/src/Bridge/VtkGlue/VisualizeStaticWhitaker2DLevelSetLayers/CMakeLists.txt b/src/Bridge/VtkGlue/VisualizeStaticWhitaker2DLevelSetLayers/CMakeLists.txt deleted file mode 100644 index 5bae6363e..000000000 --- a/src/Bridge/VtkGlue/VisualizeStaticWhitaker2DLevelSetLayers/CMakeLists.txt +++ /dev/null @@ -1,64 +0,0 @@ -cmake_minimum_required(VERSION 3.22.1) - -project(VisualizeStaticWhitaker2DLevelSetLayers) - -find_package(ITK REQUIRED) -itk_generate_factory_registration() - -find_package(VTK REQUIRED) -set(_vtk_prefix "") -if(VTK_VERSION VERSION_LESS "8.90.0") - set(_vtk_prefix "vtk") -endif() -find_package( - VTK - REQUIRED - COMPONENTS - ${_vtk_prefix}RenderingCore - ${_vtk_prefix}RenderingGL2PSOpenGL2 -) -if(VTK_VERSION VERSION_LESS "8.90.0") - include(${VTK_USE_FILE}) -endif() - -add_executable(${PROJECT_NAME} Code.cxx) -target_link_libraries( - ${PROJECT_NAME} - PRIVATE - ITK::ITKImageIO - ITK::ITKImageIntensityModule - ITK::ITKLevelSetsv4Module - ITK::ITKThresholdingModule - ${VTK_LIBRARIES} -) - -if(NOT VTK_VERSION VERSION_LESS "8.90.0") - vtk_module_autoinit( - TARGETS VisualizeStaticWhitaker2DLevelSetLayers - MODULES ${VTK_LIBRARIES} - ) -endif() - -install( - TARGETS - ${PROJECT_NAME} - DESTINATION bin/ITKSphinxExamples/Bridge/VtkGlue - COMPONENT Runtime -) - -install( - FILES - Code.cxx - CMakeLists.txt - DESTINATION - share/ITKSphinxExamples/Code/Bridge/VtkGlue/VisualizeStaticWhitaker2DLevelSetLayers - COMPONENT Code -) - -enable_testing() -add_test( - NAME VisualizeStaticWhitaker2DLevelSetLayersTest - COMMAND - ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${PROJECT_NAME} - ${CMAKE_CURRENT_BINARY_DIR}/cells.png 0 -) diff --git a/src/Bridge/VtkGlue/VisualizeStaticWhitaker2DLevelSetLayers/Documentation.rst b/src/Bridge/VtkGlue/VisualizeStaticWhitaker2DLevelSetLayers/Documentation.rst deleted file mode 100644 index 0a8b5a675..000000000 --- a/src/Bridge/VtkGlue/VisualizeStaticWhitaker2DLevelSetLayers/Documentation.rst +++ /dev/null @@ -1,49 +0,0 @@ -:name: VisualizeStaticWhitaker2DLevelSetLayers - -Visualize a Static Sparse Whitaker 2D Level-Set Layers -====================================================== - -.. index:: - single: vtkVisualize2DSparseLevelSetLayers - single: BinaryImageToLevelSetImageAdaptor - single: WhitakerSparseLevelSetImage - -Synopsis --------- - -Visualize a static sparse Whitaker level-set function 2D's layers. From the input -image, first an otsu thresholding technique is used to get a binary mask, which -is then converted to a sparse level-set function. - -Note that Whitaker's representation is composed of 5 layers where values are real. - -Results -------- - -.. figure:: cells.png - :scale: 100% - :alt: Input image (cells) - - Input image - -.. figure:: levelsets.png - :scale: 100% - :alt: Static level-sets zero-sets - - Static level-sets - - -Code ----- - -C++ -... - -.. literalinclude:: Code.cxx - :lines: 18- - - -Classes demonstrated --------------------- - -.. [breathelink:: itk::VTKVisualize2DSparseLevelSetLayers] diff --git a/src/Bridge/VtkGlue/VisualizeStaticWhitaker2DLevelSetLayers/levelsets.png.cid b/src/Bridge/VtkGlue/VisualizeStaticWhitaker2DLevelSetLayers/levelsets.png.cid deleted file mode 100644 index c9e0fad76..000000000 --- a/src/Bridge/VtkGlue/VisualizeStaticWhitaker2DLevelSetLayers/levelsets.png.cid +++ /dev/null @@ -1 +0,0 @@ -bafkreieqtjuwbwk6o2pmr3a7tyyvo6gp35jnzmpumb4kp7excbewwxmot4 diff --git a/src/Bridge/VtkGlue/index.rst b/src/Bridge/VtkGlue/index.rst index 791420dc7..afcc1865b 100644 --- a/src/Bridge/VtkGlue/index.rst +++ b/src/Bridge/VtkGlue/index.rst @@ -10,9 +10,4 @@ VtkGlue ConvertvtkImageDataToAnitkImage/Documentation.rst VisualizeEvolvingDense2DLevelSetAsElevationMap/Documentation.rst VisualizeEvolvingDense2DLevelSetZeroSet/Documentation.rst - VisualizeStaticDense2DLevelSetAsElevationMap/Documentation.rst - VisualizeStaticDense2DLevelSetZeroSet/Documentation.rst - VisualizeStaticMalcolm2DLevelSetLayers/Documentation.rst - VisualizeStaticShi2DLevelSetLayers/Documentation.rst - VisualizeStaticWhitaker2DLevelSetLayers/Documentation.rst VTKImageToITKImage/Documentation.rst diff --git a/src/Segmentation/CMakeLists.txt b/src/Segmentation/CMakeLists.txt index fe0d3c6ef..069c2721e 100644 --- a/src/Segmentation/CMakeLists.txt +++ b/src/Segmentation/CMakeLists.txt @@ -7,6 +7,7 @@ set( KLMRegionGrowing LabelVoting LevelSets + LevelSetsv4 RegionGrowing Voronoi Watersheds diff --git a/src/Segmentation/LevelSetsv4/CMakeLists.txt b/src/Segmentation/LevelSetsv4/CMakeLists.txt new file mode 100644 index 000000000..9e7a449f6 --- /dev/null +++ b/src/Segmentation/LevelSetsv4/CMakeLists.txt @@ -0,0 +1,5 @@ +add_example(VisualizeStaticDense2DLevelSetAsElevationMap) +add_example(VisualizeStaticDense2DLevelSetZeroSet) +add_example(VisualizeStaticWhitaker2DLevelSetLayers) +add_example(VisualizeStaticShi2DLevelSetLayers) +add_example(VisualizeStaticMalcolm2DLevelSetLayers) diff --git a/src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetAsElevationMap/CMakeLists.txt b/src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetAsElevationMap/CMakeLists.txt new file mode 100644 index 000000000..0dcbfc84d --- /dev/null +++ b/src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetAsElevationMap/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.22.1) + +project(VisualizeStaticDense2DLevelSetAsElevationMap) + +find_package(ITK REQUIRED) +itk_generate_factory_registration() + +add_executable(${PROJECT_NAME} Code.cxx) +target_link_libraries( + ${PROJECT_NAME} + PRIVATE + ITK::ITKImageIO + ITK::ITKImageIntensityModule + ITK::ITKLevelSetsv4Module + ITK::ITKThresholdingModule +) + +install( + TARGETS + ${PROJECT_NAME} + DESTINATION bin/ITKSphinxExamples/Segmentation/LevelSetsv4 + COMPONENT Runtime +) + +install( + FILES + Code.cxx + CMakeLists.txt + DESTINATION + share/ITKSphinxExamples/Code/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetAsElevationMap + COMPONENT Code +) + +enable_testing() +add_test( + NAME VisualizeStaticDense2DLevelSetAsElevationMapTest + COMMAND + ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${PROJECT_NAME} + ${CMAKE_CURRENT_BINARY_DIR}/cells.png Output.mha +) diff --git a/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetAsElevationMap/Code.cxx b/src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetAsElevationMap/Code.cxx similarity index 66% rename from src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetAsElevationMap/Code.cxx rename to src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetAsElevationMap/Code.cxx index 881f9206d..1a06b6999 100644 --- a/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetAsElevationMap/Code.cxx +++ b/src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetAsElevationMap/Code.cxx @@ -18,21 +18,10 @@ #include "itkBinaryImageToLevelSetImageAdaptor.h" #include "itkImageFileReader.h" -#include "itkLevelSetIterationUpdateCommand.h" -#include "itkLevelSetContainer.h" -#include "itkLevelSetEquationChanAndVeseInternalTerm.h" -#include "itkLevelSetEquationChanAndVeseExternalTerm.h" -#include "itkLevelSetEquationContainer.h" -#include "itkLevelSetEquationTermContainer.h" -#include "itkLevelSetEvolution.h" -#include "itkLevelSetEvolutionNumberOfIterationsStoppingCriterion.h" +#include "itkImageFileWriter.h" #include "itkLevelSetDenseImage.h" -#include "itkVTKVisualize2DLevelSetAsElevationMap.h" -#include "itkSinRegularizedHeavisideStepFunction.h" - #include "itkOtsuMultipleThresholdsImageFilter.h" #include "itkRescaleIntensityImageFilter.h" -#include "vtkRenderWindowInteractor.h" int main(int argc, char * argv[]) @@ -41,11 +30,10 @@ main(int argc, char * argv[]) { std::cerr << "Missing Arguments" << std::endl; std::cerr << argv[0] << std::endl; - std::cerr << " " << std::endl; + std::cerr << " " << std::endl; return EXIT_FAILURE; } - // Image Dimension constexpr unsigned int Dimension = 2; using InputPixelType = unsigned char; @@ -58,7 +46,7 @@ main(int argc, char * argv[]) using LevelSetType = itk::LevelSetDenseImage; // Generate a binary mask that will be used as initialization for the level - // set evolution. + // set. using OtsuFilterType = itk::OtsuMultipleThresholdsImageFilter; auto otsu = OtsuFilterType::New(); otsu->SetInput(input); @@ -70,28 +58,19 @@ main(int argc, char * argv[]) rescaler->SetInput(otsu->GetOutput()); rescaler->SetOutputMinimum(0); rescaler->SetOutputMaximum(1); + rescaler->Update(); - // convert a binary mask to a level-set function + // Convert the binary mask to a level-set function using BinaryImageToLevelSetType = itk::BinaryImageToLevelSetImageAdaptor; - auto adaptor = BinaryImageToLevelSetType::New(); adaptor->SetInputImage(rescaler->GetOutput()); adaptor->Initialize(); LevelSetType::Pointer levelSet = adaptor->GetModifiableLevelSet(); - // Create the visualizer - using VisualizationType = itk::VTKVisualize2DLevelSetAsElevationMap; - auto visualizer = VisualizationType::New(); - visualizer->SetInputImage(input); - visualizer->SetLevelSet(levelSet); - - vtkSmartPointer renderWindowInteractor = vtkSmartPointer::New(); - renderWindowInteractor->SetRenderWindow(visualizer->GetRenderWindow()); - try { - visualizer->Update(); + itk::WriteImage(levelSet->GetImage(), argv[2]); } catch (const itk::ExceptionObject & error) { @@ -99,11 +78,5 @@ main(int argc, char * argv[]) return EXIT_FAILURE; } - bool interactive = (std::stoi(argv[2]) != 0); - if (interactive) - { - renderWindowInteractor->Start(); - } - return EXIT_SUCCESS; } diff --git a/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetAsElevationMap/Documentation.rst b/src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetAsElevationMap/Documentation.rst similarity index 51% rename from src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetAsElevationMap/Documentation.rst rename to src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetAsElevationMap/Documentation.rst index 5b8cf3f60..7bb3957be 100644 --- a/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetAsElevationMap/Documentation.rst +++ b/src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetAsElevationMap/Documentation.rst @@ -4,16 +4,16 @@ Visualize a Static Dense 2D Level Set as Elevation Map ====================================================== .. index:: - single: VTKVisualize2DLevelSetAsElevationMap single: BinaryImageToLevelSetImageAdaptor single: LevelSetDenseImage Synopsis -------- -Visualize a static dense level-set function 2D rendered as an elevation map. -From the input image, first an otsu thresholding technique is used to get a -binary mask, which is then converted to a dense level-set function. +Convert a binary mask into a dense level-set function and write the function +values as an image. Rendered as a height field, these values form an elevation +map whose zero level is the contour. The mask comes from an Otsu threshold of +the input image. Results @@ -25,12 +25,6 @@ Results Input image -.. figure:: levelsets.png - :scale: 100% - :alt: Static level-sets rendered as an elevation map - - Static level-sets - Code ---- @@ -45,4 +39,4 @@ C++ Classes demonstrated -------------------- -.. [breathelink:: itk::VTKVisualize2DLevelSetAsElevationMap] +.. breathelink:: itk::LevelSetDenseImage diff --git a/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetAsElevationMap/cells.png.cid b/src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetAsElevationMap/cells.png.cid similarity index 100% rename from src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetAsElevationMap/cells.png.cid rename to src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetAsElevationMap/cells.png.cid diff --git a/src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetZeroSet/CMakeLists.txt b/src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetZeroSet/CMakeLists.txt new file mode 100644 index 000000000..94fa7fc2d --- /dev/null +++ b/src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetZeroSet/CMakeLists.txt @@ -0,0 +1,41 @@ +cmake_minimum_required(VERSION 3.22.1) + +project(VisualizeStaticDense2DLevelSetZeroSet) + +find_package(ITK REQUIRED) +itk_generate_factory_registration() + +add_executable(${PROJECT_NAME} Code.cxx) +target_link_libraries( + ${PROJECT_NAME} + PRIVATE + ITK::ITKImageIO + ITK::ITKImageFeatureModule + ITK::ITKImageIntensityModule + ITK::ITKLevelSetsv4Module + ITK::ITKThresholdingModule +) + +install( + TARGETS + ${PROJECT_NAME} + DESTINATION bin/ITKSphinxExamples/Segmentation/LevelSetsv4 + COMPONENT Runtime +) + +install( + FILES + Code.cxx + CMakeLists.txt + DESTINATION + share/ITKSphinxExamples/Code/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetZeroSet + COMPONENT Code +) + +enable_testing() +add_test( + NAME VisualizeStaticDense2DLevelSetZeroSetTest + COMMAND + ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${PROJECT_NAME} + ${CMAKE_CURRENT_BINARY_DIR}/cells.png Output.png +) diff --git a/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetZeroSet/Code.cxx b/src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetZeroSet/Code.cxx similarity index 66% rename from src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetZeroSet/Code.cxx rename to src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetZeroSet/Code.cxx index 1d931949a..fcd7533e4 100644 --- a/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetZeroSet/Code.cxx +++ b/src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetZeroSet/Code.cxx @@ -18,21 +18,11 @@ #include "itkBinaryImageToLevelSetImageAdaptor.h" #include "itkImageFileReader.h" -#include "itkLevelSetIterationUpdateCommand.h" -#include "itkLevelSetContainer.h" -#include "itkLevelSetEquationChanAndVeseInternalTerm.h" -#include "itkLevelSetEquationChanAndVeseExternalTerm.h" -#include "itkLevelSetEquationContainer.h" -#include "itkLevelSetEquationTermContainer.h" -#include "itkLevelSetEvolution.h" -#include "itkLevelSetEvolutionNumberOfIterationsStoppingCriterion.h" +#include "itkImageFileWriter.h" #include "itkLevelSetDenseImage.h" -#include "itkVTKVisualizeImageLevelSetIsoValues.h" -#include "itkSinRegularizedHeavisideStepFunction.h" - #include "itkOtsuMultipleThresholdsImageFilter.h" #include "itkRescaleIntensityImageFilter.h" -#include "vtkRenderWindowInteractor.h" +#include "itkZeroCrossingImageFilter.h" int main(int argc, char * argv[]) @@ -41,11 +31,10 @@ main(int argc, char * argv[]) { std::cerr << "Missing Arguments" << std::endl; std::cerr << argv[0] << std::endl; - std::cerr << " " << std::endl; + std::cerr << " " << std::endl; return EXIT_FAILURE; } - // Image Dimension constexpr unsigned int Dimension = 2; using InputPixelType = unsigned char; @@ -58,7 +47,7 @@ main(int argc, char * argv[]) using LevelSetType = itk::LevelSetDenseImage; // Generate a binary mask that will be used as initialization for the level - // set evolution. + // set. using OtsuFilterType = itk::OtsuMultipleThresholdsImageFilter; auto otsu = OtsuFilterType::New(); otsu->SetInput(input); @@ -70,28 +59,26 @@ main(int argc, char * argv[]) rescaler->SetInput(otsu->GetOutput()); rescaler->SetOutputMinimum(0); rescaler->SetOutputMaximum(1); + rescaler->Update(); - // convert a binary mask to a level-set function + // Convert the binary mask to a level-set function using BinaryImageToLevelSetType = itk::BinaryImageToLevelSetImageAdaptor; - auto adaptor = BinaryImageToLevelSetType::New(); adaptor->SetInputImage(rescaler->GetOutput()); adaptor->Initialize(); LevelSetType::Pointer levelSet = adaptor->GetModifiableLevelSet(); - // Create the visualizer - using VisualizationType = itk::VTKVisualizeImageLevelSetIsoValues; - auto visualizer = VisualizationType::New(); - visualizer->SetInputImage(input); - visualizer->SetLevelSet(levelSet); - - vtkSmartPointer renderWindowInteractor = vtkSmartPointer::New(); - renderWindowInteractor->SetRenderWindow(visualizer->GetRenderWindow()); + using ZeroSetImageType = itk::Image; + using ZeroCrossingFilterType = itk::ZeroCrossingImageFilter; + auto zeroCrossing = ZeroCrossingFilterType::New(); + zeroCrossing->SetInput(levelSet->GetImage()); + zeroCrossing->SetForegroundValue(255); + zeroCrossing->SetBackgroundValue(0); try { - visualizer->Update(); + itk::WriteImage(zeroCrossing->GetOutput(), argv[2]); } catch (const itk::ExceptionObject & error) { @@ -99,11 +86,5 @@ main(int argc, char * argv[]) return EXIT_FAILURE; } - bool interactive = (std::stoi(argv[2]) != 0); - if (interactive) - { - renderWindowInteractor->Start(); - } - return EXIT_SUCCESS; } diff --git a/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetZeroSet/Documentation.rst b/src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetZeroSet/Documentation.rst similarity index 52% rename from src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetZeroSet/Documentation.rst rename to src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetZeroSet/Documentation.rst index 4054d3dc3..c00184ce2 100644 --- a/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetZeroSet/Documentation.rst +++ b/src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetZeroSet/Documentation.rst @@ -4,16 +4,16 @@ Visualize a Static Dense 2D Level-Set Zero-Set ============================================== .. index:: - single: VTKVisualizeImageLevelSetIsoValues single: BinaryImageToLevelSetImageAdaptor single: LevelSetDenseImage + single: ZeroCrossingImageFilter Synopsis -------- -Visualize a static dense level-set function 2D's zero set. From the input -image, first an otsu thresholding technique is used to get a binary mask, which -is then converted to a dense level-set function. +Convert a binary mask into a dense level-set function, extract its zero set +with itk::ZeroCrossingImageFilter, and write the contour as an image. The mask +comes from an Otsu threshold of the input image. Results @@ -25,12 +25,6 @@ Results Input image -.. figure:: levelsets.png - :scale: 100% - :alt: Static level-sets zero-sets - - Static level-sets - Code ---- @@ -45,4 +39,4 @@ C++ Classes demonstrated -------------------- -.. [breathelink:: itk::VTKVisualizeImageLevelSetIsoValues] +.. breathelink:: itk::LevelSetDenseImage diff --git a/src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetZeroSet/cells.png.cid b/src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetZeroSet/cells.png.cid similarity index 100% rename from src/Bridge/VtkGlue/VisualizeStaticDense2DLevelSetZeroSet/cells.png.cid rename to src/Segmentation/LevelSetsv4/VisualizeStaticDense2DLevelSetZeroSet/cells.png.cid diff --git a/src/Bridge/VtkGlue/VisualizeStaticMalcolm2DLevelSetLayers/CMakeLists.txt b/src/Segmentation/LevelSetsv4/VisualizeStaticMalcolm2DLevelSetLayers/CMakeLists.txt similarity index 50% rename from src/Bridge/VtkGlue/VisualizeStaticMalcolm2DLevelSetLayers/CMakeLists.txt rename to src/Segmentation/LevelSetsv4/VisualizeStaticMalcolm2DLevelSetLayers/CMakeLists.txt index ce03c8480..c545603e4 100644 --- a/src/Bridge/VtkGlue/VisualizeStaticMalcolm2DLevelSetLayers/CMakeLists.txt +++ b/src/Segmentation/LevelSetsv4/VisualizeStaticMalcolm2DLevelSetLayers/CMakeLists.txt @@ -5,22 +5,6 @@ project(VisualizeStaticMalcolm2DLevelSetLayers) find_package(ITK REQUIRED) itk_generate_factory_registration() -find_package(VTK REQUIRED) -set(_vtk_prefix "") -if(VTK_VERSION VERSION_LESS "8.90.0") - set(_vtk_prefix "vtk") -endif() -find_package( - VTK - REQUIRED - COMPONENTS - ${_vtk_prefix}RenderingCore - ${_vtk_prefix}RenderingGL2PSOpenGL2 -) -if(VTK_VERSION VERSION_LESS "8.90.0") - include(${VTK_USE_FILE}) -endif() - add_executable(${PROJECT_NAME} Code.cxx) target_link_libraries( ${PROJECT_NAME} @@ -29,20 +13,12 @@ target_link_libraries( ITK::ITKImageIntensityModule ITK::ITKLevelSetsv4Module ITK::ITKThresholdingModule - ${VTK_LIBRARIES} ) -if(NOT VTK_VERSION VERSION_LESS "8.90.0") - vtk_module_autoinit( - TARGETS WatchRegistration - MODULES ${VTK_LIBRARIES} - ) -endif() - install( TARGETS ${PROJECT_NAME} - DESTINATION bin/ITKSphinxExamples/Bridge/VtkGlue + DESTINATION bin/ITKSphinxExamples/Segmentation/LevelSetsv4 COMPONENT Runtime ) @@ -51,7 +27,7 @@ install( Code.cxx CMakeLists.txt DESTINATION - share/ITKSphinxExamples/Code/Bridge/VtkGlue/VisualizeStaticMalcolm2DLevelSetLayers + share/ITKSphinxExamples/Code/Segmentation/LevelSetsv4/VisualizeStaticMalcolm2DLevelSetLayers COMPONENT Code ) @@ -60,5 +36,5 @@ add_test( NAME VisualizeStaticMalcolm2DLevelSetLayersTest COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${PROJECT_NAME} - ${CMAKE_CURRENT_BINARY_DIR}/cells.png 0 + ${CMAKE_CURRENT_BINARY_DIR}/cells.png Output.mha ) diff --git a/src/Bridge/VtkGlue/VisualizeStaticMalcolm2DLevelSetLayers/Code.cxx b/src/Segmentation/LevelSetsv4/VisualizeStaticMalcolm2DLevelSetLayers/Code.cxx similarity index 74% rename from src/Bridge/VtkGlue/VisualizeStaticMalcolm2DLevelSetLayers/Code.cxx rename to src/Segmentation/LevelSetsv4/VisualizeStaticMalcolm2DLevelSetLayers/Code.cxx index 25655931e..4432283f7 100644 --- a/src/Bridge/VtkGlue/VisualizeStaticMalcolm2DLevelSetLayers/Code.cxx +++ b/src/Segmentation/LevelSetsv4/VisualizeStaticMalcolm2DLevelSetLayers/Code.cxx @@ -16,15 +16,13 @@ * *=========================================================================*/ -#include "itkVTKVisualize2DSparseLevelSetLayers.h" - #include "itkBinaryImageToLevelSetImageAdaptor.h" #include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkImageRegionIteratorWithIndex.h" #include "itkMalcolmSparseLevelSetImage.h" - #include "itkOtsuMultipleThresholdsImageFilter.h" #include "itkRescaleIntensityImageFilter.h" -#include "vtkRenderWindowInteractor.h" int main(int argc, char * argv[]) @@ -33,11 +31,10 @@ main(int argc, char * argv[]) { std::cerr << "Missing Arguments" << std::endl; std::cerr << argv[0] << std::endl; - std::cerr << " " << std::endl; + std::cerr << " " << std::endl; return EXIT_FAILURE; } - // Image Dimension constexpr unsigned int Dimension = 2; using InputPixelType = unsigned char; @@ -48,7 +45,7 @@ main(int argc, char * argv[]) using LevelSetType = itk::MalcolmSparseLevelSetImage; // Generate a binary mask that will be used as initialization for the level - // set evolution. + // set. using OtsuFilterType = itk::OtsuMultipleThresholdsImageFilter; auto otsu = OtsuFilterType::New(); otsu->SetInput(input); @@ -60,29 +57,32 @@ main(int argc, char * argv[]) rescaler->SetInput(otsu->GetOutput()); rescaler->SetOutputMinimum(0); rescaler->SetOutputMaximum(1); + rescaler->Update(); - // convert a binary mask to a level-set function + // Convert the binary mask to a sparse level-set function using BinaryImageToLevelSetType = itk::BinaryImageToLevelSetImageAdaptor; - auto adaptor = BinaryImageToLevelSetType::New(); adaptor->SetInputImage(rescaler->GetOutput()); adaptor->Initialize(); LevelSetType::Pointer levelSet = adaptor->GetModifiableLevelSet(); - // Create the visualizer - using VisualizationType = itk::VTKVisualize2DSparseLevelSetLayers; - auto visualizer = VisualizationType::New(); - visualizer->SetInputImage(input); - visualizer->SetLevelSet(levelSet); - visualizer->SetScreenCapture(true); + // Sample the level-set function on the image grid to show its layers + using LayerImageType = itk::Image; + auto layers = LayerImageType::New(); + layers->CopyInformation(input); + layers->SetRegions(input->GetLargestPossibleRegion()); + layers->Allocate(); - vtkSmartPointer renderWindowInteractor = vtkSmartPointer::New(); - renderWindowInteractor->SetRenderWindow(visualizer->GetRenderWindow()); + itk::ImageRegionIteratorWithIndex it(layers, layers->GetLargestPossibleRegion()); + for (it.GoToBegin(); !it.IsAtEnd(); ++it) + { + it.Set(levelSet->Evaluate(it.GetIndex())); + } try { - visualizer->Update(); + itk::WriteImage(layers, argv[2]); } catch (const itk::ExceptionObject & error) { @@ -90,11 +90,5 @@ main(int argc, char * argv[]) return EXIT_FAILURE; } - bool interactive = (std::stoi(argv[2]) != 0); - if (interactive) - { - renderWindowInteractor->Start(); - } - return EXIT_SUCCESS; } diff --git a/src/Segmentation/LevelSetsv4/VisualizeStaticMalcolm2DLevelSetLayers/Documentation.rst b/src/Segmentation/LevelSetsv4/VisualizeStaticMalcolm2DLevelSetLayers/Documentation.rst new file mode 100644 index 000000000..1dbcfa838 --- /dev/null +++ b/src/Segmentation/LevelSetsv4/VisualizeStaticMalcolm2DLevelSetLayers/Documentation.rst @@ -0,0 +1,43 @@ +:name: VisualizeStaticMalcolm2DLevelSetLayers + +Visualize a Static Sparse Malcolm 2D Level-Set Layers +===================================================== + +.. index:: + single: BinaryImageToLevelSetImageAdaptor + single: MalcolmSparseLevelSetImage + +Synopsis +-------- + +Convert a binary mask into a sparse Malcolm level-set function and write its +layers as an image, by sampling the function at every pixel. The mask comes +from an Otsu threshold of the input image. + +The written values are -1, 0, and 1. + + +Results +------- + +.. figure:: cells.png + :scale: 100% + :alt: Input image (cells) + + Input image + + +Code +---- + +C++ +... + +.. literalinclude:: Code.cxx + :lines: 18- + + +Classes demonstrated +-------------------- + +.. breathelink:: itk::MalcolmSparseLevelSetImage diff --git a/src/Bridge/VtkGlue/VisualizeStaticMalcolm2DLevelSetLayers/cells.png.cid b/src/Segmentation/LevelSetsv4/VisualizeStaticMalcolm2DLevelSetLayers/cells.png.cid similarity index 100% rename from src/Bridge/VtkGlue/VisualizeStaticMalcolm2DLevelSetLayers/cells.png.cid rename to src/Segmentation/LevelSetsv4/VisualizeStaticMalcolm2DLevelSetLayers/cells.png.cid diff --git a/src/Segmentation/LevelSetsv4/VisualizeStaticShi2DLevelSetLayers/CMakeLists.txt b/src/Segmentation/LevelSetsv4/VisualizeStaticShi2DLevelSetLayers/CMakeLists.txt new file mode 100644 index 000000000..06979c025 --- /dev/null +++ b/src/Segmentation/LevelSetsv4/VisualizeStaticShi2DLevelSetLayers/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.22.1) + +project(VisualizeStaticShi2DLevelSetLayers) + +find_package(ITK REQUIRED) +itk_generate_factory_registration() + +add_executable(${PROJECT_NAME} Code.cxx) +target_link_libraries( + ${PROJECT_NAME} + PRIVATE + ITK::ITKImageIO + ITK::ITKImageIntensityModule + ITK::ITKLevelSetsv4Module + ITK::ITKThresholdingModule +) + +install( + TARGETS + ${PROJECT_NAME} + DESTINATION bin/ITKSphinxExamples/Segmentation/LevelSetsv4 + COMPONENT Runtime +) + +install( + FILES + Code.cxx + CMakeLists.txt + DESTINATION + share/ITKSphinxExamples/Code/Segmentation/LevelSetsv4/VisualizeStaticShi2DLevelSetLayers + COMPONENT Code +) + +enable_testing() +add_test( + NAME VisualizeStaticShi2DLevelSetLayersTest + COMMAND + ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${PROJECT_NAME} + ${CMAKE_CURRENT_BINARY_DIR}/cells.png Output.mha +) diff --git a/src/Bridge/VtkGlue/VisualizeStaticShi2DLevelSetLayers/Code.cxx b/src/Segmentation/LevelSetsv4/VisualizeStaticShi2DLevelSetLayers/Code.cxx similarity index 74% rename from src/Bridge/VtkGlue/VisualizeStaticShi2DLevelSetLayers/Code.cxx rename to src/Segmentation/LevelSetsv4/VisualizeStaticShi2DLevelSetLayers/Code.cxx index ae1aabf20..3a411f99d 100644 --- a/src/Bridge/VtkGlue/VisualizeStaticShi2DLevelSetLayers/Code.cxx +++ b/src/Segmentation/LevelSetsv4/VisualizeStaticShi2DLevelSetLayers/Code.cxx @@ -16,15 +16,13 @@ * *=========================================================================*/ -#include "itkVTKVisualize2DSparseLevelSetLayers.h" - #include "itkBinaryImageToLevelSetImageAdaptor.h" #include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkImageRegionIteratorWithIndex.h" #include "itkShiSparseLevelSetImage.h" - #include "itkOtsuMultipleThresholdsImageFilter.h" #include "itkRescaleIntensityImageFilter.h" -#include "vtkRenderWindowInteractor.h" int main(int argc, char * argv[]) @@ -33,11 +31,10 @@ main(int argc, char * argv[]) { std::cerr << "Missing Arguments" << std::endl; std::cerr << argv[0] << std::endl; - std::cerr << " " << std::endl; + std::cerr << " " << std::endl; return EXIT_FAILURE; } - // Image Dimension constexpr unsigned int Dimension = 2; using InputPixelType = unsigned char; @@ -48,7 +45,7 @@ main(int argc, char * argv[]) using LevelSetType = itk::ShiSparseLevelSetImage; // Generate a binary mask that will be used as initialization for the level - // set evolution. + // set. using OtsuFilterType = itk::OtsuMultipleThresholdsImageFilter; auto otsu = OtsuFilterType::New(); otsu->SetInput(input); @@ -60,29 +57,32 @@ main(int argc, char * argv[]) rescaler->SetInput(otsu->GetOutput()); rescaler->SetOutputMinimum(0); rescaler->SetOutputMaximum(1); + rescaler->Update(); - // convert a binary mask to a level-set function + // Convert the binary mask to a sparse level-set function using BinaryImageToLevelSetType = itk::BinaryImageToLevelSetImageAdaptor; - auto adaptor = BinaryImageToLevelSetType::New(); adaptor->SetInputImage(rescaler->GetOutput()); adaptor->Initialize(); LevelSetType::Pointer levelSet = adaptor->GetModifiableLevelSet(); - // Create the visualizer - using VisualizationType = itk::VTKVisualize2DSparseLevelSetLayers; - auto visualizer = VisualizationType::New(); - visualizer->SetInputImage(input); - visualizer->SetLevelSet(levelSet); - visualizer->SetScreenCapture(true); + // Sample the level-set function on the image grid to show its layers + using LayerImageType = itk::Image; + auto layers = LayerImageType::New(); + layers->CopyInformation(input); + layers->SetRegions(input->GetLargestPossibleRegion()); + layers->Allocate(); - vtkSmartPointer renderWindowInteractor = vtkSmartPointer::New(); - renderWindowInteractor->SetRenderWindow(visualizer->GetRenderWindow()); + itk::ImageRegionIteratorWithIndex it(layers, layers->GetLargestPossibleRegion()); + for (it.GoToBegin(); !it.IsAtEnd(); ++it) + { + it.Set(levelSet->Evaluate(it.GetIndex())); + } try { - visualizer->Update(); + itk::WriteImage(layers, argv[2]); } catch (const itk::ExceptionObject & error) { @@ -90,11 +90,5 @@ main(int argc, char * argv[]) return EXIT_FAILURE; } - bool interactive = (std::stoi(argv[2]) != 0); - if (interactive) - { - renderWindowInteractor->Start(); - } - return EXIT_SUCCESS; } diff --git a/src/Segmentation/LevelSetsv4/VisualizeStaticShi2DLevelSetLayers/Documentation.rst b/src/Segmentation/LevelSetsv4/VisualizeStaticShi2DLevelSetLayers/Documentation.rst new file mode 100644 index 000000000..dcef68e4d --- /dev/null +++ b/src/Segmentation/LevelSetsv4/VisualizeStaticShi2DLevelSetLayers/Documentation.rst @@ -0,0 +1,43 @@ +:name: VisualizeStaticShi2DLevelSetLayers + +Visualize a Static Sparse Shi 2D Level-Set Layers +================================================= + +.. index:: + single: BinaryImageToLevelSetImageAdaptor + single: ShiSparseLevelSetImage + +Synopsis +-------- + +Convert a binary mask into a sparse Shi level-set function and write its +layers as an image, by sampling the function at every pixel. The mask comes +from an Otsu threshold of the input image. + +The written values are -3, -1, 1, and 3. + + +Results +------- + +.. figure:: cells.png + :scale: 100% + :alt: Input image (cells) + + Input image + + +Code +---- + +C++ +... + +.. literalinclude:: Code.cxx + :lines: 18- + + +Classes demonstrated +-------------------- + +.. breathelink:: itk::ShiSparseLevelSetImage diff --git a/src/Bridge/VtkGlue/VisualizeStaticShi2DLevelSetLayers/cells.png.cid b/src/Segmentation/LevelSetsv4/VisualizeStaticShi2DLevelSetLayers/cells.png.cid similarity index 100% rename from src/Bridge/VtkGlue/VisualizeStaticShi2DLevelSetLayers/cells.png.cid rename to src/Segmentation/LevelSetsv4/VisualizeStaticShi2DLevelSetLayers/cells.png.cid diff --git a/src/Segmentation/LevelSetsv4/VisualizeStaticWhitaker2DLevelSetLayers/CMakeLists.txt b/src/Segmentation/LevelSetsv4/VisualizeStaticWhitaker2DLevelSetLayers/CMakeLists.txt new file mode 100644 index 000000000..8ee576715 --- /dev/null +++ b/src/Segmentation/LevelSetsv4/VisualizeStaticWhitaker2DLevelSetLayers/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.22.1) + +project(VisualizeStaticWhitaker2DLevelSetLayers) + +find_package(ITK REQUIRED) +itk_generate_factory_registration() + +add_executable(${PROJECT_NAME} Code.cxx) +target_link_libraries( + ${PROJECT_NAME} + PRIVATE + ITK::ITKImageIO + ITK::ITKImageIntensityModule + ITK::ITKLevelSetsv4Module + ITK::ITKThresholdingModule +) + +install( + TARGETS + ${PROJECT_NAME} + DESTINATION bin/ITKSphinxExamples/Segmentation/LevelSetsv4 + COMPONENT Runtime +) + +install( + FILES + Code.cxx + CMakeLists.txt + DESTINATION + share/ITKSphinxExamples/Code/Segmentation/LevelSetsv4/VisualizeStaticWhitaker2DLevelSetLayers + COMPONENT Code +) + +enable_testing() +add_test( + NAME VisualizeStaticWhitaker2DLevelSetLayersTest + COMMAND + ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${PROJECT_NAME} + ${CMAKE_CURRENT_BINARY_DIR}/cells.png Output.mha +) diff --git a/src/Bridge/VtkGlue/VisualizeStaticWhitaker2DLevelSetLayers/Code.cxx b/src/Segmentation/LevelSetsv4/VisualizeStaticWhitaker2DLevelSetLayers/Code.cxx similarity index 70% rename from src/Bridge/VtkGlue/VisualizeStaticWhitaker2DLevelSetLayers/Code.cxx rename to src/Segmentation/LevelSetsv4/VisualizeStaticWhitaker2DLevelSetLayers/Code.cxx index 0bc676af9..fd7e75137 100644 --- a/src/Bridge/VtkGlue/VisualizeStaticWhitaker2DLevelSetLayers/Code.cxx +++ b/src/Segmentation/LevelSetsv4/VisualizeStaticWhitaker2DLevelSetLayers/Code.cxx @@ -16,15 +16,13 @@ * *=========================================================================*/ -#include "itkVTKVisualize2DSparseLevelSetLayers.h" - #include "itkBinaryImageToLevelSetImageAdaptor.h" #include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkImageRegionIteratorWithIndex.h" #include "itkWhitakerSparseLevelSetImage.h" - #include "itkOtsuMultipleThresholdsImageFilter.h" #include "itkRescaleIntensityImageFilter.h" -#include "vtkRenderWindowInteractor.h" int main(int argc, char * argv[]) @@ -33,11 +31,10 @@ main(int argc, char * argv[]) { std::cerr << "Missing Arguments" << std::endl; std::cerr << argv[0] << std::endl; - std::cerr << " " << std::endl; + std::cerr << " " << std::endl; return EXIT_FAILURE; } - // Image Dimension constexpr unsigned int Dimension = 2; using InputPixelType = unsigned char; @@ -45,11 +42,10 @@ main(int argc, char * argv[]) InputImageType::Pointer input = itk::ReadImage(argv[1]); - using LevelSetPixelType = float; - using LevelSetType = itk::WhitakerSparseLevelSetImage; + using LevelSetType = itk::WhitakerSparseLevelSetImage; // Generate a binary mask that will be used as initialization for the level - // set evolution. + // set. using OtsuFilterType = itk::OtsuMultipleThresholdsImageFilter; auto otsu = OtsuFilterType::New(); otsu->SetInput(input); @@ -61,29 +57,32 @@ main(int argc, char * argv[]) rescaler->SetInput(otsu->GetOutput()); rescaler->SetOutputMinimum(0); rescaler->SetOutputMaximum(1); + rescaler->Update(); - // convert a binary mask to a level-set function + // Convert the binary mask to a sparse level-set function using BinaryImageToLevelSetType = itk::BinaryImageToLevelSetImageAdaptor; - auto adaptor = BinaryImageToLevelSetType::New(); adaptor->SetInputImage(rescaler->GetOutput()); adaptor->Initialize(); LevelSetType::Pointer levelSet = adaptor->GetModifiableLevelSet(); - // Create the visualizer - using VisualizationType = itk::VTKVisualize2DSparseLevelSetLayers; - auto visualizer = VisualizationType::New(); - visualizer->SetInputImage(input); - visualizer->SetLevelSet(levelSet); - visualizer->SetScreenCapture(true); + // Sample the level-set function on the image grid to show its layers + using LayerImageType = itk::Image; + auto layers = LayerImageType::New(); + layers->CopyInformation(input); + layers->SetRegions(input->GetLargestPossibleRegion()); + layers->Allocate(); - vtkSmartPointer renderWindowInteractor = vtkSmartPointer::New(); - renderWindowInteractor->SetRenderWindow(visualizer->GetRenderWindow()); + itk::ImageRegionIteratorWithIndex it(layers, layers->GetLargestPossibleRegion()); + for (it.GoToBegin(); !it.IsAtEnd(); ++it) + { + it.Set(levelSet->Evaluate(it.GetIndex())); + } try { - visualizer->Update(); + itk::WriteImage(layers, argv[2]); } catch (const itk::ExceptionObject & error) { @@ -91,11 +90,5 @@ main(int argc, char * argv[]) return EXIT_FAILURE; } - bool interactive = (std::stoi(argv[2]) != 0); - if (interactive) - { - renderWindowInteractor->Start(); - } - return EXIT_SUCCESS; } diff --git a/src/Segmentation/LevelSetsv4/VisualizeStaticWhitaker2DLevelSetLayers/Documentation.rst b/src/Segmentation/LevelSetsv4/VisualizeStaticWhitaker2DLevelSetLayers/Documentation.rst new file mode 100644 index 000000000..d9c79e472 --- /dev/null +++ b/src/Segmentation/LevelSetsv4/VisualizeStaticWhitaker2DLevelSetLayers/Documentation.rst @@ -0,0 +1,43 @@ +:name: VisualizeStaticWhitaker2DLevelSetLayers + +Visualize a Static Sparse Whitaker 2D Level-Set Layers +====================================================== + +.. index:: + single: BinaryImageToLevelSetImageAdaptor + single: WhitakerSparseLevelSetImage + +Synopsis +-------- + +Convert a binary mask into a sparse Whitaker level-set function and write its +layers as an image, by sampling the function at every pixel. The mask comes +from an Otsu threshold of the input image. + +The written values are -3, -2, -1, 0, 1, 2, and 3. + + +Results +------- + +.. figure:: cells.png + :scale: 100% + :alt: Input image (cells) + + Input image + + +Code +---- + +C++ +... + +.. literalinclude:: Code.cxx + :lines: 18- + + +Classes demonstrated +-------------------- + +.. breathelink:: itk::WhitakerSparseLevelSetImage diff --git a/src/Bridge/VtkGlue/VisualizeStaticWhitaker2DLevelSetLayers/cells.png.cid b/src/Segmentation/LevelSetsv4/VisualizeStaticWhitaker2DLevelSetLayers/cells.png.cid similarity index 100% rename from src/Bridge/VtkGlue/VisualizeStaticWhitaker2DLevelSetLayers/cells.png.cid rename to src/Segmentation/LevelSetsv4/VisualizeStaticWhitaker2DLevelSetLayers/cells.png.cid diff --git a/src/Segmentation/LevelSetsv4/index.rst b/src/Segmentation/LevelSetsv4/index.rst new file mode 100644 index 000000000..671980a97 --- /dev/null +++ b/src/Segmentation/LevelSetsv4/index.rst @@ -0,0 +1,11 @@ +LevelSetsv4 +=========== + +.. toctree:: + :maxdepth: 1 + + VisualizeStaticDense2DLevelSetAsElevationMap/Documentation.rst + VisualizeStaticDense2DLevelSetZeroSet/Documentation.rst + VisualizeStaticMalcolm2DLevelSetLayers/Documentation.rst + VisualizeStaticShi2DLevelSetLayers/Documentation.rst + VisualizeStaticWhitaker2DLevelSetLayers/Documentation.rst diff --git a/src/Segmentation/index.rst b/src/Segmentation/index.rst index f85cd6b26..a8299424a 100644 --- a/src/Segmentation/index.rst +++ b/src/Segmentation/index.rst @@ -9,6 +9,7 @@ Segmentation KLMRegionGrowing/index.rst LabelVoting/index.rst LevelSets/index.rst + LevelSetsv4/index.rst RegionGrowing/index.rst Voronoi/index.rst Watersheds/index.rst