From 25c20d30fe74cd45b459a195d8631a5f282ac01c Mon Sep 17 00:00:00 2001 From: Shreeraj Jadhav Date: Fri, 20 May 2022 12:04:17 -0400 Subject: [PATCH 1/4] ENH: Migrate example itkGrayscaleFunctionDilateImageFilter * Migrate the itkGrayscaleFunctionDilateImageFilter.cxx example from `ITK/Examples/Filtering` to `ITKSphinxExamples/src/Filtering/MathematicalMorphology/DilateAGrayscaleImage`. * Add new baseline output image as `OutputBaseline.png`. * Add an equivalent python implementation of the example. --- .../MathematicalMorphology/CMakeLists.txt | 5 ++ .../CMakeLists.txt | 42 ++++++++++ .../DilateUsingFunctionalGrayscale/Code.cxx | 79 +++++++++++++++++++ .../DilateUsingFunctionalGrayscale/Code.py | 51 ++++++++++++ .../Documentation.rst | 52 ++++++++++++ .../OutputBaseline.png.sha512 | 1 + .../cthead1.png.sha512 | 1 + 7 files changed, 231 insertions(+) create mode 100644 src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/CMakeLists.txt create mode 100644 src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/Code.cxx create mode 100644 src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/Code.py create mode 100644 src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/Documentation.rst create mode 100644 src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/OutputBaseline.png.sha512 create mode 100644 src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/cthead1.png.sha512 diff --git a/src/Filtering/MathematicalMorphology/CMakeLists.txt b/src/Filtering/MathematicalMorphology/CMakeLists.txt index c94c748fa..195fdfe41 100644 --- a/src/Filtering/MathematicalMorphology/CMakeLists.txt +++ b/src/Filtering/MathematicalMorphology/CMakeLists.txt @@ -32,3 +32,8 @@ add_example(ErodeBinaryImageUsingFlatStruct) compare_to_baseline(EXAMPLE_NAME ErodeBinaryImageUsingFlatStruct BASELINE_PREFIX ErodeBinaryImageUsingFlatStruct ) + +add_example(DilateUsingFunctionalGrayscale) +compare_to_baseline(EXAMPLE_NAME DilateUsingFunctionalGrayscale + BASELINE_PREFIX OutputBaseline + ) diff --git a/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/CMakeLists.txt b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/CMakeLists.txt new file mode 100644 index 000000000..549603929 --- /dev/null +++ b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/CMakeLists.txt @@ -0,0 +1,42 @@ +cmake_minimum_required(VERSION 3.16.3) + +project( DilateUsingFunctionalGrayscale ) + +find_package( ITK REQUIRED + COMPONENTS + ITKCommon + ITKIOImageBase + ITKMathematicalMorphology + ITKIOPNG + ) +include( ${ITK_USE_FILE} ) + +add_executable( DilateUsingFunctionalGrayscale Code.cxx ) +target_link_libraries( DilateUsingFunctionalGrayscale ${ITK_LIBRARIES} ) + +install( TARGETS DilateUsingFunctionalGrayscale + DESTINATION bin/ITKSphinxExamples/Filtering/MathematicalMorphology + COMPONENT Runtime +) + +install( FILES Code.cxx CMakeLists.txt + DESTINATION share/ITKSphinxExamples/Code/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale + COMPONENT Code +) + +enable_testing() +add_test( NAME DilateUsingFunctionalGrayscaleTest + COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/DilateUsingFunctionalGrayscale + ${CMAKE_CURRENT_BINARY_DIR}/cthead1.png + Output.png + 5 + ) + +if( ITK_WRAP_PYTHON ) + add_test( NAME DilateUsingFunctionalGrayscaleTestPython + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/Code.py + ${CMAKE_CURRENT_BINARY_DIR}/cthead1.png + OutputPython.png + 5 + ) +endif() diff --git a/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/Code.cxx b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/Code.cxx new file mode 100644 index 000000000..9986928b4 --- /dev/null +++ b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/Code.cxx @@ -0,0 +1,79 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ + +#include "itkFlatStructuringElement.h" +#include "itkGrayscaleFunctionDilateImageFilter.h" +#include "itkImage.h" +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" + +int +main(int argc, char * argv[]) +{ + if (argc < 4) + { + std::cerr << "Usage: " << std::endl; + std::cerr << argv[0] << " "; + std::cerr << std::endl; + return EXIT_FAILURE; + } + + constexpr unsigned int Dimension = 2; + using PixelType = unsigned char; + + using ImageType = itk::Image; + + using ReaderType = itk::ImageFileReader; + using WriterType = itk::ImageFileWriter; + + auto reader = ReaderType::New(); + auto writer = WriterType::New(); + + const char * inputImage = argv[1]; + const char * outputImage = argv[2]; + const unsigned int radiusValue = std::stoi(argv[3]); + + reader->SetFileName(inputImage); + writer->SetFileName(outputImage); + + using StructuringElementType = itk::FlatStructuringElement; + StructuringElementType::RadiusType radius; + radius.Fill(radiusValue); + StructuringElementType structuringElement = StructuringElementType::Ball(radius); + + using FilterType = itk::GrayscaleFunctionDilateImageFilter; + + auto filter = FilterType::New(); + + filter->SetKernel(structuringElement); + + filter->SetInput(reader->GetOutput()); + writer->SetInput(filter->GetOutput()); + + try + { + writer->Update(); + } + catch (const itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} diff --git a/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/Code.py b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/Code.py new file mode 100644 index 000000000..02d6879bb --- /dev/null +++ b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/Code.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python + +# Copyright NumFOCUS +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import itk +import argparse + +itk.auto_progress(2) + +parser = argparse.ArgumentParser( + description="Dilate an image using functional grayscale morphology." +) +parser.add_argument("input_image") +parser.add_argument("output_image") +parser.add_argument("radius", type=int) +args = parser.parse_args() + +PixelType = itk.UC +Dimension = 2 + +ImageType = itk.Image[PixelType, Dimension] + +reader = itk.ImageFileReader[ImageType].New() +reader.SetFileName(args.input_image) + +StructuringElementType = itk.FlatStructuringElement[Dimension] +structuringElement = StructuringElementType.Ball(args.radius) + +grayscaleFilter = itk.GrayscaleFunctionDilateImageFilter[ + ImageType, ImageType, structuringElement +].New() +grayscaleFilter.SetInput(reader.GetOutput()) +grayscaleFilter.SetKernel(structuringElement) + +writer = itk.ImageFileWriter[ImageType].New() +writer.SetFileName(args.output_image) +writer.SetInput(grayscaleFilter.GetOutput()) + +writer.Update() diff --git a/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/Documentation.rst b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/Documentation.rst new file mode 100644 index 000000000..646d36cb2 --- /dev/null +++ b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/Documentation.rst @@ -0,0 +1,52 @@ +:name: DilateUsingFunctionalGrayscale + +Dilate a grayscale image using a functional kernel +======================== + +.. index:: + single: BinaryBallStructuringElement + single: GrayscaleFunctionDilateImageFilter + pair: mathematical morphology; dilation + +.. seealso:: dilation; erosion + + +Synopsis +-------- + +Dilate an image using functional grayscale morphology. +Function dilation takes the maximum of all the pixels identified by the structuring element plus the structuring element value. +In this example, the white regions are enlarged. + + + +Results +------- + +.. figure:: cthead1.png + :scale: 50% + :alt: Input ct head image. + + Input grayscale image. + +.. figure:: OutputBaseline.png + :scale: 50% + :alt: Dilated output. + + Dilated output. + + +Code +---- + +C++ +... + +.. literalinclude:: Code.cxx + :lines: 18- + + +Classes demonstrated +-------------------- + +.. breathelink:: itk::GrayscaleFunctionDilateImageFilter itk::BinaryBallStructuringElement diff --git a/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/OutputBaseline.png.sha512 b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/OutputBaseline.png.sha512 new file mode 100644 index 000000000..44418e850 --- /dev/null +++ b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/OutputBaseline.png.sha512 @@ -0,0 +1 @@ +92adb2cb8bc2437cf1451037aa14305e7302d31503059b2aa4bc53e4bc8cd8ad00cb43bcbb31097e058f2486d806037b9ac192227368368392efd8a5dbc5c77c diff --git a/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/cthead1.png.sha512 b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/cthead1.png.sha512 new file mode 100644 index 000000000..68f07f886 --- /dev/null +++ b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/cthead1.png.sha512 @@ -0,0 +1 @@ +32d5c12cd02f537c901ee48ad2f438fcf5399f7292bf9c0abfb8da91b74fc2e0c4983e9650283db3462d22f05f05a8637a6c3b8188159e4bbd6dc68804a84870 From 275fede7982f970b9da3b349f91698db93e0c838 Mon Sep 17 00:00:00 2001 From: Shreeraj Jadhav Date: Fri, 20 May 2022 15:09:40 -0400 Subject: [PATCH 2/4] ENH: Add python code to documentation --- .../DilateUsingFunctionalGrayscale/Documentation.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/Documentation.rst b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/Documentation.rst index 646d36cb2..22ae13ce1 100644 --- a/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/Documentation.rst +++ b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/Documentation.rst @@ -39,6 +39,14 @@ Results Code ---- +Python +...... + +.. literalinclude:: Code.py + :language: python + :lines: 1, 16- + + C++ ... From 5067bf1c046edb92ac61c7e5ab096e5e4b7d6478 Mon Sep 17 00:00:00 2001 From: Shreeraj Jadhav Date: Mon, 23 May 2022 13:16:03 -0400 Subject: [PATCH 3/4] COMP: fix documentation build warnings --- .../DilateUsingFunctionalGrayscale/Documentation.rst | 2 +- src/Filtering/MathematicalMorphology/index.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/Documentation.rst b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/Documentation.rst index 22ae13ce1..1e0dc0112 100644 --- a/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/Documentation.rst +++ b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/Documentation.rst @@ -1,7 +1,7 @@ :name: DilateUsingFunctionalGrayscale Dilate a grayscale image using a functional kernel -======================== +=================================================== .. index:: single: BinaryBallStructuringElement diff --git a/src/Filtering/MathematicalMorphology/index.rst b/src/Filtering/MathematicalMorphology/index.rst index 3c0eb0b6d..8792e9d3b 100644 --- a/src/Filtering/MathematicalMorphology/index.rst +++ b/src/Filtering/MathematicalMorphology/index.rst @@ -6,6 +6,7 @@ MathematicalMorphology CreateABinaryBallStructuringElement/Documentation.rst DilateAGrayscaleImage/Documentation.rst + DilateUsingFunctionalGrayscale/Documentation.rst ErodeAGrayscaleImage/Documentation.rst ErodeBinaryImageUsingFlatStruct/Documentation.rst GenerateStructureElementsWithAccurateArea/Documentation.rst From 7de73b9f4adedfff8a3d7228652fe772c73f81e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C5=BEenan=20Zuki=C4=87?= Date: Fri, 31 Jan 2025 14:35:32 -0500 Subject: [PATCH 4/4] ENH: Use CID links for external data files instead of SHA512 hashes --- .../DilateUsingFunctionalGrayscale/OutputBaseline.png.cid | 1 + .../DilateUsingFunctionalGrayscale/OutputBaseline.png.sha512 | 1 - .../DilateUsingFunctionalGrayscale/cthead1.png.cid | 1 + .../DilateUsingFunctionalGrayscale/cthead1.png.sha512 | 1 - 4 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/OutputBaseline.png.cid delete mode 100644 src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/OutputBaseline.png.sha512 create mode 100644 src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/cthead1.png.cid delete mode 100644 src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/cthead1.png.sha512 diff --git a/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/OutputBaseline.png.cid b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/OutputBaseline.png.cid new file mode 100644 index 000000000..3ccba8846 --- /dev/null +++ b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/OutputBaseline.png.cid @@ -0,0 +1 @@ +bafkreiaqbnt5phaiaiohrwjfis2bwmqinj5eu4jgnumpfsmviy27nsduoe diff --git a/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/OutputBaseline.png.sha512 b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/OutputBaseline.png.sha512 deleted file mode 100644 index 44418e850..000000000 --- a/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/OutputBaseline.png.sha512 +++ /dev/null @@ -1 +0,0 @@ -92adb2cb8bc2437cf1451037aa14305e7302d31503059b2aa4bc53e4bc8cd8ad00cb43bcbb31097e058f2486d806037b9ac192227368368392efd8a5dbc5c77c diff --git a/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/cthead1.png.cid b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/cthead1.png.cid new file mode 100644 index 000000000..fed459e53 --- /dev/null +++ b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/cthead1.png.cid @@ -0,0 +1 @@ +bafkreieilrgrns7xcna5yle2yw3q2wxkl3wn7lp22k4d4pwjhlhwc3ed4u diff --git a/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/cthead1.png.sha512 b/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/cthead1.png.sha512 deleted file mode 100644 index 68f07f886..000000000 --- a/src/Filtering/MathematicalMorphology/DilateUsingFunctionalGrayscale/cthead1.png.sha512 +++ /dev/null @@ -1 +0,0 @@ -32d5c12cd02f537c901ee48ad2f438fcf5399f7292bf9c0abfb8da91b74fc2e0c4983e9650283db3462d22f05f05a8637a6c3b8188159e4bbd6dc68804a84870