From e58a95b68b4f7241f9a337765367f02a474468c4 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Sun, 10 Feb 2013 20:38:45 +1100 Subject: [PATCH 001/113] bootstrap --- .../Filtering/LabelErodeDilate/CMakeLists.txt | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 Modules/Filtering/LabelErodeDilate/CMakeLists.txt diff --git a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt new file mode 100644 index 00000000000..de6aff4d96d --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt @@ -0,0 +1,109 @@ +#Change PROJECT_NAME to the name of your project +PROJECT(LabelErodeDilate) + +# set the name of the input image used to run the test +SET(BRAIN_ATLAS ${CMAKE_CURRENT_SOURCE_DIR}/images/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz) +SET(BRAIN_SLICE ${CMAKE_CURRENT_SOURCE_DIR}/images/axial.png) + +#include some macros from another file... +INCLUDE(IJMacros.txt) + +CMAKE_MINIMUM_REQUIRED(VERSION 2.4) + +#The following lines are required to use Dart +ENABLE_TESTING() +INCLUDE(Dart) +FIND_PROGRAM(ITK_TEST_DRIVER itkTestDriver) +SET(TEST_COMMAND ${ITK_TEST_DRIVER} --add-before-env PATH ${CMAKE_CURRENT_BINARY_DIR}) + +#Declare any external dependencies that your project may have here. +#examples include: ITK, VTK, JPEG, PNG, OpenGL, ZLIB, Perl, Java +#If you're not sure what name to use, look in the Modules directory of your +#cmake install and check that a file named Find(Package).cmake exists +SET(Required_Packages + ITK +) + +INCLUDE_DIRECTORIES( + ${CMAKE_CURRENT_SOURCE_DIR} +) + +#this foreach loads all of the packages that you specified as required. +#It shouldn't need to be modified. +FOREACH(Package ${Required_Packages}) + LOADPACKAGE(${Package}) +ENDFOREACH(Package) + +#Set any libraries that your project depends on. +#examples: ITKCommon, VTKRendering, etc +SET(Libraries +${ITK_LIBRARIES} +) + + +# install devel files +OPTION(INSTALL_DEVEL_FILES "Install C++ headers" ON) +IF(INSTALL_DEVEL_FILES) +FILE(GLOB develFiles *.h *.txx) +FOREACH(f ${develFiles}) + INSTALL_FILES(/include/InsightToolkit/BasicFilters FILES ${f}) +ENDFOREACH(f) +ENDIF(INSTALL_DEVEL_FILES) + + + +# option for wrapping +OPTION(BUILD_WRAPPERS "Wrap library" OFF) +IF(BUILD_WRAPPERS) + SUBDIRS(Wrapping) +ENDIF(BUILD_WRAPPERS) + + + +#the following block of code is an example of how to build an executable in +#cmake. Unmodified, it will add an executable called "MyExe" to the project. +#MyExe will be built using the files MyClass.h and MyClass.cxx, and it will +#be linked to all the libraries you specified above. +#You can build more than one executable per project + +IF(BUILD_TESTING) + +FOREACH(CurrentExe labelSetsErode labelSetsPerf +labelSetsDilatePerf labelSetsDilate ) +ADD_EXECUTABLE(${CurrentExe} ${CurrentExe}.cxx) +TARGET_LINK_LIBRARIES(${CurrentExe} ${Libraries}) +ENDFOREACH(CurrentExe) + +ENDIF(BUILD_TESTING) + +#the following line is an example of how to add a test to your project. +#Testname is the title for this particular test. ExecutableToRun is the +#program which will be running this test. It can either be a part of this +#project or an external executable. After that list any args that are needed +#for this test. Include as many tests as you like. If your project doesn't have +#any tests you can comment out or delete the following line. +# ADD_TEST(Testname ExecutableToRun arg1 arg2 arg3) + + +ADD_TEST(testLabelErode3d labelSetsErode -i +${BRAIN_ATLAS} -o laberode3d.mha -r 5 +) + +ADD_TEST(testLabelDilate3d labelSetsDilate -i +${BRAIN_ATLAS} -o labdilate3d.mha -r 5 +) + +ADD_TEST(testLabelErode2d labelSetsErode -i +${BRAIN_SLICE} -o laberode2d.png -r 2 +) + +ADD_TEST(testLabelDilate2d labelSetsDilate -i +${BRAIN_SLICE} -o labdilate2d.png -r 5 +) + + + + + + + From 20814bec9a89f9677df0537749e9730b6c72af52 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Mon, 11 Feb 2013 12:03:07 +1100 Subject: [PATCH 002/113] started article --- Modules/Filtering/LabelErodeDilate/CMakeLists.txt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt index de6aff4d96d..b0a79e90d54 100644 --- a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt @@ -86,19 +86,24 @@ ENDIF(BUILD_TESTING) ADD_TEST(testLabelErode3d labelSetsErode -i -${BRAIN_ATLAS} -o laberode3d.mha -r 5 +${BRAIN_ATLAS} -o laberode3d.nii.gz -r 5 +--compare laberode3d.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/laberode3d.nii.gz ) ADD_TEST(testLabelDilate3d labelSetsDilate -i -${BRAIN_ATLAS} -o labdilate3d.mha -r 5 +${BRAIN_ATLAS} -o labdilate3d.nii.gz -r 5 +--compare labdilate3d.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/labdilate3d.nii.gz ) ADD_TEST(testLabelErode2d labelSetsErode -i ${BRAIN_SLICE} -o laberode2d.png -r 2 +--compare laberode2d.png ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/laberode2d.png + ) ADD_TEST(testLabelDilate2d labelSetsDilate -i ${BRAIN_SLICE} -o labdilate2d.png -r 5 +--compare labdilate2d.png ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/labdilate2d.png ) From 445da75bee93a2afb523c5b11097ca075b54eee4 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Mon, 11 Feb 2013 12:47:10 +1100 Subject: [PATCH 003/113] ready to go --- Modules/Filtering/LabelErodeDilate/CMakeLists.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt index b0a79e90d54..df058345df7 100644 --- a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt @@ -85,23 +85,23 @@ ENDIF(BUILD_TESTING) # ADD_TEST(Testname ExecutableToRun arg1 arg2 arg3) -ADD_TEST(testLabelErode3d labelSetsErode -i -${BRAIN_ATLAS} -o laberode3d.nii.gz -r 5 +ADD_TEST(testLabelErode3d ${TEST_COMMAND} labelSetsErode -i +${BRAIN_ATLAS} -o laberode3d.nii.gz -r 2 --compare laberode3d.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/laberode3d.nii.gz ) -ADD_TEST(testLabelDilate3d labelSetsDilate -i +ADD_TEST(testLabelDilate3d ${TEST_COMMAND} labelSetsDilate -i ${BRAIN_ATLAS} -o labdilate3d.nii.gz -r 5 --compare labdilate3d.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/labdilate3d.nii.gz ) -ADD_TEST(testLabelErode2d labelSetsErode -i +ADD_TEST(testLabelErode2d ${TEST_COMMAND} labelSetsErode -i ${BRAIN_SLICE} -o laberode2d.png -r 2 --compare laberode2d.png ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/laberode2d.png ) -ADD_TEST(testLabelDilate2d labelSetsDilate -i +ADD_TEST(testLabelDilate2d ${TEST_COMMAND} labelSetsDilate -i ${BRAIN_SLICE} -o labdilate2d.png -r 5 --compare labdilate2d.png ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/labdilate2d.png ) From ac664c233ab056343d6dcae4ea43d73238878164 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Tue, 12 Feb 2013 11:50:17 +1100 Subject: [PATCH 004/113] ready for performance tests --- Modules/Filtering/LabelErodeDilate/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt index df058345df7..f885e01c2f1 100644 --- a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt @@ -69,7 +69,7 @@ ENDIF(BUILD_WRAPPERS) IF(BUILD_TESTING) FOREACH(CurrentExe labelSetsErode labelSetsPerf -labelSetsDilatePerf labelSetsDilate ) +labelSetsDilatePerf labelSetsDilateWSPerf labelSetsDilateDanielssonPerf labelSetsDilate labelSetsDilateWS labelSetsDilateDanielsson) ADD_EXECUTABLE(${CurrentExe} ${CurrentExe}.cxx) TARGET_LINK_LIBRARIES(${CurrentExe} ${Libraries}) ENDFOREACH(CurrentExe) From eaf0e69842749d43970bb6401feed648c5c296be Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Tue, 12 Feb 2013 13:50:58 +1100 Subject: [PATCH 005/113] Finishing touches to article --- Modules/Filtering/LabelErodeDilate/CMakeLists.txt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt index f885e01c2f1..b0982c2bb1c 100644 --- a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt @@ -10,6 +10,11 @@ INCLUDE(IJMacros.txt) CMAKE_MINIMUM_REQUIRED(VERSION 2.4) +if(COMMAND cmake_policy) + cmake_policy(SET CMP0003 NEW) +endif(COMMAND cmake_policy) + + #The following lines are required to use Dart ENABLE_TESTING() INCLUDE(Dart) @@ -20,10 +25,12 @@ SET(TEST_COMMAND ${ITK_TEST_DRIVER} --add-before-env PATH ${CMAKE_CURRENT_BINARY #examples include: ITK, VTK, JPEG, PNG, OpenGL, ZLIB, Perl, Java #If you're not sure what name to use, look in the Modules directory of your #cmake install and check that a file named Find(Package).cmake exists + SET(Required_Packages - ITK +ITK4 ) + INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR} ) From 8634177d9fd27706006fa633d02cb3a009d78191 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Sat, 16 Feb 2013 20:12:24 +1100 Subject: [PATCH 006/113] added threading test --- .../Filtering/LabelErodeDilate/CMakeLists.txt | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt index b0982c2bb1c..9beb94ecb19 100644 --- a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt @@ -51,7 +51,7 @@ ${ITK_LIBRARIES} # install devel files OPTION(INSTALL_DEVEL_FILES "Install C++ headers" ON) IF(INSTALL_DEVEL_FILES) -FILE(GLOB develFiles *.h *.txx) +FILE(GLOB develFiles *.h *.txx) FOREACH(f ${develFiles}) INSTALL_FILES(/include/InsightToolkit/BasicFilters FILES ${f}) ENDFOREACH(f) @@ -64,13 +64,13 @@ OPTION(BUILD_WRAPPERS "Wrap library" OFF) IF(BUILD_WRAPPERS) SUBDIRS(Wrapping) ENDIF(BUILD_WRAPPERS) - - + + #the following block of code is an example of how to build an executable in #cmake. Unmodified, it will add an executable called "MyExe" to the project. #MyExe will be built using the files MyClass.h and MyClass.cxx, and it will -#be linked to all the libraries you specified above. +#be linked to all the libraries you specified above. #You can build more than one executable per project IF(BUILD_TESTING) @@ -92,30 +92,33 @@ ENDIF(BUILD_TESTING) # ADD_TEST(Testname ExecutableToRun arg1 arg2 arg3) -ADD_TEST(testLabelErode3d ${TEST_COMMAND} labelSetsErode -i +ADD_TEST(testLabelErode3d ${TEST_COMMAND} labelSetsErode -i ${BRAIN_ATLAS} -o laberode3d.nii.gz -r 2 --compare laberode3d.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/laberode3d.nii.gz ) -ADD_TEST(testLabelDilate3d ${TEST_COMMAND} labelSetsDilate -i +ADD_TEST(testLabelDilate3d ${TEST_COMMAND} labelSetsDilate -i ${BRAIN_ATLAS} -o labdilate3d.nii.gz -r 5 --compare labdilate3d.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/labdilate3d.nii.gz ) -ADD_TEST(testLabelErode2d ${TEST_COMMAND} labelSetsErode -i +ADD_TEST(testLabelErode2d ${TEST_COMMAND} labelSetsErode -i ${BRAIN_SLICE} -o laberode2d.png -r 2 --compare laberode2d.png ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/laberode2d.png ) -ADD_TEST(testLabelDilate2d ${TEST_COMMAND} labelSetsDilate -i +ADD_TEST(testLabelDilate2d ${TEST_COMMAND} labelSetsDilate -i ${BRAIN_SLICE} -o labdilate2d.png -r 5 --compare labdilate2d.png ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/labdilate2d.png ) - +ADD_TEST(threadDilateTest ${TEST_COMMAND} ${CMAKE_COMMAND} -DTESTIMAGE=${CMAKE_CURRENT_SOURCE_DIR}/BugsFromDzenan/vCenters10.mha -P ${CMAKE_CURRENT_SOURCE_DIR}/threadtest.cmake +--compare dil_4.mha dil_1.mha) + + + + - - From 3c47bf73f2e59c12bedac25caf8b4e0cd7b0e0f4 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Sat, 16 Feb 2013 21:37:41 +1100 Subject: [PATCH 007/113] Fixing tests --- Modules/Filtering/LabelErodeDilate/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt index 9beb94ecb19..5f654c7e369 100644 --- a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt @@ -3,6 +3,7 @@ PROJECT(LabelErodeDilate) # set the name of the input image used to run the test SET(BRAIN_ATLAS ${CMAKE_CURRENT_SOURCE_DIR}/images/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz) +SET(POINTIM ${CMAKE_CURRENT_SOURCE_DIR}/BugsFromDzenan/vCenters10.mha) SET(BRAIN_SLICE ${CMAKE_CURRENT_SOURCE_DIR}/images/axial.png) #include some macros from another file... @@ -102,6 +103,11 @@ ${BRAIN_ATLAS} -o labdilate3d.nii.gz -r 5 --compare labdilate3d.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/labdilate3d.nii.gz ) +ADD_TEST(testLabelDilate3dDez ${TEST_COMMAND} labelSetsDilate -i +${POINTIM} -o labdilate3d_dez.nii.gz -r 50 +--compare labdilate3d_dez.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/labdilate3d_dez.nii.gz +) + ADD_TEST(testLabelErode2d ${TEST_COMMAND} labelSetsErode -i ${BRAIN_SLICE} -o laberode2d.png -r 2 --compare laberode2d.png ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/laberode2d.png From 4580cc0ec12504599c422241fd773d9c89ae49d1 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Mon, 18 Feb 2013 15:29:11 +1100 Subject: [PATCH 008/113] added tool to check differences - Dan method seems wrong --- Modules/Filtering/LabelErodeDilate/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt index 5f654c7e369..e116ea1bf70 100644 --- a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt @@ -77,7 +77,7 @@ ENDIF(BUILD_WRAPPERS) IF(BUILD_TESTING) FOREACH(CurrentExe labelSetsErode labelSetsPerf -labelSetsDilatePerf labelSetsDilateWSPerf labelSetsDilateDanielssonPerf labelSetsDilate labelSetsDilateWS labelSetsDilateDanielsson) +labelSetsDilatePerf labelSetsDilateWSPerf labelSetsDilateDanielssonPerf labelSetsDilate labelSetsDilateWS labelSetsDilateDanielsson reportNonZero) ADD_EXECUTABLE(${CurrentExe} ${CurrentExe}.cxx) TARGET_LINK_LIBRARIES(${CurrentExe} ${Libraries}) ENDFOREACH(CurrentExe) From d53056f4870a3729e7c64e8419efa7c57f9592bd Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 19 Mar 2014 11:12:03 +1100 Subject: [PATCH 009/113] Added example of dilate filter in a loop --- Modules/Filtering/LabelErodeDilate/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt index e116ea1bf70..2f9010474af 100644 --- a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt @@ -77,7 +77,7 @@ ENDIF(BUILD_WRAPPERS) IF(BUILD_TESTING) FOREACH(CurrentExe labelSetsErode labelSetsPerf -labelSetsDilatePerf labelSetsDilateWSPerf labelSetsDilateDanielssonPerf labelSetsDilate labelSetsDilateWS labelSetsDilateDanielsson reportNonZero) +labelSetsDilatePerf labelSetsDilateWSPerf labelSetsDilateDanielssonPerf labelSetsDilate labelSetsDilateWS labelSetsDilateDanielsson reportNonZero labelSetsDilateSelected labelDilateLoopTest) ADD_EXECUTABLE(${CurrentExe} ${CurrentExe}.cxx) TARGET_LINK_LIBRARIES(${CurrentExe} ${Libraries}) ENDFOREACH(CurrentExe) @@ -122,7 +122,9 @@ ${BRAIN_SLICE} -o labdilate2d.png -r 5 ADD_TEST(threadDilateTest ${TEST_COMMAND} ${CMAKE_COMMAND} -DTESTIMAGE=${CMAKE_CURRENT_SOURCE_DIR}/BugsFromDzenan/vCenters10.mha -P ${CMAKE_CURRENT_SOURCE_DIR}/threadtest.cmake --compare dil_4.mha dil_1.mha) +ADD_TEST(LoopDilateTest ${TEST_COMMAND} labelDilateLoopTest -i ${BRAIN_SLICE} -o looplabdilate2d.png -r 1.1 --iterations 50 ) +ADD_TEST(LoopDilateTest2 ${TEST_COMMAND} labelDilateLoopTest -i ${BRAIN_SLICE} -o looplabdilate2d50.png -r 51 --iterations 1 ) From 366dbba7fc084b3dd3a3ac4a9f235f96db13a2fd Mon Sep 17 00:00:00 2001 From: Jerome Avondo Date: Thu, 20 Mar 2014 12:21:33 -0500 Subject: [PATCH 010/113] removed ITK4 dependency --- Modules/Filtering/LabelErodeDilate/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt index 2f9010474af..aa12dd97a97 100644 --- a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt @@ -28,7 +28,7 @@ SET(TEST_COMMAND ${ITK_TEST_DRIVER} --add-before-env PATH ${CMAKE_CURRENT_BINARY #cmake install and check that a file named Find(Package).cmake exists SET(Required_Packages -ITK4 +ITK ) From 33e704f6e63cdcd8331905a41bf86085f51ced3b Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 14 May 2014 09:32:39 +1000 Subject: [PATCH 011/113] support and testing for axis-aligned elliptical structuring elements --- Modules/Filtering/LabelErodeDilate/CMakeLists.txt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt index aa12dd97a97..e89d15abd40 100644 --- a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt @@ -5,6 +5,8 @@ PROJECT(LabelErodeDilate) SET(BRAIN_ATLAS ${CMAKE_CURRENT_SOURCE_DIR}/images/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz) SET(POINTIM ${CMAKE_CURRENT_SOURCE_DIR}/BugsFromDzenan/vCenters10.mha) SET(BRAIN_SLICE ${CMAKE_CURRENT_SOURCE_DIR}/images/axial.png) +SET(HOLEIM ${CMAKE_CURRENT_SOURCE_DIR}/images/hole.nii.gz) +SET(DOTIM ${CMAKE_CURRENT_SOURCE_DIR}/images/dot.nii.gz) #include some macros from another file... INCLUDE(IJMacros.txt) @@ -77,7 +79,7 @@ ENDIF(BUILD_WRAPPERS) IF(BUILD_TESTING) FOREACH(CurrentExe labelSetsErode labelSetsPerf -labelSetsDilatePerf labelSetsDilateWSPerf labelSetsDilateDanielssonPerf labelSetsDilate labelSetsDilateWS labelSetsDilateDanielsson reportNonZero labelSetsDilateSelected labelDilateLoopTest) +labelSetsDilatePerf labelSetsDilateWSPerf labelSetsDilateDanielssonPerf labelSetsDilate labelSetsDilateWS labelSetsDilateDanielsson reportNonZero labelSetsDilateSelected labelDilateLoopTest labelSetsDilateEllipse labelSetsErodeEllipse) ADD_EXECUTABLE(${CurrentExe} ${CurrentExe}.cxx) TARGET_LINK_LIBRARIES(${CurrentExe} ${Libraries}) ENDFOREACH(CurrentExe) @@ -128,5 +130,13 @@ ADD_TEST(LoopDilateTest2 ${TEST_COMMAND} labelDilateLoopTest -i ${BRAIN_SLICE} +ADD_TEST(testLabelDilateEllipse ${TEST_COMMAND} labelSetsDilateEllipse -i +${DOTIM} -o labdilate3d_ell.nii.gz -r 20 --radius2 10 --radius3 10 +--compare labdilate3d_ell.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/labdilate3d_ell.nii.gz +) +ADD_TEST(testLabelErodeEllipse ${TEST_COMMAND} labelSetsErodeEllipse -i +${HOLEIM} -o laberode3d_ell.nii.gz -r 20 --radius2 10 --radius3 10 +--compare laberode3d_ell.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/laberode3d_ell.nii.gz +) From a65fc5b97f740526bc5546822f39803109d95617 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 13 May 2015 17:24:17 +1000 Subject: [PATCH 012/113] preparing for first test --- .../include/itkLabelSetDilateImageFilter.h | 82 +++ .../include/itkLabelSetDilateImageFilter.hxx | 128 ++++ .../include/itkLabelSetErodeImageFilter.h | 90 +++ .../include/itkLabelSetErodeImageFilter.hxx | 132 ++++ .../include/itkLabelSetMorphBaseImageFilter.h | 133 ++++ .../itkLabelSetMorphBaseImageFilter.hxx | 247 +++++++ .../include/itkLabelSetUtils.h | 637 ++++++++++++++++++ .../LabelErodeDilate/include/itkinstance.h | 14 + .../test/itkLabelSetDilateTest.cxx | 86 +++ .../test/labelDilateLoopTest.cxx | 112 +++ .../test/labelSetsDilateDanielsson.cxx | 98 +++ .../test/labelSetsDilateDanielssonPerf.cxx | 118 ++++ .../test/labelSetsDilatePerf.cxx | 135 ++++ .../test/labelSetsDilateSelected.cxx | 112 +++ .../test/labelSetsDilateWS.cxx | 97 +++ .../test/labelSetsDilateWSPerf.cxx | 118 ++++ .../LabelErodeDilate/test/labelSetsErode.cxx | 111 +++ .../LabelErodeDilate/test/labelSetsPerf.cxx | 134 ++++ .../LabelErodeDilate/test/reportNonZero.cxx | 100 +++ 19 files changed, 2684 insertions(+) create mode 100644 Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h create mode 100644 Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx create mode 100644 Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h create mode 100644 Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx create mode 100644 Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h create mode 100644 Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx create mode 100644 Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h create mode 100644 Modules/Filtering/LabelErodeDilate/include/itkinstance.h create mode 100644 Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx create mode 100644 Modules/Filtering/LabelErodeDilate/test/labelDilateLoopTest.cxx create mode 100644 Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielsson.cxx create mode 100644 Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielssonPerf.cxx create mode 100644 Modules/Filtering/LabelErodeDilate/test/labelSetsDilatePerf.cxx create mode 100644 Modules/Filtering/LabelErodeDilate/test/labelSetsDilateSelected.cxx create mode 100644 Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWS.cxx create mode 100644 Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWSPerf.cxx create mode 100644 Modules/Filtering/LabelErodeDilate/test/labelSetsErode.cxx create mode 100644 Modules/Filtering/LabelErodeDilate/test/labelSetsPerf.cxx create mode 100644 Modules/Filtering/LabelErodeDilate/test/reportNonZero.cxx diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h new file mode 100644 index 00000000000..a33151205c9 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h @@ -0,0 +1,82 @@ +#ifndef __itkLabelSetDilateImageFilter_h +#define __itkLabelSetDilateImageFilter_h + +#include "itkLabelSetMorphBaseImageFilter.h" +#include "itkNumericTraits.h" + +namespace itk +{ +/** + * \class LabelSetDilateImageFilter + * \brief Class for binary morphological erosion of label images. + * + * This filter is threaded. + * + * \sa itkLabelSetDilateErodeImageFilter + * + * \author Richard Beare, Department of Medicine, Monash University, + * Australia. +**/ +template +class ITK_EXPORT LabelSetDilateImageFilter: + public LabelSetMorphBaseImageFilter +{ + +public: + /** Standard class typedefs. */ + typedef LabelSetDilateImageFilter Self; + typedef LabelSetMorphBaseImageFilter Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Runtime information support. */ + itkTypeMacro(LabelSetDilateImageFilter, LabelSetMorphBaseImageFilter); + + /** Pixel Type of the input image */ + typedef TInputImage InputImageType; + typedef TOutputImage OutputImageType; + typedef typename TInputImage::PixelType PixelType; + typedef typename NumericTraits::FloatType RealType; + typedef typename TOutputImage::PixelType OutputPixelType; + typedef typename NumericTraits::ScalarRealType ScalarRealType; + + /** Smart pointer typedef support. */ + typedef typename TInputImage::Pointer InputImagePointer; + typedef typename TInputImage::ConstPointer InputImageConstPointer; + typedef typename TInputImage::SizeType InputSizeType; + typedef typename TOutputImage::SizeType OutputSizeType; + + typedef typename OutputImageType::RegionType OutputImageRegionType; + + /** Image dimension. */ + itkStaticConstMacro(ImageDimension, unsigned int, + TInputImage::ImageDimension); + itkStaticConstMacro(OutputImageDimension, unsigned int, + TOutputImage::ImageDimension); + itkStaticConstMacro(InputImageDimension, unsigned int, + TInputImage::ImageDimension); + +protected: + LabelSetDilateImageFilter(){}; + virtual ~LabelSetDilateImageFilter() {}; + + void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, ThreadIdType threadId ) override; + +private: + LabelSetDilateImageFilter(const Self&); //purposely not implemented + void operator=(const Self&); //purposely not implemented + typedef typename Superclass::DistanceImageType DistanceImageType; + +}; + +} // end namespace itk + +#ifndef ITK_MANUAL_INSTANTIATION +#include "itkLabelSetDilateImageFilter.hxx" +#endif + +#endif diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx new file mode 100644 index 00000000000..52f4a479205 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx @@ -0,0 +1,128 @@ +#ifndef __itkLabelSetDilateImageFilter_hxx +#define __itkLabelSetDilateImageFilter_hxx + +#include "itkLabelSetDilateImageFilter.h" +#include "itkImageRegionConstIterator.h" +#include "itkImageRegionIterator.h" + + +#include "itkImageLinearIteratorWithIndex.h" +#include "itkImageLinearConstIteratorWithIndex.h" + +#include "itkLabelSetUtils.h" + + +namespace itk +{ + +template +void +LabelSetDilateImageFilter +::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, ThreadIdType threadId ) +{ + // this is where the work happens. We use a distance image with + // floating point pixel to perform the parabolic operations. The + // input image specifies the size of the SE at each location. These + // values need to be squared on the way in to the parabolic + // operations, and the squaring step needs to be integrated with the + // line copy. + // Similarly, the thresholding on output needs to be integrated + // with the last processing stage. + + // compute the number of rows first, so we can setup a progress reporter + typename std::vector< unsigned int > NumberOfRows; + InputSizeType size = outputRegionForThread.GetSize(); + + for (unsigned int i = 0; i < InputImageDimension; i++) + { + NumberOfRows.push_back( 1 ); + for (unsigned int d = 0; d < InputImageDimension; d++) + { + if( d != i ) + { + NumberOfRows[i] *= size[ d ]; + } + } + } + float progressPerDimension = 1.0/ImageDimension; + + ProgressReporter * progress = new ProgressReporter(this, threadId, NumberOfRows[this->m_CurrentDimension], 30, this->m_CurrentDimension * progressPerDimension, progressPerDimension); + + + typedef ImageLinearConstIteratorWithIndex< TInputImage > InputConstIteratorType; + typedef ImageLinearIteratorWithIndex< TOutputImage > OutputIteratorType; + + typedef ImageLinearConstIteratorWithIndex InputDistIteratorType; + typedef ImageLinearIteratorWithIndex OutputDistIteratorType; + + // for stages after the first + typedef ImageLinearConstIteratorWithIndex< TOutputImage > OutputConstIteratorType; + + + typedef ImageRegion< TInputImage::ImageDimension > RegionType; + + typename TInputImage::ConstPointer inputImage( this->GetInput () ); + typename TOutputImage::Pointer outputImage( this->GetOutput() ); + + outputImage->SetBufferedRegion( outputImage->GetRequestedRegion() ); + outputImage->Allocate(); + RegionType region = outputRegionForThread; + + InputConstIteratorType inputIterator( inputImage, region ); + InputConstIteratorType inputIteratorStage2( outputImage, region ); + OutputIteratorType outputIterator( outputImage, region ); + //OutputConstIteratorType inputIteratorStage2( outputImage, region ); + + InputDistIteratorType inputDistIterator(this->m_DistanceImage, region); + OutputDistIteratorType outputDistIterator(this->m_DistanceImage, region); + + // setup the progress reporting + // deal with the first dimension - this should be copied to the + // output if the scale is 0 + + // flag to indicate whether the internal distance image has been + // initialized using the special first pass erosion + if (this->m_Scale[this->m_CurrentDimension] > 0) + { + // Perform as normal + //RealType magnitude = 1.0/(2.0 * m_Scale[0]); + unsigned long LineLength = region.GetSize()[this->m_CurrentDimension]; + RealType image_scale = this->GetInput()->GetSpacing()[this->m_CurrentDimension]; + //bool lastpass = (m_CurrentDimension == ImageDimension - 1); + + if (!this->m_FirstPassDone) + { + LabSet::doOneDimensionDilateFirstPass(inputIterator, outputDistIterator, outputIterator, + *progress, LineLength, + this->m_CurrentDimension, + this->m_MagnitudeSign, + this->m_UseImageSpacing, + this->m_Extreme, + image_scale, + this->m_Scale[this->m_CurrentDimension]); + } + else + { + LabSet::doOneDimensionDilate(inputIteratorStage2, + inputDistIterator, + outputDistIterator, + outputIterator, + *progress, LineLength, + this->m_CurrentDimension, + this->m_MagnitudeSign, + this->m_UseImageSpacing, + this->m_Extreme, + image_scale, + this->m_Scale[this->m_CurrentDimension]); + } + } +} + + +} // namespace itk +#endif diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h new file mode 100644 index 00000000000..9bd0af33a2a --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h @@ -0,0 +1,90 @@ +#ifndef __itkLabelSetErodeImageFilter_h +#define __itkLabelSetErodeImageFilter_h + +#include "itkLabelSetMorphBaseImageFilter.h" +#include "itkNumericTraits.h" + +namespace itk +{ +/** + * \class LabelSetErodeImageFilter + * \brief Class for binary morphological erosion of label images. + * + * This filter will separate touching labels. If you don't want this + * then use a conventional binary erosion to mask the label image. + * This filter is threaded. + * + * \sa itkLabelSetDilateImageFilter + * + * \author Richard Beare, Department of Medicine, Monash University, + * Australia. +**/ +template +class ITK_EXPORT LabelSetErodeImageFilter: + public LabelSetMorphBaseImageFilter +{ + +public: + /** Standard class typedefs. */ + typedef LabelSetErodeImageFilter Self; + typedef LabelSetMorphBaseImageFilter Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Runtime information support. */ + itkTypeMacro(LabelSetErodeImageFilter, LabelSetMorphBaseImageFilter); + + /** Pixel Type of the input image */ + typedef TInputImage InputImageType; + typedef TOutputImage OutputImageType; + typedef typename TInputImage::PixelType PixelType; + typedef typename NumericTraits::FloatType RealType; + typedef typename TOutputImage::PixelType OutputPixelType; + typedef typename NumericTraits::ScalarRealType ScalarRealType; + + /** Smart pointer typedef support. */ + typedef typename TInputImage::Pointer InputImagePointer; + typedef typename TInputImage::ConstPointer InputImageConstPointer; + typedef typename TInputImage::SizeType InputSizeType; + typedef typename TOutputImage::SizeType OutputSizeType; + + /** a type to represent the "kernel radius" */ + typedef typename itk::FixedArray RadiusType; + /** Image dimension. */ + + typedef typename OutputImageType::RegionType OutputImageRegionType; + /** Image dimension. */ + itkStaticConstMacro(ImageDimension, unsigned int, + TInputImage::ImageDimension); + itkStaticConstMacro(OutputImageDimension, unsigned int, + TOutputImage::ImageDimension); + itkStaticConstMacro(InputImageDimension, unsigned int, + TInputImage::ImageDimension); + + +protected: + LabelSetErodeImageFilter(){}; + virtual ~LabelSetErodeImageFilter() {}; + + void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, ThreadIdType threadId ) override; + + // Override since the filter produces the entire dataset. + +private: + LabelSetErodeImageFilter(const Self&); //purposely not implemented + void operator=(const Self&); //purposely not implemented + + typedef typename Superclass::DistanceImageType DistanceImageType; +}; + +} // end namespace itk + +#ifndef ITK_MANUAL_INSTANTIATION +#include "itkLabelSetErodeImageFilter.hxx" +#endif + +#endif diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx new file mode 100644 index 00000000000..bc271212e24 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx @@ -0,0 +1,132 @@ +#ifndef __itkLabelSetErodeImageFilter_hxx +#define __itkLabelSetErodeImageFilter_hxx + +#include "itkLabelSetErodeImageFilter.h" +#include "itkImageRegionConstIterator.h" +#include "itkImageRegionIterator.h" + + +#include "itkImageLinearIteratorWithIndex.h" +#include "itkImageLinearConstIteratorWithIndex.h" + +#include "itkLabelSetUtils.h" + + +namespace itk +{ + +template +void +LabelSetErodeImageFilter +::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, ThreadIdType threadId ) +{ + // this is where the work happens. We use a distance image with + // floating point pixel to perform the parabolic operations. The + // input image specifies the size of the SE at each location. These + // values need to be squared on the way in to the parabolic + // operations, and the squaring step needs to be integrated with the + // line copy. + // Similarly, the thresholding on output needs to be integrated + // with the last processing stage. + + // compute the number of rows first, so we can setup a progress reporter + typename std::vector< unsigned int > NumberOfRows; + InputSizeType size = outputRegionForThread.GetSize(); + + for (unsigned int i = 0; i < InputImageDimension; i++) + { + NumberOfRows.push_back( 1 ); + for (unsigned int d = 0; d < InputImageDimension; d++) + { + if( d != i ) + { + NumberOfRows[i] *= size[ d ]; + } + } + } + float progressPerDimension = 1.0/ImageDimension; + + ProgressReporter * progress = new ProgressReporter(this, threadId, NumberOfRows[this->m_CurrentDimension], 30, this->m_CurrentDimension * progressPerDimension, progressPerDimension); + + + typedef ImageLinearConstIteratorWithIndex< TInputImage > InputConstIteratorType; + typedef ImageLinearIteratorWithIndex< TOutputImage > OutputIteratorType; + + typedef ImageLinearConstIteratorWithIndex InputDistIteratorType; + typedef ImageLinearIteratorWithIndex OutputDistIteratorType; + + // for stages after the first + typedef ImageLinearConstIteratorWithIndex< TOutputImage > OutputConstIteratorType; + + + typedef ImageRegion< TInputImage::ImageDimension > RegionType; + + typename TInputImage::ConstPointer inputImage( this->GetInput () ); + typename TOutputImage::Pointer outputImage( this->GetOutput() ); + + + outputImage->SetBufferedRegion( outputImage->GetRequestedRegion() ); + outputImage->Allocate(); + RegionType region = outputRegionForThread; + + InputConstIteratorType inputIterator( inputImage, region ); + OutputIteratorType outputIterator( outputImage, region ); + //OutputConstIteratorType inputIteratorStage2( outputImage, region ); + + InputDistIteratorType inputDistIterator(this->m_DistanceImage, region); + OutputDistIteratorType outputDistIterator(this->m_DistanceImage, region); + + // setup the progress reporting + // deal with the first dimension - this should be copied to the + // output if the scale is 0 + + // flag to indicate whether the internal distance image has been + // initialized using the special first pass erosion + if (this->m_Scale[this->m_CurrentDimension] > 0) + { + // Perform as normal + //RealType magnitude = 1.0/(2.0 * m_Scale[0]); + unsigned long LineLength = region.GetSize()[this->m_CurrentDimension]; + RealType image_scale = this->GetInput()->GetSpacing()[this->m_CurrentDimension]; + bool lastpass = (this->m_CurrentDimension == ImageDimension - 1); + + if (!this->m_FirstPassDone) + { + LabSet::doOneDimensionErodeFirstPass(inputIterator, outputDistIterator, outputIterator, + *progress, LineLength, + this->m_CurrentDimension, + this->m_MagnitudeSign, + this->m_UseImageSpacing, + this->m_Extreme, + image_scale, + this->m_Scale[this->m_CurrentDimension], + lastpass); + } + else + { + // do a standard erosion + LabSet::doOneDimensionErode(inputIterator, + inputDistIterator, + outputDistIterator, + outputIterator, + *progress, LineLength, + this->m_CurrentDimension, + this->m_MagnitudeSign, + this->m_UseImageSpacing, + this->m_Extreme, + image_scale, + this->m_Scale[this->m_CurrentDimension], + this->m_BaseSigma, + lastpass); + + } + } +} + +} // namespace itk +#endif diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h new file mode 100644 index 00000000000..12b9d521b44 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -0,0 +1,133 @@ +#ifndef __itkLabelSetMorphBaseImageFilter_h +#define __itkLabelSetMorphBaseImageFilter_h + +#include "itkNumericTraits.h" + +namespace itk +{ +#if ITK_VERSION_MAJOR < 4 + typedef int ThreadIdType; + typedef int RegionIndexType; +#else + typedef unsigned int RegionIndexType; +#endif +/** + * \class LabelSetMorphBaseImageFilter + * \brief Base class for binary morphological erosion of label images. + * + * This filter is threaded. This class handles the threading for subclasses. + * + * \sa itkLabelSetDilateImageFilter itkLabelSetErodeImageFilter + * + * \author Richard Beare, Department of Medicine, Monash University, + * Australia. +**/ +template +class ITK_EXPORT LabelSetMorphBaseImageFilter: + public ImageToImageFilter +{ + +public: + /** Standard class typedefs. */ + typedef LabelSetMorphBaseImageFilter Self; + typedef ImageToImageFilter Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Runtime information support. */ + itkTypeMacro(LabelSetMorphBaseImageFilter, ImageToImageFilter); + + + /** Pixel Type of the input image */ + typedef TInputImage InputImageType; + typedef TOutputImage OutputImageType; + typedef typename TInputImage::PixelType PixelType; + typedef typename NumericTraits::FloatType RealType; + typedef typename TOutputImage::PixelType OutputPixelType; + typedef typename NumericTraits::ScalarRealType ScalarRealType; + + typedef typename OutputImageType::IndexType OutputIndexType; + typedef typename OutputImageType::IndexValueType OutputIndexValueType; + + /** Smart pointer typedef support. */ + typedef typename TInputImage::Pointer InputImagePointer; + typedef typename TInputImage::ConstPointer InputImageConstPointer; + typedef typename TInputImage::SizeType InputSizeType; + typedef typename TOutputImage::SizeType OutputSizeType; + + /** a type to represent the "kernel radius" */ + typedef typename itk::FixedArray RadiusType; + /** Image dimension. */ + + typedef typename OutputImageType::RegionType OutputImageRegionType; + + // set all of the scales the same + void SetRadius(ScalarRealType scale); + itkSetMacro(Radius, RadiusType); + itkGetConstReferenceMacro(Radius, RadiusType); + + /** + * Set/Get whether the scale refers to pixels or world units - + * default is false + */ + itkSetMacro(UseImageSpacing, bool); + itkGetConstReferenceMacro(UseImageSpacing, bool); + itkBooleanMacro(UseImageSpacing); + + + /** Image dimension. */ + itkStaticConstMacro(ImageDimension, unsigned int, + TInputImage::ImageDimension); + itkStaticConstMacro(OutputImageDimension, unsigned int, + TOutputImage::ImageDimension); + itkStaticConstMacro(InputImageDimension, unsigned int, + TInputImage::ImageDimension); + + /** Define the image type for internal computations + RealType is usually 'double' in NumericTraits. + Here we prefer float in order to save memory. */ + + void writeDist(std::string fname); + +protected: + LabelSetMorphBaseImageFilter(); + virtual ~LabelSetMorphBaseImageFilter() {}; + + RegionIndexType SplitRequestedRegion(RegionIndexType i, RegionIndexType num, OutputImageRegionType& splitRegion) override; + virtual void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, ThreadIdType threadId) override; + void GenerateData( void ) override; + + // Override since the filter produces the entire dataset. + void EnlargeOutputRequestedRegion(DataObject *output) override; + bool m_UseImageSpacing; + void PrintSelf(std::ostream& os, Indent indent) const override; + + RadiusType m_Radius; + RadiusType m_Scale; + typedef typename itk::Image DistanceImageType; + typename TInputImage::PixelType m_Extreme; + + typename DistanceImageType::Pointer m_DistanceImage; + int m_MagnitudeSign; + int m_CurrentDimension; + bool m_FirstPassDone; + // this is the first non-zero entry in the radius. Needed to + // support elliptical operations + RealType m_BaseSigma; +private: + LabelSetMorphBaseImageFilter(const Self&); //purposely not implemented + void operator=(const Self&); //purposely not implemented + +}; + +} // end namespace itk + +#ifndef ITK_MANUAL_INSTANTIATION +#include "itkLabelSetMorphBaseImageFilter.hxx" +#endif + +#endif diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx new file mode 100644 index 00000000000..3d2fe62ad53 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -0,0 +1,247 @@ +#ifndef __itkLabelSetMorphBaseImageFilter_hxx +#define __itkLabelSetMorphBaseImageFilter_hxx + +#include "itkLabelSetMorphBaseImageFilter.h" +#include "itkImageRegionConstIterator.h" +#include "itkImageRegionIterator.h" + + +#include "itkImageLinearIteratorWithIndex.h" +#include "itkImageLinearConstIteratorWithIndex.h" + +#include "itkLabelSetUtils.h" + +#include "ioutils.h" + +namespace itk +{ + +template +LabelSetMorphBaseImageFilter +::LabelSetMorphBaseImageFilter() +{ + this->SetNumberOfRequiredOutputs( 1 ); + this->SetNumberOfRequiredInputs( 1 ); +// needs to be selected according to erosion/dilation + + m_DistanceImage = DistanceImageType::New(); + + if (doDilate) + { + m_Extreme = NumericTraits::NonpositiveMin(); + m_MagnitudeSign = 1; + } + else + { + m_Extreme = NumericTraits::max(); + m_MagnitudeSign = -1; + } + m_UseImageSpacing = false; + + this->SetRadius(1); +} + +template +void +LabelSetMorphBaseImageFilter +::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, ThreadIdType threadId) +{ + +} + +template +RegionIndexType +LabelSetMorphBaseImageFilter +::SplitRequestedRegion(RegionIndexType i, RegionIndexType num, OutputImageRegionType& splitRegion) +{ + // Get the output pointer + OutputImageType *outputPtr = this->GetOutput(); + + // Initialize the splitRegion to the output requested region + splitRegion = outputPtr->GetRequestedRegion(); + + const OutputSizeType & requestedRegionSize = splitRegion.GetSize(); + + OutputIndexType splitIndex = splitRegion.GetIndex(); + OutputSizeType splitSize = splitRegion.GetSize(); + + // split on the outermost dimension available + // and avoid the current dimension + int splitAxis = static_cast< int >( outputPtr->GetImageDimension() ) - 1; + while ( ( requestedRegionSize[splitAxis] == 1 ) || + ( splitAxis == static_cast< int >( m_CurrentDimension ) ) ) + { + --splitAxis; + if ( splitAxis < 0 ) + { // cannot split + itkDebugMacro("Cannot Split"); + return 1; + } + } + + // determine the actual number of pieces that will be generated + double range = static_cast< double >( requestedRegionSize[splitAxis] ); + + unsigned int valuesPerThread = + static_cast< unsigned int >( vcl_ceil( range / static_cast< double >( num ) ) ); + unsigned int maxThreadIdUsed = + static_cast< unsigned int >( vcl_ceil( range / static_cast< double >( valuesPerThread ) ) ) - 1; + + // Split the region + if ( i < maxThreadIdUsed ) + { + splitIndex[splitAxis] += i * valuesPerThread; + splitSize[splitAxis] = valuesPerThread; + } + if ( i == maxThreadIdUsed ) + { + splitIndex[splitAxis] += i * valuesPerThread; + // last thread needs to process the "rest" dimension being split + splitSize[splitAxis] = splitSize[splitAxis] - i * valuesPerThread; + } + + // set the split region ivars + splitRegion.SetIndex(splitIndex); + splitRegion.SetSize(splitSize); + + itkDebugMacro("Split Piece: " << splitRegion); + + return maxThreadIdUsed + 1; + +} + +template +void +LabelSetMorphBaseImageFilter +::SetRadius( ScalarRealType radius ) +{ + RadiusType s; + s.Fill(radius); + this->SetRadius( s ); +} + + +template +void +LabelSetMorphBaseImageFilter +::EnlargeOutputRequestedRegion(DataObject *output) +{ + TOutputImage *out = dynamic_cast(output); + + if (out) + { + out->SetRequestedRegion( out->GetLargestPossibleRegion() ); + } +} + +template +void +LabelSetMorphBaseImageFilter +::GenerateData(void) +{ + ThreadIdType nbthreads = this->GetNumberOfThreads(); + + typename TInputImage::ConstPointer inputImage( this->GetInput () ); + typename TOutputImage::Pointer outputImage( this->GetOutput() ); + + this->AllocateOutputs(); + + m_DistanceImage->SetBufferedRegion(outputImage->GetRequestedRegion()); + m_DistanceImage->Allocate(); + m_DistanceImage->FillBuffer(0); + m_DistanceImage->CopyInformation(inputImage); + + if (this->GetUseImageSpacing()) + { + + // radius is in mm + for (unsigned P=0;P::ThreadStruct str; + str.Filter = this; + MultiThreader* multithreader = this->GetMultiThreader(); + multithreader->SetNumberOfThreads(nbthreads); + multithreader->SetSingleMethod(this->ThreaderCallback, &str); + + // multithread the execution + for( unsigned int d=0; dSingleMethodExecute(); + if (this->m_Scale[m_CurrentDimension] > 0) + { + // needs to be set outside the multithreaded code + // first pass is completed as soon as we hit a structuring + // element dimension that is non zero. + m_FirstPassDone = true; + } + } + +} + + +template +void +LabelSetMorphBaseImageFilter +::PrintSelf(std::ostream& os, Indent indent) const +{ + Superclass::PrintSelf(os,indent); + if (m_UseImageSpacing) + { + os << "Scale in world units: " << m_Radius << std::endl; + } + else + { + os << "Scale in voxels: " << m_Radius << std::endl; + } +} + +template +void +LabelSetMorphBaseImageFilter +::writeDist(std::string fname) +{ + writeIm(m_DistanceImage, fname); +} + +} // namespace itk +#endif diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h new file mode 100644 index 00000000000..728728d1a20 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -0,0 +1,637 @@ +#ifndef __itkLabelSetUtils_h +#define __itkLabelSetUtils_h + +#include + +#include "itkProgressReporter.h" +#include +namespace itk { +namespace LabSet { +template +void DoLineErodeFirstPass(LineBufferType &LineBuf, RealType leftend, RealType rightend, + const RealType magnitude, const RealType Sigma) +{ + // This is the first pass algorithm. We can write down the values + // because we know the inputs are binary + + const long LineLength = LineBuf.size(); + for (long pos = 0; pos < LineLength; pos++) + { + // compute the height of the parabola starting at each end and + // keep the minimum + RealType left, right; + unsigned offset = LineLength - pos; + left = leftend - magnitude * (pos+1) * (pos+1); + right = rightend - magnitude * offset * offset; + // note hard coded value here - could be a parameter +// LineBuf[pos] = std::min(std::min(left, right), itk::NumericTraits::One); + LineBuf[pos] = std::min(std::min(left, right), Sigma); + } +} + +template +void DoLineDilateFirstPass(LineBufferType &LineBuf, LineBufferType &tmpLineBuf, + LabLineBufferType &LabBuf, + LabLineBufferType &NewLabBuf, + const RealType magnitude) +{ + // need to propagate the labels here + const long LineLength = LineBuf.size(); + long lastcontact = 0; + RealType lastval = LineBuf[0]; + for (long pos = 0; pos < LineLength; pos++) + { + // left pass + RealType krange = pos - lastcontact; + RealType thisval = lastval - magnitude * krange * krange; + + if (LineBuf[pos] >= LineBuf[lastcontact]) + { + lastcontact=pos; + lastval=LineBuf[pos]; + } + tmpLineBuf[pos]=std::max(LineBuf[pos], thisval); + if (thisval > LineBuf[pos]) + { + NewLabBuf[pos] = LabBuf[lastcontact]; + } + else + { + NewLabBuf[pos] = LabBuf[pos]; + } + } + + lastcontact=LineLength - 1; + lastval = tmpLineBuf[lastcontact]; + for (long pos = LineLength - 1; pos >= 0; pos--) + { + // right pass + RealType krange = lastcontact-pos; + RealType thisval = lastval - magnitude * krange * krange; + + if (tmpLineBuf[pos] >= tmpLineBuf[lastcontact]) + { + lastcontact=pos; + lastval=tmpLineBuf[pos]; + } + LineBuf[pos]=std::max(tmpLineBuf[pos], thisval); + if (thisval > tmpLineBuf[pos]) + { + NewLabBuf[pos] = LabBuf[lastcontact]; + } + // only need to do this bit on the first pass - it doubles as a + // way of initializing NewLabPos + // else + // { + // NewLabBuf[pos] = LabBuf[pos]; + // } + } + +} + + + + + +template +void DoLine(LineBufferType &LineBuf, LineBufferType &tmpLineBuf, + const RealType magnitude, const RealType m_Extreme) +{ + // contact point algorithm + long koffset = 0, newcontact=0; // how far away the search starts. + + const long LineLength = LineBuf.size(); + // negative half of the parabola + for (long pos = 0; pos < LineLength; pos++) + { + RealType BaseVal = (RealType)m_Extreme; // the base value for + // comparison + for (long krange = koffset; krange <= 0; krange++) + { + // difference needs to be paramaterised + RealType T = LineBuf[pos + krange] - magnitude * krange * krange; + // switch on template parameter - hopefully gets optimized away. + if (doDilate ? (T >= BaseVal) : (T <= BaseVal) ) + { + BaseVal = T; + newcontact = krange; + } + } + tmpLineBuf[pos] = BaseVal; + koffset = newcontact - 1; + } + // positive half of parabola + koffset = newcontact = 0; + for (long pos = LineLength - 1; pos >= 0; pos--) + { + RealType BaseVal = (RealType)m_Extreme; // the base value for comparison + for (long krange = koffset; krange >= 0; krange--) + { + RealType T = tmpLineBuf[pos + krange] - magnitude * krange * krange; + if (doDilate ? (T >= BaseVal) : (T <= BaseVal)) + { + BaseVal = T; + newcontact = krange; + } + } + LineBuf[pos] = BaseVal; + koffset = newcontact + 1; + } +} + +template +void DoLineLabelProp(LineBufferType &LineBuf, LineBufferType &tmpLineBuf, + LabBufferType &LabelBuf, LabBufferType &tmpLabelBuf, + const RealType magnitude, const RealType m_Extreme) +{ + // contact point algorithm + long koffset = 0, newcontact=0; // how far away the search starts. + + typedef typename LabBufferType::ValueType LabelType; + + const long LineLength = LineBuf.size(); + // negative half of the parabola + for (long pos = 0; pos < LineLength; pos++) + { + RealType BaseVal = (RealType)m_Extreme; // the base value for + // comparison + LabelType BaseLab = LabelBuf[pos]; + for (long krange = koffset; krange <= 0; krange++) + { + // difference needs to be paramaterised + RealType T = LineBuf[pos + krange] - magnitude * krange * krange; + // switch on template parameter - hopefully gets optimized away. + if (doDilate ? (T >= BaseVal) : (T <= BaseVal) ) + { + BaseVal = T; + newcontact = krange; + BaseLab = LabelBuf[pos+krange]; + } + } + tmpLineBuf[pos] = BaseVal; + tmpLabelBuf[pos] = BaseLab; + koffset = newcontact - 1; + } + // positive half of parabola + koffset = newcontact = 0; +#if 1 + for (long pos = LineLength - 1; pos >= 0; pos--) + { + RealType BaseVal = (RealType)m_Extreme; // the base value for comparison + // initialize the label to the previously pro + LabelType BaseLab = tmpLabelBuf[pos]; + for (long krange = koffset; krange >= 0; krange--) + { + RealType T = tmpLineBuf[pos + krange] - magnitude * krange * krange; + if (doDilate ? (T >= BaseVal) : (T <= BaseVal)) + { + BaseVal = T; + newcontact = krange; + BaseLab = tmpLabelBuf[pos+krange]; + } + } + LineBuf[pos] = BaseVal; + LabelBuf[pos] = BaseLab; + koffset = newcontact + 1; + } +#else + for (long pos = LineLength - 1; pos >= 0; pos--) + { + LineBuf[pos] = tmpLineBuf[pos]; + LabelBuf[pos] = tmpLabelBuf[pos]; + } + +#endif +} + +template +void doOneDimensionErodeFirstPass(TInIter &inputIterator, TOutDistIter &outputIterator, + TOutLabIter &outputLabIterator, + ProgressReporter &progress, + const unsigned LineLength, + const unsigned direction, + const int m_MagnitudeSign, + const bool m_UseImageSpacing, + const RealType m_Extreme, + const RealType image_scale, + const RealType Sigma, + const bool lastpass) +{ + // specialised version for binary erosion during first pass. We can + // compute the results directly because the inputs are flat. + typedef typename itk::Array LineBufferType; + typedef typename itk::Array LabelBufferType; + RealType iscale = 1.0; + if (m_UseImageSpacing) + { + iscale = image_scale; + } + // restructure equation to reduce numerical error +// const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 * Sigma); + const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0); + LineBufferType LineBuf(LineLength); + LabelBufferType LabBuf(LineLength); + + inputIterator.SetDirection(direction); + outputIterator.SetDirection(direction); + outputLabIterator.SetDirection(direction); + + inputIterator.GoToBegin(); + outputIterator.GoToBegin(); + outputLabIterator.GoToBegin(); + + while( !inputIterator.IsAtEnd() && !outputIterator.IsAtEnd() ) + { + // process this direction + // fetch the line into the buffer - this methodology is like + // the gaussian filters + unsigned int i=0; + + // copy the scanline to a buffer + while( !inputIterator.IsAtEndOfLine() ) + { + LabBuf[i] = (inputIterator.Get()); + if (LabBuf[i]) + { + LineBuf[i] = 1.0; + } + ++i; + ++inputIterator; + } + // runlength encode the line buffer (could be integrated with extraction) + + + typedef std::vector EndType; + EndType firsts; + EndType lasts; + + for (unsigned idx=0;idx(ShortLineBuf, leftend, rightend, magnitude, Sigma); + // copy the segment back into the full line buffer + std::copy(ShortLineBuf.begin(), ShortLineBuf.end(), &(LineBuf[first])); + } + // copy the line buffer back to the image + unsigned j = 0; + while( !outputIterator.IsAtEndOfLine() ) + { + outputIterator.Set( static_cast( LineBuf[j++] ) ); + ++outputIterator; + } + + if (lastpass) + { + // copy to the output image - this would be a weird case of only + // using a one dimensional SE + unsigned j2 = 0; + while (!outputLabIterator.IsAtEndOfLine()) + { + typename TInIter::PixelType val = 0; + if (LineBuf[j2] == Sigma) + { + val=LabBuf[j2]; + } + outputLabIterator.Set(val); + ++outputLabIterator; + ++j2; + } + outputLabIterator.NextLine(); + } + + // now onto the next line + inputIterator.NextLine(); + outputIterator.NextLine(); + progress.CompletedPixel(); + } +} + +template +void doOneDimensionDilateFirstPass(TInIter &inputIterator, TOutDistIter &outputIterator, + TOutLabIter &outputLabIterator, + ProgressReporter &progress, + const unsigned LineLength, + const unsigned direction, + const int m_MagnitudeSign, + const bool m_UseImageSpacing, + const RealType m_Extreme, + const RealType image_scale, + const RealType Sigma) +{ + // specialised version for binary erosion during first pass. We can + // compute the results directly because the inputs are flat. + + typedef typename itk::Array LineBufferType; + typedef typename itk::Array LabelBufferType; + RealType iscale = 1.0; + if (m_UseImageSpacing) + { + iscale = image_scale; + } + // restructure equation to reduce numerical error + //const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 * Sigma); + const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0); + LineBufferType LineBuf(LineLength); + LabelBufferType LabBuf(LineLength); + LineBufferType tmpLineBuf(LineLength); + LabelBufferType newLabBuf(LineLength); + + inputIterator.SetDirection(direction); + outputIterator.SetDirection(direction); + outputLabIterator.SetDirection(direction); + + inputIterator.GoToBegin(); + outputIterator.GoToBegin(); + outputLabIterator.GoToBegin(); + + + while( !inputIterator.IsAtEnd() && !outputIterator.IsAtEnd() ) + { + // process this direction + // fetch the line into the buffer - this methodology is like + // the gaussian filters + unsigned int i=0; + + // copy the scanline to a buffer + while( !inputIterator.IsAtEndOfLine() ) + { + LabBuf[i] = (inputIterator.Get()); + if (LabBuf[i]) + { + LineBuf[i] = Sigma; + } + else + { + LineBuf[i] = 0; + } + ++i; + ++inputIterator; + } + + DoLineDilateFirstPass(LineBuf, tmpLineBuf, LabBuf, newLabBuf, magnitude); + // copy the line buffer back to the image + unsigned j = 0; + while( !outputIterator.IsAtEndOfLine() ) + { + outputIterator.Set( static_cast( LineBuf[j] ) ); + outputLabIterator.Set(newLabBuf[j]); + ++outputLabIterator; + ++outputIterator; + ++j; + } + + + + // now onto the next line + inputIterator.NextLine(); + outputIterator.NextLine(); + outputLabIterator.NextLine(); + progress.CompletedPixel(); + } +} + + +template +void doOneDimensionErode(TInIter &inputIterator, TDistIter &inputDistIterator, + TOutDistIter &outputDistIterator, TOutLabIter &outputLabIterator, + ProgressReporter &progress, + const unsigned LineLength, + const unsigned direction, + const int m_MagnitudeSign, + const bool m_UseImageSpacing, + const RealType m_Extreme, + const RealType image_scale, + const RealType Sigma, + const RealType BaseSigma, + const bool lastpass) +{ + // traditional erosion - can't optimise the same way as the first pass + typedef typename itk::Array LineBufferType; + typedef typename itk::Array LabelBufferType; + RealType iscale = 1.0; + if (m_UseImageSpacing) + { + iscale = image_scale; + } + const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0*Sigma); + LineBufferType LineBuf(LineLength); + LabelBufferType LabBuf(LineLength); + + inputIterator.SetDirection(direction); + outputDistIterator.SetDirection(direction); + inputDistIterator.SetDirection(direction); + outputLabIterator.SetDirection(direction); + + inputIterator.GoToBegin(); + outputDistIterator.GoToBegin(); + inputDistIterator.GoToBegin(); + outputLabIterator.GoToBegin(); + + + while( !inputIterator.IsAtEnd() && !outputDistIterator.IsAtEnd() ) + { + // process this direction + // fetch the line into the buffer - this methodology is like + // the gaussian filters + unsigned int i=0; + + // copy the scanline to a buffer + while( !inputIterator.IsAtEndOfLine() ) + { + LineBuf[i] = static_cast(inputDistIterator.Get()); + LabBuf[i] = inputIterator.Get(); + ++i; + ++inputDistIterator; + ++inputIterator; + } + // runlength encode the line buffer (could be integrated with extraction) + typedef std::vector EndType; + EndType firsts; + EndType lasts; + for (unsigned idx=0;idx(ShortLineBuf, tmpShortLineBuf, magnitude, m_Extreme); + // copy the segment back into the full line buffer + std::copy(&(ShortLineBuf[1]), &(ShortLineBuf[SLL+1]), &(LineBuf[first])); + } + // copy the line buffer back to the image - don't need to do it on + // the last pass - move when we are sure it is working + unsigned j = 0; + while( !outputDistIterator.IsAtEndOfLine() ) + { + outputDistIterator.Set( static_cast( LineBuf[j++] ) ); + ++outputDistIterator; + } + + if (lastpass) + { + unsigned j2 = 0; + while (!outputLabIterator.IsAtEndOfLine()) + { + typename TInIter::PixelType val = 0; + if (LineBuf[j2] == BaseSigma) + { + val=LabBuf[j2]; + } + outputLabIterator.Set(val); + ++outputLabIterator; + ++j2; + } + outputLabIterator.NextLine(); + } + // now onto the next line + inputIterator.NextLine(); + inputDistIterator.NextLine(); + outputDistIterator.NextLine(); + progress.CompletedPixel(); + } +} + +template +void doOneDimensionDilate(TInIter &inputIterator, TDistIter &inputDistIterator, + TOutDistIter &outputDistIterator, TOutLabIter &outputLabIterator, + ProgressReporter &progress, + const unsigned LineLength, + const unsigned direction, + const int m_MagnitudeSign, + const bool m_UseImageSpacing, + const RealType m_Extreme, + const RealType image_scale, + const RealType Sigma + ) +{ + // specialised version for binary erosion during first pass. We can + // compute the results directly because the inputs are flat. + typedef typename itk::Array LineBufferType; + typedef typename itk::Array LabelBufferType; + RealType iscale = 1.0; + if (m_UseImageSpacing) + { + iscale = image_scale; + } + // restructure equation to reduce numerical error + const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 * Sigma); +// const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 ); + LineBufferType LineBuf(LineLength); + LabelBufferType LabBuf(LineLength); + LineBufferType tmpLineBuf(LineLength); + LabelBufferType newLabBuf(LineLength); + LabelBufferType tmpLabBuf(LineLength); + + inputIterator.SetDirection(direction); + inputDistIterator.SetDirection(direction); + outputDistIterator.SetDirection(direction); + outputLabIterator.SetDirection(direction); + + inputIterator.GoToBegin(); + inputDistIterator.GoToBegin(); + outputDistIterator.GoToBegin(); + outputLabIterator.GoToBegin(); + + while( !inputDistIterator.IsAtEnd() && !outputLabIterator.IsAtEnd() ) + { + // process this direction + // fetch the line into the buffer - this methodology is like + // the gaussian filters + unsigned int i=0; + + // copy the scanline to a buffer + while( !inputDistIterator.IsAtEndOfLine() ) + { + LineBuf[i] = inputDistIterator.Get(); + LabBuf[i] = inputIterator.Get(); + ++i; + ++inputIterator; + ++inputDistIterator; + } + + DoLineLabelProp(LineBuf, tmpLineBuf, LabBuf, tmpLabBuf, magnitude, m_Extreme); + // copy the line buffer back to the image + unsigned j = 0; + while( !outputDistIterator.IsAtEndOfLine() ) + { + outputDistIterator.Set( static_cast( LineBuf[j] ) ); + outputLabIterator.Set(LabBuf[j]); + ++outputDistIterator; + ++outputLabIterator; + j++; + } + + // now onto the next line + inputIterator.NextLine(); + outputLabIterator.NextLine(); + inputDistIterator.NextLine(); + outputDistIterator.NextLine(); + progress.CompletedPixel(); + } +} + +} +} +#endif diff --git a/Modules/Filtering/LabelErodeDilate/include/itkinstance.h b/Modules/Filtering/LabelErodeDilate/include/itkinstance.h new file mode 100644 index 00000000000..e2776ddb779 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/include/itkinstance.h @@ -0,0 +1,14 @@ +#ifndef __AIDANS_INSTANCE_ +#define __AIDANS_INSTANCE_ +// Aidan's trick +#include +namespace itk +{ + template + class Instance : public T::Pointer { + public: + Instance() : SmartPointer( T::New() ) {} + }; +} + +#endif diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx new file mode 100644 index 00000000000..076c4a152d0 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -0,0 +1,86 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" + +#include "itkLabelSetDilateImageFilter.h" + + +template +int doDilate(char *In, char *Out, int radius) +{ + typedef typename itk::Image MaskImType; + + // load + typedef itk::ImageFileReader< MaskImType > ReaderType; + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName( In ); + try + { + reader->Update(); + } + catch( itk::ExceptionObject & excp ) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + // Label dilation + itk::Instance< itk::LabelSetDilateImageFilter > Dilate; + Dilate->SetInput(reader->GetOutput()); + Dilate->SetRadius(radius); + Dilate->SetUseImageSpacing(true); + typedef itk::ImageFileWriter< MaskImType > WriterType; + WriterType::Pointer writer = WriterType::New(); + writer->SetInput( Dilate->GetOutput() ); + writer->SetFileName( Out ); + try + { + writer->Update(); + } + catch( itk::ExceptionObject & excp ) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; + +} + +///////////////////////////////// + +int itkLabelSetDilateTest(int argc, char * argv[]) +{ + + int dim1; + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + itk::ImageIOBase::IOComponentType ComponentType; + + if (argc != 4) + { + std::cerr << "Usage: " << argv[0] << "inputimage radius outputimage" << std::endl; + return(EXIT_FAILURE); + } + + if (!readImageInfo(argv[1], &ComponentType, &dim1)) + { + std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; + return(EXIT_FAILURE); + } + + int status = EXIT_FAILURE; + switch (dim1) + { + case 2: + status=doDilate(argv[1], argv[3], atoi(argv[2])); + break; + case 3: + status=doDilate(argv[1], argv[3], atoi(argv[2])); + break; + default: + std::cerr << "Unsupported dimension" << std::endl; + return (EXIT_FAILURE); + break; + } + return status; +} diff --git a/Modules/Filtering/LabelErodeDilate/test/labelDilateLoopTest.cxx b/Modules/Filtering/LabelErodeDilate/test/labelDilateLoopTest.cxx new file mode 100644 index 00000000000..d0fdf79a9dd --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/labelDilateLoopTest.cxx @@ -0,0 +1,112 @@ +#include "tclap/CmdLine.h" +#include "ioutils.h" + +#include +#include "itkLabelSetDilateImageFilter.h" +#include "itkinstance.h" + + +typedef class CmdLineType +{ +public: + std::string InputIm, OutputIm; + float radius; + int iterations; +} CmdLineType; + +void ParseCmdLine(int argc, char* argv[], + CmdLineType &CmdLineObj + ) +{ + using namespace TCLAP; + try + { + // Define the command line object. + CmdLine cmd("varSize ", ' ', "0.9"); + + ValueArg inArg("i","input","input image (label mask)",true,"result","string"); + cmd.add( inArg ); + + ValueArg outArg("o","output","output image", true,"","string"); + cmd.add( outArg ); + + ValueArg radArg("r","radius","erosion radius", true, -1.0,"float"); + cmd.add( radArg ); + ValueArg iterArg("","iterations","loop iterations", false, 1,"integer"); + cmd.add( iterArg ); + + // Parse the args. + cmd.parse( argc, argv ); + + CmdLineObj.InputIm = inArg.getValue(); + CmdLineObj.OutputIm = outArg.getValue(); + CmdLineObj.radius = radArg.getValue(); + CmdLineObj.iterations = iterArg.getValue(); + } + catch (ArgException &e) // catch any exceptions + { + std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; + } +} + +template +void doDilate(const CmdLineType &CmdLineObj) +{ + // test behaviour in a loop + typedef typename itk::Image MaskImType; + + // load + typename MaskImType::Pointer mask = readIm(CmdLineObj.InputIm); + + // Label dilation + itk::Instance< itk::LabelSetDilateImageFilter > Dilate; + Dilate->SetRadius(CmdLineObj.radius); + Dilate->SetUseImageSpacing(true); + + + for (int it=0; itSetInput(mask); + Dilate->Update(); + mask = Dilate->GetOutput(); + mask->DisconnectPipeline(); + } + + writeIm(mask, CmdLineObj.OutputIm); + //Dilate->writeDist("/tmp/pdist.nii.gz"); + +} + +///////////////////////////////// + +int main(int argc, char * argv[]) +{ + + int dim1; + CmdLineType CmdLineObj; + ParseCmdLine(argc, argv, CmdLineObj); + + itk::ImageIOBase::IOComponentType ComponentType; + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + + if (!readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1)) + { + std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; + return(EXIT_FAILURE); + } + + switch (dim1) + { + case 2: + doDilate(CmdLineObj); + break; + case 3: + doDilate(CmdLineObj); + break; + default: + std::cerr << "Unsupported dimension" << std::endl; + return (EXIT_FAILURE); + break; + } + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielsson.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielsson.cxx new file mode 100644 index 00000000000..5333cb90263 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielsson.cxx @@ -0,0 +1,98 @@ +#include "tclap/CmdLine.h" +#include "ioutils.h" +#include "itkinstance.h" +#include "multilabelDilation.h" + + + + +typedef class CmdLineType +{ +public: + std::string InputIm, OutputIm; + float radius; +} CmdLineType; + +void ParseCmdLine(int argc, char* argv[], + CmdLineType &CmdLineObj + ) +{ + using namespace TCLAP; + try + { + // Define the command line object. + CmdLine cmd("varSize ", ' ', "0.9"); + + ValueArg inArg("i","input","input image (label mask)",true,"result","string"); + cmd.add( inArg ); + + ValueArg outArg("o","output","output image", true,"","string"); + cmd.add( outArg ); + + ValueArg radArg("r","radius","erosion radius", true, -1.0,"float"); + cmd.add( radArg ); + + // Parse the args. + cmd.parse( argc, argv ); + + CmdLineObj.InputIm = inArg.getValue(); + CmdLineObj.OutputIm = outArg.getValue(); + CmdLineObj.radius = radArg.getValue(); + } + catch (ArgException &e) // catch any exceptions + { + std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; + } +} + + + +template +void doDilate(const CmdLineType &CmdLineObj) +{ + typedef typename itk::Image MaskImType; + + // load + typename MaskImType::Pointer mask = readIm(CmdLineObj.InputIm); + + // apply mask to size + + // Label dilation + typename MaskImType::Pointer res = multilabelDilationDanielsson(mask, CmdLineObj.radius); + writeIm(res, CmdLineObj.OutputIm); + +} + +///////////////////////////////// + +int main(int argc, char * argv[]) +{ + + int dim1; + CmdLineType CmdLineObj; + ParseCmdLine(argc, argv, CmdLineObj); + + itk::ImageIOBase::IOComponentType ComponentType; + //itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + + if (!readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1)) + { + std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; + return(EXIT_FAILURE); + } + + switch (dim1) + { + case 2: + doDilate(CmdLineObj); + break; + case 3: + doDilate(CmdLineObj); + break; + default: + std::cerr << "Unsupported dimension" << std::endl; + return (EXIT_FAILURE); + break; + } + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielssonPerf.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielssonPerf.cxx new file mode 100644 index 00000000000..646ea0f4054 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielssonPerf.cxx @@ -0,0 +1,118 @@ +#include "tclap/CmdLine.h" +#include "ioutils.h" + +#include "multilabelDilation.h" +#include "itkTimeProbe.h" + + + +typedef class CmdLineType +{ +public: + std::string InputIm, OutputIm; + float radius; + int repetitions, threads; + +} CmdLineType; + +void ParseCmdLine(int argc, char* argv[], + CmdLineType &CmdLineObj + ) +{ + using namespace TCLAP; + try + { + // Define the command line object. + CmdLine cmd("varSize ", ' ', "0.9"); + + ValueArg inArg("i","input","input image (label mask)",true,"result","string"); + cmd.add( inArg ); + + ValueArg outArg("o","output","output image", true,"","string"); + cmd.add( outArg ); + + ValueArg radArg("r","radius","erosion radius", true, -1.0,"float"); + cmd.add( radArg ); + + ValueArg threadArg("", "threads", "number of threads", false, 1, "integer"); + cmd.add(threadArg); + + ValueArg repArg("", "repetitions", "number of repeats", false, 1, "integer"); + cmd.add(repArg); + + // Parse the args. + cmd.parse( argc, argv ); + + CmdLineObj.InputIm = inArg.getValue(); + CmdLineObj.OutputIm = outArg.getValue(); + CmdLineObj.radius = radArg.getValue(); + CmdLineObj.threads = threadArg.getValue(); + CmdLineObj.repetitions = repArg.getValue(); + + } + catch (ArgException &e) // catch any exceptions + { + std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; + } +} + +template +void doDilate(const CmdLineType &CmdLineObj) +{ + typedef typename itk::Image MaskImType; + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(CmdLineObj.threads); + itk::TimeProbe timer; + + // load + typename MaskImType::Pointer mask = readIm(CmdLineObj.InputIm); + + // apply mask to size + + // Label erosion + typename MaskImType::Pointer res; + std::cout << "Iterations,lab_dilate_timed,radius,threads" << std::endl; + for (int r = 0; r < CmdLineObj.repetitions; r++) + { + timer.Start(); + res = multilabelDilationDanielsson(mask, CmdLineObj.radius); + timer.Stop(); + } + std::cout << std::setprecision(3) << CmdLineObj.repetitions << "," << timer.GetMean() << "," << CmdLineObj.radius << ","<< CmdLineObj.threads << std::endl; + writeIm(res, CmdLineObj.OutputIm); + //Erode->writeDist("/tmp/dist.mhd"); + +} + +///////////////////////////////// + +int main(int argc, char * argv[]) +{ + + int dim1; + CmdLineType CmdLineObj; + ParseCmdLine(argc, argv, CmdLineObj); + + itk::ImageIOBase::IOComponentType ComponentType; + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + + if (!readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1)) + { + std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; + return(EXIT_FAILURE); + } + + switch (dim1) + { + case 2: + doDilate(CmdLineObj); + break; + case 3: + doDilate(CmdLineObj); + break; + default: + std::cerr << "Unsupported dimension" << std::endl; + return (EXIT_FAILURE); + break; + } + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilatePerf.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilatePerf.cxx new file mode 100644 index 00000000000..8390ee7b120 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilatePerf.cxx @@ -0,0 +1,135 @@ +#include "tclap/CmdLine.h" +#include "ioutils.h" + +#include +#include "itkLabelSetDilateImageFilter.h" +#include "itkTimeProbe.h" + +// Aidan's trick +#include +namespace itk +{ + template + class Instance : public T::Pointer { + public: + Instance() : SmartPointer( T::New() ) {} + }; +} + + + +typedef class CmdLineType +{ +public: + std::string InputIm, OutputIm; + float radius; + int repetitions, threads; + +} CmdLineType; + +void ParseCmdLine(int argc, char* argv[], + CmdLineType &CmdLineObj + ) +{ + using namespace TCLAP; + try + { + // Define the command line object. + CmdLine cmd("varSize ", ' ', "0.9"); + + ValueArg inArg("i","input","input image (label mask)",true,"result","string"); + cmd.add( inArg ); + + ValueArg outArg("o","output","output image", true,"","string"); + cmd.add( outArg ); + + ValueArg radArg("r","radius","erosion radius", true, -1.0,"float"); + cmd.add( radArg ); + + ValueArg threadArg("", "threads", "number of threads", false, 1, "integer"); + cmd.add(threadArg); + + ValueArg repArg("", "repetitions", "number of repeats", false, 1, "integer"); + cmd.add(repArg); + + // Parse the args. + cmd.parse( argc, argv ); + + CmdLineObj.InputIm = inArg.getValue(); + CmdLineObj.OutputIm = outArg.getValue(); + CmdLineObj.radius = radArg.getValue(); + CmdLineObj.threads = threadArg.getValue(); + CmdLineObj.repetitions = repArg.getValue(); + + } + catch (ArgException &e) // catch any exceptions + { + std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; + } +} + +template +void doDilate(const CmdLineType &CmdLineObj) +{ + typedef typename itk::Image MaskImType; + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(CmdLineObj.threads); + itk::TimeProbe timer; + + // load + typename MaskImType::Pointer mask = readIm(CmdLineObj.InputIm); + + // apply mask to size + + // Label erosion + itk::Instance< itk::LabelSetDilateImageFilter > Dilate; + Dilate->SetInput(mask); + Dilate->SetRadius(CmdLineObj.radius); + Dilate->SetUseImageSpacing(true); + + std::cout << "Iterations,lab_dilate_timed,radius,threads" << std::endl; + for (int r = 0; r < CmdLineObj.repetitions; r++) + { + Dilate->Modified(); + timer.Start(); + Dilate->Update(); + timer.Stop(); + } + std::cout << std::setprecision(3) << CmdLineObj.repetitions << "," << timer.GetMean() << "," << CmdLineObj.radius << ","<< CmdLineObj.threads << std::endl; + writeIm(Dilate->GetOutput(), CmdLineObj.OutputIm); + //Erode->writeDist("/tmp/dist.mhd"); + +} + +///////////////////////////////// + +int main(int argc, char * argv[]) +{ + + int dim1; + CmdLineType CmdLineObj; + ParseCmdLine(argc, argv, CmdLineObj); + + itk::ImageIOBase::IOComponentType ComponentType; + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + + if (!readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1)) + { + std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; + return(EXIT_FAILURE); + } + + switch (dim1) + { + case 2: + doDilate(CmdLineObj); + break; + case 3: + doDilate(CmdLineObj); + break; + default: + std::cerr << "Unsupported dimension" << std::endl; + return (EXIT_FAILURE); + break; + } + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateSelected.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateSelected.cxx new file mode 100644 index 00000000000..ec7b3f7657f --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateSelected.cxx @@ -0,0 +1,112 @@ +#include "tclap/CmdLine.h" +#include "ioutils.h" +#include +#include "itkMGHImageIO.h" + +#include +#include "itkLabelSetDilateImageFilter.h" +#include +#include "itkinstance.h" + +typedef class CmdLineType +{ +public: + std::string InputIm, OutputIm; + std::vector Remove; + float radius; +} CmdLineType; + +void ParseCmdLine(int argc, char* argv[], + CmdLineType &CmdLineObj + ) +{ + using namespace TCLAP; + try + { + // Define the command line object. + CmdLine cmd("labelSetsDilateSelected ", ' ', "0.9"); + + ValueArg inArg("i","input","input image (label mask)",true,"result","string"); + cmd.add( inArg ); + + ValueArg outArg("o","output","output image", true,"","string"); + cmd.add( outArg ); + + ValueArg radArg("r","radius","erosion radius", true, -1.0,"float"); + cmd.add( radArg ); + + UnlabeledMultiArg labels(std::string("labels"), + std::string("labels to be removed"), + true, std::string("integers")); + cmd.add(labels); + // Parse the args. + cmd.parse( argc, argv ); + + CmdLineObj.InputIm = inArg.getValue(); + CmdLineObj.OutputIm = outArg.getValue(); + CmdLineObj.radius = radArg.getValue(); + CmdLineObj.Remove = labels.getValue(); + } + catch (ArgException &e) // catch any exceptions + { + std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; + } +} + +template +void doDilate(const CmdLineType &CmdLineObj) +{ + typedef typename itk::Image MaskImType; + + // load + typename MaskImType::Pointer mask = readIm(CmdLineObj.InputIm); + // filter out labels to be discarded + itk::Instance< itk::ChangeLabelImageFilter< MaskImType, MaskImType> > Deleter; + Deleter->SetInput(mask); + for (unsigned i = 0; i < CmdLineObj.Remove.size(); i++) + { + Deleter->SetChange(CmdLineObj.Remove[i], 0); + } + // Label dilation + itk::Instance< itk::LabelSetDilateImageFilter > Dilate; + Dilate->SetInput(Deleter->GetOutput()); + Dilate->SetRadius(CmdLineObj.radius); + Dilate->SetUseImageSpacing(true); + writeIm(Dilate->GetOutput(), CmdLineObj.OutputIm); + +} + +///////////////////////////////// + +int main(int argc, char * argv[]) +{ + //itk::ObjectFactoryBase::UnRegisterAllFactories(); + itk::MGHImageIOFactory::RegisterOneFactory(); + itk::ObjectFactoryBase::RegisterFactory(itk::MGHImageIOFactory::New() ); + + int dim1=3; + CmdLineType CmdLineObj; + ParseCmdLine(argc, argv, CmdLineObj); + itk::ImageIOBase::IOComponentType ComponentType; + + if (!readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1)) + { + std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; + return(EXIT_FAILURE); + } + switch (dim1) + { + case 2: + doDilate< int, 2>(CmdLineObj); + break; + case 3: + doDilate< int, 3>(CmdLineObj); + break; + default: + std::cerr << "Unsupported dimension" << std::endl; + return (EXIT_FAILURE); + break; + } + + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWS.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWS.cxx new file mode 100644 index 00000000000..c3bbb5f4d1e --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWS.cxx @@ -0,0 +1,97 @@ +#include "tclap/CmdLine.h" +#include "ioutils.h" + +#include "multilabelDilation.h" + + + +typedef class CmdLineType +{ +public: + std::string InputIm, OutputIm; + float radius; +} CmdLineType; + +void ParseCmdLine(int argc, char* argv[], + CmdLineType &CmdLineObj + ) +{ + using namespace TCLAP; + try + { + // Define the command line object. + CmdLine cmd("varSize ", ' ', "0.9"); + + ValueArg inArg("i","input","input image (label mask)",true,"result","string"); + cmd.add( inArg ); + + ValueArg outArg("o","output","output image", true,"","string"); + cmd.add( outArg ); + + ValueArg radArg("r","radius","erosion radius", true, -1.0,"float"); + cmd.add( radArg ); + + // Parse the args. + cmd.parse( argc, argv ); + + CmdLineObj.InputIm = inArg.getValue(); + CmdLineObj.OutputIm = outArg.getValue(); + CmdLineObj.radius = radArg.getValue(); + } + catch (ArgException &e) // catch any exceptions + { + std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; + } +} + + + +template +void doDilate(const CmdLineType &CmdLineObj) +{ + typedef typename itk::Image MaskImType; + + // load + typename MaskImType::Pointer mask = readIm(CmdLineObj.InputIm); + + // apply mask to size + + // Label dilation + typename MaskImType::Pointer res = multilabelDilation(mask, CmdLineObj.radius); + writeIm(res, CmdLineObj.OutputIm); + +} + +///////////////////////////////// + +int main(int argc, char * argv[]) +{ + + int dim1; + CmdLineType CmdLineObj; + ParseCmdLine(argc, argv, CmdLineObj); + + itk::ImageIOBase::IOComponentType ComponentType; + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + + if (!readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1)) + { + std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; + return(EXIT_FAILURE); + } + + switch (dim1) + { + case 2: + doDilate(CmdLineObj); + break; + case 3: + doDilate(CmdLineObj); + break; + default: + std::cerr << "Unsupported dimension" << std::endl; + return (EXIT_FAILURE); + break; + } + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWSPerf.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWSPerf.cxx new file mode 100644 index 00000000000..b7a6e948463 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWSPerf.cxx @@ -0,0 +1,118 @@ +#include "tclap/CmdLine.h" +#include "ioutils.h" + +#include "multilabelDilation.h" +#include "itkTimeProbe.h" + + + +typedef class CmdLineType +{ +public: + std::string InputIm, OutputIm; + float radius; + int repetitions, threads; + +} CmdLineType; + +void ParseCmdLine(int argc, char* argv[], + CmdLineType &CmdLineObj + ) +{ + using namespace TCLAP; + try + { + // Define the command line object. + CmdLine cmd("varSize ", ' ', "0.9"); + + ValueArg inArg("i","input","input image (label mask)",true,"result","string"); + cmd.add( inArg ); + + ValueArg outArg("o","output","output image", true,"","string"); + cmd.add( outArg ); + + ValueArg radArg("r","radius","erosion radius", true, -1.0,"float"); + cmd.add( radArg ); + + ValueArg threadArg("", "threads", "number of threads", false, 1, "integer"); + cmd.add(threadArg); + + ValueArg repArg("", "repetitions", "number of repeats", false, 1, "integer"); + cmd.add(repArg); + + // Parse the args. + cmd.parse( argc, argv ); + + CmdLineObj.InputIm = inArg.getValue(); + CmdLineObj.OutputIm = outArg.getValue(); + CmdLineObj.radius = radArg.getValue(); + CmdLineObj.threads = threadArg.getValue(); + CmdLineObj.repetitions = repArg.getValue(); + + } + catch (ArgException &e) // catch any exceptions + { + std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; + } +} + +template +void doDilate(const CmdLineType &CmdLineObj) +{ + typedef typename itk::Image MaskImType; + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(CmdLineObj.threads); + itk::TimeProbe timer; + + // load + typename MaskImType::Pointer mask = readIm(CmdLineObj.InputIm); + + // apply mask to size + + // Label erosion + typename MaskImType::Pointer res; + std::cout << "Iterations,lab_dilate_timed,radius,threads" << std::endl; + for (int r = 0; r < CmdLineObj.repetitions; r++) + { + timer.Start(); + res = multilabelDilation(mask, CmdLineObj.radius); + timer.Stop(); + } + std::cout << std::setprecision(3) << CmdLineObj.repetitions << "," << timer.GetMean() << "," << CmdLineObj.radius << ","<< CmdLineObj.threads << std::endl; + writeIm(res, CmdLineObj.OutputIm); + //Erode->writeDist("/tmp/dist.mhd"); + +} + +///////////////////////////////// + +int main(int argc, char * argv[]) +{ + + int dim1; + CmdLineType CmdLineObj; + ParseCmdLine(argc, argv, CmdLineObj); + + itk::ImageIOBase::IOComponentType ComponentType; + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + + if (!readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1)) + { + std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; + return(EXIT_FAILURE); + } + + switch (dim1) + { + case 2: + doDilate(CmdLineObj); + break; + case 3: + doDilate(CmdLineObj); + break; + default: + std::cerr << "Unsupported dimension" << std::endl; + return (EXIT_FAILURE); + break; + } + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsErode.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsErode.cxx new file mode 100644 index 00000000000..f5f36703d3a --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/labelSetsErode.cxx @@ -0,0 +1,111 @@ +#include "tclap/CmdLine.h" +#include "ioutils.h" + +#include +#include "itkLabelSetErodeImageFilter.h" + +// Aidan's trick +#include +namespace itk +{ + template + class Instance : public T::Pointer { + public: + Instance() : SmartPointer( T::New() ) {} + }; +} + + + +typedef class CmdLineType +{ +public: + std::string InputIm, OutputIm; + float radius; +} CmdLineType; + +void ParseCmdLine(int argc, char* argv[], + CmdLineType &CmdLineObj + ) +{ + using namespace TCLAP; + try + { + // Define the command line object. + CmdLine cmd("varSize ", ' ', "0.9"); + + ValueArg inArg("i","input","input image (label mask)",true,"result","string"); + cmd.add( inArg ); + + ValueArg outArg("o","output","output image", true,"","string"); + cmd.add( outArg ); + + ValueArg radArg("r","radius","erosion radius", true, -1.0,"float"); + cmd.add( radArg ); + + // Parse the args. + cmd.parse( argc, argv ); + + CmdLineObj.InputIm = inArg.getValue(); + CmdLineObj.OutputIm = outArg.getValue(); + CmdLineObj.radius = radArg.getValue(); + } + catch (ArgException &e) // catch any exceptions + { + std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; + } +} + +template +void doErode(const CmdLineType &CmdLineObj) +{ + typedef typename itk::Image MaskImType; + + // load + typename MaskImType::Pointer mask = readIm(CmdLineObj.InputIm); + + // apply mask to size + + // Label erosion + itk::Instance< itk::LabelSetErodeImageFilter > Erode; + Erode->SetInput(mask); + Erode->SetRadius(CmdLineObj.radius); + + writeIm(Erode->GetOutput(), CmdLineObj.OutputIm); + //Erode->writeDist("/tmp/dist.mhd"); + +} + +///////////////////////////////// + +int main(int argc, char * argv[]) +{ + + int dim1; + CmdLineType CmdLineObj; + ParseCmdLine(argc, argv, CmdLineObj); + + itk::ImageIOBase::IOComponentType ComponentType; + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + + if (!readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1)) + { + std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; + return(EXIT_FAILURE); + } + + switch (dim1) + { + case 2: + doErode(CmdLineObj); + break; + case 3: + doErode(CmdLineObj); + break; + default: + std::cerr << "Unsupported dimension" << std::endl; + return (EXIT_FAILURE); + break; + } + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsPerf.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsPerf.cxx new file mode 100644 index 00000000000..d50238fb91b --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/labelSetsPerf.cxx @@ -0,0 +1,134 @@ +#include "tclap/CmdLine.h" +#include "ioutils.h" + +#include +#include "itkLabelSetErodeImageFilter.h" +#include "itkTimeProbe.h" + +// Aidan's trick +#include +namespace itk +{ + template + class Instance : public T::Pointer { + public: + Instance() : SmartPointer( T::New() ) {} + }; +} + + + +typedef class CmdLineType +{ +public: + std::string InputIm, OutputIm; + float radius; + int repetitions, threads; + +} CmdLineType; + +void ParseCmdLine(int argc, char* argv[], + CmdLineType &CmdLineObj + ) +{ + using namespace TCLAP; + try + { + // Define the command line object. + CmdLine cmd("labelSetsPerf ", ' ', "0.9"); + + ValueArg inArg("i","input","input image (label mask)",true,"result","string"); + cmd.add( inArg ); + + ValueArg outArg("o","output","output image", true,"","string"); + cmd.add( outArg ); + + ValueArg radArg("r","radius","erosion radius", true, -1.0,"float"); + cmd.add( radArg ); + + ValueArg threadArg("", "threads", "number of threads", false, 1, "integer"); + cmd.add(threadArg); + + ValueArg repArg("", "repetitions", "number of repeats", false, 1, "integer"); + cmd.add(repArg); + + // Parse the args. + cmd.parse( argc, argv ); + + CmdLineObj.InputIm = inArg.getValue(); + CmdLineObj.OutputIm = outArg.getValue(); + CmdLineObj.radius = radArg.getValue(); + CmdLineObj.threads = threadArg.getValue(); + CmdLineObj.repetitions = repArg.getValue(); + + } + catch (ArgException &e) // catch any exceptions + { + std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; + } +} + +template +void doErode(const CmdLineType &CmdLineObj) +{ + typedef typename itk::Image MaskImType; + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(CmdLineObj.threads); + itk::TimeProbe timer; + + // load + typename MaskImType::Pointer mask = readIm(CmdLineObj.InputIm); + + // apply mask to size + + // Label erosion + itk::Instance< itk::LabelSetErodeImageFilter > Erode; + Erode->SetInput(mask); + Erode->SetRadius(CmdLineObj.radius); + + std::cout << "Iterations,label_erode_time,threads" << std::endl; + for (int r = 0; r < CmdLineObj.repetitions; r++) + { + Erode->Modified(); + timer.Start(); + Erode->Update(); + timer.Stop(); + } + std::cout << std::setprecision(3) << CmdLineObj.repetitions << "," << timer.GetMean() << "," << CmdLineObj.threads << std::endl; + + writeIm(Erode->GetOutput(), CmdLineObj.OutputIm); + //Erode->writeDist("/tmp/dist.mhd"); + +} + +///////////////////////////////// + +int main(int argc, char * argv[]) +{ + + int dim1; + CmdLineType CmdLineObj; + ParseCmdLine(argc, argv, CmdLineObj); + + itk::ImageIOBase::IOComponentType ComponentType; + + if (!readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1)) + { + std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; + return(EXIT_FAILURE); + } + + switch (dim1) + { + case 2: + doErode(CmdLineObj); + break; + case 3: + doErode(CmdLineObj); + break; + default: + std::cerr << "Unsupported dimension" << std::endl; + return (EXIT_FAILURE); + break; + } + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/LabelErodeDilate/test/reportNonZero.cxx b/Modules/Filtering/LabelErodeDilate/test/reportNonZero.cxx new file mode 100644 index 00000000000..6dbaa64524e --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/reportNonZero.cxx @@ -0,0 +1,100 @@ +// tool to report the location and values of non zero voxels so we can +// check differences between versions + +#include "itkinstance.h" + +#include "tclap/CmdLine.h" +#include "ioutils.h" + +#include "itkImageRegionIterator.h" + + +typedef class CmdLineType +{ +public: + std::string InputIm; +} CmdLineType; + +void ParseCmdLine(int argc, char* argv[], + CmdLineType &CmdLineObj + ) +{ + using namespace TCLAP; + try + { + // Define the command line object. + CmdLine cmd("varSize ", ' ', "0.9"); + + ValueArg inArg("i","input","input image (label mask)",true,"result","string"); + cmd.add( inArg ); + + // Parse the args. + cmd.parse( argc, argv ); + + CmdLineObj.InputIm = inArg.getValue(); + } + catch (ArgException &e) // catch any exceptions + { + std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; + } +} + +template < class PixType, int dim> +void doSearch(const CmdLineType &CmdLineObj) +{ + typedef typename itk::Image MaskImType; + + // load + typename MaskImType::Pointer mask = readIm(CmdLineObj.InputIm); + typedef typename itk::ImageRegionIterator IterType; + + IterType iter(mask, mask->GetLargestPossibleRegion()); + + for (iter.GoToBegin(); !iter.IsAtEnd(); ++iter) + { + PixType Val = iter.Get(); + if (Val) + { + typename MaskImType::IndexType pos = iter.GetIndex(); + typename MaskImType::PointType wc; + mask->TransformIndexToPhysicalPoint(pos, wc); + std::cout << Val ; + for (unsigned i=0; i< dim; i++) + std::cout << "," << std::setprecision(10) << wc[i]; + std::cout << std::endl; + } + } + +} + +int main(int argc, char * argv[]) +{ + + int dim1; + CmdLineType CmdLineObj; + ParseCmdLine(argc, argv, CmdLineObj); + + itk::ImageIOBase::IOComponentType ComponentType; + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + + if (!readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1)) + { + std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; + return(EXIT_FAILURE); + } + + switch (dim1) + { + case 2: + doSearch(CmdLineObj); + break; + case 3: + doSearch(CmdLineObj); + break; + default: + std::cerr << "Unsupported dimension" << std::endl; + return (EXIT_FAILURE); + break; + } + return EXIT_SUCCESS; +} From 059b1a46fb17d5bb8d3117726950ca6af06190e3 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 13 May 2015 17:55:34 +1000 Subject: [PATCH 013/113] preparing first test --- .../Filtering/LabelErodeDilate/test/CMakeLists.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt diff --git a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt new file mode 100644 index 00000000000..9b372864bac --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt @@ -0,0 +1,11 @@ +itk_module_test() +set(LabelErodeDilateTests +itkLabelSetDilateTest.cxx +) + +SET(INPUT_IMAGE ${CMAKE_CURRENT_SOURCE_DIR}/images/cthead1.png) + +set(ITK_TEST_DRIVER itkTestDriver) + +CreateTestDriver(LabelErodeDilate "${LabelErodeDilate-Test_LIBRARIES}" "${LabelErodeDilateTests}") + From f91828f8881a7d0a4f7ea0d429c706d519065ce3 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 13 May 2015 20:11:10 +1000 Subject: [PATCH 014/113] first test still --- .../Filtering/LabelErodeDilate/CMakeLists.txt | 142 +----------------- .../LabelErodeDilate/test/CMakeLists.txt | 5 +- 2 files changed, 5 insertions(+), 142 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt index e89d15abd40..073dbfb80fc 100644 --- a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt @@ -1,142 +1,2 @@ -#Change PROJECT_NAME to the name of your project PROJECT(LabelErodeDilate) - -# set the name of the input image used to run the test -SET(BRAIN_ATLAS ${CMAKE_CURRENT_SOURCE_DIR}/images/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz) -SET(POINTIM ${CMAKE_CURRENT_SOURCE_DIR}/BugsFromDzenan/vCenters10.mha) -SET(BRAIN_SLICE ${CMAKE_CURRENT_SOURCE_DIR}/images/axial.png) -SET(HOLEIM ${CMAKE_CURRENT_SOURCE_DIR}/images/hole.nii.gz) -SET(DOTIM ${CMAKE_CURRENT_SOURCE_DIR}/images/dot.nii.gz) - -#include some macros from another file... -INCLUDE(IJMacros.txt) - -CMAKE_MINIMUM_REQUIRED(VERSION 2.4) - -if(COMMAND cmake_policy) - cmake_policy(SET CMP0003 NEW) -endif(COMMAND cmake_policy) - - -#The following lines are required to use Dart -ENABLE_TESTING() -INCLUDE(Dart) -FIND_PROGRAM(ITK_TEST_DRIVER itkTestDriver) -SET(TEST_COMMAND ${ITK_TEST_DRIVER} --add-before-env PATH ${CMAKE_CURRENT_BINARY_DIR}) - -#Declare any external dependencies that your project may have here. -#examples include: ITK, VTK, JPEG, PNG, OpenGL, ZLIB, Perl, Java -#If you're not sure what name to use, look in the Modules directory of your -#cmake install and check that a file named Find(Package).cmake exists - -SET(Required_Packages -ITK -) - - -INCLUDE_DIRECTORIES( - ${CMAKE_CURRENT_SOURCE_DIR} -) - -#this foreach loads all of the packages that you specified as required. -#It shouldn't need to be modified. -FOREACH(Package ${Required_Packages}) - LOADPACKAGE(${Package}) -ENDFOREACH(Package) - -#Set any libraries that your project depends on. -#examples: ITKCommon, VTKRendering, etc -SET(Libraries -${ITK_LIBRARIES} -) - - -# install devel files -OPTION(INSTALL_DEVEL_FILES "Install C++ headers" ON) -IF(INSTALL_DEVEL_FILES) -FILE(GLOB develFiles *.h *.txx) -FOREACH(f ${develFiles}) - INSTALL_FILES(/include/InsightToolkit/BasicFilters FILES ${f}) -ENDFOREACH(f) -ENDIF(INSTALL_DEVEL_FILES) - - - -# option for wrapping -OPTION(BUILD_WRAPPERS "Wrap library" OFF) -IF(BUILD_WRAPPERS) - SUBDIRS(Wrapping) -ENDIF(BUILD_WRAPPERS) - - - -#the following block of code is an example of how to build an executable in -#cmake. Unmodified, it will add an executable called "MyExe" to the project. -#MyExe will be built using the files MyClass.h and MyClass.cxx, and it will -#be linked to all the libraries you specified above. -#You can build more than one executable per project - -IF(BUILD_TESTING) - -FOREACH(CurrentExe labelSetsErode labelSetsPerf -labelSetsDilatePerf labelSetsDilateWSPerf labelSetsDilateDanielssonPerf labelSetsDilate labelSetsDilateWS labelSetsDilateDanielsson reportNonZero labelSetsDilateSelected labelDilateLoopTest labelSetsDilateEllipse labelSetsErodeEllipse) -ADD_EXECUTABLE(${CurrentExe} ${CurrentExe}.cxx) -TARGET_LINK_LIBRARIES(${CurrentExe} ${Libraries}) -ENDFOREACH(CurrentExe) - -ENDIF(BUILD_TESTING) - -#the following line is an example of how to add a test to your project. -#Testname is the title for this particular test. ExecutableToRun is the -#program which will be running this test. It can either be a part of this -#project or an external executable. After that list any args that are needed -#for this test. Include as many tests as you like. If your project doesn't have -#any tests you can comment out or delete the following line. -# ADD_TEST(Testname ExecutableToRun arg1 arg2 arg3) - - -ADD_TEST(testLabelErode3d ${TEST_COMMAND} labelSetsErode -i -${BRAIN_ATLAS} -o laberode3d.nii.gz -r 2 ---compare laberode3d.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/laberode3d.nii.gz -) - -ADD_TEST(testLabelDilate3d ${TEST_COMMAND} labelSetsDilate -i -${BRAIN_ATLAS} -o labdilate3d.nii.gz -r 5 ---compare labdilate3d.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/labdilate3d.nii.gz -) - -ADD_TEST(testLabelDilate3dDez ${TEST_COMMAND} labelSetsDilate -i -${POINTIM} -o labdilate3d_dez.nii.gz -r 50 ---compare labdilate3d_dez.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/labdilate3d_dez.nii.gz -) - -ADD_TEST(testLabelErode2d ${TEST_COMMAND} labelSetsErode -i -${BRAIN_SLICE} -o laberode2d.png -r 2 ---compare laberode2d.png ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/laberode2d.png - -) - -ADD_TEST(testLabelDilate2d ${TEST_COMMAND} labelSetsDilate -i -${BRAIN_SLICE} -o labdilate2d.png -r 5 ---compare labdilate2d.png ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/labdilate2d.png -) - -ADD_TEST(threadDilateTest ${TEST_COMMAND} ${CMAKE_COMMAND} -DTESTIMAGE=${CMAKE_CURRENT_SOURCE_DIR}/BugsFromDzenan/vCenters10.mha -P ${CMAKE_CURRENT_SOURCE_DIR}/threadtest.cmake ---compare dil_4.mha dil_1.mha) - -ADD_TEST(LoopDilateTest ${TEST_COMMAND} labelDilateLoopTest -i ${BRAIN_SLICE} -o looplabdilate2d.png -r 1.1 --iterations 50 ) - -ADD_TEST(LoopDilateTest2 ${TEST_COMMAND} labelDilateLoopTest -i ${BRAIN_SLICE} -o looplabdilate2d50.png -r 51 --iterations 1 ) - - - -ADD_TEST(testLabelDilateEllipse ${TEST_COMMAND} labelSetsDilateEllipse -i -${DOTIM} -o labdilate3d_ell.nii.gz -r 20 --radius2 10 --radius3 10 ---compare labdilate3d_ell.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/labdilate3d_ell.nii.gz -) - -ADD_TEST(testLabelErodeEllipse ${TEST_COMMAND} labelSetsErodeEllipse -i -${HOLEIM} -o laberode3d_ell.nii.gz -r 20 --radius2 10 --radius3 10 ---compare laberode3d_ell.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/laberode3d_ell.nii.gz -) - +itk_module_impl() diff --git a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt index 9b372864bac..5bf86682efe 100644 --- a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt @@ -3,9 +3,12 @@ set(LabelErodeDilateTests itkLabelSetDilateTest.cxx ) -SET(INPUT_IMAGE ${CMAKE_CURRENT_SOURCE_DIR}/images/cthead1.png) +SET(INPUT_IMAGE2D ${CMAKE_CURRENT_SOURCE_DIR}/images/axial.png) set(ITK_TEST_DRIVER itkTestDriver) CreateTestDriver(LabelErodeDilate "${LabelErodeDilate-Test_LIBRARIES}" "${LabelErodeDilateTests}") +itk_add_test(NAME itkLabelErodeTest2D_5 + COMMAND LabelErodeDilateTestDriver +itkLabelSetDilateTest ${INPUT_IMAGE} 5 axialdilate5.png ) From ca17b03f2418e95b7525440230d9341f5e29bb97 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 13 May 2015 20:22:50 +1000 Subject: [PATCH 015/113] still trying to get tests started --- Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt index 5bf86682efe..7399189d282 100644 --- a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt @@ -9,6 +9,6 @@ set(ITK_TEST_DRIVER itkTestDriver) CreateTestDriver(LabelErodeDilate "${LabelErodeDilate-Test_LIBRARIES}" "${LabelErodeDilateTests}") -itk_add_test(NAME itkLabelErodeTest2D_5 +itk_add_test(NAME itkLabelDilateTest2D_5 COMMAND LabelErodeDilateTestDriver -itkLabelSetDilateTest ${INPUT_IMAGE} 5 axialdilate5.png ) +itkLabelSetDilateTest ${INPUT_IMAGE2D} 5 axialdilate5.png ) From 6b0849db6431ff58a6c47cc2034603d291f4c505 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 13 May 2015 21:54:46 +1000 Subject: [PATCH 016/113] key cmake file --- .../Filtering/LabelErodeDilate/itk-module.cmake | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 Modules/Filtering/LabelErodeDilate/itk-module.cmake diff --git a/Modules/Filtering/LabelErodeDilate/itk-module.cmake b/Modules/Filtering/LabelErodeDilate/itk-module.cmake new file mode 100644 index 00000000000..4fc6fa8efaf --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/itk-module.cmake @@ -0,0 +1,17 @@ +set(DOCUMENTATION +"This module contains classes for mathematical morphology +on label images using circular/spherical/hyperspherical +structuring elements. It uses parabolic structuring +functions to do these operations efficiently +and handles label collisions" ) +itk_module( LabelErodeDilate + DEPENDS + ITKIOImageBase + TEST_DEPENDS + ITKImageGrid + ITKTestKernel + ITKSmoothing + EXCLUDE_FROM_DEFAULT + DESCRIPTION + "${DOCUMENTATION}" +) From 76c35a3c3c275330c554333cb4f7e49b3c46260f Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 14 May 2015 21:13:52 +1000 Subject: [PATCH 017/113] removed ioutils ref --- .../include/itkLabelSetMorphBaseImageFilter.hxx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index 3d2fe62ad53..6e723068c00 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -11,7 +11,6 @@ #include "itkLabelSetUtils.h" -#include "ioutils.h" namespace itk { @@ -240,7 +239,11 @@ void LabelSetMorphBaseImageFilter ::writeDist(std::string fname) { - writeIm(m_DistanceImage, fname); + typedef typename itk::ImageFileWriter WriterType; + typename WriterType::Pointer writer = WriterType::New(); + writer->SetInput(m_DistanceImage); + writer->SetFileName(fname.c_str()); + writer->Update(); } } // namespace itk From 53a22957392c859f98151bd02bfe9becbef5d892 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 14 May 2015 21:18:25 +1000 Subject: [PATCH 018/113] image to image filter --- .../LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index 12b9d521b44..67ac43ad1b9 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -2,6 +2,7 @@ #define __itkLabelSetMorphBaseImageFilter_h #include "itkNumericTraits.h" +#include "itkImageToImageFilter.h" namespace itk { From 4454e78427efea5646b01bc74a6af300259e464e Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 14 May 2015 21:26:33 +1000 Subject: [PATCH 019/113] image file writer --- .../include/itkLabelSetMorphBaseImageFilter.hxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index 6e723068c00..463abac5c93 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -10,7 +10,7 @@ #include "itkImageLinearConstIteratorWithIndex.h" #include "itkLabelSetUtils.h" - +#include "itkImageFileWriter.h" namespace itk { From c51e49743d8c6a5469ac720e53d766e855a584ad Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 14 May 2015 21:28:13 +1000 Subject: [PATCH 020/113] image file writer --- .../include/itkLabelSetMorphBaseImageFilter.hxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index 463abac5c93..d88376f626d 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -239,8 +239,8 @@ void LabelSetMorphBaseImageFilter ::writeDist(std::string fname) { - typedef typename itk::ImageFileWriter WriterType; - typename WriterType::Pointer writer = WriterType::New(); + typedef itk::ImageFileWriter WriterType; + WriterType::Pointer writer = WriterType::New(); writer->SetInput(m_DistanceImage); writer->SetFileName(fname.c_str()); writer->Update(); From fc9b5cf8e06a98b7c932b20b04b8c3f3fe00d06b Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 14 May 2015 21:31:18 +1000 Subject: [PATCH 021/113] image file writer --- .../include/itkLabelSetMorphBaseImageFilter.hxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index d88376f626d..9de1e8ccb19 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -239,8 +239,8 @@ void LabelSetMorphBaseImageFilter ::writeDist(std::string fname) { - typedef itk::ImageFileWriter WriterType; - WriterType::Pointer writer = WriterType::New(); + typedef typename itk::ImageFileWriter WriterType; + typename WriterType::Pointer writer = WriterType::New(); writer->SetInput(m_DistanceImage); writer->SetFileName(fname.c_str()); writer->Update(); From 8f38c0fa25e34b73800d12c80fd7942986dcb46c Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 14 May 2015 21:35:42 +1000 Subject: [PATCH 022/113] typenames required --- .../test/itkLabelSetDilateTest.cxx | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index 076c4a152d0..dbb966fe744 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -11,8 +11,8 @@ int doDilate(char *In, char *Out, int radius) typedef typename itk::Image MaskImType; // load - typedef itk::ImageFileReader< MaskImType > ReaderType; - ReaderType::Pointer reader = ReaderType::New(); + typedef typename itk::ImageFileReader< MaskImType > ReaderType; + typename ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName( In ); try { @@ -25,13 +25,14 @@ int doDilate(char *In, char *Out, int radius) } // Label dilation - itk::Instance< itk::LabelSetDilateImageFilter > Dilate; - Dilate->SetInput(reader->GetOutput()); - Dilate->SetRadius(radius); - Dilate->SetUseImageSpacing(true); - typedef itk::ImageFileWriter< MaskImType > WriterType; - WriterType::Pointer writer = WriterType::New(); - writer->SetInput( Dilate->GetOutput() ); + typedef typename itk::LabelSetDilateImageFilter FilterType; + typename FilterType::pointer filter = FilterType::New(); + filter->SetInput(reader->GetOutput()); + filter->SetRadius(radius); + filter->SetUseImageSpacing(true); + typedef typename itk::ImageFileWriter< MaskImType > WriterType; + typename WriterType::Pointer writer = WriterType::New(); + writer->SetInput( filter->GetOutput() ); writer->SetFileName( Out ); try { From 07d757e15ccb6f2fdb70a8b4e319b34fe75c12b0 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 14 May 2015 21:38:17 +1000 Subject: [PATCH 023/113] typenames required --- .../Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index dbb966fe744..791d5eb04c5 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -26,7 +26,7 @@ int doDilate(char *In, char *Out, int radius) // Label dilation typedef typename itk::LabelSetDilateImageFilter FilterType; - typename FilterType::pointer filter = FilterType::New(); + typename FilterType::Pointer filter = FilterType::New(); filter->SetInput(reader->GetOutput()); filter->SetRadius(radius); filter->SetUseImageSpacing(true); From af4aa8d8a09566bd4c5291295ffba577baff4320 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 14 May 2015 21:42:21 +1000 Subject: [PATCH 024/113] old argument structure --- .../Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index 791d5eb04c5..56681fbde49 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -65,7 +65,7 @@ int itkLabelSetDilateTest(int argc, char * argv[]) if (!readImageInfo(argv[1], &ComponentType, &dim1)) { - std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; + std::cerr << "Failed to open " << argv[1] << std::endl; return(EXIT_FAILURE); } From ba7cb4f0c1554d2182fd04558f21396a5658d696 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 14 May 2015 21:44:55 +1000 Subject: [PATCH 025/113] readimageinfo --- .../test/itkLabelSetDilateTest.cxx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index 56681fbde49..c123bd7b566 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -49,6 +49,20 @@ int doDilate(char *In, char *Out, int radius) } ///////////////////////////////// +int readImageInfo(std::string filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim) +{ + itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(filename.c_str(), itk::ImageIOFactory::ReadMode); + if (imageIO.IsNull()) + return 0; + + + imageIO->SetFileName(filename.c_str()); + imageIO->ReadImageInformation(); + + *ComponentType = imageIO->GetComponentType(); + *dim = imageIO->GetNumberOfDimensions(); + return(1); +} int itkLabelSetDilateTest(int argc, char * argv[]) { From 72ae804ea5ee4207e66ea9b4f3b5d8afe547141f Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 14 May 2015 21:48:23 +1000 Subject: [PATCH 026/113] reducing warnings --- .../include/itkLabelSetDilateImageFilter.hxx | 5 +++-- .../Filtering/LabelErodeDilate/include/itkLabelSetUtils.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx index 52f4a479205..e306f4fa074 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx @@ -28,7 +28,8 @@ LabelSetDilateImageFilter // line copy. // Similarly, the thresholding on output needs to be integrated // with the last processing stage. - + // stop warnings about unused argument + ThreadIdType dummy=threadID; // compute the number of rows first, so we can setup a progress reporter typename std::vector< unsigned int > NumberOfRows; InputSizeType size = outputRegionForThread.GetSize(); @@ -56,7 +57,7 @@ LabelSetDilateImageFilter typedef ImageLinearIteratorWithIndex OutputDistIteratorType; // for stages after the first - typedef ImageLinearConstIteratorWithIndex< TOutputImage > OutputConstIteratorType; + //typedef ImageLinearConstIteratorWithIndex< TOutputImage > OutputConstIteratorType; typedef ImageRegion< TInputImage::ImageDimension > RegionType; diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index 728728d1a20..cb248167b24 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -349,7 +349,7 @@ void doOneDimensionDilateFirstPass(TInIter &inputIterator, TOutDistIter &outputI { // specialised version for binary erosion during first pass. We can // compute the results directly because the inputs are flat. - + const RealType dd=m_Extreme; // stop warnings typedef typename itk::Array LineBufferType; typedef typename itk::Array LabelBufferType; RealType iscale = 1.0; From f2e7716c3c048c62caccba9f3d02807d17183145 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 14 May 2015 21:50:15 +1000 Subject: [PATCH 027/113] reducing warnings --- .../LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx index e306f4fa074..1e4d79afc2a 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx @@ -29,7 +29,7 @@ LabelSetDilateImageFilter // Similarly, the thresholding on output needs to be integrated // with the last processing stage. // stop warnings about unused argument - ThreadIdType dummy=threadID; + ThreadIdType dummy=threadId; // compute the number of rows first, so we can setup a progress reporter typename std::vector< unsigned int > NumberOfRows; InputSizeType size = outputRegionForThread.GetSize(); From ac2cf704d0432d3f5a6ca6621e49525f10bd8f50 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 14 May 2015 21:53:01 +1000 Subject: [PATCH 028/113] reducing warnings --- .../LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx | 2 +- Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx index 1e4d79afc2a..c52f3bf8409 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx @@ -29,7 +29,7 @@ LabelSetDilateImageFilter // Similarly, the thresholding on output needs to be integrated // with the last processing stage. // stop warnings about unused argument - ThreadIdType dummy=threadId; + (void)threadId; // compute the number of rows first, so we can setup a progress reporter typename std::vector< unsigned int > NumberOfRows; InputSizeType size = outputRegionForThread.GetSize(); diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index cb248167b24..2027deddf23 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -349,7 +349,7 @@ void doOneDimensionDilateFirstPass(TInIter &inputIterator, TOutDistIter &outputI { // specialised version for binary erosion during first pass. We can // compute the results directly because the inputs are flat. - const RealType dd=m_Extreme; // stop warnings + (void)m_Extreme; // stop warnings typedef typename itk::Array LineBufferType; typedef typename itk::Array LabelBufferType; RealType iscale = 1.0; From 24d936a37419d779dc02214ec37181b2a329930a Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 14 May 2015 21:55:09 +1000 Subject: [PATCH 029/113] reducing warnings --- .../include/itkLabelSetMorphBaseImageFilter.hxx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index 9de1e8ccb19..9e2c9f600aa 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -45,7 +45,9 @@ void LabelSetMorphBaseImageFilter ::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, ThreadIdType threadId) { - + // stop warnings + (void)outputRegionForThread; + (void)threadId; } template From a715c45ef60950b801309191bfead8f5a3a13962 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 14 May 2015 21:13:52 +1000 Subject: [PATCH 030/113] Getting the first test to compile cleanly --- .../include/itkLabelSetDilateImageFilter.hxx | 5 +-- .../include/itkLabelSetMorphBaseImageFilter.h | 1 + .../itkLabelSetMorphBaseImageFilter.hxx | 13 ++++--- .../include/itkLabelSetUtils.h | 2 +- .../test/itkLabelSetDilateTest.cxx | 35 +++++++++++++------ 5 files changed, 39 insertions(+), 17 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx index 52f4a479205..c52f3bf8409 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx @@ -28,7 +28,8 @@ LabelSetDilateImageFilter // line copy. // Similarly, the thresholding on output needs to be integrated // with the last processing stage. - + // stop warnings about unused argument + (void)threadId; // compute the number of rows first, so we can setup a progress reporter typename std::vector< unsigned int > NumberOfRows; InputSizeType size = outputRegionForThread.GetSize(); @@ -56,7 +57,7 @@ LabelSetDilateImageFilter typedef ImageLinearIteratorWithIndex OutputDistIteratorType; // for stages after the first - typedef ImageLinearConstIteratorWithIndex< TOutputImage > OutputConstIteratorType; + //typedef ImageLinearConstIteratorWithIndex< TOutputImage > OutputConstIteratorType; typedef ImageRegion< TInputImage::ImageDimension > RegionType; diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index 12b9d521b44..67ac43ad1b9 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -2,6 +2,7 @@ #define __itkLabelSetMorphBaseImageFilter_h #include "itkNumericTraits.h" +#include "itkImageToImageFilter.h" namespace itk { diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index 3d2fe62ad53..9e2c9f600aa 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -10,8 +10,7 @@ #include "itkImageLinearConstIteratorWithIndex.h" #include "itkLabelSetUtils.h" - -#include "ioutils.h" +#include "itkImageFileWriter.h" namespace itk { @@ -46,7 +45,9 @@ void LabelSetMorphBaseImageFilter ::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, ThreadIdType threadId) { - + // stop warnings + (void)outputRegionForThread; + (void)threadId; } template @@ -240,7 +241,11 @@ void LabelSetMorphBaseImageFilter ::writeDist(std::string fname) { - writeIm(m_DistanceImage, fname); + typedef typename itk::ImageFileWriter WriterType; + typename WriterType::Pointer writer = WriterType::New(); + writer->SetInput(m_DistanceImage); + writer->SetFileName(fname.c_str()); + writer->Update(); } } // namespace itk diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index 728728d1a20..2027deddf23 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -349,7 +349,7 @@ void doOneDimensionDilateFirstPass(TInIter &inputIterator, TOutDistIter &outputI { // specialised version for binary erosion during first pass. We can // compute the results directly because the inputs are flat. - + (void)m_Extreme; // stop warnings typedef typename itk::Array LineBufferType; typedef typename itk::Array LabelBufferType; RealType iscale = 1.0; diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index 076c4a152d0..c123bd7b566 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -11,8 +11,8 @@ int doDilate(char *In, char *Out, int radius) typedef typename itk::Image MaskImType; // load - typedef itk::ImageFileReader< MaskImType > ReaderType; - ReaderType::Pointer reader = ReaderType::New(); + typedef typename itk::ImageFileReader< MaskImType > ReaderType; + typename ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName( In ); try { @@ -25,13 +25,14 @@ int doDilate(char *In, char *Out, int radius) } // Label dilation - itk::Instance< itk::LabelSetDilateImageFilter > Dilate; - Dilate->SetInput(reader->GetOutput()); - Dilate->SetRadius(radius); - Dilate->SetUseImageSpacing(true); - typedef itk::ImageFileWriter< MaskImType > WriterType; - WriterType::Pointer writer = WriterType::New(); - writer->SetInput( Dilate->GetOutput() ); + typedef typename itk::LabelSetDilateImageFilter FilterType; + typename FilterType::Pointer filter = FilterType::New(); + filter->SetInput(reader->GetOutput()); + filter->SetRadius(radius); + filter->SetUseImageSpacing(true); + typedef typename itk::ImageFileWriter< MaskImType > WriterType; + typename WriterType::Pointer writer = WriterType::New(); + writer->SetInput( filter->GetOutput() ); writer->SetFileName( Out ); try { @@ -48,6 +49,20 @@ int doDilate(char *In, char *Out, int radius) } ///////////////////////////////// +int readImageInfo(std::string filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim) +{ + itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(filename.c_str(), itk::ImageIOFactory::ReadMode); + if (imageIO.IsNull()) + return 0; + + + imageIO->SetFileName(filename.c_str()); + imageIO->ReadImageInformation(); + + *ComponentType = imageIO->GetComponentType(); + *dim = imageIO->GetNumberOfDimensions(); + return(1); +} int itkLabelSetDilateTest(int argc, char * argv[]) { @@ -64,7 +79,7 @@ int itkLabelSetDilateTest(int argc, char * argv[]) if (!readImageInfo(argv[1], &ComponentType, &dim1)) { - std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; + std::cerr << "Failed to open " << argv[1] << std::endl; return(EXIT_FAILURE); } From 89594de43abc6a59beaf92710ba74b4df56e4997 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 20:54:27 +1000 Subject: [PATCH 031/113] moved test images --- ...HarvardOxford-cort-maxprob-thr50-1mm.nii.gz | Bin 0 -> 129144 bytes .../LabelErodeDilate/test/images/axial.png | Bin 0 -> 1739 bytes .../test/images/baseline/labdilate2d.png | Bin 0 -> 2256 bytes .../test/images/baseline/labdilate3d.nii.gz | Bin 0 -> 138738 bytes .../images/baseline/labdilate3d_dez.nii.gz | Bin 0 -> 22184 bytes .../images/baseline/labdilate3d_ell.nii.gz | Bin 0 -> 8081 bytes .../test/images/baseline/laberode2d.png | Bin 0 -> 1344 bytes .../test/images/baseline/laberode3d.nii.gz | Bin 0 -> 71626 bytes .../test/images/baseline/laberode3d_ell.nii.gz | Bin 0 -> 8170 bytes .../LabelErodeDilate/test/images/dot.nii.gz | Bin 0 -> 14209 bytes .../LabelErodeDilate/test/images/hole.nii.gz | Bin 0 -> 28244 bytes .../LabelErodeDilate/test/images/point.nii.gz | Bin 0 -> 14205 bytes 12 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Modules/Filtering/LabelErodeDilate/test/images/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz create mode 100644 Modules/Filtering/LabelErodeDilate/test/images/axial.png create mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/labdilate2d.png create mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/labdilate3d.nii.gz create mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/labdilate3d_dez.nii.gz create mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/labdilate3d_ell.nii.gz create mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/laberode2d.png create mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/laberode3d.nii.gz create mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/laberode3d_ell.nii.gz create mode 100644 Modules/Filtering/LabelErodeDilate/test/images/dot.nii.gz create mode 100644 Modules/Filtering/LabelErodeDilate/test/images/hole.nii.gz create mode 100644 Modules/Filtering/LabelErodeDilate/test/images/point.nii.gz diff --git a/Modules/Filtering/LabelErodeDilate/test/images/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz b/Modules/Filtering/LabelErodeDilate/test/images/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz new file mode 100644 index 0000000000000000000000000000000000000000..a99a84779a059b2cef8861ff8cc6c2e314c0fb7a GIT binary patch literal 129144 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

tIgEM>txr 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 literal 0 HcmV?d00001 diff --git a/Modules/Filtering/LabelErodeDilate/test/images/baseline/labdilate2d.png b/Modules/Filtering/LabelErodeDilate/test/images/baseline/labdilate2d.png new file mode 100644 index 0000000000000000000000000000000000000000..d7b13c7a3ec5ea462f69c8333e420c36c7f4cee2 GIT binary patch literal 2256 zcmV;>2ru`EP)D=;tsF)lDLFfcGMFfcGMFfe5+FfiJPX@}8Nk4ugY8D0&z*toNDaB*dTd|nOl~cXpcP6fAPZYQYIb}J;r zP8uOd%-4=~`&N?CB*XSFTXLA#ZV|Q@wI8=jk|-*!)7>-)w(G*rXRiD{eF%MTazStu z)$3>cYYxkH0X8k%xuWw9MQ5}S^<5fUY)wIJt;kSM_U>=rrS986UkSzvE!I8^likAESDng;|$sPUbP-d6G+GXI9*djKNm3A7wFb%#a2^)Qb%lMICFZIynq6^r~bZt`8hu#0DKbEpW?Pg40I2UwH`={_FXIxbw!4U%EvViul^T*E_^xgJA2C`=MNt$0Z?LEgH+6Lre&sU& zz^+LU0BEx$FSqL?3C{kP>b29qWS&S0U{S!XNA0gSP&+S?tZwhXm%8qwaAd#P36TL5 z(@mG!mLrk~yz*vATm5s8WJtnYZ)Z!L>vmJPJ0hl-zOcQ6JrEkR-`n-|Ilx zsoi|B;{g+?rzCdNl(X4++~m!)3#yqgPJST?RwYb&letY|ljSJDwv@kcHARA}XGuvB z^(@-0M2TYheG-f4#p_+;IK6ZwuthW0qhaiZnw(j1AIs(=glQ_F(ldtw|(_z6%L#rer$F)>V|-2>039+1Z&X7%8>g)CzD90O9ZK zG`v3s2bmn}Oq2H?0nPwEc8*}WoWS0gHVl&LwIZJN_l37TgK@KHO1( zF9G0`{I&#p2=0LTzPsmf5T4{degV9Xw(J|z_R+pdS&vl2k+f>fj@sIjtby_#V6k%> zTk?9!DN`}EERyG=a3hMqj)!oU+bK(O%_iNZOQxeD>V>pZ$s~!m7mK)2=cQ}ZK4~6( z<$j7(%|&3l?oD< zU~Y6sipCIzebv4lom)8Y2e>W20RVU|I`p)|t*BM*LvphzUt~uIq^b$o+wBH-^Su4U zSf4o?@NREcD_wJ&&f87A)kzq3GY+=^pyUpsy_m#q z2a33V$B(;+nO}+Hyk)DxkOgqNjhx0#5O*go1);{S+c7uQr>v$o-H60tBQ;|x`U>4X zuGqe2vB$`gtPz=T8|98SqSe?a-m;7&$@8a@(-|hPz0*WYod`VLA;~I*eWco*3Y&Br zX~2}+g7yW5u}q1>6yjCXaG*Zpca^4th)VyQJElVnMv^qZh|T)GHzJIReBt<#67BLRT?hQqaSj*&Vo z>{oFmxhCG%dWF7S$D71aI4S;?Q{(sb1N!aiqWljC|7Z4+gQE_+Q9On;e}bwC&{Fpr z_#H}U0BFd6pc;E>L+7CH{3wGHGN!l?${v~@9{NJBCC7U_-_2=&EVupsOm@Dq7+j4Ts{n#4 zcOF1)k9&b<#?MYvAMV`n`QyujJ3G3eEbwa(!C4t%o2nU&b|UBvOK4*eCfJfILTg~- z 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 literal 0 HcmV?d00001 diff --git a/Modules/Filtering/LabelErodeDilate/test/images/baseline/labdilate3d_dez.nii.gz b/Modules/Filtering/LabelErodeDilate/test/images/baseline/labdilate3d_dez.nii.gz new file mode 100644 index 0000000000000000000000000000000000000000..450fa20a3fb2dc3a95fd3f09d37e7b13f7772698 GIT binary patch literal 22184 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 KB#Ju>@)!UzPGpt< literal 0 HcmV?d00001 diff --git a/Modules/Filtering/LabelErodeDilate/test/images/baseline/laberode2d.png b/Modules/Filtering/LabelErodeDilate/test/images/baseline/laberode2d.png new file mode 100644 index 0000000000000000000000000000000000000000..332c3232886c2aa250362f6d268f7cb20e60281e GIT binary patch literal 1344 zcmV-G1;6@D=;tsF)lDLFfcGMFfcGMFfe5+FfiI=ss7BiuSO`RqQoIaSiR0 zSru97tTy^e>I&L{=xMzgu4sxEYF}C)?B?pqa=5LKA4Pjdt)m-sH&PgHinO!V0T=IL z@q#94b61fU+J26WhQpnBNUObEUbRlq*|ezQLTzzQC2v`i^fN}Py}bSjboUiEiby+a z4eu=V7Bq?Ggh?8zY}}U6FR-u%d~NN?sVE-1w+C7H?HPs;G`LNZyj~VwQ=2si>dmb- zRP0wGdZx4eb2bRS+)Qm~@)=fm=v_F568&UtjaVaXK~(j;6KAJ5ylMm5G3!{ldjZ+y zW@#fy8tv!KvV}K?WkYJ4{@9W47$9T>PPMsL1+1XFn2d4T_TCLI`uKAa74RnETu;3b z{bk4Hv+Lv> z<4l%!@t*mq)M~ZTOqeHH~Sc9b| zRC}}@LCGJIAM`OfYrUT@>VWpP<2ZBT;U-BRvT4)f_6XL8LC%Nb#A6hD;0=}g_C&oi z`!MfsM^Y5C76fH#ulX5(pnPwhb`$@OohFT>-W-gyi4IJ0$#*yU)@%Unwh{)P<)s9? z*m>>4AmkS-Lk5|5R{PL~v_5bc@iW(whv3nc1EE7~T6-MZFePA~Y?6WXDd3&)SOOGF z_T{zOK^cGld2g1s$*DaSIqRM5?R7MWW`}$UgCTdN)OGF|W6e|IC|TWU|YOOiZJ)m#5xD)vM~PwHX&q?_a)JKlaDtg|CP=w7++ ziJs1X=ZsOY9mjDL0LJaj4vzLhL_}Mu3=X1A1c|@2i{|3M#C1os*;spA*g(0Esnl*m zbc%(yOAD`Y!1_RQl5?z#b=xJ|;Zu zOi>+4iiP1r2-ikKZWC*n`1pa(I7?zDotP)+&KRyZO|k=y$${Z^oMumwom85i9%YO- z?{*x=aU4g6!H-32tH2$!qmSWCg;zKAm1i33diZ*BX9i_;se=eXt?PJ>x;$~&J-|h` zX7%OCaHHs+MU-9wFBaj4y@)P`dzGdw+@FZ*CQ9sR47=#`TzOK38xE<`MP90lOC66Z zBtP`UN-t!z|4mSI9+RSB+HoAmaU92S9LI4S$DaSGcixp&u8+w80000 C@Pc3f literal 0 HcmV?d00001 diff --git a/Modules/Filtering/LabelErodeDilate/test/images/baseline/laberode3d.nii.gz b/Modules/Filtering/LabelErodeDilate/test/images/baseline/laberode3d.nii.gz new file mode 100644 index 0000000000000000000000000000000000000000..cb85d8c4a91045fee627feb2f422b7471089ec8d GIT binary patch literal 71626 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 z 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 literal 0 HcmV?d00001 diff --git a/Modules/Filtering/LabelErodeDilate/test/images/baseline/laberode3d_ell.nii.gz b/Modules/Filtering/LabelErodeDilate/test/images/baseline/laberode3d_ell.nii.gz new file mode 100644 index 0000000000000000000000000000000000000000..c6ce652617a9c6a89aaedd5a4c2b16e9a5bf5224 GIT binary patch literal 8170 zcmeI0YfMvj7{79(<>D-xlvYG8Zi_7g z+%OrpS}ZUV?wxjk^jN?^7!D3?-O6m_6i}(PlyZ@Rv{2SU-1JkMEPhyW&WDqnoRjBy z|G)QrpAQF9`Zi+gveAs+Dc_UkaA{gS6YhPLjj+4tu>%?T3)bNs+reF#10L@qC3U`p z)NY^%qv|8Bn()|S^Z)ic_XRF_$)4|NMSgUoUAxvTolg&Vt#y|aY4Dp zs@Pml)-NoD5({biIYUbyk-V|=bOvZE0*ITdIhbT(PAAbY1J3&t>Xi>h3~z4N1m9r- zFaekVOaLYT6MzZ81YiO%f&WBcVY0bJZYOR%4%Tt45(?`Q)}oibJAaxn$`b|>GCrZ` z66qN$8XmSrR^w0k>At-+GS_5Tj6r|3NFE%aR%m`sb(3xg@QpzF5jL%^T_0H?t@qzc zPx7e&7Rd=XD+CwPnwImlL3wrWa2bAMbg$$4;3Q!FkYAf+1g|4!T^FUr1RBTjNv9Bp73;-bk?xI0=WRQ5ujosS4W9uv>J45r~`z1S>0X~Q8~() z-;G=I@^-OoFy*8h*HmN8rT2o5wbKOY83B_6Ffb(Ms5_fhZ8C6zyk9mjm;ceSGXAZ7 zeZL>rVc8)l!bF^|@ecM_KbkYEkqel=H!YF;YTo2 zRp^@(#RU`o(te6%bq_Kb{PY~jY@zB1;;pCTJkmnS4u~a13v3$~<<*^`q6 z4Z|u4+)OM5h5KOkD}14`_zf^(uyZtIcuTU{j+XUCCn|tT(j+w?a%7?sB#!%`aq{t93PJ8rD4aH_BB;IY$Z!Fp+q1 z^wu7^I)?B~n$NAu7zDydjuAxEoyZ0+yPoQ%+P+)T)?11M>(Bvv1tB??+8jAn#5V$w z(bPiqJk0kB%xAzqkgS-ES3l{WoV$ZHb1vp>@v zCp>uZLo&6QljnXm*Q!}ryI$=UQeCr1Z1<0|i;8Sr>$g^!=tpikzvzEQ`0T)i87a2S z|LcCwsrhOppZZKI-DdvQ<)4ox?X26k{@(W;XLrfE$?yxlRJ^Y`>G)sE{a;io{YCCA zYqk1*`PIIBMu^i!$C!v7&5-;=knMpjQ0J9N5qc$Vl)IsLtr!nMnhmU1V%$(M20}j39Aw5?@>>W zhQMeDjE2By2#^;7Q*12+z&bzG=dy&3g3%Bd4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C;T{50zddMR0S*Q@T=;+eEk_7>0}7+MMnhmU1V%$(Gz3ONU_e8lVI{*K M`>7=x;_om30Nh`$@c;k- literal 0 HcmV?d00001 diff --git a/Modules/Filtering/LabelErodeDilate/test/images/hole.nii.gz b/Modules/Filtering/LabelErodeDilate/test/images/hole.nii.gz new file mode 100644 index 0000000000000000000000000000000000000000..86f12e3b2cb618e7f3e0a4ac33b99ec3be42357c GIT binary patch literal 28244 zcmeI(&nv@m9LMo5n;$DtQYNiw+z?3?@?*InT%@^hLR`tFG%h16TcL&&H7AD^wJple zgw2m6nQ7v*1Epw|AM@4t7nItb@5AT%{=6Qa+q=(OX-XD;O7eJC(;KhJNV;?Sw0h~s zqII{u*y66w-zm8%lzDCbTwR8#GhdftzRN23T$@u!Mys|%+0|D4i*Z)lb)K`*b5NF= zc|B|^cWj(*oVfk_u2=QE({}szm&(iZZEMHR<}X#zg#9Tn^bk^-)!{}})5myl z^SxnuAY8E(oM~;&>%KZ#cLzLut7*SC<3s=f1Q0*~0R#|0009ILKmdU#5$JxsACX3~ z9Ew+yEngyq00IagfB*srAbb!(j3IPNVKmY**5I_I{1Q0;rj|DD0!c^FGDr~yqz5(e>uG;_r literal 0 HcmV?d00001 diff --git a/Modules/Filtering/LabelErodeDilate/test/images/point.nii.gz b/Modules/Filtering/LabelErodeDilate/test/images/point.nii.gz new file mode 100644 index 0000000000000000000000000000000000000000..0e380e4359b43836a310f74873e17c3c97205a49 GIT binary patch literal 14205 zcmb2|=3oE=<~QdJvz#0S7%mtt+jL6t&5?$L^%@b8nW_=T{FH9osA{Pf;oc}})8_tx zN38CzSD5EV?$h7f8t0}?n>#aXQA=t_viNZu?e89QSIz%eYQ6S*W!b+^SC`Ef*}7-> z@B8`9A2 Date: Fri, 15 May 2015 21:07:36 +1000 Subject: [PATCH 032/113] 3D test --- .../LabelErodeDilate/test/CMakeLists.txt | 7 +++++++ .../test/images/baseline/axialdilate5.png | Bin 0 -> 2256 bytes 2 files changed, 7 insertions(+) create mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/axialdilate5.png diff --git a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt index 7399189d282..5cd569f6a87 100644 --- a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt @@ -4,6 +4,7 @@ itkLabelSetDilateTest.cxx ) SET(INPUT_IMAGE2D ${CMAKE_CURRENT_SOURCE_DIR}/images/axial.png) +SET(INPUT_IMAGE3D ${CMAKE_CURRENT_SOURCE_DIR}/images/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz) set(ITK_TEST_DRIVER itkTestDriver) @@ -11,4 +12,10 @@ CreateTestDriver(LabelErodeDilate "${LabelErodeDilate-Test_LIBRARIES}" "${LabelE itk_add_test(NAME itkLabelDilateTest2D_5 COMMAND LabelErodeDilateTestDriver + --compare axialdilate5.png ${CMAKE_CURRENT_SOURCE_DIR}/baseline/axialdilate5.png itkLabelSetDilateTest ${INPUT_IMAGE2D} 5 axialdilate5.png ) + +itk_add_test(NAME itkLabelDilateTest3D_5 + COMMAND LabelErodeDilateTestDriver + --compare cortdilate_5.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/baseline/cortdilate_5.nii.gz +itkLabelSetDilateTest ${INPUT_IMAGE3D} 5 cortdilate_5.nii.gz ) diff --git a/Modules/Filtering/LabelErodeDilate/test/images/baseline/axialdilate5.png b/Modules/Filtering/LabelErodeDilate/test/images/baseline/axialdilate5.png new file mode 100644 index 0000000000000000000000000000000000000000..78001fee1ba7b94b071a45f891bbd8d78555fdce GIT binary patch literal 2256 zcmV;>2ru`EP)D=;tsF)lDLFfcGMFfcGMFfe5+Ffd{8D&_zH2xUn`K~#90?VYc3 z97hnwTdCZp$|WF!BMwjns0@Mx%tJ0u5n^JX@)I0MOhiRo0U<~96bdmn4sacC9Z-lt z46Y1(Kmq%2cBi|id%AaTZSMzkce{Jjzx}4CXLhZ%0A|gaHEY(aS+i!%`T}&~*3zPS zJz$%A8_n{;Uc{RY$PPbvJ2rw003~Cz&kNj)O;H0JhJPX@}8Nk4ugY8D0&z*toNDaB*dTd|nOl~cXpcP6fAPZYQYIb}J;r zP8uOd%-4=~`&N?CB*XSFTXLA#ZV|Q@wI8=jk|-*!)7>-)w(G*rXRiD{eF%MTazStu z)$3>cYYxkH0X8k%xuWw9MQ5}S^<5fUY)wIJt;kSM_U>=rrS986UkSzvE!I8^likAESDng;|$sPUbP-d6G+GXI9*djKNm3A7wFb%#a2^)Qb%lMICFZIynq6^r~bZt`8hu#0DKbEpW?Pg40I2UwH`={_FXIxbw!4U%EvViul^T*E_^xgJA2C`=MNt$0Z?LEgH+6Lre&sU& zz^+LU0BEx$FSqL?3C{kP>b29qWS&S0U{S!XNA0gSP&+S?tZwhXm%8qwaAd#P36TL5 z(@mG!mLrk~yz*vATm5s8WJtnYZ)Z!L>vmJPJ0hl-zOcQ6JrEkR-`n-|Ilx zsoi|B;{g+?rzCdNl(X4++~m!)3#yqgPJST?RwYb&letY|ljSJDwv@kcHARA}XGuvB z^(@-0M2TYheG-f4#p_+;IK6ZwuthW0qhaiZnw(j1AIs(=glQ_F(ldtw|(_z6%L#rer$F)>V|-2>039+1Z&X7%8>g)CzD90O9ZK zG`v3s2bmn}Oq2H?0nPwEc8*}WoWS0gHVl&LwIZJN_l37TgK@KHO1( zF9G0`{I&#p2=0LTzPsmf5T4{degV9Xw(J|z_R+pdS&vl2k+f>fj@sIjtby_#V6k%> zTk?9!DN`}EERyG=a3hMqj)!oU+bK(O%_iNZOQxeD>V>pZ$s~!m7mK)2=cQ}ZK4~6( z<$j7(%|&3l?oD< zU~Y6sipCIzebv4lom)8Y2e>W20RVU|I`p)|t*BM*LvphzUt~uIq^b$o+wBH-^Su4U zSf4o?@NREcD_wJ&&f87A)kzq3GY+=^pyUpsy_m#q z2a33V$B(;+nO}+Hyk)DxkOgqNjhx0#5O*go1);{S+c7uQr>v$o-H60tBQ;|x`U>4X zuGqe2vB$`gtPz=T8|98SqSe?a-m;7&$@8a@(-|hPz0*WYod`VLA;~I*eWco*3Y&Br zX~2}+g7yW5u}q1>6yjCXaG*Zpca^4th)VyQJElVnMv^qZh|T)GHzJIReBt<#67BLRT?hQqaSj*&Vo z>{oFmxhCG%dWF7S$D71aI4S;?Q{(sb1N!aiqWljC|7Z4+gQE_+Q9On;e}bwC&{Fpr z_#H}U0BFd6pc;E>L+7CH{3wGHGN!l?${v~@9{NJBCC7U_-_2=&EVupsOm@Dq7+j4Ts{n#4 zcOF1)k9&b<#?MYvAMV`n`QyujJ3G3eEbwa(!C4t%o2nU&b|UBvOK4*eCfJfILTg~- z Date: Fri, 15 May 2015 21:09:51 +1000 Subject: [PATCH 033/113] 3d baseline dilate --- .../test/images/baseline/cortdilate_5.nii.gz | Bin 0 -> 138738 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/cortdilate_5.nii.gz diff --git a/Modules/Filtering/LabelErodeDilate/test/images/baseline/cortdilate_5.nii.gz b/Modules/Filtering/LabelErodeDilate/test/images/baseline/cortdilate_5.nii.gz new file mode 100644 index 0000000000000000000000000000000000000000..235ec671decda465a98ad4407a968181823a934a GIT binary patch literal 138738 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 literal 0 HcmV?d00001 From 026c00f2de7e4738f38cf02aa2d69964b09be4f2 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 21:11:07 +1000 Subject: [PATCH 034/113] corrected cmake path to baseline --- Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt index 5cd569f6a87..94b14c6a23d 100644 --- a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt @@ -12,10 +12,10 @@ CreateTestDriver(LabelErodeDilate "${LabelErodeDilate-Test_LIBRARIES}" "${LabelE itk_add_test(NAME itkLabelDilateTest2D_5 COMMAND LabelErodeDilateTestDriver - --compare axialdilate5.png ${CMAKE_CURRENT_SOURCE_DIR}/baseline/axialdilate5.png + --compare axialdilate5.png ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/axialdilate5.png itkLabelSetDilateTest ${INPUT_IMAGE2D} 5 axialdilate5.png ) itk_add_test(NAME itkLabelDilateTest3D_5 COMMAND LabelErodeDilateTestDriver - --compare cortdilate_5.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/baseline/cortdilate_5.nii.gz + --compare cortdilate_5.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/cortdilate_5.nii.gz itkLabelSetDilateTest ${INPUT_IMAGE3D} 5 cortdilate_5.nii.gz ) From 09376ef16d9be89776fd3d0c49991c2ef35c61bd Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 21:16:46 +1000 Subject: [PATCH 035/113] erode test --- .../LabelErodeDilate/test/CMakeLists.txt | 11 ++ .../test/itkLabelSetErodeTest.cxx | 101 ++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx diff --git a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt index 94b14c6a23d..632cb4a7b48 100644 --- a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt @@ -1,6 +1,7 @@ itk_module_test() set(LabelErodeDilateTests itkLabelSetDilateTest.cxx +itkLabelSetErodeTest.cxx ) SET(INPUT_IMAGE2D ${CMAKE_CURRENT_SOURCE_DIR}/images/axial.png) @@ -19,3 +20,13 @@ itk_add_test(NAME itkLabelDilateTest3D_5 COMMAND LabelErodeDilateTestDriver --compare cortdilate_5.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/cortdilate_5.nii.gz itkLabelSetDilateTest ${INPUT_IMAGE3D} 5 cortdilate_5.nii.gz ) + +itk_add_test(NAME itkLabelErodeTest2D_3 + COMMAND LabelErodeErodeTestDriver + --compare axialerode3.png ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/axialerode3.png +itkLabelSetErodeTest ${INPUT_IMAGE2D} 3 axialerode5.png ) + +itk_add_test(NAME itkLabelErodeTest3D_3 + COMMAND LabelErodeErodeTestDriver + --compare corterode_3.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/corterode_3.nii.gz +itkLabelSetErodeTest ${INPUT_IMAGE3D} 3 corterode_3.nii.gz ) diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx new file mode 100644 index 00000000000..41a9ee81fb2 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx @@ -0,0 +1,101 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" + +#include "itkLabelSetErodeImageFilter.h" + + +template +int doErode(char *In, char *Out, int radius) +{ + typedef typename itk::Image MaskImType; + + // load + typedef typename itk::ImageFileReader< MaskImType > ReaderType; + typename ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName( In ); + try + { + reader->Update(); + } + catch( itk::ExceptionObject & excp ) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + // Label dilation + typedef typename itk::LabelSetErodeImageFilter FilterType; + typename FilterType::Pointer filter = FilterType::New(); + filter->SetInput(reader->GetOutput()); + filter->SetRadius(radius); + filter->SetUseImageSpacing(true); + typedef typename itk::ImageFileWriter< MaskImType > WriterType; + typename WriterType::Pointer writer = WriterType::New(); + writer->SetInput( filter->GetOutput() ); + writer->SetFileName( Out ); + try + { + writer->Update(); + } + catch( itk::ExceptionObject & excp ) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; + +} + +///////////////////////////////// +int readImageInfo(std::string filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim) +{ + itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(filename.c_str(), itk::ImageIOFactory::ReadMode); + if (imageIO.IsNull()) + return 0; + + + imageIO->SetFileName(filename.c_str()); + imageIO->ReadImageInformation(); + + *ComponentType = imageIO->GetComponentType(); + *dim = imageIO->GetNumberOfDimensions(); + return(1); +} + +int itkLabelSetErodeTest(int argc, char * argv[]) +{ + + int dim1; + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + itk::ImageIOBase::IOComponentType ComponentType; + + if (argc != 4) + { + std::cerr << "Usage: " << argv[0] << "inputimage radius outputimage" << std::endl; + return(EXIT_FAILURE); + } + + if (!readImageInfo(argv[1], &ComponentType, &dim1)) + { + std::cerr << "Failed to open " << argv[1] << std::endl; + return(EXIT_FAILURE); + } + + int status = EXIT_FAILURE; + switch (dim1) + { + case 2: + status=doErode(argv[1], argv[3], atoi(argv[2])); + break; + case 3: + status=doErode(argv[1], argv[3], atoi(argv[2])); + break; + default: + std::cerr << "Unsupported dimension" << std::endl; + return (EXIT_FAILURE); + break; + } + return status; +} From 4091fb5ba0c3b30e27141715f3a9bbba8dabd8be Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 21:21:47 +1000 Subject: [PATCH 036/113] moved readImageInfo --- .../test/itkLabelSetDilateTest.cxx | 3 +++ .../test/itkLabelSetErodeTest.cxx | 19 ++++--------------- .../LabelErodeDilate/test/read_info.h | 19 +++++++++++++++++++ 3 files changed, 26 insertions(+), 15 deletions(-) create mode 100644 Modules/Filtering/LabelErodeDilate/test/read_info.h diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index c123bd7b566..8d7ba19b1f1 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -4,6 +4,9 @@ #include "itkLabelSetDilateImageFilter.h" +int readImageInfo(std::string filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim); + +#include "read_info.h" template int doDilate(char *In, char *Out, int radius) diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx index 41a9ee81fb2..c16ecabbd88 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx @@ -4,6 +4,9 @@ #include "itkLabelSetErodeImageFilter.h" +int readImageInfo(std::string filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim); + +#include "read_info.h" template int doErode(char *In, char *Out, int radius) @@ -48,21 +51,7 @@ int doErode(char *In, char *Out, int radius) } -///////////////////////////////// -int readImageInfo(std::string filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim) -{ - itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(filename.c_str(), itk::ImageIOFactory::ReadMode); - if (imageIO.IsNull()) - return 0; - - - imageIO->SetFileName(filename.c_str()); - imageIO->ReadImageInformation(); - - *ComponentType = imageIO->GetComponentType(); - *dim = imageIO->GetNumberOfDimensions(); - return(1); -} +///////////////////////////////////////////// int itkLabelSetErodeTest(int argc, char * argv[]) { diff --git a/Modules/Filtering/LabelErodeDilate/test/read_info.h b/Modules/Filtering/LabelErodeDilate/test/read_info.h new file mode 100644 index 00000000000..72aedb9e528 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/read_info.h @@ -0,0 +1,19 @@ +#ifndef _read_info_h +#define _read_info_h +///////////////////////////////// +int readImageInfo(std::string filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim) +{ + itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(filename.c_str(), itk::ImageIOFactory::ReadMode); + if (imageIO.IsNull()) + return 0; + + + imageIO->SetFileName(filename.c_str()); + imageIO->ReadImageInformation(); + + *ComponentType = imageIO->GetComponentType(); + *dim = imageIO->GetNumberOfDimensions(); + return(1); +} +///////////////////////////////// +#endif From 90bea67a897c88e5dc32ad466b9527c14ea25a15 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 21:23:05 +1000 Subject: [PATCH 037/113] moved readImageInfo --- .../test/itkLabelSetDilateTest.cxx | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index 8d7ba19b1f1..ae899fd1731 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -52,20 +52,6 @@ int doDilate(char *In, char *Out, int radius) } ///////////////////////////////// -int readImageInfo(std::string filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim) -{ - itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(filename.c_str(), itk::ImageIOFactory::ReadMode); - if (imageIO.IsNull()) - return 0; - - - imageIO->SetFileName(filename.c_str()); - imageIO->ReadImageInformation(); - - *ComponentType = imageIO->GetComponentType(); - *dim = imageIO->GetNumberOfDimensions(); - return(1); -} int itkLabelSetDilateTest(int argc, char * argv[]) { From b8e4223a25920b717e4ec56ae0371e42f0358e4f Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 21:27:38 +1000 Subject: [PATCH 038/113] moved readinfo to something separate --- .../test/itkLabelSetDilateTest.cxx | 3 --- .../test/itkLabelSetErodeTest.cxx | 2 -- .../LabelErodeDilate/test/read_info.cxx | 19 +++++++++++++++++++ .../LabelErodeDilate/test/read_info.h | 15 +-------------- 4 files changed, 20 insertions(+), 19 deletions(-) create mode 100644 Modules/Filtering/LabelErodeDilate/test/read_info.cxx diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index ae899fd1731..487da93da0f 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -3,9 +3,6 @@ #include "itkImageFileWriter.h" #include "itkLabelSetDilateImageFilter.h" - -int readImageInfo(std::string filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim); - #include "read_info.h" template diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx index c16ecabbd88..7dfeec46451 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx @@ -4,8 +4,6 @@ #include "itkLabelSetErodeImageFilter.h" -int readImageInfo(std::string filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim); - #include "read_info.h" template diff --git a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx new file mode 100644 index 00000000000..fe95a36a79c --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx @@ -0,0 +1,19 @@ +#ifndef _read_info_cxx +#define _read_info_cxx +///////////////////////////////// +int readImageInfo(std::string filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim) +{ + itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(filename.c_str(), itk::ImageIOFactory::ReadMode); + if (imageIO.IsNull()) + return 0; + + + imageIO->SetFileName(filename.c_str()); + imageIO->ReadImageInformation(); + + *ComponentType = imageIO->GetComponentType(); + *dim = imageIO->GetNumberOfDimensions(); + return(1); +} +///////////////////////////////// +#endif diff --git a/Modules/Filtering/LabelErodeDilate/test/read_info.h b/Modules/Filtering/LabelErodeDilate/test/read_info.h index 72aedb9e528..d0c2a69b1f3 100644 --- a/Modules/Filtering/LabelErodeDilate/test/read_info.h +++ b/Modules/Filtering/LabelErodeDilate/test/read_info.h @@ -1,19 +1,6 @@ #ifndef _read_info_h #define _read_info_h ///////////////////////////////// -int readImageInfo(std::string filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim) -{ - itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(filename.c_str(), itk::ImageIOFactory::ReadMode); - if (imageIO.IsNull()) - return 0; - - - imageIO->SetFileName(filename.c_str()); - imageIO->ReadImageInformation(); - - *ComponentType = imageIO->GetComponentType(); - *dim = imageIO->GetNumberOfDimensions(); - return(1); -} +int readImageInfo(std::string filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim); ///////////////////////////////// #endif From 4c97a97cd41efd82f747bd3e16ef7f97902412eb Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 21:28:55 +1000 Subject: [PATCH 039/113] cmake ref to read_info --- Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt index 632cb4a7b48..4b7179cd3df 100644 --- a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt @@ -2,6 +2,7 @@ itk_module_test() set(LabelErodeDilateTests itkLabelSetDilateTest.cxx itkLabelSetErodeTest.cxx +read_info.cxx ) SET(INPUT_IMAGE2D ${CMAKE_CURRENT_SOURCE_DIR}/images/axial.png) From 6ca96d0f5e1e26348488ad6f1b0192f2cff183a5 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 21:32:40 +1000 Subject: [PATCH 040/113] include image reader class --- Modules/Filtering/LabelErodeDilate/test/read_info.cxx | 2 ++ Modules/Filtering/LabelErodeDilate/test/read_info.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx index fe95a36a79c..a2b6f99fb52 100644 --- a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx @@ -1,5 +1,7 @@ #ifndef _read_info_cxx #define _read_info_cxx +#include "read_info.h" + ///////////////////////////////// int readImageInfo(std::string filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim) { diff --git a/Modules/Filtering/LabelErodeDilate/test/read_info.h b/Modules/Filtering/LabelErodeDilate/test/read_info.h index d0c2a69b1f3..f08d60bbf69 100644 --- a/Modules/Filtering/LabelErodeDilate/test/read_info.h +++ b/Modules/Filtering/LabelErodeDilate/test/read_info.h @@ -1,6 +1,8 @@ #ifndef _read_info_h #define _read_info_h ///////////////////////////////// +#include "itkImageFileReader.h" + int readImageInfo(std::string filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim); ///////////////////////////////// #endif From 190b9a10ab908dd58566a7eca3be71edbde1019f Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 21:37:18 +1000 Subject: [PATCH 041/113] removed c++ strings --- Modules/Filtering/LabelErodeDilate/test/read_info.cxx | 4 ++-- Modules/Filtering/LabelErodeDilate/test/read_info.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx index a2b6f99fb52..04392a65210 100644 --- a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx @@ -3,14 +3,14 @@ #include "read_info.h" ///////////////////////////////// -int readImageInfo(std::string filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim) +int readImageInfo(char * filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim) { itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(filename.c_str(), itk::ImageIOFactory::ReadMode); if (imageIO.IsNull()) return 0; - imageIO->SetFileName(filename.c_str()); + imageIO->SetFileName(filename); imageIO->ReadImageInformation(); *ComponentType = imageIO->GetComponentType(); diff --git a/Modules/Filtering/LabelErodeDilate/test/read_info.h b/Modules/Filtering/LabelErodeDilate/test/read_info.h index f08d60bbf69..c3ccbb309f0 100644 --- a/Modules/Filtering/LabelErodeDilate/test/read_info.h +++ b/Modules/Filtering/LabelErodeDilate/test/read_info.h @@ -3,6 +3,6 @@ ///////////////////////////////// #include "itkImageFileReader.h" -int readImageInfo(std::string filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim); +int readImageInfo(char* filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim); ///////////////////////////////// #endif From e86543298be585b6467b7ed42b633d1d5f44b63b Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 21:38:32 +1000 Subject: [PATCH 042/113] removed another one --- Modules/Filtering/LabelErodeDilate/test/read_info.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx index 04392a65210..114e9cc9081 100644 --- a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx @@ -5,7 +5,7 @@ ///////////////////////////////// int readImageInfo(char * filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim) { - itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(filename.c_str(), itk::ImageIOFactory::ReadMode); + itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(filename, itk::ImageIOFactory::ReadMode); if (imageIO.IsNull()) return 0; From 76824bf572ddeb848a12322bb6465083aab5d0fd Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 21:41:52 +1000 Subject: [PATCH 043/113] moved to static function --- Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt | 1 - .../Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx | 2 +- .../Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx | 2 +- Modules/Filtering/LabelErodeDilate/test/read_info.cxx | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt index 4b7179cd3df..632cb4a7b48 100644 --- a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt @@ -2,7 +2,6 @@ itk_module_test() set(LabelErodeDilateTests itkLabelSetDilateTest.cxx itkLabelSetErodeTest.cxx -read_info.cxx ) SET(INPUT_IMAGE2D ${CMAKE_CURRENT_SOURCE_DIR}/images/axial.png) diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index 487da93da0f..b57d23234a7 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -3,7 +3,7 @@ #include "itkImageFileWriter.h" #include "itkLabelSetDilateImageFilter.h" -#include "read_info.h" +#include "read_info.cxx" template int doDilate(char *In, char *Out, int radius) diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx index 7dfeec46451..2699fa602df 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx @@ -4,7 +4,7 @@ #include "itkLabelSetErodeImageFilter.h" -#include "read_info.h" +#include "read_info.cxx" template int doErode(char *In, char *Out, int radius) diff --git a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx index 114e9cc9081..f4c3c1a9c5e 100644 --- a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx @@ -3,7 +3,7 @@ #include "read_info.h" ///////////////////////////////// -int readImageInfo(char * filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim) +static int readImageInfo(char * filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim) { itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(filename, itk::ImageIOFactory::ReadMode); if (imageIO.IsNull()) From 0b2c2d2347fcd27202b54542c4b3e439065706c3 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 21:43:47 +1000 Subject: [PATCH 044/113] moved to static function --- Modules/Filtering/LabelErodeDilate/test/read_info.cxx | 1 - 1 file changed, 1 deletion(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx index f4c3c1a9c5e..26a904dc58c 100644 --- a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx @@ -1,6 +1,5 @@ #ifndef _read_info_cxx #define _read_info_cxx -#include "read_info.h" ///////////////////////////////// static int readImageInfo(char * filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim) From 06ede66833789a2e087556b536fb5d0324a4890b Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 21:45:48 +1000 Subject: [PATCH 045/113] fixing warning --- Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index 2027deddf23..9754b7be69f 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -219,6 +219,7 @@ void doOneDimensionErodeFirstPass(TInIter &inputIterator, TOutDistIter &outputIt { // specialised version for binary erosion during first pass. We can // compute the results directly because the inputs are flat. + (void)m_Extreme; // avoid warning typedef typename itk::Array LineBufferType; typedef typename itk::Array LabelBufferType; RealType iscale = 1.0; From 23482b015fd41f49c346acf4166bc3570e8f0e11 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 21:48:25 +1000 Subject: [PATCH 046/113] fixing warning --- .../LabelErodeDilate/include/itkLabelSetErodeImageFilter.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h index 9bd0af33a2a..ff7efaf9218 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h @@ -56,7 +56,6 @@ class ITK_EXPORT LabelSetErodeImageFilter: typedef typename itk::FixedArray RadiusType; /** Image dimension. */ - typedef typename OutputImageType::RegionType OutputImageRegionType; /** Image dimension. */ itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); From 695014e28fcfe5853f9bd85c18dc516073148373 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 21:50:02 +1000 Subject: [PATCH 047/113] fixing warning --- .../LabelErodeDilate/include/itkLabelSetErodeImageFilter.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h index ff7efaf9218..9bd0af33a2a 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h @@ -56,6 +56,7 @@ class ITK_EXPORT LabelSetErodeImageFilter: typedef typename itk::FixedArray RadiusType; /** Image dimension. */ + typedef typename OutputImageType::RegionType OutputImageRegionType; /** Image dimension. */ itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); From 4c18636186ff302619b39c63f9301666e2cbf460 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 21:51:49 +1000 Subject: [PATCH 048/113] fixing warning --- .../LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx index bc271212e24..b0b491ebb20 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx @@ -55,10 +55,6 @@ LabelSetErodeImageFilter typedef ImageLinearConstIteratorWithIndex InputDistIteratorType; typedef ImageLinearIteratorWithIndex OutputDistIteratorType; - // for stages after the first - typedef ImageLinearConstIteratorWithIndex< TOutputImage > OutputConstIteratorType; - - typedef ImageRegion< TInputImage::ImageDimension > RegionType; typename TInputImage::ConstPointer inputImage( this->GetInput () ); From a1e1e0b3511847c1512874c5cd33e4d5c3929e8a Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 21:54:00 +1000 Subject: [PATCH 049/113] misnamed driver --- Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt index 632cb4a7b48..ff4688e6b1a 100644 --- a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt @@ -22,11 +22,11 @@ itk_add_test(NAME itkLabelDilateTest3D_5 itkLabelSetDilateTest ${INPUT_IMAGE3D} 5 cortdilate_5.nii.gz ) itk_add_test(NAME itkLabelErodeTest2D_3 - COMMAND LabelErodeErodeTestDriver + COMMAND LabelErodeDilateTestDriver --compare axialerode3.png ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/axialerode3.png itkLabelSetErodeTest ${INPUT_IMAGE2D} 3 axialerode5.png ) itk_add_test(NAME itkLabelErodeTest3D_3 - COMMAND LabelErodeErodeTestDriver + COMMAND LabelErodeDilateTestDriver --compare corterode_3.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/corterode_3.nii.gz itkLabelSetErodeTest ${INPUT_IMAGE3D} 3 corterode_3.nii.gz ) From e432c385fa92c138e06f218b3cfe274ed55c49dd Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 21:56:10 +1000 Subject: [PATCH 050/113] changed output name --- Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt index ff4688e6b1a..22c4932d995 100644 --- a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt @@ -24,7 +24,7 @@ itkLabelSetDilateTest ${INPUT_IMAGE3D} 5 cortdilate_5.nii.gz ) itk_add_test(NAME itkLabelErodeTest2D_3 COMMAND LabelErodeDilateTestDriver --compare axialerode3.png ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/axialerode3.png -itkLabelSetErodeTest ${INPUT_IMAGE2D} 3 axialerode5.png ) +itkLabelSetErodeTest ${INPUT_IMAGE2D} 3 axialerode3.png ) itk_add_test(NAME itkLabelErodeTest3D_3 COMMAND LabelErodeDilateTestDriver From 86822461beacf9bab08a65f9e9e7800c6239f98e Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 21:58:51 +1000 Subject: [PATCH 051/113] erode baselines --- .../test/images/baseline/axialerode3.png | Bin 0 -> 1180 bytes .../test/images/baseline/corterode_3.nii.gz | Bin 0 -> 58540 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/axialerode3.png create mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/corterode_3.nii.gz diff --git a/Modules/Filtering/LabelErodeDilate/test/images/baseline/axialerode3.png b/Modules/Filtering/LabelErodeDilate/test/images/baseline/axialerode3.png new file mode 100644 index 0000000000000000000000000000000000000000..f81ebdd55bec693a029ecb949c4821ab4331efec GIT binary patch literal 1180 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±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 literal 0 HcmV?d00001 From 56d55728df29921dcaf661f365b366d4ae6ba527 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 22:21:21 +1000 Subject: [PATCH 052/113] ran uncrustify --- .../include/itkLabelSetDilateImageFilter.h | 49 ++- .../include/itkLabelSetDilateImageFilter.hxx | 111 +++-- .../include/itkLabelSetErodeImageFilter.h | 51 ++- .../include/itkLabelSetErodeImageFilter.hxx | 114 +++-- .../include/itkLabelSetMorphBaseImageFilter.h | 77 ++-- .../itkLabelSetMorphBaseImageFilter.hxx | 112 +++-- .../include/itkLabelSetUtils.h | 389 +++++++++--------- .../LabelErodeDilate/include/itkinstance.h | 11 +- .../test/itkLabelSetDilateTest.cxx | 53 ++- .../test/itkLabelSetErodeTest.cxx | 53 ++- .../test/labelDilateLoopTest.cxx | 91 ++-- .../test/labelSetsDilateDanielsson.cxx | 74 ++-- .../test/labelSetsDilateDanielssonPerf.cxx | 92 ++--- .../test/labelSetsDilatePerf.cxx | 103 +++-- .../test/labelSetsDilateSelected.cxx | 99 +++-- .../test/labelSetsDilateWS.cxx | 73 ++-- .../test/labelSetsDilateWSPerf.cxx | 92 ++--- .../LabelErodeDilate/test/labelSetsErode.cxx | 82 ++-- .../LabelErodeDilate/test/labelSetsPerf.cxx | 103 +++-- .../LabelErodeDilate/test/read_info.cxx | 11 +- .../LabelErodeDilate/test/read_info.h | 3 +- .../LabelErodeDilate/test/reportNonZero.cxx | 66 +-- 22 files changed, 934 insertions(+), 975 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h index a33151205c9..ba3db414652 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h @@ -17,18 +17,17 @@ namespace itk * \author Richard Beare, Department of Medicine, Monash University, * Australia. **/ -template +template< typename TInputImage, + typename TOutputImage = TInputImage > class ITK_EXPORT LabelSetDilateImageFilter: - public LabelSetMorphBaseImageFilter + public LabelSetMorphBaseImageFilter< TInputImage, true, TOutputImage > { - public: /** Standard class typedefs. */ - typedef LabelSetDilateImageFilter Self; - typedef LabelSetMorphBaseImageFilter Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; + typedef LabelSetDilateImageFilter Self; + typedef LabelSetMorphBaseImageFilter< TInputImage, true, TOutputImage > Superclass; + typedef SmartPointer< Self > Pointer; + typedef SmartPointer< const Self > ConstPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -37,18 +36,18 @@ class ITK_EXPORT LabelSetDilateImageFilter: itkTypeMacro(LabelSetDilateImageFilter, LabelSetMorphBaseImageFilter); /** Pixel Type of the input image */ - typedef TInputImage InputImageType; - typedef TOutputImage OutputImageType; - typedef typename TInputImage::PixelType PixelType; - typedef typename NumericTraits::FloatType RealType; - typedef typename TOutputImage::PixelType OutputPixelType; - typedef typename NumericTraits::ScalarRealType ScalarRealType; + typedef TInputImage InputImageType; + typedef TOutputImage OutputImageType; + typedef typename TInputImage::PixelType PixelType; + typedef typename NumericTraits< PixelType >::FloatType RealType; + typedef typename TOutputImage::PixelType OutputPixelType; + typedef typename NumericTraits< PixelType >::ScalarRealType ScalarRealType; /** Smart pointer typedef support. */ - typedef typename TInputImage::Pointer InputImagePointer; - typedef typename TInputImage::ConstPointer InputImageConstPointer; - typedef typename TInputImage::SizeType InputSizeType; - typedef typename TOutputImage::SizeType OutputSizeType; + typedef typename TInputImage::Pointer InputImagePointer; + typedef typename TInputImage::ConstPointer InputImageConstPointer; + typedef typename TInputImage::SizeType InputSizeType; + typedef typename TOutputImage::SizeType OutputSizeType; typedef typename OutputImageType::RegionType OutputImageRegionType; @@ -59,20 +58,18 @@ class ITK_EXPORT LabelSetDilateImageFilter: TOutputImage::ImageDimension); itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension); - protected: - LabelSetDilateImageFilter(){}; - virtual ~LabelSetDilateImageFilter() {}; + LabelSetDilateImageFilter(){} + virtual ~LabelSetDilateImageFilter() {} - void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, ThreadIdType threadId ) override; + void ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) override; private: - LabelSetDilateImageFilter(const Self&); //purposely not implemented - void operator=(const Self&); //purposely not implemented - typedef typename Superclass::DistanceImageType DistanceImageType; + LabelSetDilateImageFilter(const Self &); //purposely not implemented + void operator=(const Self &); //purposely not implemented + typedef typename Superclass::DistanceImageType DistanceImageType; }; - } // end namespace itk #ifndef ITK_MANUAL_INSTANTIATION diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx index c52f3bf8409..5c8d621a0c3 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx @@ -5,20 +5,17 @@ #include "itkImageRegionConstIterator.h" #include "itkImageRegionIterator.h" - #include "itkImageLinearIteratorWithIndex.h" #include "itkImageLinearConstIteratorWithIndex.h" #include "itkLabelSetUtils.h" - namespace itk { - -template +template< typename TInputImage, typename TOutputImage > void -LabelSetDilateImageFilter -::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, ThreadIdType threadId ) +LabelSetDilateImageFilter< TInputImage, TOutputImage > +::ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) { // this is where the work happens. We use a distance image with // floating point pixel to perform the parabolic operations. The @@ -32,49 +29,53 @@ LabelSetDilateImageFilter (void)threadId; // compute the number of rows first, so we can setup a progress reporter typename std::vector< unsigned int > NumberOfRows; - InputSizeType size = outputRegionForThread.GetSize(); + InputSizeType size = outputRegionForThread.GetSize(); - for (unsigned int i = 0; i < InputImageDimension; i++) + for ( unsigned int i = 0; i < InputImageDimension; i++ ) { - NumberOfRows.push_back( 1 ); - for (unsigned int d = 0; d < InputImageDimension; d++) + NumberOfRows.push_back(1); + for ( unsigned int d = 0; d < InputImageDimension; d++ ) { - if( d != i ) + if ( d != i ) { - NumberOfRows[i] *= size[ d ]; + NumberOfRows[i] *= size[d]; } } } - float progressPerDimension = 1.0/ImageDimension; - - ProgressReporter * progress = new ProgressReporter(this, threadId, NumberOfRows[this->m_CurrentDimension], 30, this->m_CurrentDimension * progressPerDimension, progressPerDimension); + float progressPerDimension = 1.0 / ImageDimension; + ProgressReporter *progress = new ProgressReporter(this, + threadId, + NumberOfRows[this->m_CurrentDimension], + 30, + this->m_CurrentDimension * progressPerDimension, + progressPerDimension); - typedef ImageLinearConstIteratorWithIndex< TInputImage > InputConstIteratorType; - typedef ImageLinearIteratorWithIndex< TOutputImage > OutputIteratorType; + typedef ImageLinearConstIteratorWithIndex< TInputImage > InputConstIteratorType; + typedef ImageLinearIteratorWithIndex< TOutputImage > OutputIteratorType; - typedef ImageLinearConstIteratorWithIndex InputDistIteratorType; - typedef ImageLinearIteratorWithIndex OutputDistIteratorType; + typedef ImageLinearConstIteratorWithIndex< DistanceImageType > InputDistIteratorType; + typedef ImageLinearIteratorWithIndex< DistanceImageType > OutputDistIteratorType; // for stages after the first - //typedef ImageLinearConstIteratorWithIndex< TOutputImage > OutputConstIteratorType; - + //typedef ImageLinearConstIteratorWithIndex< TOutputImage > + // OutputConstIteratorType; typedef ImageRegion< TInputImage::ImageDimension > RegionType; - typename TInputImage::ConstPointer inputImage( this->GetInput () ); - typename TOutputImage::Pointer outputImage( this->GetOutput() ); + typename TInputImage::ConstPointer inputImage( this->GetInput () ); + typename TOutputImage::Pointer outputImage( this->GetOutput() ); outputImage->SetBufferedRegion( outputImage->GetRequestedRegion() ); outputImage->Allocate(); RegionType region = outputRegionForThread; - InputConstIteratorType inputIterator( inputImage, region ); - InputConstIteratorType inputIteratorStage2( outputImage, region ); - OutputIteratorType outputIterator( outputImage, region ); + InputConstIteratorType inputIterator(inputImage, region); + InputConstIteratorType inputIteratorStage2(outputImage, region); + OutputIteratorType outputIterator(outputImage, region); //OutputConstIteratorType inputIteratorStage2( outputImage, region ); - InputDistIteratorType inputDistIterator(this->m_DistanceImage, region); + InputDistIteratorType inputDistIterator(this->m_DistanceImage, region); OutputDistIteratorType outputDistIterator(this->m_DistanceImage, region); // setup the progress reporting @@ -83,47 +84,45 @@ LabelSetDilateImageFilter // flag to indicate whether the internal distance image has been // initialized using the special first pass erosion - if (this->m_Scale[this->m_CurrentDimension] > 0) + if ( this->m_Scale[this->m_CurrentDimension] > 0 ) { // Perform as normal //RealType magnitude = 1.0/(2.0 * m_Scale[0]); unsigned long LineLength = region.GetSize()[this->m_CurrentDimension]; - RealType image_scale = this->GetInput()->GetSpacing()[this->m_CurrentDimension]; + RealType image_scale = this->GetInput()->GetSpacing()[this->m_CurrentDimension]; //bool lastpass = (m_CurrentDimension == ImageDimension - 1); - if (!this->m_FirstPassDone) + if ( !this->m_FirstPassDone ) { - LabSet::doOneDimensionDilateFirstPass(inputIterator, outputDistIterator, outputIterator, - *progress, LineLength, - this->m_CurrentDimension, - this->m_MagnitudeSign, - this->m_UseImageSpacing, - this->m_Extreme, - image_scale, - this->m_Scale[this->m_CurrentDimension]); + LabSet::doOneDimensionDilateFirstPass< InputConstIteratorType, OutputDistIteratorType, OutputIteratorType, + RealType >(inputIterator, outputDistIterator, outputIterator, + *progress, LineLength, + this->m_CurrentDimension, + this->m_MagnitudeSign, + this->m_UseImageSpacing, + this->m_Extreme, + image_scale, + this->m_Scale[this->m_CurrentDimension]); } else { - LabSet::doOneDimensionDilate(inputIteratorStage2, - inputDistIterator, - outputDistIterator, - outputIterator, - *progress, LineLength, - this->m_CurrentDimension, - this->m_MagnitudeSign, - this->m_UseImageSpacing, - this->m_Extreme, - image_scale, - this->m_Scale[this->m_CurrentDimension]); + LabSet::doOneDimensionDilate< InputConstIteratorType, + InputDistIteratorType, + OutputIteratorType, + OutputDistIteratorType, + RealType >(inputIteratorStage2, + inputDistIterator, + outputDistIterator, + outputIterator, + *progress, LineLength, + this->m_CurrentDimension, + this->m_MagnitudeSign, + this->m_UseImageSpacing, + this->m_Extreme, + image_scale, + this->m_Scale[this->m_CurrentDimension]); } } } - - } // namespace itk #endif diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h index 9bd0af33a2a..3548dc83ea8 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h @@ -19,18 +19,17 @@ namespace itk * \author Richard Beare, Department of Medicine, Monash University, * Australia. **/ -template +template< typename TInputImage, + typename TOutputImage = TInputImage > class ITK_EXPORT LabelSetErodeImageFilter: - public LabelSetMorphBaseImageFilter + public LabelSetMorphBaseImageFilter< TInputImage, false, TOutputImage > { - public: /** Standard class typedefs. */ - typedef LabelSetErodeImageFilter Self; - typedef LabelSetMorphBaseImageFilter Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; + typedef LabelSetErodeImageFilter Self; + typedef LabelSetMorphBaseImageFilter< TInputImage, false, TOutputImage > Superclass; + typedef SmartPointer< Self > Pointer; + typedef SmartPointer< const Self > ConstPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -39,21 +38,21 @@ class ITK_EXPORT LabelSetErodeImageFilter: itkTypeMacro(LabelSetErodeImageFilter, LabelSetMorphBaseImageFilter); /** Pixel Type of the input image */ - typedef TInputImage InputImageType; - typedef TOutputImage OutputImageType; - typedef typename TInputImage::PixelType PixelType; - typedef typename NumericTraits::FloatType RealType; - typedef typename TOutputImage::PixelType OutputPixelType; - typedef typename NumericTraits::ScalarRealType ScalarRealType; + typedef TInputImage InputImageType; + typedef TOutputImage OutputImageType; + typedef typename TInputImage::PixelType PixelType; + typedef typename NumericTraits< PixelType >::FloatType RealType; + typedef typename TOutputImage::PixelType OutputPixelType; + typedef typename NumericTraits< PixelType >::ScalarRealType ScalarRealType; /** Smart pointer typedef support. */ - typedef typename TInputImage::Pointer InputImagePointer; - typedef typename TInputImage::ConstPointer InputImageConstPointer; - typedef typename TInputImage::SizeType InputSizeType; - typedef typename TOutputImage::SizeType OutputSizeType; + typedef typename TInputImage::Pointer InputImagePointer; + typedef typename TInputImage::ConstPointer InputImageConstPointer; + typedef typename TInputImage::SizeType InputSizeType; + typedef typename TOutputImage::SizeType OutputSizeType; /** a type to represent the "kernel radius" */ - typedef typename itk::FixedArray RadiusType; + typedef typename itk::FixedArray< ScalarRealType, TInputImage::ImageDimension > RadiusType; /** Image dimension. */ typedef typename OutputImageType::RegionType OutputImageRegionType; @@ -64,23 +63,19 @@ class ITK_EXPORT LabelSetErodeImageFilter: TOutputImage::ImageDimension); itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension); - - protected: - LabelSetErodeImageFilter(){}; - virtual ~LabelSetErodeImageFilter() {}; + LabelSetErodeImageFilter(){} + virtual ~LabelSetErodeImageFilter() {} - void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, ThreadIdType threadId ) override; + void ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) override; // Override since the filter produces the entire dataset. - private: - LabelSetErodeImageFilter(const Self&); //purposely not implemented - void operator=(const Self&); //purposely not implemented + LabelSetErodeImageFilter(const Self &); //purposely not implemented + void operator=(const Self &); //purposely not implemented typedef typename Superclass::DistanceImageType DistanceImageType; }; - } // end namespace itk #ifndef ITK_MANUAL_INSTANTIATION diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx index b0b491ebb20..bc38c7e777c 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx @@ -5,20 +5,17 @@ #include "itkImageRegionConstIterator.h" #include "itkImageRegionIterator.h" - #include "itkImageLinearIteratorWithIndex.h" #include "itkImageLinearConstIteratorWithIndex.h" #include "itkLabelSetUtils.h" - namespace itk { - -template +template< typename TInputImage, typename TOutputImage > void -LabelSetErodeImageFilter -::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, ThreadIdType threadId ) +LabelSetErodeImageFilter< TInputImage, TOutputImage > +::ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) { // this is where the work happens. We use a distance image with // floating point pixel to perform the parabolic operations. The @@ -31,45 +28,48 @@ LabelSetErodeImageFilter // compute the number of rows first, so we can setup a progress reporter typename std::vector< unsigned int > NumberOfRows; - InputSizeType size = outputRegionForThread.GetSize(); + InputSizeType size = outputRegionForThread.GetSize(); - for (unsigned int i = 0; i < InputImageDimension; i++) + for ( unsigned int i = 0; i < InputImageDimension; i++ ) { - NumberOfRows.push_back( 1 ); - for (unsigned int d = 0; d < InputImageDimension; d++) + NumberOfRows.push_back(1); + for ( unsigned int d = 0; d < InputImageDimension; d++ ) { - if( d != i ) + if ( d != i ) { - NumberOfRows[i] *= size[ d ]; + NumberOfRows[i] *= size[d]; } } } - float progressPerDimension = 1.0/ImageDimension; - - ProgressReporter * progress = new ProgressReporter(this, threadId, NumberOfRows[this->m_CurrentDimension], 30, this->m_CurrentDimension * progressPerDimension, progressPerDimension); + float progressPerDimension = 1.0 / ImageDimension; + ProgressReporter *progress = new ProgressReporter(this, + threadId, + NumberOfRows[this->m_CurrentDimension], + 30, + this->m_CurrentDimension * progressPerDimension, + progressPerDimension); - typedef ImageLinearConstIteratorWithIndex< TInputImage > InputConstIteratorType; - typedef ImageLinearIteratorWithIndex< TOutputImage > OutputIteratorType; + typedef ImageLinearConstIteratorWithIndex< TInputImage > InputConstIteratorType; + typedef ImageLinearIteratorWithIndex< TOutputImage > OutputIteratorType; - typedef ImageLinearConstIteratorWithIndex InputDistIteratorType; - typedef ImageLinearIteratorWithIndex OutputDistIteratorType; + typedef ImageLinearConstIteratorWithIndex< DistanceImageType > InputDistIteratorType; + typedef ImageLinearIteratorWithIndex< DistanceImageType > OutputDistIteratorType; typedef ImageRegion< TInputImage::ImageDimension > RegionType; - typename TInputImage::ConstPointer inputImage( this->GetInput () ); - typename TOutputImage::Pointer outputImage( this->GetOutput() ); - + typename TInputImage::ConstPointer inputImage( this->GetInput () ); + typename TOutputImage::Pointer outputImage( this->GetOutput() ); outputImage->SetBufferedRegion( outputImage->GetRequestedRegion() ); outputImage->Allocate(); RegionType region = outputRegionForThread; - InputConstIteratorType inputIterator( inputImage, region ); - OutputIteratorType outputIterator( outputImage, region ); + InputConstIteratorType inputIterator(inputImage, region); + OutputIteratorType outputIterator(outputImage, region); //OutputConstIteratorType inputIteratorStage2( outputImage, region ); - InputDistIteratorType inputDistIterator(this->m_DistanceImage, region); + InputDistIteratorType inputDistIterator(this->m_DistanceImage, region); OutputDistIteratorType outputDistIterator(this->m_DistanceImage, region); // setup the progress reporting @@ -78,51 +78,49 @@ LabelSetErodeImageFilter // flag to indicate whether the internal distance image has been // initialized using the special first pass erosion - if (this->m_Scale[this->m_CurrentDimension] > 0) + if ( this->m_Scale[this->m_CurrentDimension] > 0 ) { // Perform as normal //RealType magnitude = 1.0/(2.0 * m_Scale[0]); unsigned long LineLength = region.GetSize()[this->m_CurrentDimension]; - RealType image_scale = this->GetInput()->GetSpacing()[this->m_CurrentDimension]; - bool lastpass = (this->m_CurrentDimension == ImageDimension - 1); + RealType image_scale = this->GetInput()->GetSpacing()[this->m_CurrentDimension]; + bool lastpass = ( this->m_CurrentDimension == ImageDimension - 1 ); - if (!this->m_FirstPassDone) + if ( !this->m_FirstPassDone ) { - LabSet::doOneDimensionErodeFirstPass(inputIterator, outputDistIterator, outputIterator, - *progress, LineLength, - this->m_CurrentDimension, - this->m_MagnitudeSign, - this->m_UseImageSpacing, - this->m_Extreme, - image_scale, - this->m_Scale[this->m_CurrentDimension], - lastpass); + LabSet::doOneDimensionErodeFirstPass< InputConstIteratorType, OutputDistIteratorType, OutputIteratorType, + RealType >(inputIterator, outputDistIterator, outputIterator, + *progress, LineLength, + this->m_CurrentDimension, + this->m_MagnitudeSign, + this->m_UseImageSpacing, + this->m_Extreme, + image_scale, + this->m_Scale[this->m_CurrentDimension], + lastpass); } else { // do a standard erosion - LabSet::doOneDimensionErode(inputIterator, - inputDistIterator, - outputDistIterator, - outputIterator, - *progress, LineLength, - this->m_CurrentDimension, - this->m_MagnitudeSign, - this->m_UseImageSpacing, - this->m_Extreme, - image_scale, - this->m_Scale[this->m_CurrentDimension], - this->m_BaseSigma, - lastpass); - + LabSet::doOneDimensionErode< InputConstIteratorType, + InputDistIteratorType, + OutputIteratorType, + OutputDistIteratorType, + RealType >(inputIterator, + inputDistIterator, + outputDistIterator, + outputIterator, + *progress, LineLength, + this->m_CurrentDimension, + this->m_MagnitudeSign, + this->m_UseImageSpacing, + this->m_Extreme, + image_scale, + this->m_Scale[this->m_CurrentDimension], + this->m_BaseSigma, + lastpass); } } } - } // namespace itk #endif diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index 67ac43ad1b9..ba46b24db5d 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -7,10 +7,10 @@ namespace itk { #if ITK_VERSION_MAJOR < 4 - typedef int ThreadIdType; - typedef int RegionIndexType; +typedef int ThreadIdType; +typedef int RegionIndexType; #else - typedef unsigned int RegionIndexType; +typedef unsigned int RegionIndexType; #endif /** * \class LabelSetMorphBaseImageFilter @@ -23,18 +23,17 @@ namespace itk * \author Richard Beare, Department of Medicine, Monash University, * Australia. **/ -template +template< typename TInputImage, bool doDilate, + typename TOutputImage = TInputImage > class ITK_EXPORT LabelSetMorphBaseImageFilter: - public ImageToImageFilter + public ImageToImageFilter< TInputImage, TOutputImage > { - public: /** Standard class typedefs. */ - typedef LabelSetMorphBaseImageFilter Self; - typedef ImageToImageFilter Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; + typedef LabelSetMorphBaseImageFilter Self; + typedef ImageToImageFilter< TInputImage, TOutputImage > Superclass; + typedef SmartPointer< Self > Pointer; + typedef SmartPointer< const Self > ConstPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -42,32 +41,32 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter: /** Runtime information support. */ itkTypeMacro(LabelSetMorphBaseImageFilter, ImageToImageFilter); - /** Pixel Type of the input image */ - typedef TInputImage InputImageType; - typedef TOutputImage OutputImageType; - typedef typename TInputImage::PixelType PixelType; - typedef typename NumericTraits::FloatType RealType; - typedef typename TOutputImage::PixelType OutputPixelType; - typedef typename NumericTraits::ScalarRealType ScalarRealType; + typedef TInputImage InputImageType; + typedef TOutputImage OutputImageType; + typedef typename TInputImage::PixelType PixelType; + typedef typename NumericTraits< PixelType >::FloatType RealType; + typedef typename TOutputImage::PixelType OutputPixelType; + typedef typename NumericTraits< PixelType >::ScalarRealType ScalarRealType; - typedef typename OutputImageType::IndexType OutputIndexType; - typedef typename OutputImageType::IndexValueType OutputIndexValueType; + typedef typename OutputImageType::IndexType OutputIndexType; + typedef typename OutputImageType::IndexValueType OutputIndexValueType; /** Smart pointer typedef support. */ - typedef typename TInputImage::Pointer InputImagePointer; - typedef typename TInputImage::ConstPointer InputImageConstPointer; - typedef typename TInputImage::SizeType InputSizeType; - typedef typename TOutputImage::SizeType OutputSizeType; + typedef typename TInputImage::Pointer InputImagePointer; + typedef typename TInputImage::ConstPointer InputImageConstPointer; + typedef typename TInputImage::SizeType InputSizeType; + typedef typename TOutputImage::SizeType OutputSizeType; /** a type to represent the "kernel radius" */ - typedef typename itk::FixedArray RadiusType; + typedef typename itk::FixedArray< ScalarRealType, TInputImage::ImageDimension > RadiusType; /** Image dimension. */ typedef typename OutputImageType::RegionType OutputImageRegionType; // set all of the scales the same void SetRadius(ScalarRealType scale); + itkSetMacro(Radius, RadiusType); itkGetConstReferenceMacro(Radius, RadiusType); @@ -79,7 +78,6 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter: itkGetConstReferenceMacro(UseImageSpacing, bool); itkBooleanMacro(UseImageSpacing); - /** Image dimension. */ itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); @@ -96,35 +94,38 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter: protected: LabelSetMorphBaseImageFilter(); - virtual ~LabelSetMorphBaseImageFilter() {}; + virtual ~LabelSetMorphBaseImageFilter() {} + + RegionIndexType SplitRequestedRegion(RegionIndexType i, RegionIndexType num, + OutputImageRegionType & splitRegion) override; - RegionIndexType SplitRequestedRegion(RegionIndexType i, RegionIndexType num, OutputImageRegionType& splitRegion) override; - virtual void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, ThreadIdType threadId) override; - void GenerateData( void ) override; + virtual void ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, + ThreadIdType threadId) override; + + void GenerateData(void) override; // Override since the filter produces the entire dataset. void EnlargeOutputRequestedRegion(DataObject *output) override; + bool m_UseImageSpacing; - void PrintSelf(std::ostream& os, Indent indent) const override; + void PrintSelf(std::ostream & os, Indent indent) const override; RadiusType m_Radius; RadiusType m_Scale; - typedef typename itk::Image DistanceImageType; + typedef typename itk::Image< RealType, TInputImage::ImageDimension > DistanceImageType; typename TInputImage::PixelType m_Extreme; typename DistanceImageType::Pointer m_DistanceImage; - int m_MagnitudeSign; - int m_CurrentDimension; + int m_MagnitudeSign; + int m_CurrentDimension; bool m_FirstPassDone; // this is the first non-zero entry in the radius. Needed to // support elliptical operations RealType m_BaseSigma; private: - LabelSetMorphBaseImageFilter(const Self&); //purposely not implemented - void operator=(const Self&); //purposely not implemented - + LabelSetMorphBaseImageFilter(const Self &); //purposely not implemented + void operator=(const Self &); //purposely not implemented }; - } // end namespace itk #ifndef ITK_MANUAL_INSTANTIATION diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index 9e2c9f600aa..67a4de8df2c 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -5,7 +5,6 @@ #include "itkImageRegionConstIterator.h" #include "itkImageRegionIterator.h" - #include "itkImageLinearIteratorWithIndex.h" #include "itkImageLinearConstIteratorWithIndex.h" @@ -14,25 +13,24 @@ namespace itk { - -template -LabelSetMorphBaseImageFilter +template< typename TInputImage, bool doDilate, typename TOutputImage > +LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > ::LabelSetMorphBaseImageFilter() { - this->SetNumberOfRequiredOutputs( 1 ); - this->SetNumberOfRequiredInputs( 1 ); + this->SetNumberOfRequiredOutputs(1); + this->SetNumberOfRequiredInputs(1); // needs to be selected according to erosion/dilation m_DistanceImage = DistanceImageType::New(); - if (doDilate) + if ( doDilate ) { - m_Extreme = NumericTraits::NonpositiveMin(); + m_Extreme = NumericTraits< PixelType >::NonpositiveMin(); m_MagnitudeSign = 1; } else { - m_Extreme = NumericTraits::max(); + m_Extreme = NumericTraits< PixelType >::max(); m_MagnitudeSign = -1; } m_UseImageSpacing = false; @@ -40,20 +38,20 @@ LabelSetMorphBaseImageFilter this->SetRadius(1); } -template +template< typename TInputImage, bool doDilate, typename TOutputImage > void -LabelSetMorphBaseImageFilter -::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, ThreadIdType threadId) +LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > +::ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) { // stop warnings (void)outputRegionForThread; (void)threadId; } -template +template< typename TInputImage, bool doDilate, typename TOutputImage > RegionIndexType -LabelSetMorphBaseImageFilter -::SplitRequestedRegion(RegionIndexType i, RegionIndexType num, OutputImageRegionType& splitRegion) +LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > +::SplitRequestedRegion(RegionIndexType i, RegionIndexType num, OutputImageRegionType & splitRegion) { // Get the output pointer OutputImageType *outputPtr = this->GetOutput(); @@ -69,8 +67,8 @@ LabelSetMorphBaseImageFilter // split on the outermost dimension available // and avoid the current dimension int splitAxis = static_cast< int >( outputPtr->GetImageDimension() ) - 1; - while ( ( requestedRegionSize[splitAxis] == 1 ) || - ( splitAxis == static_cast< int >( m_CurrentDimension ) ) ) + while ( ( requestedRegionSize[splitAxis] == 1 ) + || ( splitAxis == static_cast< int >( m_CurrentDimension ) ) ) { --splitAxis; if ( splitAxis < 0 ) @@ -108,57 +106,55 @@ LabelSetMorphBaseImageFilter itkDebugMacro("Split Piece: " << splitRegion); return maxThreadIdUsed + 1; - } -template +template< typename TInputImage, bool doDilate, typename TOutputImage > void -LabelSetMorphBaseImageFilter -::SetRadius( ScalarRealType radius ) +LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > +::SetRadius(ScalarRealType radius) { RadiusType s; + s.Fill(radius); - this->SetRadius( s ); + this->SetRadius(s); } - -template +template< typename TInputImage, bool doDilate, typename TOutputImage > void -LabelSetMorphBaseImageFilter +LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > ::EnlargeOutputRequestedRegion(DataObject *output) { - TOutputImage *out = dynamic_cast(output); + TOutputImage *out = dynamic_cast< TOutputImage * >( output ); - if (out) + if ( out ) { out->SetRequestedRegion( out->GetLargestPossibleRegion() ); } } -template +template< typename TInputImage, bool doDilate, typename TOutputImage > void -LabelSetMorphBaseImageFilter +LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > ::GenerateData(void) { ThreadIdType nbthreads = this->GetNumberOfThreads(); - typename TInputImage::ConstPointer inputImage( this->GetInput () ); - typename TOutputImage::Pointer outputImage( this->GetOutput() ); + typename TInputImage::ConstPointer inputImage( this->GetInput () ); + typename TOutputImage::Pointer outputImage( this->GetOutput() ); this->AllocateOutputs(); - m_DistanceImage->SetBufferedRegion(outputImage->GetRequestedRegion()); + m_DistanceImage->SetBufferedRegion( outputImage->GetRequestedRegion() ); m_DistanceImage->Allocate(); m_DistanceImage->FillBuffer(0); m_DistanceImage->CopyInformation(inputImage); - if (this->GetUseImageSpacing()) + if ( this->GetUseImageSpacing() ) { - // radius is in mm - for (unsigned P=0;P // radius is in pixels RadiusType R; // this gives us a little bit of a margin - for (unsigned P=0;P // Subsequent non zero values are scaled by the first non zero // value to support elliptical operations. // The first value needs to be recorded for use by the erosion operation. - unsigned firstval=0; - for (unsigned P=0;P::ThreadStruct str; str.Filter = this; - MultiThreader* multithreader = this->GetMultiThreader(); + MultiThreader *multithreader = this->GetMultiThreader(); multithreader->SetNumberOfThreads(nbthreads); multithreader->SetSingleMethod(this->ThreaderCallback, &str); // multithread the execution - for( unsigned int d=0; dSingleMethodExecute(); - if (this->m_Scale[m_CurrentDimension] > 0) + if ( this->m_Scale[m_CurrentDimension] > 0 ) { // needs to be set outside the multithreaded code // first pass is completed as soon as we hit a structuring @@ -216,17 +211,15 @@ LabelSetMorphBaseImageFilter m_FirstPassDone = true; } } - } - -template +template< typename TInputImage, bool doDilate, typename TOutputImage > void -LabelSetMorphBaseImageFilter -::PrintSelf(std::ostream& os, Indent indent) const +LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > +::PrintSelf(std::ostream & os, Indent indent) const { - Superclass::PrintSelf(os,indent); - if (m_UseImageSpacing) + Superclass::PrintSelf(os, indent); + if ( m_UseImageSpacing ) { os << "Scale in world units: " << m_Radius << std::endl; } @@ -236,17 +229,16 @@ LabelSetMorphBaseImageFilter } } -template +template< typename TInputImage, bool doDilate, typename TOutputImage > void -LabelSetMorphBaseImageFilter +LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > ::writeDist(std::string fname) { - typedef typename itk::ImageFileWriter WriterType; + typedef typename itk::ImageFileWriter< DistanceImageType > WriterType; typename WriterType::Pointer writer = WriterType::New(); writer->SetInput(m_DistanceImage); - writer->SetFileName(fname.c_str()); + writer->SetFileName( fname.c_str() ); writer->Update(); } - } // namespace itk #endif diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index 9754b7be69f..db1429c51b3 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -5,53 +5,58 @@ #include "itkProgressReporter.h" #include -namespace itk { -namespace LabSet { -template -void DoLineErodeFirstPass(LineBufferType &LineBuf, RealType leftend, RealType rightend, +namespace itk +{ +namespace LabSet +{ +template< class LineBufferType, class RealType > +void DoLineErodeFirstPass(LineBufferType & LineBuf, RealType leftend, RealType rightend, const RealType magnitude, const RealType Sigma) { // This is the first pass algorithm. We can write down the values // because we know the inputs are binary const long LineLength = LineBuf.size(); - for (long pos = 0; pos < LineLength; pos++) + + for ( long pos = 0; pos < LineLength; pos++ ) { // compute the height of the parabola starting at each end and // keep the minimum RealType left, right; unsigned offset = LineLength - pos; - left = leftend - magnitude * (pos+1) * (pos+1); + left = leftend - magnitude * ( pos + 1 ) * ( pos + 1 ); right = rightend - magnitude * offset * offset; // note hard coded value here - could be a parameter -// LineBuf[pos] = std::min(std::min(left, right), itk::NumericTraits::One); +// LineBuf[pos] = std::min(std::min(left, right), +// itk::NumericTraits::One); LineBuf[pos] = std::min(std::min(left, right), Sigma); } } -template -void DoLineDilateFirstPass(LineBufferType &LineBuf, LineBufferType &tmpLineBuf, - LabLineBufferType &LabBuf, - LabLineBufferType &NewLabBuf, +template< class LineBufferType, class LabLineBufferType, class RealType > +void DoLineDilateFirstPass(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, + LabLineBufferType & LabBuf, + LabLineBufferType & NewLabBuf, const RealType magnitude) { // need to propagate the labels here const long LineLength = LineBuf.size(); - long lastcontact = 0; - RealType lastval = LineBuf[0]; - for (long pos = 0; pos < LineLength; pos++) + long lastcontact = 0; + RealType lastval = LineBuf[0]; + + for ( long pos = 0; pos < LineLength; pos++ ) { // left pass RealType krange = pos - lastcontact; RealType thisval = lastval - magnitude * krange * krange; - if (LineBuf[pos] >= LineBuf[lastcontact]) + if ( LineBuf[pos] >= LineBuf[lastcontact] ) { - lastcontact=pos; - lastval=LineBuf[pos]; + lastcontact = pos; + lastval = LineBuf[pos]; } - tmpLineBuf[pos]=std::max(LineBuf[pos], thisval); - if (thisval > LineBuf[pos]) + tmpLineBuf[pos] = std::max(LineBuf[pos], thisval); + if ( thisval > LineBuf[pos] ) { NewLabBuf[pos] = LabBuf[lastcontact]; } @@ -61,21 +66,21 @@ void DoLineDilateFirstPass(LineBufferType &LineBuf, LineBufferType &tmpLineBuf, } } - lastcontact=LineLength - 1; + lastcontact = LineLength - 1; lastval = tmpLineBuf[lastcontact]; - for (long pos = LineLength - 1; pos >= 0; pos--) + for ( long pos = LineLength - 1; pos >= 0; pos-- ) { // right pass - RealType krange = lastcontact-pos; + RealType krange = lastcontact - pos; RealType thisval = lastval - magnitude * krange * krange; - if (tmpLineBuf[pos] >= tmpLineBuf[lastcontact]) + if ( tmpLineBuf[pos] >= tmpLineBuf[lastcontact] ) { - lastcontact=pos; - lastval=tmpLineBuf[pos]; + lastcontact = pos; + lastval = tmpLineBuf[pos]; } - LineBuf[pos]=std::max(tmpLineBuf[pos], thisval); - if (thisval > tmpLineBuf[pos]) + LineBuf[pos] = std::max(tmpLineBuf[pos], thisval); + if ( thisval > tmpLineBuf[pos] ) { NewLabBuf[pos] = LabBuf[lastcontact]; } @@ -86,32 +91,28 @@ void DoLineDilateFirstPass(LineBufferType &LineBuf, LineBufferType &tmpLineBuf, // NewLabBuf[pos] = LabBuf[pos]; // } } - } - - - - -template -void DoLine(LineBufferType &LineBuf, LineBufferType &tmpLineBuf, +template< class LineBufferType, class RealType, bool doDilate > +void DoLine(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, const RealType magnitude, const RealType m_Extreme) { // contact point algorithm - long koffset = 0, newcontact=0; // how far away the search starts. + long koffset = 0, newcontact = 0; // how far away the search starts. const long LineLength = LineBuf.size(); + // negative half of the parabola - for (long pos = 0; pos < LineLength; pos++) + for ( long pos = 0; pos < LineLength; pos++ ) { RealType BaseVal = (RealType)m_Extreme; // the base value for // comparison - for (long krange = koffset; krange <= 0; krange++) + for ( long krange = koffset; krange <= 0; krange++ ) { // difference needs to be paramaterised RealType T = LineBuf[pos + krange] - magnitude * krange * krange; // switch on template parameter - hopefully gets optimized away. - if (doDilate ? (T >= BaseVal) : (T <= BaseVal) ) + if ( doDilate ? ( T >= BaseVal ) : ( T <= BaseVal ) ) { BaseVal = T; newcontact = krange; @@ -122,13 +123,13 @@ void DoLine(LineBufferType &LineBuf, LineBufferType &tmpLineBuf, } // positive half of parabola koffset = newcontact = 0; - for (long pos = LineLength - 1; pos >= 0; pos--) + for ( long pos = LineLength - 1; pos >= 0; pos-- ) { RealType BaseVal = (RealType)m_Extreme; // the base value for comparison - for (long krange = koffset; krange >= 0; krange--) + for ( long krange = koffset; krange >= 0; krange-- ) { RealType T = tmpLineBuf[pos + krange] - magnitude * krange * krange; - if (doDilate ? (T >= BaseVal) : (T <= BaseVal)) + if ( doDilate ? ( T >= BaseVal ) : ( T <= BaseVal ) ) { BaseVal = T; newcontact = krange; @@ -139,33 +140,33 @@ void DoLine(LineBufferType &LineBuf, LineBufferType &tmpLineBuf, } } -template -void DoLineLabelProp(LineBufferType &LineBuf, LineBufferType &tmpLineBuf, - LabBufferType &LabelBuf, LabBufferType &tmpLabelBuf, +template< class LineBufferType, class LabBufferType, class RealType, bool doDilate > +void DoLineLabelProp(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, + LabBufferType & LabelBuf, LabBufferType & tmpLabelBuf, const RealType magnitude, const RealType m_Extreme) { // contact point algorithm - long koffset = 0, newcontact=0; // how far away the search starts. + long koffset = 0, newcontact = 0; // how far away the search starts. typedef typename LabBufferType::ValueType LabelType; const long LineLength = LineBuf.size(); // negative half of the parabola - for (long pos = 0; pos < LineLength; pos++) + for ( long pos = 0; pos < LineLength; pos++ ) { RealType BaseVal = (RealType)m_Extreme; // the base value for // comparison LabelType BaseLab = LabelBuf[pos]; - for (long krange = koffset; krange <= 0; krange++) + for ( long krange = koffset; krange <= 0; krange++ ) { // difference needs to be paramaterised RealType T = LineBuf[pos + krange] - magnitude * krange * krange; // switch on template parameter - hopefully gets optimized away. - if (doDilate ? (T >= BaseVal) : (T <= BaseVal) ) + if ( doDilate ? ( T >= BaseVal ) : ( T <= BaseVal ) ) { BaseVal = T; newcontact = krange; - BaseLab = LabelBuf[pos+krange]; + BaseLab = LabelBuf[pos + krange]; } } tmpLineBuf[pos] = BaseVal; @@ -175,19 +176,19 @@ void DoLineLabelProp(LineBufferType &LineBuf, LineBufferType &tmpLineBuf, // positive half of parabola koffset = newcontact = 0; #if 1 - for (long pos = LineLength - 1; pos >= 0; pos--) + for ( long pos = LineLength - 1; pos >= 0; pos-- ) { RealType BaseVal = (RealType)m_Extreme; // the base value for comparison // initialize the label to the previously pro LabelType BaseLab = tmpLabelBuf[pos]; - for (long krange = koffset; krange >= 0; krange--) + for ( long krange = koffset; krange >= 0; krange-- ) { RealType T = tmpLineBuf[pos + krange] - magnitude * krange * krange; - if (doDilate ? (T >= BaseVal) : (T <= BaseVal)) + if ( doDilate ? ( T >= BaseVal ) : ( T <= BaseVal ) ) { BaseVal = T; newcontact = krange; - BaseLab = tmpLabelBuf[pos+krange]; + BaseLab = tmpLabelBuf[pos + krange]; } } LineBuf[pos] = BaseVal; @@ -195,7 +196,7 @@ void DoLineLabelProp(LineBufferType &LineBuf, LineBufferType &tmpLineBuf, koffset = newcontact + 1; } #else - for (long pos = LineLength - 1; pos >= 0; pos--) + for ( long pos = LineLength - 1; pos >= 0; pos-- ) { LineBuf[pos] = tmpLineBuf[pos]; LabelBuf[pos] = tmpLabelBuf[pos]; @@ -204,10 +205,10 @@ void DoLineLabelProp(LineBufferType &LineBuf, LineBufferType &tmpLineBuf, #endif } -template -void doOneDimensionErodeFirstPass(TInIter &inputIterator, TOutDistIter &outputIterator, - TOutLabIter &outputLabIterator, - ProgressReporter &progress, +template< class TInIter, class TOutDistIter, class TOutLabIter, class RealType > +void doOneDimensionErodeFirstPass(TInIter & inputIterator, TOutDistIter & outputIterator, + TOutLabIter & outputLabIterator, + ProgressReporter & progress, const unsigned LineLength, const unsigned direction, const int m_MagnitudeSign, @@ -220,17 +221,18 @@ void doOneDimensionErodeFirstPass(TInIter &inputIterator, TOutDistIter &outputIt // specialised version for binary erosion during first pass. We can // compute the results directly because the inputs are flat. (void)m_Extreme; // avoid warning - typedef typename itk::Array LineBufferType; - typedef typename itk::Array LabelBufferType; + typedef typename itk::Array< RealType > LineBufferType; + typedef typename itk::Array< typename TInIter::PixelType > LabelBufferType; RealType iscale = 1.0; - if (m_UseImageSpacing) + if ( m_UseImageSpacing ) { iscale = image_scale; } // restructure equation to reduce numerical error -// const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 * Sigma); - const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0); - LineBufferType LineBuf(LineLength); +// const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 * +// Sigma); + const RealType magnitude = ( m_MagnitudeSign * iscale * iscale ) / ( 2.0 ); + LineBufferType LineBuf(LineLength); LabelBufferType LabBuf(LineLength); inputIterator.SetDirection(direction); @@ -241,86 +243,85 @@ void doOneDimensionErodeFirstPass(TInIter &inputIterator, TOutDistIter &outputIt outputIterator.GoToBegin(); outputLabIterator.GoToBegin(); - while( !inputIterator.IsAtEnd() && !outputIterator.IsAtEnd() ) + while ( !inputIterator.IsAtEnd() && !outputIterator.IsAtEnd() ) { // process this direction // fetch the line into the buffer - this methodology is like // the gaussian filters - unsigned int i=0; + unsigned int i = 0; // copy the scanline to a buffer - while( !inputIterator.IsAtEndOfLine() ) + while ( !inputIterator.IsAtEndOfLine() ) + { + LabBuf[i] = ( inputIterator.Get() ); + if ( LabBuf[i] ) { - LabBuf[i] = (inputIterator.Get()); - if (LabBuf[i]) - { - LineBuf[i] = 1.0; - } - ++i; - ++inputIterator; + LineBuf[i] = 1.0; } + ++i; + ++inputIterator; + } // runlength encode the line buffer (could be integrated with extraction) - - typedef std::vector EndType; + typedef std::vector< unsigned > EndType; EndType firsts; EndType lasts; - for (unsigned idx=0;idx(ShortLineBuf, leftend, rightend, magnitude, Sigma); + DoLineErodeFirstPass< LineBufferType, RealType >(ShortLineBuf, leftend, rightend, magnitude, Sigma); // copy the segment back into the full line buffer - std::copy(ShortLineBuf.begin(), ShortLineBuf.end(), &(LineBuf[first])); + std::copy( ShortLineBuf.begin(), ShortLineBuf.end(), &( LineBuf[first] ) ); } // copy the line buffer back to the image unsigned j = 0; - while( !outputIterator.IsAtEndOfLine() ) + while ( !outputIterator.IsAtEndOfLine() ) { - outputIterator.Set( static_cast( LineBuf[j++] ) ); + outputIterator.Set( static_cast< typename TOutDistIter::PixelType >( LineBuf[j++] ) ); ++outputIterator; } - if (lastpass) + if ( lastpass ) { // copy to the output image - this would be a weird case of only // using a one dimensional SE unsigned j2 = 0; - while (!outputLabIterator.IsAtEndOfLine()) + while ( !outputLabIterator.IsAtEndOfLine() ) { typename TInIter::PixelType val = 0; - if (LineBuf[j2] == Sigma) + if ( LineBuf[j2] == Sigma ) { - val=LabBuf[j2]; + val = LabBuf[j2]; } outputLabIterator.Set(val); ++outputLabIterator; @@ -336,34 +337,35 @@ void doOneDimensionErodeFirstPass(TInIter &inputIterator, TOutDistIter &outputIt } } -template -void doOneDimensionDilateFirstPass(TInIter &inputIterator, TOutDistIter &outputIterator, - TOutLabIter &outputLabIterator, - ProgressReporter &progress, - const unsigned LineLength, - const unsigned direction, - const int m_MagnitudeSign, - const bool m_UseImageSpacing, - const RealType m_Extreme, - const RealType image_scale, - const RealType Sigma) +template< class TInIter, class TOutDistIter, class TOutLabIter, class RealType > +void doOneDimensionDilateFirstPass(TInIter & inputIterator, TOutDistIter & outputIterator, + TOutLabIter & outputLabIterator, + ProgressReporter & progress, + const unsigned LineLength, + const unsigned direction, + const int m_MagnitudeSign, + const bool m_UseImageSpacing, + const RealType m_Extreme, + const RealType image_scale, + const RealType Sigma) { // specialised version for binary erosion during first pass. We can // compute the results directly because the inputs are flat. (void)m_Extreme; // stop warnings - typedef typename itk::Array LineBufferType; - typedef typename itk::Array LabelBufferType; + typedef typename itk::Array< RealType > LineBufferType; + typedef typename itk::Array< typename TInIter::PixelType > LabelBufferType; RealType iscale = 1.0; - if (m_UseImageSpacing) + if ( m_UseImageSpacing ) { iscale = image_scale; } // restructure equation to reduce numerical error - //const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 * Sigma); - const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0); - LineBufferType LineBuf(LineLength); + //const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 * + // Sigma); + const RealType magnitude = ( m_MagnitudeSign * iscale * iscale ) / ( 2.0 ); + LineBufferType LineBuf(LineLength); LabelBufferType LabBuf(LineLength); - LineBufferType tmpLineBuf(LineLength); + LineBufferType tmpLineBuf(LineLength); LabelBufferType newLabBuf(LineLength); inputIterator.SetDirection(direction); @@ -374,19 +376,18 @@ void doOneDimensionDilateFirstPass(TInIter &inputIterator, TOutDistIter &outputI outputIterator.GoToBegin(); outputLabIterator.GoToBegin(); - - while( !inputIterator.IsAtEnd() && !outputIterator.IsAtEnd() ) + while ( !inputIterator.IsAtEnd() && !outputIterator.IsAtEnd() ) { // process this direction // fetch the line into the buffer - this methodology is like // the gaussian filters - unsigned int i=0; + unsigned int i = 0; // copy the scanline to a buffer - while( !inputIterator.IsAtEndOfLine() ) + while ( !inputIterator.IsAtEndOfLine() ) { - LabBuf[i] = (inputIterator.Get()); - if (LabBuf[i]) + LabBuf[i] = ( inputIterator.Get() ); + if ( LabBuf[i] ) { LineBuf[i] = Sigma; } @@ -398,20 +399,22 @@ void doOneDimensionDilateFirstPass(TInIter &inputIterator, TOutDistIter &outputI ++inputIterator; } - DoLineDilateFirstPass(LineBuf, tmpLineBuf, LabBuf, newLabBuf, magnitude); + DoLineDilateFirstPass< LineBufferType, LabelBufferType, RealType >(LineBuf, + tmpLineBuf, + LabBuf, + newLabBuf, + magnitude); // copy the line buffer back to the image unsigned j = 0; - while( !outputIterator.IsAtEndOfLine() ) + while ( !outputIterator.IsAtEndOfLine() ) { - outputIterator.Set( static_cast( LineBuf[j] ) ); + outputIterator.Set( static_cast< typename TOutDistIter::PixelType >( LineBuf[j] ) ); outputLabIterator.Set(newLabBuf[j]); ++outputLabIterator; ++outputIterator; ++j; } - - // now onto the next line inputIterator.NextLine(); outputIterator.NextLine(); @@ -420,11 +423,10 @@ void doOneDimensionDilateFirstPass(TInIter &inputIterator, TOutDistIter &outputI } } - -template -void doOneDimensionErode(TInIter &inputIterator, TDistIter &inputDistIterator, - TOutDistIter &outputDistIterator, TOutLabIter &outputLabIterator, - ProgressReporter &progress, +template< class TInIter, class TDistIter, class TOutLabIter, class TOutDistIter, class RealType > +void doOneDimensionErode(TInIter & inputIterator, TDistIter & inputDistIterator, + TOutDistIter & outputDistIterator, TOutLabIter & outputLabIterator, + ProgressReporter & progress, const unsigned LineLength, const unsigned direction, const int m_MagnitudeSign, @@ -436,15 +438,15 @@ void doOneDimensionErode(TInIter &inputIterator, TDistIter &inputDistIterator, const bool lastpass) { // traditional erosion - can't optimise the same way as the first pass - typedef typename itk::Array LineBufferType; - typedef typename itk::Array LabelBufferType; + typedef typename itk::Array< RealType > LineBufferType; + typedef typename itk::Array< typename TInIter::PixelType > LabelBufferType; RealType iscale = 1.0; - if (m_UseImageSpacing) + if ( m_UseImageSpacing ) { iscale = image_scale; } - const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0*Sigma); - LineBufferType LineBuf(LineLength); + const RealType magnitude = ( m_MagnitudeSign * iscale * iscale ) / ( 2.0 * Sigma ); + LineBufferType LineBuf(LineLength); LabelBufferType LabBuf(LineLength); inputIterator.SetDirection(direction); @@ -457,88 +459,87 @@ void doOneDimensionErode(TInIter &inputIterator, TDistIter &inputDistIterator, inputDistIterator.GoToBegin(); outputLabIterator.GoToBegin(); - - while( !inputIterator.IsAtEnd() && !outputDistIterator.IsAtEnd() ) + while ( !inputIterator.IsAtEnd() && !outputDistIterator.IsAtEnd() ) { // process this direction // fetch the line into the buffer - this methodology is like // the gaussian filters - unsigned int i=0; + unsigned int i = 0; // copy the scanline to a buffer - while( !inputIterator.IsAtEndOfLine() ) - { - LineBuf[i] = static_cast(inputDistIterator.Get()); - LabBuf[i] = inputIterator.Get(); - ++i; - ++inputDistIterator; - ++inputIterator; - } + while ( !inputIterator.IsAtEndOfLine() ) + { + LineBuf[i] = static_cast< RealType >( inputDistIterator.Get() ); + LabBuf[i] = inputIterator.Get(); + ++i; + ++inputDistIterator; + ++inputIterator; + } // runlength encode the line buffer (could be integrated with extraction) - typedef std::vector EndType; + typedef std::vector< unsigned > EndType; EndType firsts; EndType lasts; - for (unsigned idx=0;idx(ShortLineBuf, tmpShortLineBuf, magnitude, m_Extreme); + DoLine< LineBufferType, RealType, false >(ShortLineBuf, tmpShortLineBuf, magnitude, m_Extreme); // copy the segment back into the full line buffer - std::copy(&(ShortLineBuf[1]), &(ShortLineBuf[SLL+1]), &(LineBuf[first])); + std::copy( &( ShortLineBuf[1] ), &( ShortLineBuf[SLL + 1] ), &( LineBuf[first] ) ); } // copy the line buffer back to the image - don't need to do it on // the last pass - move when we are sure it is working unsigned j = 0; - while( !outputDistIterator.IsAtEndOfLine() ) + while ( !outputDistIterator.IsAtEndOfLine() ) { - outputDistIterator.Set( static_cast( LineBuf[j++] ) ); + outputDistIterator.Set( static_cast< typename TOutDistIter::PixelType >( LineBuf[j++] ) ); ++outputDistIterator; } - if (lastpass) + if ( lastpass ) { unsigned j2 = 0; - while (!outputLabIterator.IsAtEndOfLine()) + while ( !outputLabIterator.IsAtEndOfLine() ) { typename TInIter::PixelType val = 0; - if (LineBuf[j2] == BaseSigma) + if ( LineBuf[j2] == BaseSigma ) { - val=LabBuf[j2]; + val = LabBuf[j2]; } outputLabIterator.Set(val); ++outputLabIterator; @@ -554,10 +555,10 @@ void doOneDimensionErode(TInIter &inputIterator, TDistIter &inputDistIterator, } } -template -void doOneDimensionDilate(TInIter &inputIterator, TDistIter &inputDistIterator, - TOutDistIter &outputDistIterator, TOutLabIter &outputLabIterator, - ProgressReporter &progress, +template< class TInIter, class TDistIter, class TOutLabIter, class TOutDistIter, class RealType > +void doOneDimensionDilate(TInIter & inputIterator, TDistIter & inputDistIterator, + TOutDistIter & outputDistIterator, TOutLabIter & outputLabIterator, + ProgressReporter & progress, const unsigned LineLength, const unsigned direction, const int m_MagnitudeSign, @@ -565,23 +566,23 @@ void doOneDimensionDilate(TInIter &inputIterator, TDistIter &inputDistIterator, const RealType m_Extreme, const RealType image_scale, const RealType Sigma - ) + ) { // specialised version for binary erosion during first pass. We can // compute the results directly because the inputs are flat. - typedef typename itk::Array LineBufferType; - typedef typename itk::Array LabelBufferType; + typedef typename itk::Array< RealType > LineBufferType; + typedef typename itk::Array< typename TInIter::PixelType > LabelBufferType; RealType iscale = 1.0; - if (m_UseImageSpacing) + if ( m_UseImageSpacing ) { iscale = image_scale; } // restructure equation to reduce numerical error - const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 * Sigma); + const RealType magnitude = ( m_MagnitudeSign * iscale * iscale ) / ( 2.0 * Sigma ); // const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 ); - LineBufferType LineBuf(LineLength); + LineBufferType LineBuf(LineLength); LabelBufferType LabBuf(LineLength); - LineBufferType tmpLineBuf(LineLength); + LineBufferType tmpLineBuf(LineLength); LabelBufferType newLabBuf(LineLength); LabelBufferType tmpLabBuf(LineLength); @@ -595,15 +596,15 @@ void doOneDimensionDilate(TInIter &inputIterator, TDistIter &inputDistIterator, outputDistIterator.GoToBegin(); outputLabIterator.GoToBegin(); - while( !inputDistIterator.IsAtEnd() && !outputLabIterator.IsAtEnd() ) + while ( !inputDistIterator.IsAtEnd() && !outputLabIterator.IsAtEnd() ) { // process this direction // fetch the line into the buffer - this methodology is like // the gaussian filters - unsigned int i=0; + unsigned int i = 0; // copy the scanline to a buffer - while( !inputDistIterator.IsAtEndOfLine() ) + while ( !inputDistIterator.IsAtEndOfLine() ) { LineBuf[i] = inputDistIterator.Get(); LabBuf[i] = inputIterator.Get(); @@ -612,12 +613,17 @@ void doOneDimensionDilate(TInIter &inputIterator, TDistIter &inputDistIterator, ++inputDistIterator; } - DoLineLabelProp(LineBuf, tmpLineBuf, LabBuf, tmpLabBuf, magnitude, m_Extreme); + DoLineLabelProp< LineBufferType, LabelBufferType, RealType, true >(LineBuf, + tmpLineBuf, + LabBuf, + tmpLabBuf, + magnitude, + m_Extreme); // copy the line buffer back to the image unsigned j = 0; - while( !outputDistIterator.IsAtEndOfLine() ) + while ( !outputDistIterator.IsAtEndOfLine() ) { - outputDistIterator.Set( static_cast( LineBuf[j] ) ); + outputDistIterator.Set( static_cast< typename TOutDistIter::PixelType >( LineBuf[j] ) ); outputLabIterator.Set(LabBuf[j]); ++outputDistIterator; ++outputLabIterator; @@ -632,7 +638,6 @@ void doOneDimensionDilate(TInIter &inputIterator, TDistIter &inputDistIterator, progress.CompletedPixel(); } } - } } #endif diff --git a/Modules/Filtering/LabelErodeDilate/include/itkinstance.h b/Modules/Filtering/LabelErodeDilate/include/itkinstance.h index e2776ddb779..dd4b8cd13ee 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkinstance.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkinstance.h @@ -4,11 +4,12 @@ #include namespace itk { - template - class Instance : public T::Pointer { - public: - Instance() : SmartPointer( T::New() ) {} - }; +template< typename T > +class Instance:public T::Pointer +{ +public: + Instance():SmartPointer< T >( T::New() ) {} +}; } #endif diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index b57d23234a7..3066b28a14a 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -5,82 +5,81 @@ #include "itkLabelSetDilateImageFilter.h" #include "read_info.cxx" -template +template< class MaskPixType, int dim > int doDilate(char *In, char *Out, int radius) { - typedef typename itk::Image MaskImType; + typedef typename itk::Image< MaskPixType, dim > MaskImType; // load typedef typename itk::ImageFileReader< MaskImType > ReaderType; typename ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName( In ); - try + reader->SetFileName(In); + try { - reader->Update(); + reader->Update(); } - catch( itk::ExceptionObject & excp ) + catch ( itk::ExceptionObject & excp ) { - std::cerr << excp << std::endl; - return EXIT_FAILURE; + std::cerr << excp << std::endl; + return EXIT_FAILURE; } // Label dilation - typedef typename itk::LabelSetDilateImageFilter FilterType; + typedef typename itk::LabelSetDilateImageFilter< MaskImType, MaskImType > FilterType; typename FilterType::Pointer filter = FilterType::New(); - filter->SetInput(reader->GetOutput()); + filter->SetInput( reader->GetOutput() ); filter->SetRadius(radius); filter->SetUseImageSpacing(true); typedef typename itk::ImageFileWriter< MaskImType > WriterType; typename WriterType::Pointer writer = WriterType::New(); writer->SetInput( filter->GetOutput() ); - writer->SetFileName( Out ); + writer->SetFileName(Out); try { - writer->Update(); + writer->Update(); } - catch( itk::ExceptionObject & excp ) + catch ( itk::ExceptionObject & excp ) { - std::cerr << excp << std::endl; - return EXIT_FAILURE; + std::cerr << excp << std::endl; + return EXIT_FAILURE; } return EXIT_SUCCESS; - } ///////////////////////////////// -int itkLabelSetDilateTest(int argc, char * argv[]) +int itkLabelSetDilateTest(int argc, char *argv[]) { - int dim1; + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); itk::ImageIOBase::IOComponentType ComponentType; - if (argc != 4) + if ( argc != 4 ) { - std::cerr << "Usage: " << argv[0] << "inputimage radius outputimage" << std::endl; - return(EXIT_FAILURE); + std::cerr << "Usage: " << argv[0] << "inputimage radius outputimage" << std::endl; + return ( EXIT_FAILURE ); } - if (!readImageInfo(argv[1], &ComponentType, &dim1)) + if ( !readImageInfo(argv[1], &ComponentType, &dim1) ) { std::cerr << "Failed to open " << argv[1] << std::endl; - return(EXIT_FAILURE); + return ( EXIT_FAILURE ); } int status = EXIT_FAILURE; - switch (dim1) + switch ( dim1 ) { case 2: - status=doDilate(argv[1], argv[3], atoi(argv[2])); + status = doDilate< unsigned char, 2 >( argv[1], argv[3], atoi(argv[2]) ); break; case 3: - status=doDilate(argv[1], argv[3], atoi(argv[2])); + status = doDilate< unsigned char, 3 >( argv[1], argv[3], atoi(argv[2]) ); break; default: std::cerr << "Unsupported dimension" << std::endl; - return (EXIT_FAILURE); + return ( EXIT_FAILURE ); break; } return status; diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx index 2699fa602df..3f7e29e4708 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx @@ -6,82 +6,81 @@ #include "read_info.cxx" -template +template< class MaskPixType, int dim > int doErode(char *In, char *Out, int radius) { - typedef typename itk::Image MaskImType; + typedef typename itk::Image< MaskPixType, dim > MaskImType; // load typedef typename itk::ImageFileReader< MaskImType > ReaderType; typename ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName( In ); - try + reader->SetFileName(In); + try { - reader->Update(); + reader->Update(); } - catch( itk::ExceptionObject & excp ) + catch ( itk::ExceptionObject & excp ) { - std::cerr << excp << std::endl; - return EXIT_FAILURE; + std::cerr << excp << std::endl; + return EXIT_FAILURE; } // Label dilation - typedef typename itk::LabelSetErodeImageFilter FilterType; + typedef typename itk::LabelSetErodeImageFilter< MaskImType, MaskImType > FilterType; typename FilterType::Pointer filter = FilterType::New(); - filter->SetInput(reader->GetOutput()); + filter->SetInput( reader->GetOutput() ); filter->SetRadius(radius); filter->SetUseImageSpacing(true); typedef typename itk::ImageFileWriter< MaskImType > WriterType; typename WriterType::Pointer writer = WriterType::New(); writer->SetInput( filter->GetOutput() ); - writer->SetFileName( Out ); + writer->SetFileName(Out); try { - writer->Update(); + writer->Update(); } - catch( itk::ExceptionObject & excp ) + catch ( itk::ExceptionObject & excp ) { - std::cerr << excp << std::endl; - return EXIT_FAILURE; + std::cerr << excp << std::endl; + return EXIT_FAILURE; } return EXIT_SUCCESS; - } ///////////////////////////////////////////// -int itkLabelSetErodeTest(int argc, char * argv[]) +int itkLabelSetErodeTest(int argc, char *argv[]) { - int dim1; + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); itk::ImageIOBase::IOComponentType ComponentType; - if (argc != 4) + if ( argc != 4 ) { - std::cerr << "Usage: " << argv[0] << "inputimage radius outputimage" << std::endl; - return(EXIT_FAILURE); + std::cerr << "Usage: " << argv[0] << "inputimage radius outputimage" << std::endl; + return ( EXIT_FAILURE ); } - if (!readImageInfo(argv[1], &ComponentType, &dim1)) + if ( !readImageInfo(argv[1], &ComponentType, &dim1) ) { std::cerr << "Failed to open " << argv[1] << std::endl; - return(EXIT_FAILURE); + return ( EXIT_FAILURE ); } int status = EXIT_FAILURE; - switch (dim1) + switch ( dim1 ) { case 2: - status=doErode(argv[1], argv[3], atoi(argv[2])); + status = doErode< unsigned char, 2 >( argv[1], argv[3], atoi(argv[2]) ); break; case 3: - status=doErode(argv[1], argv[3], atoi(argv[2])); + status = doErode< unsigned char, 3 >( argv[1], argv[3], atoi(argv[2]) ); break; default: std::cerr << "Unsupported dimension" << std::endl; - return (EXIT_FAILURE); + return ( EXIT_FAILURE ); break; } return status; diff --git a/Modules/Filtering/LabelErodeDilate/test/labelDilateLoopTest.cxx b/Modules/Filtering/LabelErodeDilate/test/labelDilateLoopTest.cxx index d0fdf79a9dd..8d354191526 100644 --- a/Modules/Filtering/LabelErodeDilate/test/labelDilateLoopTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/labelDilateLoopTest.cxx @@ -5,66 +5,64 @@ #include "itkLabelSetDilateImageFilter.h" #include "itkinstance.h" - typedef class CmdLineType { public: std::string InputIm, OutputIm; - float radius; - int iterations; + float radius; + int iterations; } CmdLineType; -void ParseCmdLine(int argc, char* argv[], - CmdLineType &CmdLineObj +void ParseCmdLine(int argc, char *argv[], + CmdLineType & CmdLineObj ) { using namespace TCLAP; try - { - // Define the command line object. - CmdLine cmd("varSize ", ' ', "0.9"); - - ValueArg inArg("i","input","input image (label mask)",true,"result","string"); - cmd.add( inArg ); - - ValueArg outArg("o","output","output image", true,"","string"); - cmd.add( outArg ); - - ValueArg radArg("r","radius","erosion radius", true, -1.0,"float"); - cmd.add( radArg ); - ValueArg iterArg("","iterations","loop iterations", false, 1,"integer"); - cmd.add( iterArg ); - - // Parse the args. - cmd.parse( argc, argv ); - - CmdLineObj.InputIm = inArg.getValue(); - CmdLineObj.OutputIm = outArg.getValue(); - CmdLineObj.radius = radArg.getValue(); - CmdLineObj.iterations = iterArg.getValue(); - } - catch (ArgException &e) // catch any exceptions + { + // Define the command line object. + CmdLine cmd("varSize ", ' ', "0.9"); + + ValueArg< std::string > inArg("i", "input", "input image (label mask)", true, "result", "string"); + cmd.add(inArg); + + ValueArg< std::string > outArg("o", "output", "output image", true, "", "string"); + cmd.add(outArg); + + ValueArg< float > radArg("r", "radius", "erosion radius", true, -1.0, "float"); + cmd.add(radArg); + ValueArg< int > iterArg("", "iterations", "loop iterations", false, 1, "integer"); + cmd.add(iterArg); + + // Parse the args. + cmd.parse(argc, argv); + + CmdLineObj.InputIm = inArg.getValue(); + CmdLineObj.OutputIm = outArg.getValue(); + CmdLineObj.radius = radArg.getValue(); + CmdLineObj.iterations = iterArg.getValue(); + } + catch ( ArgException & e ) // catch any exceptions { std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; } } -template -void doDilate(const CmdLineType &CmdLineObj) +template< class MaskPixType, int dim > +void doDilate(const CmdLineType & CmdLineObj) { // test behaviour in a loop - typedef typename itk::Image MaskImType; + typedef typename itk::Image< MaskPixType, dim > MaskImType; // load - typename MaskImType::Pointer mask = readIm(CmdLineObj.InputIm); + typename MaskImType::Pointer mask = readIm< MaskImType >(CmdLineObj.InputIm); // Label dilation - itk::Instance< itk::LabelSetDilateImageFilter > Dilate; + itk::Instance< itk::LabelSetDilateImageFilter< MaskImType, MaskImType > > Dilate; Dilate->SetRadius(CmdLineObj.radius); Dilate->SetUseImageSpacing(true); - - for (int it=0; itSetInput(mask); Dilate->Update(); @@ -72,40 +70,39 @@ void doDilate(const CmdLineType &CmdLineObj) mask->DisconnectPipeline(); } - writeIm(mask, CmdLineObj.OutputIm); + writeIm< MaskImType >(mask, CmdLineObj.OutputIm); //Dilate->writeDist("/tmp/pdist.nii.gz"); - } ///////////////////////////////// -int main(int argc, char * argv[]) +int main(int argc, char *argv[]) { - - int dim1; + int dim1; CmdLineType CmdLineObj; + ParseCmdLine(argc, argv, CmdLineObj); itk::ImageIOBase::IOComponentType ComponentType; itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - if (!readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1)) + if ( !readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1) ) { std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; - return(EXIT_FAILURE); + return ( EXIT_FAILURE ); } - switch (dim1) + switch ( dim1 ) { case 2: - doDilate(CmdLineObj); + doDilate< unsigned char, 2 >(CmdLineObj); break; case 3: - doDilate(CmdLineObj); + doDilate< unsigned char, 3 >(CmdLineObj); break; default: std::cerr << "Unsupported dimension" << std::endl; - return (EXIT_FAILURE); + return ( EXIT_FAILURE ); break; } return EXIT_SUCCESS; diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielsson.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielsson.cxx index 5333cb90263..664028cfa0f 100644 --- a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielsson.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielsson.cxx @@ -3,95 +3,89 @@ #include "itkinstance.h" #include "multilabelDilation.h" - - - typedef class CmdLineType { public: std::string InputIm, OutputIm; - float radius; + float radius; } CmdLineType; -void ParseCmdLine(int argc, char* argv[], - CmdLineType &CmdLineObj +void ParseCmdLine(int argc, char *argv[], + CmdLineType & CmdLineObj ) { using namespace TCLAP; try - { - // Define the command line object. - CmdLine cmd("varSize ", ' ', "0.9"); + { + // Define the command line object. + CmdLine cmd("varSize ", ' ', "0.9"); - ValueArg inArg("i","input","input image (label mask)",true,"result","string"); - cmd.add( inArg ); + ValueArg< std::string > inArg("i", "input", "input image (label mask)", true, "result", "string"); + cmd.add(inArg); - ValueArg outArg("o","output","output image", true,"","string"); - cmd.add( outArg ); + ValueArg< std::string > outArg("o", "output", "output image", true, "", "string"); + cmd.add(outArg); - ValueArg radArg("r","radius","erosion radius", true, -1.0,"float"); - cmd.add( radArg ); + ValueArg< float > radArg("r", "radius", "erosion radius", true, -1.0, "float"); + cmd.add(radArg); - // Parse the args. - cmd.parse( argc, argv ); + // Parse the args. + cmd.parse(argc, argv); - CmdLineObj.InputIm = inArg.getValue(); - CmdLineObj.OutputIm = outArg.getValue(); - CmdLineObj.radius = radArg.getValue(); - } - catch (ArgException &e) // catch any exceptions + CmdLineObj.InputIm = inArg.getValue(); + CmdLineObj.OutputIm = outArg.getValue(); + CmdLineObj.radius = radArg.getValue(); + } + catch ( ArgException & e ) // catch any exceptions { std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; } } - - -template -void doDilate(const CmdLineType &CmdLineObj) +template< class MaskPixType, int dim > +void doDilate(const CmdLineType & CmdLineObj) { - typedef typename itk::Image MaskImType; + typedef typename itk::Image< MaskPixType, dim > MaskImType; // load - typename MaskImType::Pointer mask = readIm(CmdLineObj.InputIm); + typename MaskImType::Pointer mask = readIm< MaskImType >(CmdLineObj.InputIm); // apply mask to size // Label dilation - typename MaskImType::Pointer res = multilabelDilationDanielsson(mask, CmdLineObj.radius); - writeIm(res, CmdLineObj.OutputIm); - + typename MaskImType::Pointer res = multilabelDilationDanielsson< MaskImType >(mask, CmdLineObj.radius); + writeIm< MaskImType >(res, CmdLineObj.OutputIm); } ///////////////////////////////// -int main(int argc, char * argv[]) +int main(int argc, char *argv[]) { - - int dim1; + int dim1; CmdLineType CmdLineObj; + ParseCmdLine(argc, argv, CmdLineObj); itk::ImageIOBase::IOComponentType ComponentType; //itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - if (!readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1)) + if ( !readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1) ) { std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; - return(EXIT_FAILURE); + return ( EXIT_FAILURE ); } - switch (dim1) + switch ( dim1 ) { case 2: - doDilate(CmdLineObj); + doDilate< unsigned char, 2 >(CmdLineObj); break; case 3: - doDilate(CmdLineObj); + doDilate< unsigned char, 3 >(CmdLineObj); break; default: std::cerr << "Unsupported dimension" << std::endl; - return (EXIT_FAILURE); + return ( EXIT_FAILURE ); break; } return EXIT_SUCCESS; diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielssonPerf.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielssonPerf.cxx index 646ea0f4054..6f7e7040b92 100644 --- a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielssonPerf.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielssonPerf.cxx @@ -4,114 +4,110 @@ #include "multilabelDilation.h" #include "itkTimeProbe.h" - - typedef class CmdLineType { public: std::string InputIm, OutputIm; - float radius; - int repetitions, threads; - + float radius; + int repetitions, threads; } CmdLineType; -void ParseCmdLine(int argc, char* argv[], - CmdLineType &CmdLineObj +void ParseCmdLine(int argc, char *argv[], + CmdLineType & CmdLineObj ) { using namespace TCLAP; try - { - // Define the command line object. - CmdLine cmd("varSize ", ' ', "0.9"); - - ValueArg inArg("i","input","input image (label mask)",true,"result","string"); - cmd.add( inArg ); + { + // Define the command line object. + CmdLine cmd("varSize ", ' ', "0.9"); - ValueArg outArg("o","output","output image", true,"","string"); - cmd.add( outArg ); + ValueArg< std::string > inArg("i", "input", "input image (label mask)", true, "result", "string"); + cmd.add(inArg); - ValueArg radArg("r","radius","erosion radius", true, -1.0,"float"); - cmd.add( radArg ); + ValueArg< std::string > outArg("o", "output", "output image", true, "", "string"); + cmd.add(outArg); - ValueArg threadArg("", "threads", "number of threads", false, 1, "integer"); - cmd.add(threadArg); + ValueArg< float > radArg("r", "radius", "erosion radius", true, -1.0, "float"); + cmd.add(radArg); - ValueArg repArg("", "repetitions", "number of repeats", false, 1, "integer"); - cmd.add(repArg); + ValueArg< int > threadArg("", "threads", "number of threads", false, 1, "integer"); + cmd.add(threadArg); - // Parse the args. - cmd.parse( argc, argv ); + ValueArg< int > repArg("", "repetitions", "number of repeats", false, 1, "integer"); + cmd.add(repArg); - CmdLineObj.InputIm = inArg.getValue(); - CmdLineObj.OutputIm = outArg.getValue(); - CmdLineObj.radius = radArg.getValue(); - CmdLineObj.threads = threadArg.getValue(); - CmdLineObj.repetitions = repArg.getValue(); + // Parse the args. + cmd.parse(argc, argv); - } - catch (ArgException &e) // catch any exceptions + CmdLineObj.InputIm = inArg.getValue(); + CmdLineObj.OutputIm = outArg.getValue(); + CmdLineObj.radius = radArg.getValue(); + CmdLineObj.threads = threadArg.getValue(); + CmdLineObj.repetitions = repArg.getValue(); + } + catch ( ArgException & e ) // catch any exceptions { std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; } } -template -void doDilate(const CmdLineType &CmdLineObj) +template< class MaskPixType, int dim > +void doDilate(const CmdLineType & CmdLineObj) { - typedef typename itk::Image MaskImType; + typedef typename itk::Image< MaskPixType, dim > MaskImType; itk::MultiThreader::SetGlobalMaximumNumberOfThreads(CmdLineObj.threads); itk::TimeProbe timer; // load - typename MaskImType::Pointer mask = readIm(CmdLineObj.InputIm); + typename MaskImType::Pointer mask = readIm< MaskImType >(CmdLineObj.InputIm); // apply mask to size // Label erosion typename MaskImType::Pointer res; std::cout << "Iterations,lab_dilate_timed,radius,threads" << std::endl; - for (int r = 0; r < CmdLineObj.repetitions; r++) + for ( int r = 0; r < CmdLineObj.repetitions; r++ ) { timer.Start(); - res = multilabelDilationDanielsson(mask, CmdLineObj.radius); + res = multilabelDilationDanielsson< MaskImType >(mask, CmdLineObj.radius); timer.Stop(); } - std::cout << std::setprecision(3) << CmdLineObj.repetitions << "," << timer.GetMean() << "," << CmdLineObj.radius << ","<< CmdLineObj.threads << std::endl; - writeIm(res, CmdLineObj.OutputIm); + std::cout << std::setprecision(3) << CmdLineObj.repetitions << "," << timer.GetMean() << "," << CmdLineObj.radius + << "," << CmdLineObj.threads << std::endl; + writeIm< MaskImType >(res, CmdLineObj.OutputIm); //Erode->writeDist("/tmp/dist.mhd"); - } ///////////////////////////////// -int main(int argc, char * argv[]) +int main(int argc, char *argv[]) { - - int dim1; + int dim1; CmdLineType CmdLineObj; + ParseCmdLine(argc, argv, CmdLineObj); itk::ImageIOBase::IOComponentType ComponentType; itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - if (!readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1)) + if ( !readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1) ) { std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; - return(EXIT_FAILURE); + return ( EXIT_FAILURE ); } - switch (dim1) + switch ( dim1 ) { case 2: - doDilate(CmdLineObj); + doDilate< unsigned char, 2 >(CmdLineObj); break; case 3: - doDilate(CmdLineObj); + doDilate< unsigned char, 3 >(CmdLineObj); break; default: std::cerr << "Unsupported dimension" << std::endl; - return (EXIT_FAILURE); + return ( EXIT_FAILURE ); break; } return EXIT_SUCCESS; diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilatePerf.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilatePerf.cxx index 8390ee7b120..3ddc7fb44b8 100644 --- a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilatePerf.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilatePerf.cxx @@ -9,126 +9,123 @@ #include namespace itk { - template - class Instance : public T::Pointer { - public: - Instance() : SmartPointer( T::New() ) {} - }; +template< typename T > +class Instance:public T::Pointer +{ +public: + Instance():SmartPointer< T >( T::New() ) {} +}; } - - typedef class CmdLineType { public: std::string InputIm, OutputIm; - float radius; - int repetitions, threads; - + float radius; + int repetitions, threads; } CmdLineType; -void ParseCmdLine(int argc, char* argv[], - CmdLineType &CmdLineObj +void ParseCmdLine(int argc, char *argv[], + CmdLineType & CmdLineObj ) { using namespace TCLAP; try - { - // Define the command line object. - CmdLine cmd("varSize ", ' ', "0.9"); + { + // Define the command line object. + CmdLine cmd("varSize ", ' ', "0.9"); - ValueArg inArg("i","input","input image (label mask)",true,"result","string"); - cmd.add( inArg ); + ValueArg< std::string > inArg("i", "input", "input image (label mask)", true, "result", "string"); + cmd.add(inArg); - ValueArg outArg("o","output","output image", true,"","string"); - cmd.add( outArg ); + ValueArg< std::string > outArg("o", "output", "output image", true, "", "string"); + cmd.add(outArg); - ValueArg radArg("r","radius","erosion radius", true, -1.0,"float"); - cmd.add( radArg ); + ValueArg< float > radArg("r", "radius", "erosion radius", true, -1.0, "float"); + cmd.add(radArg); - ValueArg threadArg("", "threads", "number of threads", false, 1, "integer"); - cmd.add(threadArg); + ValueArg< int > threadArg("", "threads", "number of threads", false, 1, "integer"); + cmd.add(threadArg); - ValueArg repArg("", "repetitions", "number of repeats", false, 1, "integer"); - cmd.add(repArg); + ValueArg< int > repArg("", "repetitions", "number of repeats", false, 1, "integer"); + cmd.add(repArg); - // Parse the args. - cmd.parse( argc, argv ); + // Parse the args. + cmd.parse(argc, argv); - CmdLineObj.InputIm = inArg.getValue(); - CmdLineObj.OutputIm = outArg.getValue(); - CmdLineObj.radius = radArg.getValue(); - CmdLineObj.threads = threadArg.getValue(); - CmdLineObj.repetitions = repArg.getValue(); - - } - catch (ArgException &e) // catch any exceptions + CmdLineObj.InputIm = inArg.getValue(); + CmdLineObj.OutputIm = outArg.getValue(); + CmdLineObj.radius = radArg.getValue(); + CmdLineObj.threads = threadArg.getValue(); + CmdLineObj.repetitions = repArg.getValue(); + } + catch ( ArgException & e ) // catch any exceptions { std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; } } -template -void doDilate(const CmdLineType &CmdLineObj) +template< class MaskPixType, int dim > +void doDilate(const CmdLineType & CmdLineObj) { - typedef typename itk::Image MaskImType; + typedef typename itk::Image< MaskPixType, dim > MaskImType; itk::MultiThreader::SetGlobalMaximumNumberOfThreads(CmdLineObj.threads); itk::TimeProbe timer; // load - typename MaskImType::Pointer mask = readIm(CmdLineObj.InputIm); + typename MaskImType::Pointer mask = readIm< MaskImType >(CmdLineObj.InputIm); // apply mask to size // Label erosion - itk::Instance< itk::LabelSetDilateImageFilter > Dilate; + itk::Instance< itk::LabelSetDilateImageFilter< MaskImType, MaskImType > > Dilate; Dilate->SetInput(mask); Dilate->SetRadius(CmdLineObj.radius); Dilate->SetUseImageSpacing(true); std::cout << "Iterations,lab_dilate_timed,radius,threads" << std::endl; - for (int r = 0; r < CmdLineObj.repetitions; r++) + for ( int r = 0; r < CmdLineObj.repetitions; r++ ) { Dilate->Modified(); timer.Start(); Dilate->Update(); timer.Stop(); } - std::cout << std::setprecision(3) << CmdLineObj.repetitions << "," << timer.GetMean() << "," << CmdLineObj.radius << ","<< CmdLineObj.threads << std::endl; - writeIm(Dilate->GetOutput(), CmdLineObj.OutputIm); + std::cout << std::setprecision(3) << CmdLineObj.repetitions << "," << timer.GetMean() << "," << CmdLineObj.radius + << "," << CmdLineObj.threads << std::endl; + writeIm< MaskImType >(Dilate->GetOutput(), CmdLineObj.OutputIm); //Erode->writeDist("/tmp/dist.mhd"); - } ///////////////////////////////// -int main(int argc, char * argv[]) +int main(int argc, char *argv[]) { - - int dim1; + int dim1; CmdLineType CmdLineObj; + ParseCmdLine(argc, argv, CmdLineObj); itk::ImageIOBase::IOComponentType ComponentType; itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - if (!readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1)) + if ( !readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1) ) { std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; - return(EXIT_FAILURE); + return ( EXIT_FAILURE ); } - switch (dim1) + switch ( dim1 ) { case 2: - doDilate(CmdLineObj); + doDilate< unsigned char, 2 >(CmdLineObj); break; case 3: - doDilate(CmdLineObj); + doDilate< unsigned char, 3 >(CmdLineObj); break; default: std::cerr << "Unsupported dimension" << std::endl; - return (EXIT_FAILURE); + return ( EXIT_FAILURE ); break; } return EXIT_SUCCESS; diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateSelected.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateSelected.cxx index ec7b3f7657f..0888110dc6e 100644 --- a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateSelected.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateSelected.cxx @@ -11,100 +11,99 @@ typedef class CmdLineType { public: - std::string InputIm, OutputIm; - std::vector Remove; - float radius; + std::string InputIm, OutputIm; + std::vector< int > Remove; + float radius; } CmdLineType; -void ParseCmdLine(int argc, char* argv[], - CmdLineType &CmdLineObj +void ParseCmdLine(int argc, char *argv[], + CmdLineType & CmdLineObj ) { using namespace TCLAP; try - { - // Define the command line object. - CmdLine cmd("labelSetsDilateSelected ", ' ', "0.9"); - - ValueArg inArg("i","input","input image (label mask)",true,"result","string"); - cmd.add( inArg ); - - ValueArg outArg("o","output","output image", true,"","string"); - cmd.add( outArg ); - - ValueArg radArg("r","radius","erosion radius", true, -1.0,"float"); - cmd.add( radArg ); - - UnlabeledMultiArg labels(std::string("labels"), - std::string("labels to be removed"), - true, std::string("integers")); - cmd.add(labels); - // Parse the args. - cmd.parse( argc, argv ); - - CmdLineObj.InputIm = inArg.getValue(); - CmdLineObj.OutputIm = outArg.getValue(); - CmdLineObj.radius = radArg.getValue(); - CmdLineObj.Remove = labels.getValue(); - } - catch (ArgException &e) // catch any exceptions + { + // Define the command line object. + CmdLine cmd("labelSetsDilateSelected ", ' ', "0.9"); + + ValueArg< std::string > inArg("i", "input", "input image (label mask)", true, "result", "string"); + cmd.add(inArg); + + ValueArg< std::string > outArg("o", "output", "output image", true, "", "string"); + cmd.add(outArg); + + ValueArg< float > radArg("r", "radius", "erosion radius", true, -1.0, "float"); + cmd.add(radArg); + + UnlabeledMultiArg< int > labels( std::string("labels"), + std::string("labels to be removed"), + true, std::string("integers") ); + cmd.add(labels); + // Parse the args. + cmd.parse(argc, argv); + + CmdLineObj.InputIm = inArg.getValue(); + CmdLineObj.OutputIm = outArg.getValue(); + CmdLineObj.radius = radArg.getValue(); + CmdLineObj.Remove = labels.getValue(); + } + catch ( ArgException & e ) // catch any exceptions { std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; } } -template -void doDilate(const CmdLineType &CmdLineObj) +template< class MaskPixType, int dim > +void doDilate(const CmdLineType & CmdLineObj) { - typedef typename itk::Image MaskImType; + typedef typename itk::Image< MaskPixType, dim > MaskImType; // load - typename MaskImType::Pointer mask = readIm(CmdLineObj.InputIm); + typename MaskImType::Pointer mask = readIm< MaskImType >(CmdLineObj.InputIm); // filter out labels to be discarded - itk::Instance< itk::ChangeLabelImageFilter< MaskImType, MaskImType> > Deleter; + itk::Instance< itk::ChangeLabelImageFilter< MaskImType, MaskImType > > Deleter; Deleter->SetInput(mask); - for (unsigned i = 0; i < CmdLineObj.Remove.size(); i++) + for ( unsigned i = 0; i < CmdLineObj.Remove.size(); i++ ) { Deleter->SetChange(CmdLineObj.Remove[i], 0); } // Label dilation - itk::Instance< itk::LabelSetDilateImageFilter > Dilate; - Dilate->SetInput(Deleter->GetOutput()); + itk::Instance< itk::LabelSetDilateImageFilter< MaskImType, MaskImType > > Dilate; + Dilate->SetInput( Deleter->GetOutput() ); Dilate->SetRadius(CmdLineObj.radius); Dilate->SetUseImageSpacing(true); - writeIm(Dilate->GetOutput(), CmdLineObj.OutputIm); - + writeIm< MaskImType >(Dilate->GetOutput(), CmdLineObj.OutputIm); } ///////////////////////////////// -int main(int argc, char * argv[]) +int main(int argc, char *argv[]) { //itk::ObjectFactoryBase::UnRegisterAllFactories(); itk::MGHImageIOFactory::RegisterOneFactory(); - itk::ObjectFactoryBase::RegisterFactory(itk::MGHImageIOFactory::New() ); + itk::ObjectFactoryBase::RegisterFactory( itk::MGHImageIOFactory::New() ); - int dim1=3; + int dim1 = 3; CmdLineType CmdLineObj; ParseCmdLine(argc, argv, CmdLineObj); itk::ImageIOBase::IOComponentType ComponentType; - if (!readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1)) + if ( !readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1) ) { std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; - return(EXIT_FAILURE); + return ( EXIT_FAILURE ); } - switch (dim1) + switch ( dim1 ) { case 2: - doDilate< int, 2>(CmdLineObj); + doDilate< int, 2 >(CmdLineObj); break; case 3: - doDilate< int, 3>(CmdLineObj); + doDilate< int, 3 >(CmdLineObj); break; default: std::cerr << "Unsupported dimension" << std::endl; - return (EXIT_FAILURE); + return ( EXIT_FAILURE ); break; } diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWS.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWS.cxx index c3bbb5f4d1e..616e6c89025 100644 --- a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWS.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWS.cxx @@ -3,94 +3,89 @@ #include "multilabelDilation.h" - - typedef class CmdLineType { public: std::string InputIm, OutputIm; - float radius; + float radius; } CmdLineType; -void ParseCmdLine(int argc, char* argv[], - CmdLineType &CmdLineObj +void ParseCmdLine(int argc, char *argv[], + CmdLineType & CmdLineObj ) { using namespace TCLAP; try - { - // Define the command line object. - CmdLine cmd("varSize ", ' ', "0.9"); + { + // Define the command line object. + CmdLine cmd("varSize ", ' ', "0.9"); - ValueArg inArg("i","input","input image (label mask)",true,"result","string"); - cmd.add( inArg ); + ValueArg< std::string > inArg("i", "input", "input image (label mask)", true, "result", "string"); + cmd.add(inArg); - ValueArg outArg("o","output","output image", true,"","string"); - cmd.add( outArg ); + ValueArg< std::string > outArg("o", "output", "output image", true, "", "string"); + cmd.add(outArg); - ValueArg radArg("r","radius","erosion radius", true, -1.0,"float"); - cmd.add( radArg ); + ValueArg< float > radArg("r", "radius", "erosion radius", true, -1.0, "float"); + cmd.add(radArg); - // Parse the args. - cmd.parse( argc, argv ); + // Parse the args. + cmd.parse(argc, argv); - CmdLineObj.InputIm = inArg.getValue(); - CmdLineObj.OutputIm = outArg.getValue(); - CmdLineObj.radius = radArg.getValue(); - } - catch (ArgException &e) // catch any exceptions + CmdLineObj.InputIm = inArg.getValue(); + CmdLineObj.OutputIm = outArg.getValue(); + CmdLineObj.radius = radArg.getValue(); + } + catch ( ArgException & e ) // catch any exceptions { std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; } } - - -template -void doDilate(const CmdLineType &CmdLineObj) +template< class MaskPixType, int dim > +void doDilate(const CmdLineType & CmdLineObj) { - typedef typename itk::Image MaskImType; + typedef typename itk::Image< MaskPixType, dim > MaskImType; // load - typename MaskImType::Pointer mask = readIm(CmdLineObj.InputIm); + typename MaskImType::Pointer mask = readIm< MaskImType >(CmdLineObj.InputIm); // apply mask to size // Label dilation - typename MaskImType::Pointer res = multilabelDilation(mask, CmdLineObj.radius); - writeIm(res, CmdLineObj.OutputIm); - + typename MaskImType::Pointer res = multilabelDilation< MaskImType >(mask, CmdLineObj.radius); + writeIm< MaskImType >(res, CmdLineObj.OutputIm); } ///////////////////////////////// -int main(int argc, char * argv[]) +int main(int argc, char *argv[]) { - - int dim1; + int dim1; CmdLineType CmdLineObj; + ParseCmdLine(argc, argv, CmdLineObj); itk::ImageIOBase::IOComponentType ComponentType; itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - if (!readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1)) + if ( !readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1) ) { std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; - return(EXIT_FAILURE); + return ( EXIT_FAILURE ); } - switch (dim1) + switch ( dim1 ) { case 2: - doDilate(CmdLineObj); + doDilate< unsigned char, 2 >(CmdLineObj); break; case 3: - doDilate(CmdLineObj); + doDilate< unsigned char, 3 >(CmdLineObj); break; default: std::cerr << "Unsupported dimension" << std::endl; - return (EXIT_FAILURE); + return ( EXIT_FAILURE ); break; } return EXIT_SUCCESS; diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWSPerf.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWSPerf.cxx index b7a6e948463..31e72153ff8 100644 --- a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWSPerf.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWSPerf.cxx @@ -4,114 +4,110 @@ #include "multilabelDilation.h" #include "itkTimeProbe.h" - - typedef class CmdLineType { public: std::string InputIm, OutputIm; - float radius; - int repetitions, threads; - + float radius; + int repetitions, threads; } CmdLineType; -void ParseCmdLine(int argc, char* argv[], - CmdLineType &CmdLineObj +void ParseCmdLine(int argc, char *argv[], + CmdLineType & CmdLineObj ) { using namespace TCLAP; try - { - // Define the command line object. - CmdLine cmd("varSize ", ' ', "0.9"); - - ValueArg inArg("i","input","input image (label mask)",true,"result","string"); - cmd.add( inArg ); + { + // Define the command line object. + CmdLine cmd("varSize ", ' ', "0.9"); - ValueArg outArg("o","output","output image", true,"","string"); - cmd.add( outArg ); + ValueArg< std::string > inArg("i", "input", "input image (label mask)", true, "result", "string"); + cmd.add(inArg); - ValueArg radArg("r","radius","erosion radius", true, -1.0,"float"); - cmd.add( radArg ); + ValueArg< std::string > outArg("o", "output", "output image", true, "", "string"); + cmd.add(outArg); - ValueArg threadArg("", "threads", "number of threads", false, 1, "integer"); - cmd.add(threadArg); + ValueArg< float > radArg("r", "radius", "erosion radius", true, -1.0, "float"); + cmd.add(radArg); - ValueArg repArg("", "repetitions", "number of repeats", false, 1, "integer"); - cmd.add(repArg); + ValueArg< int > threadArg("", "threads", "number of threads", false, 1, "integer"); + cmd.add(threadArg); - // Parse the args. - cmd.parse( argc, argv ); + ValueArg< int > repArg("", "repetitions", "number of repeats", false, 1, "integer"); + cmd.add(repArg); - CmdLineObj.InputIm = inArg.getValue(); - CmdLineObj.OutputIm = outArg.getValue(); - CmdLineObj.radius = radArg.getValue(); - CmdLineObj.threads = threadArg.getValue(); - CmdLineObj.repetitions = repArg.getValue(); + // Parse the args. + cmd.parse(argc, argv); - } - catch (ArgException &e) // catch any exceptions + CmdLineObj.InputIm = inArg.getValue(); + CmdLineObj.OutputIm = outArg.getValue(); + CmdLineObj.radius = radArg.getValue(); + CmdLineObj.threads = threadArg.getValue(); + CmdLineObj.repetitions = repArg.getValue(); + } + catch ( ArgException & e ) // catch any exceptions { std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; } } -template -void doDilate(const CmdLineType &CmdLineObj) +template< class MaskPixType, int dim > +void doDilate(const CmdLineType & CmdLineObj) { - typedef typename itk::Image MaskImType; + typedef typename itk::Image< MaskPixType, dim > MaskImType; itk::MultiThreader::SetGlobalMaximumNumberOfThreads(CmdLineObj.threads); itk::TimeProbe timer; // load - typename MaskImType::Pointer mask = readIm(CmdLineObj.InputIm); + typename MaskImType::Pointer mask = readIm< MaskImType >(CmdLineObj.InputIm); // apply mask to size // Label erosion typename MaskImType::Pointer res; std::cout << "Iterations,lab_dilate_timed,radius,threads" << std::endl; - for (int r = 0; r < CmdLineObj.repetitions; r++) + for ( int r = 0; r < CmdLineObj.repetitions; r++ ) { timer.Start(); - res = multilabelDilation(mask, CmdLineObj.radius); + res = multilabelDilation< MaskImType >(mask, CmdLineObj.radius); timer.Stop(); } - std::cout << std::setprecision(3) << CmdLineObj.repetitions << "," << timer.GetMean() << "," << CmdLineObj.radius << ","<< CmdLineObj.threads << std::endl; - writeIm(res, CmdLineObj.OutputIm); + std::cout << std::setprecision(3) << CmdLineObj.repetitions << "," << timer.GetMean() << "," << CmdLineObj.radius + << "," << CmdLineObj.threads << std::endl; + writeIm< MaskImType >(res, CmdLineObj.OutputIm); //Erode->writeDist("/tmp/dist.mhd"); - } ///////////////////////////////// -int main(int argc, char * argv[]) +int main(int argc, char *argv[]) { - - int dim1; + int dim1; CmdLineType CmdLineObj; + ParseCmdLine(argc, argv, CmdLineObj); itk::ImageIOBase::IOComponentType ComponentType; itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - if (!readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1)) + if ( !readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1) ) { std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; - return(EXIT_FAILURE); + return ( EXIT_FAILURE ); } - switch (dim1) + switch ( dim1 ) { case 2: - doDilate(CmdLineObj); + doDilate< unsigned char, 2 >(CmdLineObj); break; case 3: - doDilate(CmdLineObj); + doDilate< unsigned char, 3 >(CmdLineObj); break; default: std::cerr << "Unsupported dimension" << std::endl; - return (EXIT_FAILURE); + return ( EXIT_FAILURE ); break; } return EXIT_SUCCESS; diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsErode.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsErode.cxx index f5f36703d3a..c9c809548a6 100644 --- a/Modules/Filtering/LabelErodeDilate/test/labelSetsErode.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/labelSetsErode.cxx @@ -8,103 +8,101 @@ #include namespace itk { - template - class Instance : public T::Pointer { - public: - Instance() : SmartPointer( T::New() ) {} - }; +template< typename T > +class Instance:public T::Pointer +{ +public: + Instance():SmartPointer< T >( T::New() ) {} +}; } - - typedef class CmdLineType { public: std::string InputIm, OutputIm; - float radius; + float radius; } CmdLineType; -void ParseCmdLine(int argc, char* argv[], - CmdLineType &CmdLineObj +void ParseCmdLine(int argc, char *argv[], + CmdLineType & CmdLineObj ) { using namespace TCLAP; try - { - // Define the command line object. - CmdLine cmd("varSize ", ' ', "0.9"); + { + // Define the command line object. + CmdLine cmd("varSize ", ' ', "0.9"); - ValueArg inArg("i","input","input image (label mask)",true,"result","string"); - cmd.add( inArg ); + ValueArg< std::string > inArg("i", "input", "input image (label mask)", true, "result", "string"); + cmd.add(inArg); - ValueArg outArg("o","output","output image", true,"","string"); - cmd.add( outArg ); + ValueArg< std::string > outArg("o", "output", "output image", true, "", "string"); + cmd.add(outArg); - ValueArg radArg("r","radius","erosion radius", true, -1.0,"float"); - cmd.add( radArg ); + ValueArg< float > radArg("r", "radius", "erosion radius", true, -1.0, "float"); + cmd.add(radArg); - // Parse the args. - cmd.parse( argc, argv ); + // Parse the args. + cmd.parse(argc, argv); - CmdLineObj.InputIm = inArg.getValue(); - CmdLineObj.OutputIm = outArg.getValue(); - CmdLineObj.radius = radArg.getValue(); - } - catch (ArgException &e) // catch any exceptions + CmdLineObj.InputIm = inArg.getValue(); + CmdLineObj.OutputIm = outArg.getValue(); + CmdLineObj.radius = radArg.getValue(); + } + catch ( ArgException & e ) // catch any exceptions { std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; } } -template -void doErode(const CmdLineType &CmdLineObj) +template< class MaskPixType, int dim > +void doErode(const CmdLineType & CmdLineObj) { - typedef typename itk::Image MaskImType; + typedef typename itk::Image< MaskPixType, dim > MaskImType; // load - typename MaskImType::Pointer mask = readIm(CmdLineObj.InputIm); + typename MaskImType::Pointer mask = readIm< MaskImType >(CmdLineObj.InputIm); // apply mask to size // Label erosion - itk::Instance< itk::LabelSetErodeImageFilter > Erode; + itk::Instance< itk::LabelSetErodeImageFilter< MaskImType, MaskImType > > Erode; Erode->SetInput(mask); Erode->SetRadius(CmdLineObj.radius); - writeIm(Erode->GetOutput(), CmdLineObj.OutputIm); + writeIm< MaskImType >(Erode->GetOutput(), CmdLineObj.OutputIm); //Erode->writeDist("/tmp/dist.mhd"); - } ///////////////////////////////// -int main(int argc, char * argv[]) +int main(int argc, char *argv[]) { - - int dim1; + int dim1; CmdLineType CmdLineObj; + ParseCmdLine(argc, argv, CmdLineObj); itk::ImageIOBase::IOComponentType ComponentType; itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - if (!readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1)) + if ( !readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1) ) { std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; - return(EXIT_FAILURE); + return ( EXIT_FAILURE ); } - switch (dim1) + switch ( dim1 ) { case 2: - doErode(CmdLineObj); + doErode< unsigned char, 2 >(CmdLineObj); break; case 3: - doErode(CmdLineObj); + doErode< unsigned char, 3 >(CmdLineObj); break; default: std::cerr << "Unsupported dimension" << std::endl; - return (EXIT_FAILURE); + return ( EXIT_FAILURE ); break; } return EXIT_SUCCESS; diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsPerf.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsPerf.cxx index d50238fb91b..e06b03c0c9f 100644 --- a/Modules/Filtering/LabelErodeDilate/test/labelSetsPerf.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/labelSetsPerf.cxx @@ -9,125 +9,122 @@ #include namespace itk { - template - class Instance : public T::Pointer { - public: - Instance() : SmartPointer( T::New() ) {} - }; +template< typename T > +class Instance:public T::Pointer +{ +public: + Instance():SmartPointer< T >( T::New() ) {} +}; } - - typedef class CmdLineType { public: std::string InputIm, OutputIm; - float radius; - int repetitions, threads; - + float radius; + int repetitions, threads; } CmdLineType; -void ParseCmdLine(int argc, char* argv[], - CmdLineType &CmdLineObj +void ParseCmdLine(int argc, char *argv[], + CmdLineType & CmdLineObj ) { using namespace TCLAP; try - { - // Define the command line object. - CmdLine cmd("labelSetsPerf ", ' ', "0.9"); + { + // Define the command line object. + CmdLine cmd("labelSetsPerf ", ' ', "0.9"); - ValueArg inArg("i","input","input image (label mask)",true,"result","string"); - cmd.add( inArg ); + ValueArg< std::string > inArg("i", "input", "input image (label mask)", true, "result", "string"); + cmd.add(inArg); - ValueArg outArg("o","output","output image", true,"","string"); - cmd.add( outArg ); + ValueArg< std::string > outArg("o", "output", "output image", true, "", "string"); + cmd.add(outArg); - ValueArg radArg("r","radius","erosion radius", true, -1.0,"float"); - cmd.add( radArg ); + ValueArg< float > radArg("r", "radius", "erosion radius", true, -1.0, "float"); + cmd.add(radArg); - ValueArg threadArg("", "threads", "number of threads", false, 1, "integer"); - cmd.add(threadArg); + ValueArg< int > threadArg("", "threads", "number of threads", false, 1, "integer"); + cmd.add(threadArg); - ValueArg repArg("", "repetitions", "number of repeats", false, 1, "integer"); - cmd.add(repArg); + ValueArg< int > repArg("", "repetitions", "number of repeats", false, 1, "integer"); + cmd.add(repArg); - // Parse the args. - cmd.parse( argc, argv ); + // Parse the args. + cmd.parse(argc, argv); - CmdLineObj.InputIm = inArg.getValue(); - CmdLineObj.OutputIm = outArg.getValue(); - CmdLineObj.radius = radArg.getValue(); - CmdLineObj.threads = threadArg.getValue(); - CmdLineObj.repetitions = repArg.getValue(); - - } - catch (ArgException &e) // catch any exceptions + CmdLineObj.InputIm = inArg.getValue(); + CmdLineObj.OutputIm = outArg.getValue(); + CmdLineObj.radius = radArg.getValue(); + CmdLineObj.threads = threadArg.getValue(); + CmdLineObj.repetitions = repArg.getValue(); + } + catch ( ArgException & e ) // catch any exceptions { std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; } } -template -void doErode(const CmdLineType &CmdLineObj) +template< class MaskPixType, int dim > +void doErode(const CmdLineType & CmdLineObj) { - typedef typename itk::Image MaskImType; + typedef typename itk::Image< MaskPixType, dim > MaskImType; itk::MultiThreader::SetGlobalMaximumNumberOfThreads(CmdLineObj.threads); itk::TimeProbe timer; // load - typename MaskImType::Pointer mask = readIm(CmdLineObj.InputIm); + typename MaskImType::Pointer mask = readIm< MaskImType >(CmdLineObj.InputIm); // apply mask to size // Label erosion - itk::Instance< itk::LabelSetErodeImageFilter > Erode; + itk::Instance< itk::LabelSetErodeImageFilter< MaskImType, MaskImType > > Erode; Erode->SetInput(mask); Erode->SetRadius(CmdLineObj.radius); std::cout << "Iterations,label_erode_time,threads" << std::endl; - for (int r = 0; r < CmdLineObj.repetitions; r++) + for ( int r = 0; r < CmdLineObj.repetitions; r++ ) { Erode->Modified(); timer.Start(); Erode->Update(); timer.Stop(); } - std::cout << std::setprecision(3) << CmdLineObj.repetitions << "," << timer.GetMean() << "," << CmdLineObj.threads << std::endl; + std::cout << std::setprecision(3) << CmdLineObj.repetitions << "," << timer.GetMean() << "," << CmdLineObj.threads + << std::endl; - writeIm(Erode->GetOutput(), CmdLineObj.OutputIm); + writeIm< MaskImType >(Erode->GetOutput(), CmdLineObj.OutputIm); //Erode->writeDist("/tmp/dist.mhd"); - } ///////////////////////////////// -int main(int argc, char * argv[]) +int main(int argc, char *argv[]) { - - int dim1; + int dim1; CmdLineType CmdLineObj; + ParseCmdLine(argc, argv, CmdLineObj); itk::ImageIOBase::IOComponentType ComponentType; - if (!readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1)) + if ( !readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1) ) { std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; - return(EXIT_FAILURE); + return ( EXIT_FAILURE ); } - switch (dim1) + switch ( dim1 ) { case 2: - doErode(CmdLineObj); + doErode< unsigned char, 2 >(CmdLineObj); break; case 3: - doErode(CmdLineObj); + doErode< unsigned char, 3 >(CmdLineObj); break; default: std::cerr << "Unsupported dimension" << std::endl; - return (EXIT_FAILURE); + return ( EXIT_FAILURE ); break; } return EXIT_SUCCESS; diff --git a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx index 26a904dc58c..ddaf05d8de8 100644 --- a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx @@ -2,19 +2,22 @@ #define _read_info_cxx ///////////////////////////////// -static int readImageInfo(char * filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim) +static int readImageInfo(char *filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim) { itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(filename, itk::ImageIOFactory::ReadMode); - if (imageIO.IsNull()) - return 0; + if ( imageIO.IsNull() ) + { + return 0; + } imageIO->SetFileName(filename); imageIO->ReadImageInformation(); *ComponentType = imageIO->GetComponentType(); *dim = imageIO->GetNumberOfDimensions(); - return(1); + return ( 1 ); } + ///////////////////////////////// #endif diff --git a/Modules/Filtering/LabelErodeDilate/test/read_info.h b/Modules/Filtering/LabelErodeDilate/test/read_info.h index c3ccbb309f0..af43d3c4753 100644 --- a/Modules/Filtering/LabelErodeDilate/test/read_info.h +++ b/Modules/Filtering/LabelErodeDilate/test/read_info.h @@ -3,6 +3,7 @@ ///////////////////////////////// #include "itkImageFileReader.h" -int readImageInfo(char* filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim); +int readImageInfo(char *filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim); + ///////////////////////////////// #endif diff --git a/Modules/Filtering/LabelErodeDilate/test/reportNonZero.cxx b/Modules/Filtering/LabelErodeDilate/test/reportNonZero.cxx index 6dbaa64524e..31075e1dd0e 100644 --- a/Modules/Filtering/LabelErodeDilate/test/reportNonZero.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/reportNonZero.cxx @@ -8,92 +8,92 @@ #include "itkImageRegionIterator.h" - typedef class CmdLineType { public: std::string InputIm; } CmdLineType; -void ParseCmdLine(int argc, char* argv[], - CmdLineType &CmdLineObj +void ParseCmdLine(int argc, char *argv[], + CmdLineType & CmdLineObj ) { using namespace TCLAP; try - { - // Define the command line object. - CmdLine cmd("varSize ", ' ', "0.9"); + { + // Define the command line object. + CmdLine cmd("varSize ", ' ', "0.9"); - ValueArg inArg("i","input","input image (label mask)",true,"result","string"); - cmd.add( inArg ); + ValueArg< std::string > inArg("i", "input", "input image (label mask)", true, "result", "string"); + cmd.add(inArg); - // Parse the args. - cmd.parse( argc, argv ); + // Parse the args. + cmd.parse(argc, argv); - CmdLineObj.InputIm = inArg.getValue(); - } - catch (ArgException &e) // catch any exceptions + CmdLineObj.InputIm = inArg.getValue(); + } + catch ( ArgException & e ) // catch any exceptions { std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; } } -template < class PixType, int dim> -void doSearch(const CmdLineType &CmdLineObj) +template< class PixType, int dim > +void doSearch(const CmdLineType & CmdLineObj) { - typedef typename itk::Image MaskImType; + typedef typename itk::Image< PixType, dim > MaskImType; // load - typename MaskImType::Pointer mask = readIm(CmdLineObj.InputIm); - typedef typename itk::ImageRegionIterator IterType; + typename MaskImType::Pointer mask = readIm< MaskImType >(CmdLineObj.InputIm); + typedef typename itk::ImageRegionIterator< MaskImType > IterType; - IterType iter(mask, mask->GetLargestPossibleRegion()); + IterType iter( mask, mask->GetLargestPossibleRegion() ); - for (iter.GoToBegin(); !iter.IsAtEnd(); ++iter) + for ( iter.GoToBegin(); !iter.IsAtEnd(); ++iter ) { PixType Val = iter.Get(); - if (Val) + if ( Val ) { typename MaskImType::IndexType pos = iter.GetIndex(); typename MaskImType::PointType wc; mask->TransformIndexToPhysicalPoint(pos, wc); - std::cout << Val ; - for (unsigned i=0; i< dim; i++) + std::cout << Val; + for ( unsigned i = 0; i < dim; i++ ) + { std::cout << "," << std::setprecision(10) << wc[i]; + } std::cout << std::endl; } } - } -int main(int argc, char * argv[]) +int main(int argc, char *argv[]) { - - int dim1; + int dim1; CmdLineType CmdLineObj; + ParseCmdLine(argc, argv, CmdLineObj); itk::ImageIOBase::IOComponentType ComponentType; itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - if (!readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1)) + if ( !readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1) ) { std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; - return(EXIT_FAILURE); + return ( EXIT_FAILURE ); } - switch (dim1) + switch ( dim1 ) { case 2: - doSearch(CmdLineObj); + doSearch< int, 2 >(CmdLineObj); break; case 3: - doSearch(CmdLineObj); + doSearch< int, 3 >(CmdLineObj); break; default: std::cerr << "Unsupported dimension" << std::endl; - return (EXIT_FAILURE); + return ( EXIT_FAILURE ); break; } return EXIT_SUCCESS; From d599d69b6aa1ccfbd5806fbf6a575e7ca4efba14 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 22:27:30 +1000 Subject: [PATCH 053/113] first bit of KWStyle change --- .../LabelErodeDilate/include/itkLabelSetDilateImageFilter.h | 4 ++-- .../LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx | 4 ++-- .../LabelErodeDilate/include/itkLabelSetErodeImageFilter.h | 4 ++-- .../LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx | 4 ++-- .../include/itkLabelSetMorphBaseImageFilter.h | 4 ++-- .../include/itkLabelSetMorphBaseImageFilter.hxx | 4 ++-- Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h | 4 ++-- Modules/Filtering/LabelErodeDilate/test/read_info.cxx | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h index ba3db414652..2c1efb08e9c 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h @@ -1,5 +1,5 @@ -#ifndef __itkLabelSetDilateImageFilter_h -#define __itkLabelSetDilateImageFilter_h +#ifndef itkLabelSetDilateImageFilter_h +#define itkLabelSetDilateImageFilter_h #include "itkLabelSetMorphBaseImageFilter.h" #include "itkNumericTraits.h" diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx index 5c8d621a0c3..ceab5fcec10 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx @@ -1,5 +1,5 @@ -#ifndef __itkLabelSetDilateImageFilter_hxx -#define __itkLabelSetDilateImageFilter_hxx +#ifndef itkLabelSetDilateImageFilter_hxx +#define itkLabelSetDilateImageFilter_hxx #include "itkLabelSetDilateImageFilter.h" #include "itkImageRegionConstIterator.h" diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h index 3548dc83ea8..f18077db485 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h @@ -1,5 +1,5 @@ -#ifndef __itkLabelSetErodeImageFilter_h -#define __itkLabelSetErodeImageFilter_h +#ifndef itkLabelSetErodeImageFilter_h +#define itkLabelSetErodeImageFilter_h #include "itkLabelSetMorphBaseImageFilter.h" #include "itkNumericTraits.h" diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx index bc38c7e777c..dab50f2b06a 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx @@ -1,5 +1,5 @@ -#ifndef __itkLabelSetErodeImageFilter_hxx -#define __itkLabelSetErodeImageFilter_hxx +#ifndef itkLabelSetErodeImageFilter_hxx +#define itkLabelSetErodeImageFilter_hxx #include "itkLabelSetErodeImageFilter.h" #include "itkImageRegionConstIterator.h" diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index ba46b24db5d..23b42bf4988 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -1,5 +1,5 @@ -#ifndef __itkLabelSetMorphBaseImageFilter_h -#define __itkLabelSetMorphBaseImageFilter_h +#ifndef itkLabelSetMorphBaseImageFilter_h +#define itkLabelSetMorphBaseImageFilter_h #include "itkNumericTraits.h" #include "itkImageToImageFilter.h" diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index 67a4de8df2c..fddd914e586 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -1,5 +1,5 @@ -#ifndef __itkLabelSetMorphBaseImageFilter_hxx -#define __itkLabelSetMorphBaseImageFilter_hxx +#ifndef itkLabelSetMorphBaseImageFilter_hxx +#define itkLabelSetMorphBaseImageFilter_hxx #include "itkLabelSetMorphBaseImageFilter.h" #include "itkImageRegionConstIterator.h" diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index db1429c51b3..643eab221d1 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -1,5 +1,5 @@ -#ifndef __itkLabelSetUtils_h -#define __itkLabelSetUtils_h +#ifndef itkLabelSetUtils_h +#define itkLabelSetUtils_h #include diff --git a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx index ddaf05d8de8..fb678cb5eaa 100644 --- a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx @@ -1,5 +1,5 @@ -#ifndef _read_info_cxx -#define _read_info_cxx +#ifndef read_info_cxx +#define read_info_cxx ///////////////////////////////// static int readImageInfo(char *filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim) From 3813c9066bc8630467f76c2a05ffc434df02115d Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 22:30:14 +1000 Subject: [PATCH 054/113] added ingroup --- .../LabelErodeDilate/include/itkLabelSetDilateImageFilter.h | 2 ++ .../LabelErodeDilate/include/itkLabelSetErodeImageFilter.h | 2 ++ .../LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h | 2 ++ 3 files changed, 6 insertions(+) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h index 2c1efb08e9c..9a9837f619e 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h @@ -14,6 +14,8 @@ namespace itk * * \sa itkLabelSetDilateErodeImageFilter * + * \ingroup LabelErodeDilate + * * \author Richard Beare, Department of Medicine, Monash University, * Australia. **/ diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h index f18077db485..c7ec55cc684 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h @@ -16,6 +16,8 @@ namespace itk * * \sa itkLabelSetDilateImageFilter * + * \ingroup LabelErodeDilate + * * \author Richard Beare, Department of Medicine, Monash University, * Australia. **/ diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index 23b42bf4988..c0ebd61f32d 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -20,6 +20,8 @@ typedef unsigned int RegionIndexType; * * \sa itkLabelSetDilateImageFilter itkLabelSetErodeImageFilter * + * \ingroup LabelErodeDilate + * * \author Richard Beare, Department of Medicine, Monash University, * Australia. **/ From 70cfbdac6aa05e44e9520d5233e1e2c6799421e2 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 22:36:32 +1000 Subject: [PATCH 055/113] licenses --- .../include/itkLabelSetDilateImageFilter.h | 17 +++++++++++++++++ .../include/itkLabelSetDilateImageFilter.hxx | 17 +++++++++++++++++ .../include/itkLabelSetErodeImageFilter.h | 17 +++++++++++++++++ .../include/itkLabelSetErodeImageFilter.hxx | 17 +++++++++++++++++ .../include/itkLabelSetMorphBaseImageFilter.h | 19 +++++++++++++++++++ .../itkLabelSetMorphBaseImageFilter.hxx | 17 +++++++++++++++++ .../include/itkLabelSetUtils.h | 17 +++++++++++++++++ 7 files changed, 121 insertions(+) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h index 9a9837f619e..e65aed5a2ba 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h @@ -1,3 +1,20 @@ +/*========================================================================= + * + * Copyright Insight Software Consortium + * + * 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. + * + *=========================================================================*/ #ifndef itkLabelSetDilateImageFilter_h #define itkLabelSetDilateImageFilter_h diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx index ceab5fcec10..43a9e0e7d68 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx @@ -1,3 +1,20 @@ +/*========================================================================= + * + * Copyright Insight Software Consortium + * + * 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. + * + *=========================================================================*/ #ifndef itkLabelSetDilateImageFilter_hxx #define itkLabelSetDilateImageFilter_hxx diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h index c7ec55cc684..fedbb464376 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h @@ -1,3 +1,20 @@ +/*========================================================================= + * + * Copyright Insight Software Consortium + * + * 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. + * + *=========================================================================*/ #ifndef itkLabelSetErodeImageFilter_h #define itkLabelSetErodeImageFilter_h diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx index dab50f2b06a..fc12dad9b9d 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx @@ -1,3 +1,20 @@ +/*========================================================================= + * + * Copyright Insight Software Consortium + * + * 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. + * + *=========================================================================*/ #ifndef itkLabelSetErodeImageFilter_hxx #define itkLabelSetErodeImageFilter_hxx diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index c0ebd61f32d..5db5424f8ec 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -1,3 +1,20 @@ +/*========================================================================= + * + * Copyright Insight Software Consortium + * + * 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. + * + *=========================================================================*/ #ifndef itkLabelSetMorphBaseImageFilter_h #define itkLabelSetMorphBaseImageFilter_h @@ -118,9 +135,11 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter: typename TInputImage::PixelType m_Extreme; typename DistanceImageType::Pointer m_DistanceImage; + int m_MagnitudeSign; int m_CurrentDimension; bool m_FirstPassDone; + // this is the first non-zero entry in the radius. Needed to // support elliptical operations RealType m_BaseSigma; diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index fddd914e586..3e6f794284f 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -1,3 +1,20 @@ +/*========================================================================= + * + * Copyright Insight Software Consortium + * + * 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. + * + *=========================================================================*/ #ifndef itkLabelSetMorphBaseImageFilter_hxx #define itkLabelSetMorphBaseImageFilter_hxx diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index 643eab221d1..f6376ddb732 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -1,3 +1,20 @@ +/*========================================================================= + * + * Copyright Insight Software Consortium + * + * 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. + * + *=========================================================================*/ #ifndef itkLabelSetUtils_h #define itkLabelSetUtils_h From 7a8327a3bf80ce43acebdbb5c2764f84a9b4cc30 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 15 May 2015 22:39:18 +1000 Subject: [PATCH 056/113] more licenses --- .../test/itkLabelSetDilateTest.cxx | 17 +++++++++++++++++ .../test/itkLabelSetErodeTest.cxx | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index 3066b28a14a..a48dbb0d738 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -1,3 +1,20 @@ +/*========================================================================= + * + * Copyright Insight Software Consortium + * + * 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. + * + *=========================================================================*/ #include #include "itkImageFileReader.h" #include "itkImageFileWriter.h" diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx index 3f7e29e4708..abd1e72e916 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx @@ -1,3 +1,20 @@ +/*========================================================================= + * + * Copyright Insight Software Consortium + * + * 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. + * + *=========================================================================*/ #include #include "itkImageFileReader.h" #include "itkImageFileWriter.h" From 4524131bbd4b4fd8b0ad128b200398a06b011732 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Mon, 18 May 2015 18:30:04 +1000 Subject: [PATCH 057/113] moved old tests, uncrustified --- .../LabelErodeDilate/include/itkinstance.h | 22 ++- .../test/labelDilateLoopTest.cxx | 109 --------------- .../test/labelSetsDilateDanielsson.cxx | 92 ------------ .../test/labelSetsDilateDanielssonPerf.cxx | 114 --------------- .../test/labelSetsDilatePerf.cxx | 132 ------------------ .../test/labelSetsDilateSelected.cxx | 111 --------------- .../test/labelSetsDilateWS.cxx | 92 ------------ .../test/labelSetsDilateWSPerf.cxx | 114 --------------- .../LabelErodeDilate/test/labelSetsErode.cxx | 109 --------------- .../LabelErodeDilate/test/labelSetsPerf.cxx | 131 ----------------- .../LabelErodeDilate/test/read_info.h | 9 -- .../LabelErodeDilate/test/reportNonZero.cxx | 100 ------------- 12 files changed, 20 insertions(+), 1115 deletions(-) delete mode 100644 Modules/Filtering/LabelErodeDilate/test/labelDilateLoopTest.cxx delete mode 100644 Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielsson.cxx delete mode 100644 Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielssonPerf.cxx delete mode 100644 Modules/Filtering/LabelErodeDilate/test/labelSetsDilatePerf.cxx delete mode 100644 Modules/Filtering/LabelErodeDilate/test/labelSetsDilateSelected.cxx delete mode 100644 Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWS.cxx delete mode 100644 Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWSPerf.cxx delete mode 100644 Modules/Filtering/LabelErodeDilate/test/labelSetsErode.cxx delete mode 100644 Modules/Filtering/LabelErodeDilate/test/labelSetsPerf.cxx delete mode 100644 Modules/Filtering/LabelErodeDilate/test/read_info.h delete mode 100644 Modules/Filtering/LabelErodeDilate/test/reportNonZero.cxx diff --git a/Modules/Filtering/LabelErodeDilate/include/itkinstance.h b/Modules/Filtering/LabelErodeDilate/include/itkinstance.h index dd4b8cd13ee..c5fd460ecb7 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkinstance.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkinstance.h @@ -1,5 +1,23 @@ -#ifndef __AIDANS_INSTANCE_ -#define __AIDANS_INSTANCE_ +/*========================================================================= + * + * Copyright Insight Software Consortium + * + * 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. + * + *=========================================================================*/ + +#ifndef _itkinstance_h +#define _itkinstance_h // Aidan's trick #include namespace itk diff --git a/Modules/Filtering/LabelErodeDilate/test/labelDilateLoopTest.cxx b/Modules/Filtering/LabelErodeDilate/test/labelDilateLoopTest.cxx deleted file mode 100644 index 8d354191526..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/labelDilateLoopTest.cxx +++ /dev/null @@ -1,109 +0,0 @@ -#include "tclap/CmdLine.h" -#include "ioutils.h" - -#include -#include "itkLabelSetDilateImageFilter.h" -#include "itkinstance.h" - -typedef class CmdLineType -{ -public: - std::string InputIm, OutputIm; - float radius; - int iterations; -} CmdLineType; - -void ParseCmdLine(int argc, char *argv[], - CmdLineType & CmdLineObj - ) -{ - using namespace TCLAP; - try - { - // Define the command line object. - CmdLine cmd("varSize ", ' ', "0.9"); - - ValueArg< std::string > inArg("i", "input", "input image (label mask)", true, "result", "string"); - cmd.add(inArg); - - ValueArg< std::string > outArg("o", "output", "output image", true, "", "string"); - cmd.add(outArg); - - ValueArg< float > radArg("r", "radius", "erosion radius", true, -1.0, "float"); - cmd.add(radArg); - ValueArg< int > iterArg("", "iterations", "loop iterations", false, 1, "integer"); - cmd.add(iterArg); - - // Parse the args. - cmd.parse(argc, argv); - - CmdLineObj.InputIm = inArg.getValue(); - CmdLineObj.OutputIm = outArg.getValue(); - CmdLineObj.radius = radArg.getValue(); - CmdLineObj.iterations = iterArg.getValue(); - } - catch ( ArgException & e ) // catch any exceptions - { - std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; - } -} - -template< class MaskPixType, int dim > -void doDilate(const CmdLineType & CmdLineObj) -{ - // test behaviour in a loop - typedef typename itk::Image< MaskPixType, dim > MaskImType; - - // load - typename MaskImType::Pointer mask = readIm< MaskImType >(CmdLineObj.InputIm); - - // Label dilation - itk::Instance< itk::LabelSetDilateImageFilter< MaskImType, MaskImType > > Dilate; - Dilate->SetRadius(CmdLineObj.radius); - Dilate->SetUseImageSpacing(true); - - for ( int it = 0; it < CmdLineObj.iterations; it++ ) - { - Dilate->SetInput(mask); - Dilate->Update(); - mask = Dilate->GetOutput(); - mask->DisconnectPipeline(); - } - - writeIm< MaskImType >(mask, CmdLineObj.OutputIm); - //Dilate->writeDist("/tmp/pdist.nii.gz"); -} - -///////////////////////////////// - -int main(int argc, char *argv[]) -{ - int dim1; - CmdLineType CmdLineObj; - - ParseCmdLine(argc, argv, CmdLineObj); - - itk::ImageIOBase::IOComponentType ComponentType; - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - - if ( !readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1) ) - { - std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; - return ( EXIT_FAILURE ); - } - - switch ( dim1 ) - { - case 2: - doDilate< unsigned char, 2 >(CmdLineObj); - break; - case 3: - doDilate< unsigned char, 3 >(CmdLineObj); - break; - default: - std::cerr << "Unsupported dimension" << std::endl; - return ( EXIT_FAILURE ); - break; - } - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielsson.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielsson.cxx deleted file mode 100644 index 664028cfa0f..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielsson.cxx +++ /dev/null @@ -1,92 +0,0 @@ -#include "tclap/CmdLine.h" -#include "ioutils.h" -#include "itkinstance.h" -#include "multilabelDilation.h" - -typedef class CmdLineType -{ -public: - std::string InputIm, OutputIm; - float radius; -} CmdLineType; - -void ParseCmdLine(int argc, char *argv[], - CmdLineType & CmdLineObj - ) -{ - using namespace TCLAP; - try - { - // Define the command line object. - CmdLine cmd("varSize ", ' ', "0.9"); - - ValueArg< std::string > inArg("i", "input", "input image (label mask)", true, "result", "string"); - cmd.add(inArg); - - ValueArg< std::string > outArg("o", "output", "output image", true, "", "string"); - cmd.add(outArg); - - ValueArg< float > radArg("r", "radius", "erosion radius", true, -1.0, "float"); - cmd.add(radArg); - - // Parse the args. - cmd.parse(argc, argv); - - CmdLineObj.InputIm = inArg.getValue(); - CmdLineObj.OutputIm = outArg.getValue(); - CmdLineObj.radius = radArg.getValue(); - } - catch ( ArgException & e ) // catch any exceptions - { - std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; - } -} - -template< class MaskPixType, int dim > -void doDilate(const CmdLineType & CmdLineObj) -{ - typedef typename itk::Image< MaskPixType, dim > MaskImType; - - // load - typename MaskImType::Pointer mask = readIm< MaskImType >(CmdLineObj.InputIm); - - // apply mask to size - - // Label dilation - typename MaskImType::Pointer res = multilabelDilationDanielsson< MaskImType >(mask, CmdLineObj.radius); - writeIm< MaskImType >(res, CmdLineObj.OutputIm); -} - -///////////////////////////////// - -int main(int argc, char *argv[]) -{ - int dim1; - CmdLineType CmdLineObj; - - ParseCmdLine(argc, argv, CmdLineObj); - - itk::ImageIOBase::IOComponentType ComponentType; - //itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - - if ( !readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1) ) - { - std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; - return ( EXIT_FAILURE ); - } - - switch ( dim1 ) - { - case 2: - doDilate< unsigned char, 2 >(CmdLineObj); - break; - case 3: - doDilate< unsigned char, 3 >(CmdLineObj); - break; - default: - std::cerr << "Unsupported dimension" << std::endl; - return ( EXIT_FAILURE ); - break; - } - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielssonPerf.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielssonPerf.cxx deleted file mode 100644 index 6f7e7040b92..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateDanielssonPerf.cxx +++ /dev/null @@ -1,114 +0,0 @@ -#include "tclap/CmdLine.h" -#include "ioutils.h" - -#include "multilabelDilation.h" -#include "itkTimeProbe.h" - -typedef class CmdLineType -{ -public: - std::string InputIm, OutputIm; - float radius; - int repetitions, threads; -} CmdLineType; - -void ParseCmdLine(int argc, char *argv[], - CmdLineType & CmdLineObj - ) -{ - using namespace TCLAP; - try - { - // Define the command line object. - CmdLine cmd("varSize ", ' ', "0.9"); - - ValueArg< std::string > inArg("i", "input", "input image (label mask)", true, "result", "string"); - cmd.add(inArg); - - ValueArg< std::string > outArg("o", "output", "output image", true, "", "string"); - cmd.add(outArg); - - ValueArg< float > radArg("r", "radius", "erosion radius", true, -1.0, "float"); - cmd.add(radArg); - - ValueArg< int > threadArg("", "threads", "number of threads", false, 1, "integer"); - cmd.add(threadArg); - - ValueArg< int > repArg("", "repetitions", "number of repeats", false, 1, "integer"); - cmd.add(repArg); - - // Parse the args. - cmd.parse(argc, argv); - - CmdLineObj.InputIm = inArg.getValue(); - CmdLineObj.OutputIm = outArg.getValue(); - CmdLineObj.radius = radArg.getValue(); - CmdLineObj.threads = threadArg.getValue(); - CmdLineObj.repetitions = repArg.getValue(); - } - catch ( ArgException & e ) // catch any exceptions - { - std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; - } -} - -template< class MaskPixType, int dim > -void doDilate(const CmdLineType & CmdLineObj) -{ - typedef typename itk::Image< MaskPixType, dim > MaskImType; - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(CmdLineObj.threads); - itk::TimeProbe timer; - - // load - typename MaskImType::Pointer mask = readIm< MaskImType >(CmdLineObj.InputIm); - - // apply mask to size - - // Label erosion - typename MaskImType::Pointer res; - std::cout << "Iterations,lab_dilate_timed,radius,threads" << std::endl; - for ( int r = 0; r < CmdLineObj.repetitions; r++ ) - { - timer.Start(); - res = multilabelDilationDanielsson< MaskImType >(mask, CmdLineObj.radius); - timer.Stop(); - } - std::cout << std::setprecision(3) << CmdLineObj.repetitions << "," << timer.GetMean() << "," << CmdLineObj.radius - << "," << CmdLineObj.threads << std::endl; - writeIm< MaskImType >(res, CmdLineObj.OutputIm); - //Erode->writeDist("/tmp/dist.mhd"); -} - -///////////////////////////////// - -int main(int argc, char *argv[]) -{ - int dim1; - CmdLineType CmdLineObj; - - ParseCmdLine(argc, argv, CmdLineObj); - - itk::ImageIOBase::IOComponentType ComponentType; - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - - if ( !readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1) ) - { - std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; - return ( EXIT_FAILURE ); - } - - switch ( dim1 ) - { - case 2: - doDilate< unsigned char, 2 >(CmdLineObj); - break; - case 3: - doDilate< unsigned char, 3 >(CmdLineObj); - break; - default: - std::cerr << "Unsupported dimension" << std::endl; - return ( EXIT_FAILURE ); - break; - } - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilatePerf.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilatePerf.cxx deleted file mode 100644 index 3ddc7fb44b8..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilatePerf.cxx +++ /dev/null @@ -1,132 +0,0 @@ -#include "tclap/CmdLine.h" -#include "ioutils.h" - -#include -#include "itkLabelSetDilateImageFilter.h" -#include "itkTimeProbe.h" - -// Aidan's trick -#include -namespace itk -{ -template< typename T > -class Instance:public T::Pointer -{ -public: - Instance():SmartPointer< T >( T::New() ) {} -}; -} - -typedef class CmdLineType -{ -public: - std::string InputIm, OutputIm; - float radius; - int repetitions, threads; -} CmdLineType; - -void ParseCmdLine(int argc, char *argv[], - CmdLineType & CmdLineObj - ) -{ - using namespace TCLAP; - try - { - // Define the command line object. - CmdLine cmd("varSize ", ' ', "0.9"); - - ValueArg< std::string > inArg("i", "input", "input image (label mask)", true, "result", "string"); - cmd.add(inArg); - - ValueArg< std::string > outArg("o", "output", "output image", true, "", "string"); - cmd.add(outArg); - - ValueArg< float > radArg("r", "radius", "erosion radius", true, -1.0, "float"); - cmd.add(radArg); - - ValueArg< int > threadArg("", "threads", "number of threads", false, 1, "integer"); - cmd.add(threadArg); - - ValueArg< int > repArg("", "repetitions", "number of repeats", false, 1, "integer"); - cmd.add(repArg); - - // Parse the args. - cmd.parse(argc, argv); - - CmdLineObj.InputIm = inArg.getValue(); - CmdLineObj.OutputIm = outArg.getValue(); - CmdLineObj.radius = radArg.getValue(); - CmdLineObj.threads = threadArg.getValue(); - CmdLineObj.repetitions = repArg.getValue(); - } - catch ( ArgException & e ) // catch any exceptions - { - std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; - } -} - -template< class MaskPixType, int dim > -void doDilate(const CmdLineType & CmdLineObj) -{ - typedef typename itk::Image< MaskPixType, dim > MaskImType; - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(CmdLineObj.threads); - itk::TimeProbe timer; - - // load - typename MaskImType::Pointer mask = readIm< MaskImType >(CmdLineObj.InputIm); - - // apply mask to size - - // Label erosion - itk::Instance< itk::LabelSetDilateImageFilter< MaskImType, MaskImType > > Dilate; - Dilate->SetInput(mask); - Dilate->SetRadius(CmdLineObj.radius); - Dilate->SetUseImageSpacing(true); - - std::cout << "Iterations,lab_dilate_timed,radius,threads" << std::endl; - for ( int r = 0; r < CmdLineObj.repetitions; r++ ) - { - Dilate->Modified(); - timer.Start(); - Dilate->Update(); - timer.Stop(); - } - std::cout << std::setprecision(3) << CmdLineObj.repetitions << "," << timer.GetMean() << "," << CmdLineObj.radius - << "," << CmdLineObj.threads << std::endl; - writeIm< MaskImType >(Dilate->GetOutput(), CmdLineObj.OutputIm); - //Erode->writeDist("/tmp/dist.mhd"); -} - -///////////////////////////////// - -int main(int argc, char *argv[]) -{ - int dim1; - CmdLineType CmdLineObj; - - ParseCmdLine(argc, argv, CmdLineObj); - - itk::ImageIOBase::IOComponentType ComponentType; - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - - if ( !readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1) ) - { - std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; - return ( EXIT_FAILURE ); - } - - switch ( dim1 ) - { - case 2: - doDilate< unsigned char, 2 >(CmdLineObj); - break; - case 3: - doDilate< unsigned char, 3 >(CmdLineObj); - break; - default: - std::cerr << "Unsupported dimension" << std::endl; - return ( EXIT_FAILURE ); - break; - } - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateSelected.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateSelected.cxx deleted file mode 100644 index 0888110dc6e..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateSelected.cxx +++ /dev/null @@ -1,111 +0,0 @@ -#include "tclap/CmdLine.h" -#include "ioutils.h" -#include -#include "itkMGHImageIO.h" - -#include -#include "itkLabelSetDilateImageFilter.h" -#include -#include "itkinstance.h" - -typedef class CmdLineType -{ -public: - std::string InputIm, OutputIm; - std::vector< int > Remove; - float radius; -} CmdLineType; - -void ParseCmdLine(int argc, char *argv[], - CmdLineType & CmdLineObj - ) -{ - using namespace TCLAP; - try - { - // Define the command line object. - CmdLine cmd("labelSetsDilateSelected ", ' ', "0.9"); - - ValueArg< std::string > inArg("i", "input", "input image (label mask)", true, "result", "string"); - cmd.add(inArg); - - ValueArg< std::string > outArg("o", "output", "output image", true, "", "string"); - cmd.add(outArg); - - ValueArg< float > radArg("r", "radius", "erosion radius", true, -1.0, "float"); - cmd.add(radArg); - - UnlabeledMultiArg< int > labels( std::string("labels"), - std::string("labels to be removed"), - true, std::string("integers") ); - cmd.add(labels); - // Parse the args. - cmd.parse(argc, argv); - - CmdLineObj.InputIm = inArg.getValue(); - CmdLineObj.OutputIm = outArg.getValue(); - CmdLineObj.radius = radArg.getValue(); - CmdLineObj.Remove = labels.getValue(); - } - catch ( ArgException & e ) // catch any exceptions - { - std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; - } -} - -template< class MaskPixType, int dim > -void doDilate(const CmdLineType & CmdLineObj) -{ - typedef typename itk::Image< MaskPixType, dim > MaskImType; - - // load - typename MaskImType::Pointer mask = readIm< MaskImType >(CmdLineObj.InputIm); - // filter out labels to be discarded - itk::Instance< itk::ChangeLabelImageFilter< MaskImType, MaskImType > > Deleter; - Deleter->SetInput(mask); - for ( unsigned i = 0; i < CmdLineObj.Remove.size(); i++ ) - { - Deleter->SetChange(CmdLineObj.Remove[i], 0); - } - // Label dilation - itk::Instance< itk::LabelSetDilateImageFilter< MaskImType, MaskImType > > Dilate; - Dilate->SetInput( Deleter->GetOutput() ); - Dilate->SetRadius(CmdLineObj.radius); - Dilate->SetUseImageSpacing(true); - writeIm< MaskImType >(Dilate->GetOutput(), CmdLineObj.OutputIm); -} - -///////////////////////////////// - -int main(int argc, char *argv[]) -{ - //itk::ObjectFactoryBase::UnRegisterAllFactories(); - itk::MGHImageIOFactory::RegisterOneFactory(); - itk::ObjectFactoryBase::RegisterFactory( itk::MGHImageIOFactory::New() ); - - int dim1 = 3; - CmdLineType CmdLineObj; - ParseCmdLine(argc, argv, CmdLineObj); - itk::ImageIOBase::IOComponentType ComponentType; - - if ( !readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1) ) - { - std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; - return ( EXIT_FAILURE ); - } - switch ( dim1 ) - { - case 2: - doDilate< int, 2 >(CmdLineObj); - break; - case 3: - doDilate< int, 3 >(CmdLineObj); - break; - default: - std::cerr << "Unsupported dimension" << std::endl; - return ( EXIT_FAILURE ); - break; - } - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWS.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWS.cxx deleted file mode 100644 index 616e6c89025..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWS.cxx +++ /dev/null @@ -1,92 +0,0 @@ -#include "tclap/CmdLine.h" -#include "ioutils.h" - -#include "multilabelDilation.h" - -typedef class CmdLineType -{ -public: - std::string InputIm, OutputIm; - float radius; -} CmdLineType; - -void ParseCmdLine(int argc, char *argv[], - CmdLineType & CmdLineObj - ) -{ - using namespace TCLAP; - try - { - // Define the command line object. - CmdLine cmd("varSize ", ' ', "0.9"); - - ValueArg< std::string > inArg("i", "input", "input image (label mask)", true, "result", "string"); - cmd.add(inArg); - - ValueArg< std::string > outArg("o", "output", "output image", true, "", "string"); - cmd.add(outArg); - - ValueArg< float > radArg("r", "radius", "erosion radius", true, -1.0, "float"); - cmd.add(radArg); - - // Parse the args. - cmd.parse(argc, argv); - - CmdLineObj.InputIm = inArg.getValue(); - CmdLineObj.OutputIm = outArg.getValue(); - CmdLineObj.radius = radArg.getValue(); - } - catch ( ArgException & e ) // catch any exceptions - { - std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; - } -} - -template< class MaskPixType, int dim > -void doDilate(const CmdLineType & CmdLineObj) -{ - typedef typename itk::Image< MaskPixType, dim > MaskImType; - - // load - typename MaskImType::Pointer mask = readIm< MaskImType >(CmdLineObj.InputIm); - - // apply mask to size - - // Label dilation - typename MaskImType::Pointer res = multilabelDilation< MaskImType >(mask, CmdLineObj.radius); - writeIm< MaskImType >(res, CmdLineObj.OutputIm); -} - -///////////////////////////////// - -int main(int argc, char *argv[]) -{ - int dim1; - CmdLineType CmdLineObj; - - ParseCmdLine(argc, argv, CmdLineObj); - - itk::ImageIOBase::IOComponentType ComponentType; - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - - if ( !readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1) ) - { - std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; - return ( EXIT_FAILURE ); - } - - switch ( dim1 ) - { - case 2: - doDilate< unsigned char, 2 >(CmdLineObj); - break; - case 3: - doDilate< unsigned char, 3 >(CmdLineObj); - break; - default: - std::cerr << "Unsupported dimension" << std::endl; - return ( EXIT_FAILURE ); - break; - } - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWSPerf.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWSPerf.cxx deleted file mode 100644 index 31e72153ff8..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/labelSetsDilateWSPerf.cxx +++ /dev/null @@ -1,114 +0,0 @@ -#include "tclap/CmdLine.h" -#include "ioutils.h" - -#include "multilabelDilation.h" -#include "itkTimeProbe.h" - -typedef class CmdLineType -{ -public: - std::string InputIm, OutputIm; - float radius; - int repetitions, threads; -} CmdLineType; - -void ParseCmdLine(int argc, char *argv[], - CmdLineType & CmdLineObj - ) -{ - using namespace TCLAP; - try - { - // Define the command line object. - CmdLine cmd("varSize ", ' ', "0.9"); - - ValueArg< std::string > inArg("i", "input", "input image (label mask)", true, "result", "string"); - cmd.add(inArg); - - ValueArg< std::string > outArg("o", "output", "output image", true, "", "string"); - cmd.add(outArg); - - ValueArg< float > radArg("r", "radius", "erosion radius", true, -1.0, "float"); - cmd.add(radArg); - - ValueArg< int > threadArg("", "threads", "number of threads", false, 1, "integer"); - cmd.add(threadArg); - - ValueArg< int > repArg("", "repetitions", "number of repeats", false, 1, "integer"); - cmd.add(repArg); - - // Parse the args. - cmd.parse(argc, argv); - - CmdLineObj.InputIm = inArg.getValue(); - CmdLineObj.OutputIm = outArg.getValue(); - CmdLineObj.radius = radArg.getValue(); - CmdLineObj.threads = threadArg.getValue(); - CmdLineObj.repetitions = repArg.getValue(); - } - catch ( ArgException & e ) // catch any exceptions - { - std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; - } -} - -template< class MaskPixType, int dim > -void doDilate(const CmdLineType & CmdLineObj) -{ - typedef typename itk::Image< MaskPixType, dim > MaskImType; - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(CmdLineObj.threads); - itk::TimeProbe timer; - - // load - typename MaskImType::Pointer mask = readIm< MaskImType >(CmdLineObj.InputIm); - - // apply mask to size - - // Label erosion - typename MaskImType::Pointer res; - std::cout << "Iterations,lab_dilate_timed,radius,threads" << std::endl; - for ( int r = 0; r < CmdLineObj.repetitions; r++ ) - { - timer.Start(); - res = multilabelDilation< MaskImType >(mask, CmdLineObj.radius); - timer.Stop(); - } - std::cout << std::setprecision(3) << CmdLineObj.repetitions << "," << timer.GetMean() << "," << CmdLineObj.radius - << "," << CmdLineObj.threads << std::endl; - writeIm< MaskImType >(res, CmdLineObj.OutputIm); - //Erode->writeDist("/tmp/dist.mhd"); -} - -///////////////////////////////// - -int main(int argc, char *argv[]) -{ - int dim1; - CmdLineType CmdLineObj; - - ParseCmdLine(argc, argv, CmdLineObj); - - itk::ImageIOBase::IOComponentType ComponentType; - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - - if ( !readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1) ) - { - std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; - return ( EXIT_FAILURE ); - } - - switch ( dim1 ) - { - case 2: - doDilate< unsigned char, 2 >(CmdLineObj); - break; - case 3: - doDilate< unsigned char, 3 >(CmdLineObj); - break; - default: - std::cerr << "Unsupported dimension" << std::endl; - return ( EXIT_FAILURE ); - break; - } - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsErode.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsErode.cxx deleted file mode 100644 index c9c809548a6..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/labelSetsErode.cxx +++ /dev/null @@ -1,109 +0,0 @@ -#include "tclap/CmdLine.h" -#include "ioutils.h" - -#include -#include "itkLabelSetErodeImageFilter.h" - -// Aidan's trick -#include -namespace itk -{ -template< typename T > -class Instance:public T::Pointer -{ -public: - Instance():SmartPointer< T >( T::New() ) {} -}; -} - -typedef class CmdLineType -{ -public: - std::string InputIm, OutputIm; - float radius; -} CmdLineType; - -void ParseCmdLine(int argc, char *argv[], - CmdLineType & CmdLineObj - ) -{ - using namespace TCLAP; - try - { - // Define the command line object. - CmdLine cmd("varSize ", ' ', "0.9"); - - ValueArg< std::string > inArg("i", "input", "input image (label mask)", true, "result", "string"); - cmd.add(inArg); - - ValueArg< std::string > outArg("o", "output", "output image", true, "", "string"); - cmd.add(outArg); - - ValueArg< float > radArg("r", "radius", "erosion radius", true, -1.0, "float"); - cmd.add(radArg); - - // Parse the args. - cmd.parse(argc, argv); - - CmdLineObj.InputIm = inArg.getValue(); - CmdLineObj.OutputIm = outArg.getValue(); - CmdLineObj.radius = radArg.getValue(); - } - catch ( ArgException & e ) // catch any exceptions - { - std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; - } -} - -template< class MaskPixType, int dim > -void doErode(const CmdLineType & CmdLineObj) -{ - typedef typename itk::Image< MaskPixType, dim > MaskImType; - - // load - typename MaskImType::Pointer mask = readIm< MaskImType >(CmdLineObj.InputIm); - - // apply mask to size - - // Label erosion - itk::Instance< itk::LabelSetErodeImageFilter< MaskImType, MaskImType > > Erode; - Erode->SetInput(mask); - Erode->SetRadius(CmdLineObj.radius); - - writeIm< MaskImType >(Erode->GetOutput(), CmdLineObj.OutputIm); - //Erode->writeDist("/tmp/dist.mhd"); -} - -///////////////////////////////// - -int main(int argc, char *argv[]) -{ - int dim1; - CmdLineType CmdLineObj; - - ParseCmdLine(argc, argv, CmdLineObj); - - itk::ImageIOBase::IOComponentType ComponentType; - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - - if ( !readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1) ) - { - std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; - return ( EXIT_FAILURE ); - } - - switch ( dim1 ) - { - case 2: - doErode< unsigned char, 2 >(CmdLineObj); - break; - case 3: - doErode< unsigned char, 3 >(CmdLineObj); - break; - default: - std::cerr << "Unsupported dimension" << std::endl; - return ( EXIT_FAILURE ); - break; - } - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/LabelErodeDilate/test/labelSetsPerf.cxx b/Modules/Filtering/LabelErodeDilate/test/labelSetsPerf.cxx deleted file mode 100644 index e06b03c0c9f..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/labelSetsPerf.cxx +++ /dev/null @@ -1,131 +0,0 @@ -#include "tclap/CmdLine.h" -#include "ioutils.h" - -#include -#include "itkLabelSetErodeImageFilter.h" -#include "itkTimeProbe.h" - -// Aidan's trick -#include -namespace itk -{ -template< typename T > -class Instance:public T::Pointer -{ -public: - Instance():SmartPointer< T >( T::New() ) {} -}; -} - -typedef class CmdLineType -{ -public: - std::string InputIm, OutputIm; - float radius; - int repetitions, threads; -} CmdLineType; - -void ParseCmdLine(int argc, char *argv[], - CmdLineType & CmdLineObj - ) -{ - using namespace TCLAP; - try - { - // Define the command line object. - CmdLine cmd("labelSetsPerf ", ' ', "0.9"); - - ValueArg< std::string > inArg("i", "input", "input image (label mask)", true, "result", "string"); - cmd.add(inArg); - - ValueArg< std::string > outArg("o", "output", "output image", true, "", "string"); - cmd.add(outArg); - - ValueArg< float > radArg("r", "radius", "erosion radius", true, -1.0, "float"); - cmd.add(radArg); - - ValueArg< int > threadArg("", "threads", "number of threads", false, 1, "integer"); - cmd.add(threadArg); - - ValueArg< int > repArg("", "repetitions", "number of repeats", false, 1, "integer"); - cmd.add(repArg); - - // Parse the args. - cmd.parse(argc, argv); - - CmdLineObj.InputIm = inArg.getValue(); - CmdLineObj.OutputIm = outArg.getValue(); - CmdLineObj.radius = radArg.getValue(); - CmdLineObj.threads = threadArg.getValue(); - CmdLineObj.repetitions = repArg.getValue(); - } - catch ( ArgException & e ) // catch any exceptions - { - std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; - } -} - -template< class MaskPixType, int dim > -void doErode(const CmdLineType & CmdLineObj) -{ - typedef typename itk::Image< MaskPixType, dim > MaskImType; - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(CmdLineObj.threads); - itk::TimeProbe timer; - - // load - typename MaskImType::Pointer mask = readIm< MaskImType >(CmdLineObj.InputIm); - - // apply mask to size - - // Label erosion - itk::Instance< itk::LabelSetErodeImageFilter< MaskImType, MaskImType > > Erode; - Erode->SetInput(mask); - Erode->SetRadius(CmdLineObj.radius); - - std::cout << "Iterations,label_erode_time,threads" << std::endl; - for ( int r = 0; r < CmdLineObj.repetitions; r++ ) - { - Erode->Modified(); - timer.Start(); - Erode->Update(); - timer.Stop(); - } - std::cout << std::setprecision(3) << CmdLineObj.repetitions << "," << timer.GetMean() << "," << CmdLineObj.threads - << std::endl; - - writeIm< MaskImType >(Erode->GetOutput(), CmdLineObj.OutputIm); - //Erode->writeDist("/tmp/dist.mhd"); -} - -///////////////////////////////// - -int main(int argc, char *argv[]) -{ - int dim1; - CmdLineType CmdLineObj; - - ParseCmdLine(argc, argv, CmdLineObj); - - itk::ImageIOBase::IOComponentType ComponentType; - - if ( !readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1) ) - { - std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; - return ( EXIT_FAILURE ); - } - - switch ( dim1 ) - { - case 2: - doErode< unsigned char, 2 >(CmdLineObj); - break; - case 3: - doErode< unsigned char, 3 >(CmdLineObj); - break; - default: - std::cerr << "Unsupported dimension" << std::endl; - return ( EXIT_FAILURE ); - break; - } - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/LabelErodeDilate/test/read_info.h b/Modules/Filtering/LabelErodeDilate/test/read_info.h deleted file mode 100644 index af43d3c4753..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/read_info.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _read_info_h -#define _read_info_h -///////////////////////////////// -#include "itkImageFileReader.h" - -int readImageInfo(char *filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim); - -///////////////////////////////// -#endif diff --git a/Modules/Filtering/LabelErodeDilate/test/reportNonZero.cxx b/Modules/Filtering/LabelErodeDilate/test/reportNonZero.cxx deleted file mode 100644 index 31075e1dd0e..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/reportNonZero.cxx +++ /dev/null @@ -1,100 +0,0 @@ -// tool to report the location and values of non zero voxels so we can -// check differences between versions - -#include "itkinstance.h" - -#include "tclap/CmdLine.h" -#include "ioutils.h" - -#include "itkImageRegionIterator.h" - -typedef class CmdLineType -{ -public: - std::string InputIm; -} CmdLineType; - -void ParseCmdLine(int argc, char *argv[], - CmdLineType & CmdLineObj - ) -{ - using namespace TCLAP; - try - { - // Define the command line object. - CmdLine cmd("varSize ", ' ', "0.9"); - - ValueArg< std::string > inArg("i", "input", "input image (label mask)", true, "result", "string"); - cmd.add(inArg); - - // Parse the args. - cmd.parse(argc, argv); - - CmdLineObj.InputIm = inArg.getValue(); - } - catch ( ArgException & e ) // catch any exceptions - { - std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; - } -} - -template< class PixType, int dim > -void doSearch(const CmdLineType & CmdLineObj) -{ - typedef typename itk::Image< PixType, dim > MaskImType; - - // load - typename MaskImType::Pointer mask = readIm< MaskImType >(CmdLineObj.InputIm); - typedef typename itk::ImageRegionIterator< MaskImType > IterType; - - IterType iter( mask, mask->GetLargestPossibleRegion() ); - - for ( iter.GoToBegin(); !iter.IsAtEnd(); ++iter ) - { - PixType Val = iter.Get(); - if ( Val ) - { - typename MaskImType::IndexType pos = iter.GetIndex(); - typename MaskImType::PointType wc; - mask->TransformIndexToPhysicalPoint(pos, wc); - std::cout << Val; - for ( unsigned i = 0; i < dim; i++ ) - { - std::cout << "," << std::setprecision(10) << wc[i]; - } - std::cout << std::endl; - } - } -} - -int main(int argc, char *argv[]) -{ - int dim1; - CmdLineType CmdLineObj; - - ParseCmdLine(argc, argv, CmdLineObj); - - itk::ImageIOBase::IOComponentType ComponentType; - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - - if ( !readImageInfo(CmdLineObj.InputIm, &ComponentType, &dim1) ) - { - std::cerr << "Failed to open " << CmdLineObj.InputIm << std::endl; - return ( EXIT_FAILURE ); - } - - switch ( dim1 ) - { - case 2: - doSearch< int, 2 >(CmdLineObj); - break; - case 3: - doSearch< int, 3 >(CmdLineObj); - break; - default: - std::cerr << "Unsupported dimension" << std::endl; - return ( EXIT_FAILURE ); - break; - } - return EXIT_SUCCESS; -} From 64448c08dc19ced10508d7342ca4ef738e4ed2d4 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Mon, 18 May 2015 18:36:54 +1000 Subject: [PATCH 058/113] license --- .../LabelErodeDilate/test/read_info.cxx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx index fb678cb5eaa..a53439f73da 100644 --- a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx @@ -1,3 +1,21 @@ +/*========================================================================= + * + * Copyright Insight Software Consortium + * + * 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. + * + *=========================================================================*/ + #ifndef read_info_cxx #define read_info_cxx From 29087ada093285e616e9cb9b77b0dc7bb527fbf6 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Mon, 18 May 2015 20:02:14 +1000 Subject: [PATCH 059/113] define change --- Modules/Filtering/LabelErodeDilate/include/itkinstance.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkinstance.h b/Modules/Filtering/LabelErodeDilate/include/itkinstance.h index c5fd460ecb7..8fb6bfe50fa 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkinstance.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkinstance.h @@ -16,8 +16,8 @@ * *=========================================================================*/ -#ifndef _itkinstance_h -#define _itkinstance_h +#ifndef itkinstance_h +#define itkinstance_h // Aidan's trick #include namespace itk From 749c1f1d3babb8875e7ab1467761bf77593c9ab2 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 20 May 2015 10:18:26 +1000 Subject: [PATCH 060/113] changed override to ITK_OVERRIDE --- .../include/itkLabelSetDilateImageFilter.h | 2 +- .../include/itkLabelSetErodeImageFilter.h | 2 +- .../include/itkLabelSetMorphBaseImageFilter.h | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h index e65aed5a2ba..13ebb69b877 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h @@ -81,7 +81,7 @@ class ITK_EXPORT LabelSetDilateImageFilter: LabelSetDilateImageFilter(){} virtual ~LabelSetDilateImageFilter() {} - void ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) override; + void ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) ITK_OVERRIDE; private: LabelSetDilateImageFilter(const Self &); //purposely not implemented diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h index fedbb464376..8e9e139df60 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h @@ -86,7 +86,7 @@ class ITK_EXPORT LabelSetErodeImageFilter: LabelSetErodeImageFilter(){} virtual ~LabelSetErodeImageFilter() {} - void ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) override; + void ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) ITK_OVERRIDE; // Override since the filter produces the entire dataset. private: diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index 5db5424f8ec..4421adcdf5a 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -116,18 +116,18 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter: virtual ~LabelSetMorphBaseImageFilter() {} RegionIndexType SplitRequestedRegion(RegionIndexType i, RegionIndexType num, - OutputImageRegionType & splitRegion) override; + OutputImageRegionType & splitRegion) ITK_OVERRIDE; virtual void ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, - ThreadIdType threadId) override; + ThreadIdType threadId) ITK_OVERRIDE; - void GenerateData(void) override; + void GenerateData(void) ITK_OVERRIDE; // Override since the filter produces the entire dataset. - void EnlargeOutputRequestedRegion(DataObject *output) override; + void EnlargeOutputRequestedRegion(DataObject *output) ITK_OVERRIDE; bool m_UseImageSpacing; - void PrintSelf(std::ostream & os, Indent indent) const override; + void PrintSelf(std::ostream & os, Indent indent) const ITK_OVERRIDE; RadiusType m_Radius; RadiusType m_Scale; From ce6c2de0e25e2bada7263813c90edf3aef58eb03 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Sun, 13 Mar 2016 10:17:32 -0500 Subject: [PATCH 061/113] ENH: Prefer std:: over vcl versions. The vcl_* definitions can now be greatly simplified. After removing specializations for early non-conformant c++ compilers the end result was that only the std:: version of the functions could ever be used by the compiler. --- .../include/itkLabelSetMorphBaseImageFilter.hxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index 3e6f794284f..32442e92205 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -99,9 +99,9 @@ LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > double range = static_cast< double >( requestedRegionSize[splitAxis] ); unsigned int valuesPerThread = - static_cast< unsigned int >( vcl_ceil( range / static_cast< double >( num ) ) ); + static_cast< unsigned int >( std::ceil( range / static_cast< double >( num ) ) ); unsigned int maxThreadIdUsed = - static_cast< unsigned int >( vcl_ceil( range / static_cast< double >( valuesPerThread ) ) ) - 1; + static_cast< unsigned int >( std::ceil( range / static_cast< double >( valuesPerThread ) ) ) - 1; // Split the region if ( i < maxThreadIdUsed ) From 6940db869a205a57b3ad0420788c24b4814fe779 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Sat, 16 Dec 2017 19:17:04 -0600 Subject: [PATCH 062/113] ENH: ITKv5 override consistency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Provide remove virtual and override Use clang-tidy to add ITK_OVERRIDE, and to remove redundant virtual on functions. cd ../ITK; clang-tidy -p ITK-clangtidy $find Modules/[A-J]* -name *.cxx |fgrep -v ThirdParty) -checks=-*,modernize-use-override -header-filter=.* -fix clang-tidy -p ITK-clangtidy $(find Modules/[K-Z]* -name *.cxx |fgrep -v ThirdParty) -checks=-*,modernize-use-override -header-filter=.* -fix https://stackoverflow.com/questions/39932391/virtual-override-or-both-c When you override a function you don't technically need to write either virtual or override. The original base class declaration needs the keyword virtual to mark it as virtual. In the derived class the function is virtual by way of having the ¹same type as the base class function. However, an override can help avoid bugs by producing a compilation error when the intended override isn't technically an override. E.g. that the function type isn't exactly like the base class function. Or that a maintenance of the base class changes that function's type, e.g. adding a defaulted argument. In the same way, a virtual keyword in the derived class can make such a bug more subtle, by ensuring that the function is still is virtual in further derived classes. So the general advice is, virtual for the base class function declaration. This is technically necessary. Use override (only) for a derived class' override. This helps with maintenance. --- .../LabelErodeDilate/include/itkLabelSetDilateImageFilter.h | 2 +- .../LabelErodeDilate/include/itkLabelSetErodeImageFilter.h | 2 +- .../include/itkLabelSetMorphBaseImageFilter.h | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h index 13ebb69b877..c09b34890f5 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h @@ -79,7 +79,7 @@ class ITK_EXPORT LabelSetDilateImageFilter: TInputImage::ImageDimension); protected: LabelSetDilateImageFilter(){} - virtual ~LabelSetDilateImageFilter() {} + ~LabelSetDilateImageFilter() ITK_OVERRIDE {} void ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) ITK_OVERRIDE; diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h index 8e9e139df60..150d6dd5f18 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h @@ -84,7 +84,7 @@ class ITK_EXPORT LabelSetErodeImageFilter: TInputImage::ImageDimension); protected: LabelSetErodeImageFilter(){} - virtual ~LabelSetErodeImageFilter() {} + ~LabelSetErodeImageFilter() ITK_OVERRIDE {} void ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) ITK_OVERRIDE; diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index 4421adcdf5a..db0f24ceb89 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -113,12 +113,12 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter: protected: LabelSetMorphBaseImageFilter(); - virtual ~LabelSetMorphBaseImageFilter() {} + ~LabelSetMorphBaseImageFilter() ITK_OVERRIDE {} RegionIndexType SplitRequestedRegion(RegionIndexType i, RegionIndexType num, OutputImageRegionType & splitRegion) ITK_OVERRIDE; - virtual void ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, + void ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) ITK_OVERRIDE; void GenerateData(void) ITK_OVERRIDE; From 0315748919c2cf816e7eb656d16ed7b10f1c9de2 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Sat, 16 Dec 2017 19:36:25 -0600 Subject: [PATCH 063/113] COMP: Use C++11 override directly git grep -l "ITK_OVERRIDE" | fgrep -v itk_compiler_detection.h | fgrep -v CMakeLists.txt |fgrep -v .cmake | xargs sed -i '' -e "s/ITK_OVERRIDE/override/g" --- .../include/itkLabelSetDilateImageFilter.h | 4 ++-- .../include/itkLabelSetErodeImageFilter.h | 4 ++-- .../include/itkLabelSetMorphBaseImageFilter.h | 12 ++++++------ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h index c09b34890f5..f74a47570f7 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h @@ -79,9 +79,9 @@ class ITK_EXPORT LabelSetDilateImageFilter: TInputImage::ImageDimension); protected: LabelSetDilateImageFilter(){} - ~LabelSetDilateImageFilter() ITK_OVERRIDE {} + ~LabelSetDilateImageFilter() override {} - void ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) ITK_OVERRIDE; + void ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) override; private: LabelSetDilateImageFilter(const Self &); //purposely not implemented diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h index 150d6dd5f18..e57dcaca1f0 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h @@ -84,9 +84,9 @@ class ITK_EXPORT LabelSetErodeImageFilter: TInputImage::ImageDimension); protected: LabelSetErodeImageFilter(){} - ~LabelSetErodeImageFilter() ITK_OVERRIDE {} + ~LabelSetErodeImageFilter() override {} - void ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) ITK_OVERRIDE; + void ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) override; // Override since the filter produces the entire dataset. private: diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index db0f24ceb89..36406212d8a 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -113,21 +113,21 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter: protected: LabelSetMorphBaseImageFilter(); - ~LabelSetMorphBaseImageFilter() ITK_OVERRIDE {} + ~LabelSetMorphBaseImageFilter() override {} RegionIndexType SplitRequestedRegion(RegionIndexType i, RegionIndexType num, - OutputImageRegionType & splitRegion) ITK_OVERRIDE; + OutputImageRegionType & splitRegion) override; void ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, - ThreadIdType threadId) ITK_OVERRIDE; + ThreadIdType threadId) override; - void GenerateData(void) ITK_OVERRIDE; + void GenerateData(void) override; // Override since the filter produces the entire dataset. - void EnlargeOutputRequestedRegion(DataObject *output) ITK_OVERRIDE; + void EnlargeOutputRequestedRegion(DataObject *output) override; bool m_UseImageSpacing; - void PrintSelf(std::ostream & os, Indent indent) const ITK_OVERRIDE; + void PrintSelf(std::ostream & os, Indent indent) const override; RadiusType m_Radius; RadiusType m_Scale; From bf0b0edff19e1fbe8a7a00bb7275651f2d20facc Mon Sep 17 00:00:00 2001 From: Francois Budin Date: Mon, 26 Mar 2018 11:20:04 -0400 Subject: [PATCH 064/113] BUG: Update Multithreader API calls The Multithreader API has been updated in [1] and [2]. [1] a61e48039740d872f7555e56ff1a41a12e0cb7f0 [2] 039cac087303c71bb84d5a242390a6d8435434a2 --- .../include/itkLabelSetMorphBaseImageFilter.hxx | 2 +- .../Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx | 2 +- .../Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index 32442e92205..fe573856931 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -211,7 +211,7 @@ LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > // Set up the multithreaded processing typename ImageSource< TOutputImage >::ThreadStruct str; str.Filter = this; - MultiThreader *multithreader = this->GetMultiThreader(); + ProcessObject::MultiThreaderType *multithreader = this->GetMultiThreader(); multithreader->SetNumberOfThreads(nbthreads); multithreader->SetSingleMethod(this->ThreaderCallback, &str); diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index a48dbb0d738..584cdf2eae1 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -70,7 +70,7 @@ int itkLabelSetDilateTest(int argc, char *argv[]) { int dim1; - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads(1); itk::ImageIOBase::IOComponentType ComponentType; if ( argc != 4 ) diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx index abd1e72e916..6aef46c86ef 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx @@ -71,7 +71,7 @@ int itkLabelSetErodeTest(int argc, char *argv[]) { int dim1; - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads(1); itk::ImageIOBase::IOComponentType ComponentType; if ( argc != 4 ) From ad4e349a16d2232133c9422d319a115ee92ba251 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Mon, 12 Feb 2018 14:22:58 -0600 Subject: [PATCH 065/113] STYLE: Modernize to C++11 conventions STYLE: Use auto for variable creation This check is responsible for using the auto type specifier for variable declarations to improve code readability and maintainability. The auto type specifier will only be introduced in situations where the variable type matches the type of the initializer expression. In other words auto should deduce the same type that was originally spelled in the source cd /Users/johnsonhj/Dashboard/src/ITK-clangtidy/ run-clang-tidy.py -checks=-*,modernize-use-auto -header-filter=.* -fix use auto when declaring iterators use auto when initializing with a cast to avoid duplicating the type name use auto when initializing with a template cast to avoid duplicating the type name use auto when initializing with new to avoid duplicating the type name SRCDIR=/Users/johnsonhj/Dashboard/src/ITK #My local SRC BLDDIR=/Users/johnsonhj/Dashboard/src/ITK-clangtidy/ #My local BLD PERF: Replace explicit return calls of constructor Replaces explicit calls to the constructor in a return with a braced initializer list. This way the return type is not needlessly duplicated in the function definition and the return statement. SRCDIR=/Users/johnsonhj/Dashboard/src/ITK #My local SRC BLDDIR=/Users/johnsonhj/Dashboard/src/ITK-clangtidy/ #My local BLD cd /Users/johnsonhj/Dashboard/src/ITK-clangtidy/ run-clang-tidy.py -checks=-*,modernize-return-braced-init-list -header-filter=.* -fix PERF: Allow compiler to choose best way to construct a copy With move semantics added to the language and the standard library updated with move constructors added for many types it is now interesting to take an argument directly by value, instead of by const-reference, and then copy. This check allows the compiler to take care of choosing the best way to construct the copy. The transformation is usually beneficial when the calling code passes an rvalue and assumes the move construction is a cheap operation. This short example illustrates how the construction of the value happens: class Foo { public: - Foo(const std::string &Copied, const std::string &ReadOnly) - : Copied(Copied), ReadOnly(ReadOnly) {} + Foo(std::string Moved, const std::string &ReadOnly) + : Copied(std::move(Moved)), ReadOnly(ReadOnly) {} private: private: std::string Copied; const std::string &ReadOnly; }; SRCDIR=/Users/johnsonhj/Dashboard/src/ITK #My local SRC BLDDIR=/Users/johnsonhj/Dashboard/src/ITK-clangtidy/ #My local BLD cd /Users/johnsonhj/Dashboard/src/ITK-clangtidy/ run-clang-tidy.py -checks=-*,modernize-pass-by-value -header-filter=.* -fix STYLE: Use range-based loops from C++11 Used as a more readable equivalent to the traditional for loop operating over a range of values, such as all elements in a container, in the forward direction. ==== Range based loopes are more explicit for only computing the end location once for containers. for ( ImageIORegion::IndexType::const_iterator i = this->GetIndex().begin(); i != this->GetIndex().end(); //<- NOTE: Compute end every loop iteration ++i ) for (long i : this->GetIndex()) //<- NOTE: Implicitly only compute end once ==== Explicitly reduce the amount of index computations: (The compiler probably does this too) for(int i = 0; i < 11; i++) { pos[0] = testPoints[i][0]; pos[1] = testPoints[i][1]; ^^^^ for(auto & testPoint : testPoints) { pos[0] = testPoint[0]; pos[1] = testPoint[1]; ==== SRCDIR=/Users/johnsonhj/Dashboard/src/ITK #My local SRC BLDDIR=/Users/johnsonhj/Dashboard/src/ITK-clangtidy/ #My local BLD cd /Users/johnsonhj/Dashboard/src/ITK-clangtidy/ run-clang-tidy.py -checks=-*,modernize-loop-convert -header-filter=.* -fix --- .../include/itkLabelSetDilateImageFilter.hxx | 12 ++++++------ .../include/itkLabelSetErodeImageFilter.hxx | 12 ++++++------ .../include/itkLabelSetMorphBaseImageFilter.hxx | 7 +++---- .../LabelErodeDilate/include/itkLabelSetUtils.h | 8 ++++---- 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx index 43a9e0e7d68..27d46486cf0 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx @@ -61,12 +61,12 @@ LabelSetDilateImageFilter< TInputImage, TOutputImage > } float progressPerDimension = 1.0 / ImageDimension; - ProgressReporter *progress = new ProgressReporter(this, - threadId, - NumberOfRows[this->m_CurrentDimension], - 30, - this->m_CurrentDimension * progressPerDimension, - progressPerDimension); + auto *progress = new ProgressReporter(this, + threadId, + NumberOfRows[this->m_CurrentDimension], + 30, + this->m_CurrentDimension * progressPerDimension, + progressPerDimension); typedef ImageLinearConstIteratorWithIndex< TInputImage > InputConstIteratorType; typedef ImageLinearIteratorWithIndex< TOutputImage > OutputIteratorType; diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx index fc12dad9b9d..5d24b1931ea 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx @@ -60,12 +60,12 @@ LabelSetErodeImageFilter< TInputImage, TOutputImage > } float progressPerDimension = 1.0 / ImageDimension; - ProgressReporter *progress = new ProgressReporter(this, - threadId, - NumberOfRows[this->m_CurrentDimension], - 30, - this->m_CurrentDimension * progressPerDimension, - progressPerDimension); + auto *progress = new ProgressReporter(this, + threadId, + NumberOfRows[this->m_CurrentDimension], + 30, + this->m_CurrentDimension * progressPerDimension, + progressPerDimension); typedef ImageLinearConstIteratorWithIndex< TInputImage > InputConstIteratorType; typedef ImageLinearIteratorWithIndex< TOutputImage > OutputIteratorType; diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index fe573856931..125e7331109 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -96,10 +96,9 @@ LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > } // determine the actual number of pieces that will be generated - double range = static_cast< double >( requestedRegionSize[splitAxis] ); + auto range = static_cast< double >( requestedRegionSize[splitAxis] ); - unsigned int valuesPerThread = - static_cast< unsigned int >( std::ceil( range / static_cast< double >( num ) ) ); + auto valuesPerThread = static_cast< unsigned int >( std::ceil( range / static_cast< double >( num ) ) ); unsigned int maxThreadIdUsed = static_cast< unsigned int >( std::ceil( range / static_cast< double >( valuesPerThread ) ) ) - 1; @@ -141,7 +140,7 @@ void LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > ::EnlargeOutputRequestedRegion(DataObject *output) { - TOutputImage *out = dynamic_cast< TOutputImage * >( output ); + auto *out = dynamic_cast< TOutputImage * >( output ); if ( out ) { diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index f6376ddb732..63774852031 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -122,7 +122,7 @@ void DoLine(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, // negative half of the parabola for ( long pos = 0; pos < LineLength; pos++ ) { - RealType BaseVal = (RealType)m_Extreme; // the base value for + auto BaseVal = (RealType)m_Extreme; // the base value for // comparison for ( long krange = koffset; krange <= 0; krange++ ) { @@ -142,7 +142,7 @@ void DoLine(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, koffset = newcontact = 0; for ( long pos = LineLength - 1; pos >= 0; pos-- ) { - RealType BaseVal = (RealType)m_Extreme; // the base value for comparison + auto BaseVal = (RealType)m_Extreme; // the base value for comparison for ( long krange = koffset; krange >= 0; krange-- ) { RealType T = tmpLineBuf[pos + krange] - magnitude * krange * krange; @@ -171,7 +171,7 @@ void DoLineLabelProp(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, // negative half of the parabola for ( long pos = 0; pos < LineLength; pos++ ) { - RealType BaseVal = (RealType)m_Extreme; // the base value for + auto BaseVal = (RealType)m_Extreme; // the base value for // comparison LabelType BaseLab = LabelBuf[pos]; for ( long krange = koffset; krange <= 0; krange++ ) @@ -195,7 +195,7 @@ void DoLineLabelProp(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, #if 1 for ( long pos = LineLength - 1; pos >= 0; pos-- ) { - RealType BaseVal = (RealType)m_Extreme; // the base value for comparison + auto BaseVal = (RealType)m_Extreme; // the base value for comparison // initialize the label to the previously pro LabelType BaseLab = tmpLabelBuf[pos]; for ( long krange = koffset; krange >= 0; krange-- ) From 8bc2289dd81ee81abca9af0388568d1f56e7424f Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Mon, 12 Feb 2018 21:03:39 -0600 Subject: [PATCH 066/113] STYLE: Replace itkStaticConstMacro with static constexpr Use static constexpr directly now that C++11 conformance is required by all compilers. :%s/itkStaticConstMacro *( *\([^,]*\),[ \_s]*\([^,]*\),\_s*\([^)]*\)) */static constexpr \2 \1 = \3/ge --- .../include/itkLabelSetDilateImageFilter.h | 9 +++------ .../include/itkLabelSetErodeImageFilter.h | 9 +++------ .../include/itkLabelSetMorphBaseImageFilter.h | 9 +++------ 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h index f74a47570f7..b3edfa48371 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h @@ -71,12 +71,9 @@ class ITK_EXPORT LabelSetDilateImageFilter: typedef typename OutputImageType::RegionType OutputImageRegionType; /** Image dimension. */ - itkStaticConstMacro(ImageDimension, unsigned int, - TInputImage::ImageDimension); - itkStaticConstMacro(OutputImageDimension, unsigned int, - TOutputImage::ImageDimension); - itkStaticConstMacro(InputImageDimension, unsigned int, - TInputImage::ImageDimension); + static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; + static constexpr unsigned int OutputImageDimension = TOutputImage::ImageDimension; + static constexpr unsigned int InputImageDimension = TInputImage::ImageDimension; protected: LabelSetDilateImageFilter(){} ~LabelSetDilateImageFilter() override {} diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h index e57dcaca1f0..c8376b07d43 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h @@ -76,12 +76,9 @@ class ITK_EXPORT LabelSetErodeImageFilter: typedef typename OutputImageType::RegionType OutputImageRegionType; /** Image dimension. */ - itkStaticConstMacro(ImageDimension, unsigned int, - TInputImage::ImageDimension); - itkStaticConstMacro(OutputImageDimension, unsigned int, - TOutputImage::ImageDimension); - itkStaticConstMacro(InputImageDimension, unsigned int, - TInputImage::ImageDimension); + static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; + static constexpr unsigned int OutputImageDimension = TOutputImage::ImageDimension; + static constexpr unsigned int InputImageDimension = TInputImage::ImageDimension; protected: LabelSetErodeImageFilter(){} ~LabelSetErodeImageFilter() override {} diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index 36406212d8a..50b9b3dff78 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -98,12 +98,9 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter: itkBooleanMacro(UseImageSpacing); /** Image dimension. */ - itkStaticConstMacro(ImageDimension, unsigned int, - TInputImage::ImageDimension); - itkStaticConstMacro(OutputImageDimension, unsigned int, - TOutputImage::ImageDimension); - itkStaticConstMacro(InputImageDimension, unsigned int, - TInputImage::ImageDimension); + static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; + static constexpr unsigned int OutputImageDimension = TOutputImage::ImageDimension; + static constexpr unsigned int InputImageDimension = TInputImage::ImageDimension; /** Define the image type for internal computations RealType is usually 'double' in NumericTraits. From b765a8032220ac74ce9169e1ca5cc434656e021b Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Mon, 12 Feb 2018 23:30:13 -0600 Subject: [PATCH 067/113] STYLE: Prefer C++11 type alias over typedef == http://en.cppreference.com/w/cpp/language/type_alias == Type alias is a name that refers to a previously defined type (similar to typedef). A type alias declaration introduces a name which can be used as a synonym for the type denoted by type-id. It does not introduce a new type and it cannot change the meaning of an existing type name. There is no difference between a type alias declaration and typedef declaration. This declaration may appear in block scope, class scope, or namespace scope. == https://www.quora.com/Is-using-typedef-in-C++-considered-a-bad-practice == While typedef is still available for backward compatibility, the new Type Alias syntax 'using Alias = ExistingLongName;' is more consistent with the flow of C++ than the old typedef syntax 'typedef ExistingLongName Alias;', and it also works for templates (Type alias, alias template (since C++11)), so leftover 'typedef' aliases will differ in style from any alias templates. --- .../include/itkLabelSetDilateImageFilter.h | 36 ++++++------- .../include/itkLabelSetDilateImageFilter.hxx | 13 +++-- .../include/itkLabelSetErodeImageFilter.h | 38 +++++++------- .../include/itkLabelSetErodeImageFilter.hxx | 10 ++-- .../include/itkLabelSetMorphBaseImageFilter.h | 52 +++++++++---------- .../itkLabelSetMorphBaseImageFilter.hxx | 2 +- .../include/itkLabelSetUtils.h | 22 ++++---- .../test/itkLabelSetDilateTest.cxx | 8 +-- .../test/itkLabelSetErodeTest.cxx | 8 +-- 9 files changed, 94 insertions(+), 95 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h index b3edfa48371..5db0328757a 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h @@ -42,11 +42,11 @@ class ITK_EXPORT LabelSetDilateImageFilter: public LabelSetMorphBaseImageFilter< TInputImage, true, TOutputImage > { public: - /** Standard class typedefs. */ - typedef LabelSetDilateImageFilter Self; - typedef LabelSetMorphBaseImageFilter< TInputImage, true, TOutputImage > Superclass; - typedef SmartPointer< Self > Pointer; - typedef SmartPointer< const Self > ConstPointer; + /** Standard class type alias. */ + using Self = LabelSetDilateImageFilter; + using Superclass = LabelSetMorphBaseImageFilter< TInputImage, true, TOutputImage >; + using Pointer = SmartPointer< Self >; + using ConstPointer = SmartPointer< const Self >; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -55,20 +55,20 @@ class ITK_EXPORT LabelSetDilateImageFilter: itkTypeMacro(LabelSetDilateImageFilter, LabelSetMorphBaseImageFilter); /** Pixel Type of the input image */ - typedef TInputImage InputImageType; - typedef TOutputImage OutputImageType; - typedef typename TInputImage::PixelType PixelType; - typedef typename NumericTraits< PixelType >::FloatType RealType; - typedef typename TOutputImage::PixelType OutputPixelType; - typedef typename NumericTraits< PixelType >::ScalarRealType ScalarRealType; + using InputImageType = TInputImage; + using OutputImageType = TOutputImage; + using PixelType = typename TInputImage::PixelType; + using RealType = typename NumericTraits< PixelType >::FloatType; + using OutputPixelType = typename TOutputImage::PixelType; + using ScalarRealType = typename NumericTraits< PixelType >::ScalarRealType; - /** Smart pointer typedef support. */ - typedef typename TInputImage::Pointer InputImagePointer; - typedef typename TInputImage::ConstPointer InputImageConstPointer; - typedef typename TInputImage::SizeType InputSizeType; - typedef typename TOutputImage::SizeType OutputSizeType; + /** Smart pointer type alias support. */ + using InputImagePointer = typename TInputImage::Pointer; + using InputImageConstPointer = typename TInputImage::ConstPointer; + using InputSizeType = typename TInputImage::SizeType; + using OutputSizeType = typename TOutputImage::SizeType; - typedef typename OutputImageType::RegionType OutputImageRegionType; + using OutputImageRegionType = typename OutputImageType::RegionType; /** Image dimension. */ static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; @@ -84,7 +84,7 @@ class ITK_EXPORT LabelSetDilateImageFilter: LabelSetDilateImageFilter(const Self &); //purposely not implemented void operator=(const Self &); //purposely not implemented - typedef typename Superclass::DistanceImageType DistanceImageType; + using DistanceImageType = typename Superclass::DistanceImageType; }; } // end namespace itk diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx index 27d46486cf0..107508368bb 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx @@ -68,17 +68,16 @@ LabelSetDilateImageFilter< TInputImage, TOutputImage > this->m_CurrentDimension * progressPerDimension, progressPerDimension); - typedef ImageLinearConstIteratorWithIndex< TInputImage > InputConstIteratorType; - typedef ImageLinearIteratorWithIndex< TOutputImage > OutputIteratorType; + using InputConstIteratorType = ImageLinearConstIteratorWithIndex< TInputImage >; + using OutputIteratorType = ImageLinearIteratorWithIndex< TOutputImage >; - typedef ImageLinearConstIteratorWithIndex< DistanceImageType > InputDistIteratorType; - typedef ImageLinearIteratorWithIndex< DistanceImageType > OutputDistIteratorType; + using InputDistIteratorType = ImageLinearConstIteratorWithIndex< DistanceImageType >; + using OutputDistIteratorType = ImageLinearIteratorWithIndex< DistanceImageType >; // for stages after the first - //typedef ImageLinearConstIteratorWithIndex< TOutputImage > - // OutputConstIteratorType; + // using OutputConstIteratorType = ImageLinearConstIteratorWithIndex< TOutputImage > ; - typedef ImageRegion< TInputImage::ImageDimension > RegionType; + using RegionType = ImageRegion< TInputImage::ImageDimension >; typename TInputImage::ConstPointer inputImage( this->GetInput () ); typename TOutputImage::Pointer outputImage( this->GetOutput() ); diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h index c8376b07d43..8c966ff635e 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h @@ -44,11 +44,11 @@ class ITK_EXPORT LabelSetErodeImageFilter: public LabelSetMorphBaseImageFilter< TInputImage, false, TOutputImage > { public: - /** Standard class typedefs. */ - typedef LabelSetErodeImageFilter Self; - typedef LabelSetMorphBaseImageFilter< TInputImage, false, TOutputImage > Superclass; - typedef SmartPointer< Self > Pointer; - typedef SmartPointer< const Self > ConstPointer; + /** Standard class type alias. */ + using Self = LabelSetErodeImageFilter; + using Superclass = LabelSetMorphBaseImageFilter< TInputImage, false, TOutputImage >; + using Pointer = SmartPointer< Self >; + using ConstPointer = SmartPointer< const Self >; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -57,24 +57,24 @@ class ITK_EXPORT LabelSetErodeImageFilter: itkTypeMacro(LabelSetErodeImageFilter, LabelSetMorphBaseImageFilter); /** Pixel Type of the input image */ - typedef TInputImage InputImageType; - typedef TOutputImage OutputImageType; - typedef typename TInputImage::PixelType PixelType; - typedef typename NumericTraits< PixelType >::FloatType RealType; - typedef typename TOutputImage::PixelType OutputPixelType; - typedef typename NumericTraits< PixelType >::ScalarRealType ScalarRealType; + using InputImageType = TInputImage; + using OutputImageType = TOutputImage; + using PixelType = typename TInputImage::PixelType; + using RealType = typename NumericTraits< PixelType >::FloatType; + using OutputPixelType = typename TOutputImage::PixelType; + using ScalarRealType = typename NumericTraits< PixelType >::ScalarRealType; - /** Smart pointer typedef support. */ - typedef typename TInputImage::Pointer InputImagePointer; - typedef typename TInputImage::ConstPointer InputImageConstPointer; - typedef typename TInputImage::SizeType InputSizeType; - typedef typename TOutputImage::SizeType OutputSizeType; + /** Smart pointer type alias support. */ + using InputImagePointer = typename TInputImage::Pointer; + using InputImageConstPointer = typename TInputImage::ConstPointer; + using InputSizeType = typename TInputImage::SizeType; + using OutputSizeType = typename TOutputImage::SizeType; /** a type to represent the "kernel radius" */ - typedef typename itk::FixedArray< ScalarRealType, TInputImage::ImageDimension > RadiusType; + using RadiusType = typename itk::FixedArray< ScalarRealType, TInputImage::ImageDimension >; /** Image dimension. */ - typedef typename OutputImageType::RegionType OutputImageRegionType; + using OutputImageRegionType = typename OutputImageType::RegionType; /** Image dimension. */ static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; static constexpr unsigned int OutputImageDimension = TOutputImage::ImageDimension; @@ -90,7 +90,7 @@ class ITK_EXPORT LabelSetErodeImageFilter: LabelSetErodeImageFilter(const Self &); //purposely not implemented void operator=(const Self &); //purposely not implemented - typedef typename Superclass::DistanceImageType DistanceImageType; + using DistanceImageType = typename Superclass::DistanceImageType; }; } // end namespace itk diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx index 5d24b1931ea..1a1ffb5acc3 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx @@ -67,13 +67,13 @@ LabelSetErodeImageFilter< TInputImage, TOutputImage > this->m_CurrentDimension * progressPerDimension, progressPerDimension); - typedef ImageLinearConstIteratorWithIndex< TInputImage > InputConstIteratorType; - typedef ImageLinearIteratorWithIndex< TOutputImage > OutputIteratorType; + using InputConstIteratorType = ImageLinearConstIteratorWithIndex< TInputImage >; + using OutputIteratorType = ImageLinearIteratorWithIndex< TOutputImage >; - typedef ImageLinearConstIteratorWithIndex< DistanceImageType > InputDistIteratorType; - typedef ImageLinearIteratorWithIndex< DistanceImageType > OutputDistIteratorType; + using InputDistIteratorType = ImageLinearConstIteratorWithIndex< DistanceImageType >; + using OutputDistIteratorType = ImageLinearIteratorWithIndex< DistanceImageType >; - typedef ImageRegion< TInputImage::ImageDimension > RegionType; + using RegionType = ImageRegion< TInputImage::ImageDimension >; typename TInputImage::ConstPointer inputImage( this->GetInput () ); typename TOutputImage::Pointer outputImage( this->GetOutput() ); diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index 50b9b3dff78..8a29282cad1 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -24,10 +24,10 @@ namespace itk { #if ITK_VERSION_MAJOR < 4 -typedef int ThreadIdType; -typedef int RegionIndexType; +using ThreadIdType = int; +using RegionIndexType = int; #else -typedef unsigned int RegionIndexType; +using RegionIndexType = unsigned int; #endif /** * \class LabelSetMorphBaseImageFilter @@ -48,11 +48,11 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter: public ImageToImageFilter< TInputImage, TOutputImage > { public: - /** Standard class typedefs. */ - typedef LabelSetMorphBaseImageFilter Self; - typedef ImageToImageFilter< TInputImage, TOutputImage > Superclass; - typedef SmartPointer< Self > Pointer; - typedef SmartPointer< const Self > ConstPointer; + /** Standard class type alias. */ + using Self = LabelSetMorphBaseImageFilter; + using Superclass = ImageToImageFilter< TInputImage, TOutputImage >; + using Pointer = SmartPointer< Self >; + using ConstPointer = SmartPointer< const Self >; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -61,27 +61,27 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter: itkTypeMacro(LabelSetMorphBaseImageFilter, ImageToImageFilter); /** Pixel Type of the input image */ - typedef TInputImage InputImageType; - typedef TOutputImage OutputImageType; - typedef typename TInputImage::PixelType PixelType; - typedef typename NumericTraits< PixelType >::FloatType RealType; - typedef typename TOutputImage::PixelType OutputPixelType; - typedef typename NumericTraits< PixelType >::ScalarRealType ScalarRealType; - - typedef typename OutputImageType::IndexType OutputIndexType; - typedef typename OutputImageType::IndexValueType OutputIndexValueType; - - /** Smart pointer typedef support. */ - typedef typename TInputImage::Pointer InputImagePointer; - typedef typename TInputImage::ConstPointer InputImageConstPointer; - typedef typename TInputImage::SizeType InputSizeType; - typedef typename TOutputImage::SizeType OutputSizeType; + using InputImageType = TInputImage; + using OutputImageType = TOutputImage; + using PixelType = typename TInputImage::PixelType; + using RealType = typename NumericTraits< PixelType >::FloatType; + using OutputPixelType = typename TOutputImage::PixelType; + using ScalarRealType = typename NumericTraits< PixelType >::ScalarRealType; + + using OutputIndexType = typename OutputImageType::IndexType; + using OutputIndexValueType = typename OutputImageType::IndexValueType; + + /** Smart pointer type alias support. */ + using InputImagePointer = typename TInputImage::Pointer; + using InputImageConstPointer = typename TInputImage::ConstPointer; + using InputSizeType = typename TInputImage::SizeType; + using OutputSizeType = typename TOutputImage::SizeType; /** a type to represent the "kernel radius" */ - typedef typename itk::FixedArray< ScalarRealType, TInputImage::ImageDimension > RadiusType; + using RadiusType = typename itk::FixedArray< ScalarRealType, TInputImage::ImageDimension >; /** Image dimension. */ - typedef typename OutputImageType::RegionType OutputImageRegionType; + using OutputImageRegionType = typename OutputImageType::RegionType; // set all of the scales the same void SetRadius(ScalarRealType scale); @@ -128,7 +128,7 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter: RadiusType m_Radius; RadiusType m_Scale; - typedef typename itk::Image< RealType, TInputImage::ImageDimension > DistanceImageType; + using DistanceImageType = typename itk::Image< RealType, TInputImage::ImageDimension >; typename TInputImage::PixelType m_Extreme; typename DistanceImageType::Pointer m_DistanceImage; diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index 125e7331109..212a7553894 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -250,7 +250,7 @@ void LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > ::writeDist(std::string fname) { - typedef typename itk::ImageFileWriter< DistanceImageType > WriterType; + using WriterType = typename itk::ImageFileWriter< DistanceImageType >; typename WriterType::Pointer writer = WriterType::New(); writer->SetInput(m_DistanceImage); writer->SetFileName( fname.c_str() ); diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index 63774852031..697df7148dd 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -165,7 +165,7 @@ void DoLineLabelProp(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, // contact point algorithm long koffset = 0, newcontact = 0; // how far away the search starts. - typedef typename LabBufferType::ValueType LabelType; + using LabelType = typename LabBufferType::ValueType; const long LineLength = LineBuf.size(); // negative half of the parabola @@ -238,8 +238,8 @@ void doOneDimensionErodeFirstPass(TInIter & inputIterator, TOutDistIter & output // specialised version for binary erosion during first pass. We can // compute the results directly because the inputs are flat. (void)m_Extreme; // avoid warning - typedef typename itk::Array< RealType > LineBufferType; - typedef typename itk::Array< typename TInIter::PixelType > LabelBufferType; + using LineBufferType = typename itk::Array< RealType >; + using LabelBufferType = typename itk::Array< typename TInIter::PixelType >; RealType iscale = 1.0; if ( m_UseImageSpacing ) { @@ -280,7 +280,7 @@ void doOneDimensionErodeFirstPass(TInIter & inputIterator, TOutDistIter & output } // runlength encode the line buffer (could be integrated with extraction) - typedef std::vector< unsigned > EndType; + using EndType = std::vector< unsigned >; EndType firsts; EndType lasts; @@ -369,8 +369,8 @@ void doOneDimensionDilateFirstPass(TInIter & inputIterator, TOutDistIter & outpu // specialised version for binary erosion during first pass. We can // compute the results directly because the inputs are flat. (void)m_Extreme; // stop warnings - typedef typename itk::Array< RealType > LineBufferType; - typedef typename itk::Array< typename TInIter::PixelType > LabelBufferType; + using LineBufferType = typename itk::Array< RealType >; + using LabelBufferType = typename itk::Array< typename TInIter::PixelType >; RealType iscale = 1.0; if ( m_UseImageSpacing ) { @@ -455,8 +455,8 @@ void doOneDimensionErode(TInIter & inputIterator, TDistIter & inputDistIterator, const bool lastpass) { // traditional erosion - can't optimise the same way as the first pass - typedef typename itk::Array< RealType > LineBufferType; - typedef typename itk::Array< typename TInIter::PixelType > LabelBufferType; + using LineBufferType = typename itk::Array< RealType >; + using LabelBufferType = typename itk::Array< typename TInIter::PixelType >; RealType iscale = 1.0; if ( m_UseImageSpacing ) { @@ -493,7 +493,7 @@ void doOneDimensionErode(TInIter & inputIterator, TDistIter & inputDistIterator, ++inputIterator; } // runlength encode the line buffer (could be integrated with extraction) - typedef std::vector< unsigned > EndType; + using EndType = std::vector< unsigned >; EndType firsts; EndType lasts; for ( unsigned idx = 0; idx < LineLength; idx++ ) @@ -587,8 +587,8 @@ void doOneDimensionDilate(TInIter & inputIterator, TDistIter & inputDistIterator { // specialised version for binary erosion during first pass. We can // compute the results directly because the inputs are flat. - typedef typename itk::Array< RealType > LineBufferType; - typedef typename itk::Array< typename TInIter::PixelType > LabelBufferType; + using LineBufferType = typename itk::Array< RealType >; + using LabelBufferType = typename itk::Array< typename TInIter::PixelType >; RealType iscale = 1.0; if ( m_UseImageSpacing ) { diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index 584cdf2eae1..e13e7037fd4 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -25,10 +25,10 @@ template< class MaskPixType, int dim > int doDilate(char *In, char *Out, int radius) { - typedef typename itk::Image< MaskPixType, dim > MaskImType; + using MaskImType = typename itk::Image< MaskPixType, dim >; // load - typedef typename itk::ImageFileReader< MaskImType > ReaderType; + using ReaderType = typename itk::ImageFileReader< MaskImType >; typename ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(In); try @@ -42,12 +42,12 @@ int doDilate(char *In, char *Out, int radius) } // Label dilation - typedef typename itk::LabelSetDilateImageFilter< MaskImType, MaskImType > FilterType; + using FilterType = typename itk::LabelSetDilateImageFilter< MaskImType, MaskImType >; typename FilterType::Pointer filter = FilterType::New(); filter->SetInput( reader->GetOutput() ); filter->SetRadius(radius); filter->SetUseImageSpacing(true); - typedef typename itk::ImageFileWriter< MaskImType > WriterType; + using WriterType = typename itk::ImageFileWriter< MaskImType >; typename WriterType::Pointer writer = WriterType::New(); writer->SetInput( filter->GetOutput() ); writer->SetFileName(Out); diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx index 6aef46c86ef..bcbf3c5f677 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx @@ -26,10 +26,10 @@ template< class MaskPixType, int dim > int doErode(char *In, char *Out, int radius) { - typedef typename itk::Image< MaskPixType, dim > MaskImType; + using MaskImType = typename itk::Image< MaskPixType, dim >; // load - typedef typename itk::ImageFileReader< MaskImType > ReaderType; + using ReaderType = typename itk::ImageFileReader< MaskImType >; typename ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(In); try @@ -43,12 +43,12 @@ int doErode(char *In, char *Out, int radius) } // Label dilation - typedef typename itk::LabelSetErodeImageFilter< MaskImType, MaskImType > FilterType; + using FilterType = typename itk::LabelSetErodeImageFilter< MaskImType, MaskImType >; typename FilterType::Pointer filter = FilterType::New(); filter->SetInput( reader->GetOutput() ); filter->SetRadius(radius); filter->SetUseImageSpacing(true); - typedef typename itk::ImageFileWriter< MaskImType > WriterType; + using WriterType = typename itk::ImageFileWriter< MaskImType >; typename WriterType::Pointer writer = WriterType::New(); writer->SetInput( filter->GetOutput() ); writer->SetFileName(Out); From 7d2a2f60ec41bba8e62593fb8796198de6e3d1cc Mon Sep 17 00:00:00 2001 From: Jon Haitz Legarreta Date: Sat, 14 Apr 2018 19:35:08 +0200 Subject: [PATCH 068/113] COMP: Move ITK_DISALLOW_COPY_AND_ASSIGN calls to public section. Move `ITK_DISALLOW_COPY_AND_ASSIGN` calls to public section following the discussion in https://discourse.itk.org/t/noncopyable If legacy (pre-macro) copy and assing methods existed, subsitute them for the `ITK_DISALLOW_COPY_AND_ASSIGN` macro. --- .../LabelErodeDilate/include/itkLabelSetDilateImageFilter.h | 5 ++--- .../LabelErodeDilate/include/itkLabelSetErodeImageFilter.h | 5 ++--- .../include/itkLabelSetMorphBaseImageFilter.h | 5 ++--- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h index 5db0328757a..fdf4af0a7c2 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h @@ -42,6 +42,8 @@ class ITK_EXPORT LabelSetDilateImageFilter: public LabelSetMorphBaseImageFilter< TInputImage, true, TOutputImage > { public: + ITK_DISALLOW_COPY_AND_ASSIGN(LabelSetDilateImageFilter); + /** Standard class type alias. */ using Self = LabelSetDilateImageFilter; using Superclass = LabelSetMorphBaseImageFilter< TInputImage, true, TOutputImage >; @@ -81,9 +83,6 @@ class ITK_EXPORT LabelSetDilateImageFilter: void ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) override; private: - LabelSetDilateImageFilter(const Self &); //purposely not implemented - void operator=(const Self &); //purposely not implemented - using DistanceImageType = typename Superclass::DistanceImageType; }; } // end namespace itk diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h index 8c966ff635e..59f57b3ffa1 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h @@ -44,6 +44,8 @@ class ITK_EXPORT LabelSetErodeImageFilter: public LabelSetMorphBaseImageFilter< TInputImage, false, TOutputImage > { public: + ITK_DISALLOW_COPY_AND_ASSIGN(LabelSetErodeImageFilter); + /** Standard class type alias. */ using Self = LabelSetErodeImageFilter; using Superclass = LabelSetMorphBaseImageFilter< TInputImage, false, TOutputImage >; @@ -87,9 +89,6 @@ class ITK_EXPORT LabelSetErodeImageFilter: // Override since the filter produces the entire dataset. private: - LabelSetErodeImageFilter(const Self &); //purposely not implemented - void operator=(const Self &); //purposely not implemented - using DistanceImageType = typename Superclass::DistanceImageType; }; } // end namespace itk diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index 8a29282cad1..045d70b1b59 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -48,6 +48,8 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter: public ImageToImageFilter< TInputImage, TOutputImage > { public: + ITK_DISALLOW_COPY_AND_ASSIGN(LabelSetMorphBaseImageFilter); + /** Standard class type alias. */ using Self = LabelSetMorphBaseImageFilter; using Superclass = ImageToImageFilter< TInputImage, TOutputImage >; @@ -140,9 +142,6 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter: // this is the first non-zero entry in the radius. Needed to // support elliptical operations RealType m_BaseSigma; -private: - LabelSetMorphBaseImageFilter(const Self &); //purposely not implemented - void operator=(const Self &); //purposely not implemented }; } // end namespace itk From aeb3d8b663aaecf70cded083c9dcf4bb66c3e8e6 Mon Sep 17 00:00:00 2001 From: Jon Haitz Legarreta Date: Mon, 21 May 2018 19:11:55 +0200 Subject: [PATCH 069/113] BUG: Fix test errors steming from the new multi-threading mechanism. Fix errors steming from the use of the new `itk::PoolMultiThreader` class for multi-threading. The errors stemmed when this gerrit topic got merged: http://review.source.kitware.com/#/c/23175/ And were later related to the following gerrit-topic: http://review.source.kitware.com/#/c/23434/ The solution adopted in this patch set was based on the proposal in: http://review.source.kitware.com/#/c/23439/ --- .../include/itkLabelSetDilateImageFilter.h | 5 +-- .../include/itkLabelSetDilateImageFilter.hxx | 31 ++----------------- .../include/itkLabelSetErodeImageFilter.h | 5 +-- .../include/itkLabelSetErodeImageFilter.hxx | 26 ++-------------- .../include/itkLabelSetMorphBaseImageFilter.h | 3 +- .../itkLabelSetMorphBaseImageFilter.hxx | 5 +-- .../include/itkLabelSetUtils.h | 9 ------ 7 files changed, 16 insertions(+), 68 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h index fdf4af0a7c2..0aaaa25cce4 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h @@ -77,10 +77,11 @@ class ITK_EXPORT LabelSetDilateImageFilter: static constexpr unsigned int OutputImageDimension = TOutputImage::ImageDimension; static constexpr unsigned int InputImageDimension = TInputImage::ImageDimension; protected: - LabelSetDilateImageFilter(){} + LabelSetDilateImageFilter() + { this->DynamicMultiThreadingOn(); } ~LabelSetDilateImageFilter() override {} - void ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) override; + void DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) override; private: using DistanceImageType = typename Superclass::DistanceImageType; diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx index 107508368bb..4689a1c38c3 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx @@ -32,7 +32,7 @@ namespace itk template< typename TInputImage, typename TOutputImage > void LabelSetDilateImageFilter< TInputImage, TOutputImage > -::ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) +::DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) { // this is where the work happens. We use a distance image with // floating point pixel to perform the parabolic operations. The @@ -42,31 +42,6 @@ LabelSetDilateImageFilter< TInputImage, TOutputImage > // line copy. // Similarly, the thresholding on output needs to be integrated // with the last processing stage. - // stop warnings about unused argument - (void)threadId; - // compute the number of rows first, so we can setup a progress reporter - typename std::vector< unsigned int > NumberOfRows; - InputSizeType size = outputRegionForThread.GetSize(); - - for ( unsigned int i = 0; i < InputImageDimension; i++ ) - { - NumberOfRows.push_back(1); - for ( unsigned int d = 0; d < InputImageDimension; d++ ) - { - if ( d != i ) - { - NumberOfRows[i] *= size[d]; - } - } - } - float progressPerDimension = 1.0 / ImageDimension; - - auto *progress = new ProgressReporter(this, - threadId, - NumberOfRows[this->m_CurrentDimension], - 30, - this->m_CurrentDimension * progressPerDimension, - progressPerDimension); using InputConstIteratorType = ImageLinearConstIteratorWithIndex< TInputImage >; using OutputIteratorType = ImageLinearIteratorWithIndex< TOutputImage >; @@ -112,7 +87,7 @@ LabelSetDilateImageFilter< TInputImage, TOutputImage > { LabSet::doOneDimensionDilateFirstPass< InputConstIteratorType, OutputDistIteratorType, OutputIteratorType, RealType >(inputIterator, outputDistIterator, outputIterator, - *progress, LineLength, + LineLength, this->m_CurrentDimension, this->m_MagnitudeSign, this->m_UseImageSpacing, @@ -130,7 +105,7 @@ LabelSetDilateImageFilter< TInputImage, TOutputImage > inputDistIterator, outputDistIterator, outputIterator, - *progress, LineLength, + LineLength, this->m_CurrentDimension, this->m_MagnitudeSign, this->m_UseImageSpacing, diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h index 59f57b3ffa1..52f97651c83 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h @@ -82,10 +82,11 @@ class ITK_EXPORT LabelSetErodeImageFilter: static constexpr unsigned int OutputImageDimension = TOutputImage::ImageDimension; static constexpr unsigned int InputImageDimension = TInputImage::ImageDimension; protected: - LabelSetErodeImageFilter(){} + LabelSetErodeImageFilter() + { this->DynamicMultiThreadingOn(); } ~LabelSetErodeImageFilter() override {} - void ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) override; + void DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) override; // Override since the filter produces the entire dataset. private: diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx index 1a1ffb5acc3..f9ceb7d0d0f 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx @@ -32,7 +32,7 @@ namespace itk template< typename TInputImage, typename TOutputImage > void LabelSetErodeImageFilter< TInputImage, TOutputImage > -::ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) +::DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) { // this is where the work happens. We use a distance image with // floating point pixel to perform the parabolic operations. The @@ -47,26 +47,6 @@ LabelSetErodeImageFilter< TInputImage, TOutputImage > typename std::vector< unsigned int > NumberOfRows; InputSizeType size = outputRegionForThread.GetSize(); - for ( unsigned int i = 0; i < InputImageDimension; i++ ) - { - NumberOfRows.push_back(1); - for ( unsigned int d = 0; d < InputImageDimension; d++ ) - { - if ( d != i ) - { - NumberOfRows[i] *= size[d]; - } - } - } - float progressPerDimension = 1.0 / ImageDimension; - - auto *progress = new ProgressReporter(this, - threadId, - NumberOfRows[this->m_CurrentDimension], - 30, - this->m_CurrentDimension * progressPerDimension, - progressPerDimension); - using InputConstIteratorType = ImageLinearConstIteratorWithIndex< TInputImage >; using OutputIteratorType = ImageLinearIteratorWithIndex< TOutputImage >; @@ -107,7 +87,7 @@ LabelSetErodeImageFilter< TInputImage, TOutputImage > { LabSet::doOneDimensionErodeFirstPass< InputConstIteratorType, OutputDistIteratorType, OutputIteratorType, RealType >(inputIterator, outputDistIterator, outputIterator, - *progress, LineLength, + LineLength, this->m_CurrentDimension, this->m_MagnitudeSign, this->m_UseImageSpacing, @@ -127,7 +107,7 @@ LabelSetErodeImageFilter< TInputImage, TOutputImage > inputDistIterator, outputDistIterator, outputIterator, - *progress, LineLength, + LineLength, this->m_CurrentDimension, this->m_MagnitudeSign, this->m_UseImageSpacing, diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index 045d70b1b59..2f32d147e7f 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -117,8 +117,7 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter: RegionIndexType SplitRequestedRegion(RegionIndexType i, RegionIndexType num, OutputImageRegionType & splitRegion) override; - void ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, - ThreadIdType threadId) override; + void DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) override; void GenerateData(void) override; diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index 212a7553894..b12beb584f0 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -53,16 +53,17 @@ LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > m_UseImageSpacing = false; this->SetRadius(1); + + this->DynamicMultiThreadingOn(); } template< typename TInputImage, bool doDilate, typename TOutputImage > void LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > -::ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) +::DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) { // stop warnings (void)outputRegionForThread; - (void)threadId; } template< typename TInputImage, bool doDilate, typename TOutputImage > diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index 697df7148dd..02695e68db5 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -20,7 +20,6 @@ #include -#include "itkProgressReporter.h" #include namespace itk { @@ -225,7 +224,6 @@ void DoLineLabelProp(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, template< class TInIter, class TOutDistIter, class TOutLabIter, class RealType > void doOneDimensionErodeFirstPass(TInIter & inputIterator, TOutDistIter & outputIterator, TOutLabIter & outputLabIterator, - ProgressReporter & progress, const unsigned LineLength, const unsigned direction, const int m_MagnitudeSign, @@ -350,14 +348,12 @@ void doOneDimensionErodeFirstPass(TInIter & inputIterator, TOutDistIter & output // now onto the next line inputIterator.NextLine(); outputIterator.NextLine(); - progress.CompletedPixel(); } } template< class TInIter, class TOutDistIter, class TOutLabIter, class RealType > void doOneDimensionDilateFirstPass(TInIter & inputIterator, TOutDistIter & outputIterator, TOutLabIter & outputLabIterator, - ProgressReporter & progress, const unsigned LineLength, const unsigned direction, const int m_MagnitudeSign, @@ -436,14 +432,12 @@ void doOneDimensionDilateFirstPass(TInIter & inputIterator, TOutDistIter & outpu inputIterator.NextLine(); outputIterator.NextLine(); outputLabIterator.NextLine(); - progress.CompletedPixel(); } } template< class TInIter, class TDistIter, class TOutLabIter, class TOutDistIter, class RealType > void doOneDimensionErode(TInIter & inputIterator, TDistIter & inputDistIterator, TOutDistIter & outputDistIterator, TOutLabIter & outputLabIterator, - ProgressReporter & progress, const unsigned LineLength, const unsigned direction, const int m_MagnitudeSign, @@ -568,14 +562,12 @@ void doOneDimensionErode(TInIter & inputIterator, TDistIter & inputDistIterator, inputIterator.NextLine(); inputDistIterator.NextLine(); outputDistIterator.NextLine(); - progress.CompletedPixel(); } } template< class TInIter, class TDistIter, class TOutLabIter, class TOutDistIter, class RealType > void doOneDimensionDilate(TInIter & inputIterator, TDistIter & inputDistIterator, TOutDistIter & outputDistIterator, TOutLabIter & outputLabIterator, - ProgressReporter & progress, const unsigned LineLength, const unsigned direction, const int m_MagnitudeSign, @@ -652,7 +644,6 @@ void doOneDimensionDilate(TInIter & inputIterator, TDistIter & inputDistIterator outputLabIterator.NextLine(); inputDistIterator.NextLine(); outputDistIterator.NextLine(); - progress.CompletedPixel(); } } } From 499804d84af7fa0c6cd0983023dd2a08e9d460cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Sun, 3 Jun 2018 20:17:07 +0200 Subject: [PATCH 070/113] BUG: Fix unused variable CDash warnings. Fix the unused variable CDash warnings reported in: https://open.cdash.org/viewBuildError.php?type=1&buildid=5401884 and issued by the builds triggered in the following gerrit topic: http://review.source.kitware.com/#/c/23434/ Also, take advantage to remove the unused `NumberOfRows` `typename` in the same file. Moreover, the new multi-threading framework does not require the filters to declare and update variables to report their progress. --- .../LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx index f9ceb7d0d0f..774da4966dc 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx @@ -43,10 +43,6 @@ LabelSetErodeImageFilter< TInputImage, TOutputImage > // Similarly, the thresholding on output needs to be integrated // with the last processing stage. - // compute the number of rows first, so we can setup a progress reporter - typename std::vector< unsigned int > NumberOfRows; - InputSizeType size = outputRegionForThread.GetSize(); - using InputConstIteratorType = ImageLinearConstIteratorWithIndex< TInputImage >; using OutputIteratorType = ImageLinearIteratorWithIndex< TOutputImage >; From a872b530e97baed596686ee99eede2e60d92b880 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 5 Sep 2018 11:35:40 +1000 Subject: [PATCH 071/113] FIX: Large erosions were producing blank images Edge effects in morphology operations are typically handled by including an extreme boundary value (max of pix type for erosion, min for dilation), that stops the boundary having any influence on the operation. The value was being set using the relevant numeric traits of the input image type. This is incorrect for the label morphology filters as the work is actually done on the distance image. This patch sets extreme values based on the pixel type of the internal distance image. Some unused variables have been removed. --- .../include/itkLabelSetDilateImageFilter.hxx | 1 - .../include/itkLabelSetErodeImageFilter.hxx | 1 - .../include/itkLabelSetMorphBaseImageFilter.h | 2 +- .../include/itkLabelSetMorphBaseImageFilter.hxx | 4 ++-- .../LabelErodeDilate/include/itkLabelSetUtils.h | 4 ---- .../LabelErodeDilate/test/CMakeLists.txt | 14 +++++++++++++- .../test/images/baseline/dotdilate_41.nii.gz | Bin 0 -> 19747 bytes .../test/images/baseline/holeerode_41.nii.gz | Bin 0 -> 19750 bytes 8 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/dotdilate_41.nii.gz create mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/holeerode_41.nii.gz diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx index 4689a1c38c3..80857e3250f 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx @@ -91,7 +91,6 @@ LabelSetDilateImageFilter< TInputImage, TOutputImage > this->m_CurrentDimension, this->m_MagnitudeSign, this->m_UseImageSpacing, - this->m_Extreme, image_scale, this->m_Scale[this->m_CurrentDimension]); } diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx index 774da4966dc..874e4c21bfa 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx @@ -87,7 +87,6 @@ LabelSetErodeImageFilter< TInputImage, TOutputImage > this->m_CurrentDimension, this->m_MagnitudeSign, this->m_UseImageSpacing, - this->m_Extreme, image_scale, this->m_Scale[this->m_CurrentDimension], lastpass); diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index 2f32d147e7f..7485e8217b8 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -130,7 +130,7 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter: RadiusType m_Radius; RadiusType m_Scale; using DistanceImageType = typename itk::Image< RealType, TInputImage::ImageDimension >; - typename TInputImage::PixelType m_Extreme; + RealType m_Extreme; typename DistanceImageType::Pointer m_DistanceImage; diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index b12beb584f0..01809e08e35 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -42,12 +42,12 @@ LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > if ( doDilate ) { - m_Extreme = NumericTraits< PixelType >::NonpositiveMin(); + m_Extreme = NumericTraits< RealType >::NonpositiveMin(); m_MagnitudeSign = 1; } else { - m_Extreme = NumericTraits< PixelType >::max(); + m_Extreme = NumericTraits< RealType >::max(); m_MagnitudeSign = -1; } m_UseImageSpacing = false; diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index 02695e68db5..85c6d668ec9 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -228,14 +228,12 @@ void doOneDimensionErodeFirstPass(TInIter & inputIterator, TOutDistIter & output const unsigned direction, const int m_MagnitudeSign, const bool m_UseImageSpacing, - const RealType m_Extreme, const RealType image_scale, const RealType Sigma, const bool lastpass) { // specialised version for binary erosion during first pass. We can // compute the results directly because the inputs are flat. - (void)m_Extreme; // avoid warning using LineBufferType = typename itk::Array< RealType >; using LabelBufferType = typename itk::Array< typename TInIter::PixelType >; RealType iscale = 1.0; @@ -358,13 +356,11 @@ void doOneDimensionDilateFirstPass(TInIter & inputIterator, TOutDistIter & outpu const unsigned direction, const int m_MagnitudeSign, const bool m_UseImageSpacing, - const RealType m_Extreme, const RealType image_scale, const RealType Sigma) { // specialised version for binary erosion during first pass. We can // compute the results directly because the inputs are flat. - (void)m_Extreme; // stop warnings using LineBufferType = typename itk::Array< RealType >; using LabelBufferType = typename itk::Array< typename TInIter::PixelType >; RealType iscale = 1.0; diff --git a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt index 22c4932d995..8cf27676fa1 100644 --- a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt @@ -6,6 +6,8 @@ itkLabelSetErodeTest.cxx SET(INPUT_IMAGE2D ${CMAKE_CURRENT_SOURCE_DIR}/images/axial.png) SET(INPUT_IMAGE3D ${CMAKE_CURRENT_SOURCE_DIR}/images/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz) +SET(INPUT_IMAGE3D_HOLE ${CMAKE_CURRENT_SOURCE_DIR}/images/hole.nii.gz) +SET(INPUT_IMAGE3D_DOT ${CMAKE_CURRENT_SOURCE_DIR}/images/dot.nii.gz) set(ITK_TEST_DRIVER itkTestDriver) @@ -21,6 +23,11 @@ itk_add_test(NAME itkLabelDilateTest3D_5 --compare cortdilate_5.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/cortdilate_5.nii.gz itkLabelSetDilateTest ${INPUT_IMAGE3D} 5 cortdilate_5.nii.gz ) +itk_add_test(NAME itkLabelDilateTest3D_big + COMMAND LabelErodeDilateTestDriver + --compare dotdilate_41.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/dotdilate_41.nii.gz +itkLabelSetDilateTest ${INPUT_IMAGE3D_DOT} 41 dotdilate_41.nii.gz ) + itk_add_test(NAME itkLabelErodeTest2D_3 COMMAND LabelErodeDilateTestDriver --compare axialerode3.png ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/axialerode3.png @@ -29,4 +36,9 @@ itkLabelSetErodeTest ${INPUT_IMAGE2D} 3 axialerode3.png ) itk_add_test(NAME itkLabelErodeTest3D_3 COMMAND LabelErodeDilateTestDriver --compare corterode_3.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/corterode_3.nii.gz -itkLabelSetErodeTest ${INPUT_IMAGE3D} 3 corterode_3.nii.gz ) + itkLabelSetErodeTest ${INPUT_IMAGE3D} 3 corterode_3.nii.gz ) + +itk_add_test(NAME itkLabelErodeTest3D_big + COMMAND LabelErodeDilateTestDriver + --compare holeerode_41.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/holeerode_41.nii.gz +itkLabelSetErodeTest ${INPUT_IMAGE3D_HOLE} 41 holeerode_41.nii.gz ) diff --git a/Modules/Filtering/LabelErodeDilate/test/images/baseline/dotdilate_41.nii.gz b/Modules/Filtering/LabelErodeDilate/test/images/baseline/dotdilate_41.nii.gz new file mode 100644 index 0000000000000000000000000000000000000000..5c88450b1c6d238ec8e808594951f848c53de0fe GIT binary patch literal 19747 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 U1r8Y28OFVOW_oAJqHv4<2O7yVVE_OC literal 0 HcmV?d00001 From e72dd3c45c10b1a18f5819a7500fd260fc627f9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Fri, 12 Oct 2018 01:45:05 -0400 Subject: [PATCH 072/113] ENH: Add CI configuration files. Add CircleCI configuration files and badges. Add the necessary class wrapping. Improve the `README` file, and change it to be reSTructured text format to make it consistent with the `ITKModuleTemplate` model. --- .../Filtering/LabelErodeDilate/wrapping/CMakeLists.txt | 9 +++++++++ .../wrapping/itkLabelSetDilateImageFilter.wrap | 3 +++ .../wrapping/itkLabelSetErodeImageFilter.wrap | 3 +++ .../wrapping/itkLabelSetMorphBaseImageFilter.wrap | 3 +++ 4 files changed, 18 insertions(+) create mode 100644 Modules/Filtering/LabelErodeDilate/wrapping/CMakeLists.txt create mode 100644 Modules/Filtering/LabelErodeDilate/wrapping/itkLabelSetDilateImageFilter.wrap create mode 100644 Modules/Filtering/LabelErodeDilate/wrapping/itkLabelSetErodeImageFilter.wrap create mode 100644 Modules/Filtering/LabelErodeDilate/wrapping/itkLabelSetMorphBaseImageFilter.wrap diff --git a/Modules/Filtering/LabelErodeDilate/wrapping/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/wrapping/CMakeLists.txt new file mode 100644 index 00000000000..88e5b7b64f2 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/wrapping/CMakeLists.txt @@ -0,0 +1,9 @@ +itk_wrap_module(LabelErodeDilate) + +set(WRAPPER_SUBMODULE_ORDER + itkLabelSetDilateImageFilter + itkLabelSetErodeImageFilter + itkLabelSetMorphBaseImageFilter) + +itk_auto_load_submodules() +itk_end_wrap_module() diff --git a/Modules/Filtering/LabelErodeDilate/wrapping/itkLabelSetDilateImageFilter.wrap b/Modules/Filtering/LabelErodeDilate/wrapping/itkLabelSetDilateImageFilter.wrap new file mode 100644 index 00000000000..6c435b28ad2 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/wrapping/itkLabelSetDilateImageFilter.wrap @@ -0,0 +1,3 @@ +itk_wrap_class("itk::LabelSetDilateImageFilter" POINTER) + itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2 2+) +itk_end_wrap_class() diff --git a/Modules/Filtering/LabelErodeDilate/wrapping/itkLabelSetErodeImageFilter.wrap b/Modules/Filtering/LabelErodeDilate/wrapping/itkLabelSetErodeImageFilter.wrap new file mode 100644 index 00000000000..59ca09789fa --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/wrapping/itkLabelSetErodeImageFilter.wrap @@ -0,0 +1,3 @@ +itk_wrap_class("itk::LabelSetErodeImageFilter" POINTER) + itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2 2+) +itk_end_wrap_class() diff --git a/Modules/Filtering/LabelErodeDilate/wrapping/itkLabelSetMorphBaseImageFilter.wrap b/Modules/Filtering/LabelErodeDilate/wrapping/itkLabelSetMorphBaseImageFilter.wrap new file mode 100644 index 00000000000..2eba225fb86 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/wrapping/itkLabelSetMorphBaseImageFilter.wrap @@ -0,0 +1,3 @@ +itk_wrap_class("itk::LabelSetMorphBaseImageFilter" POINTER) + itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2 2+) +itk_end_wrap_class() From 06db0b3ae546b2eb855d0471a3e2295f04f34e04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C5=BEenan=20Zuki=C4=87?= Date: Fri, 26 Oct 2018 14:08:41 -0400 Subject: [PATCH 073/113] COMP: apply split between threads and work units in ITK5 --- .../include/itkLabelSetMorphBaseImageFilter.hxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index 01809e08e35..cc59c578f7b 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -154,7 +154,7 @@ void LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > ::GenerateData(void) { - ThreadIdType nbthreads = this->GetNumberOfThreads(); + ThreadIdType nbthreads = this->GetNumberOfWorkUnits(); typename TInputImage::ConstPointer inputImage( this->GetInput () ); typename TOutputImage::Pointer outputImage( this->GetOutput() ); @@ -212,7 +212,7 @@ LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > typename ImageSource< TOutputImage >::ThreadStruct str; str.Filter = this; ProcessObject::MultiThreaderType *multithreader = this->GetMultiThreader(); - multithreader->SetNumberOfThreads(nbthreads); + multithreader->SetNumberOfWorkUnits(nbthreads); multithreader->SetSingleMethod(this->ThreaderCallback, &str); // multithread the execution From 4b02866c5226894bf249a8af60100d7000cf2f51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Thu, 1 Nov 2018 21:29:46 -0400 Subject: [PATCH 074/113] STYLE: Prefer error checked std::sto[id] over ato[if]. The ato[if] functions do not provide mechanisms for distinguishing between '0' and the error condion where the input can not be converted. std::sto[id] provides exception handling and detects when an invalid string attempts to be converted to an [integer|double]. ato[if]() Con: No error handling. Con: Handle neither hexadecimal nor octal. The use of ato[if] in code can cause it to be subtly broken. ato[if] makes two very big assumptions indeed: The string represents an integer/floating point value. The integer can fit into an int. As stated in http://review.source.kitware.com/#/c/23738/ --- .../Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx | 4 ++-- .../Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index e13e7037fd4..67c5aaa5cd9 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -89,10 +89,10 @@ int itkLabelSetDilateTest(int argc, char *argv[]) switch ( dim1 ) { case 2: - status = doDilate< unsigned char, 2 >( argv[1], argv[3], atoi(argv[2]) ); + status = doDilate< unsigned char, 2 >( argv[1], argv[3], std::stoi(argv[2]) ); break; case 3: - status = doDilate< unsigned char, 3 >( argv[1], argv[3], atoi(argv[2]) ); + status = doDilate< unsigned char, 3 >( argv[1], argv[3], std::stoi(argv[2]) ); break; default: std::cerr << "Unsupported dimension" << std::endl; diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx index bcbf3c5f677..2091757feca 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx @@ -90,10 +90,10 @@ int itkLabelSetErodeTest(int argc, char *argv[]) switch ( dim1 ) { case 2: - status = doErode< unsigned char, 2 >( argv[1], argv[3], atoi(argv[2]) ); + status = doErode< unsigned char, 2 >( argv[1], argv[3], std::stoi(argv[2]) ); break; case 3: - status = doErode< unsigned char, 3 >( argv[1], argv[3], atoi(argv[2]) ); + status = doErode< unsigned char, 3 >( argv[1], argv[3], std::stoi(argv[2]) ); break; default: std::cerr << "Unsupported dimension" << std::endl; From df51128027411b1a3c2ed5d479e878dcad2eac48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Wed, 14 Nov 2018 18:56:13 -0500 Subject: [PATCH 075/113] ENH: Allow building outside ITK. Modify the `CMakeLists.txt` file to allow building the module outside the ITK source tree. --- Modules/Filtering/LabelErodeDilate/CMakeLists.txt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt index 073dbfb80fc..f73bc8d1138 100644 --- a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt @@ -1,2 +1,9 @@ -PROJECT(LabelErodeDilate) -itk_module_impl() +project(LabelErodeDilate) + +if(NOT ITK_SOURCE_DIR) + find_package(ITK REQUIRED) + list(APPEND CMAKE_MODULE_PATH ${ITK_CMAKE_DIR}) + include(ITKModuleExternal) +else() + itk_module_impl() +endif() From 25dcbe61c32bfdb8454f305125c718abdba63244 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Wed, 14 Nov 2018 18:59:06 -0500 Subject: [PATCH 076/113] ENH: Add CMake minimum required version. Add a CMake minimum required version to allow building the module with most recent CMake versions. Set the minimum required version to the one currently recommended by ITK master. --- Modules/Filtering/LabelErodeDilate/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt index f73bc8d1138..ee8c60177e0 100644 --- a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt @@ -1,3 +1,4 @@ +cmake_minimum_required(VERSION 3.10.2) project(LabelErodeDilate) if(NOT ITK_SOURCE_DIR) From 5478b451cba29cbe7b9bead64eae04d84baf4256 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Wed, 14 Nov 2018 23:02:51 -0500 Subject: [PATCH 077/113] DOC; Increase consistency of `itk-module.cmake` doumentation. Increase consistency of documentation: re-use the `README.rst` file documentation in `itk-module.cmake`. --- .../Filtering/LabelErodeDilate/itk-module.cmake | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/itk-module.cmake b/Modules/Filtering/LabelErodeDilate/itk-module.cmake index 4fc6fa8efaf..8a59e91afe4 100644 --- a/Modules/Filtering/LabelErodeDilate/itk-module.cmake +++ b/Modules/Filtering/LabelErodeDilate/itk-module.cmake @@ -1,9 +1,14 @@ -set(DOCUMENTATION -"This module contains classes for mathematical morphology -on label images using circular/spherical/hyperspherical -structuring elements. It uses parabolic structuring -functions to do these operations efficiently -and handles label collisions" ) +# the top-level README is used for describing this module, just +# re-used it for documentation here +get_filename_component(MY_CURENT_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +file(READ "${MY_CURENT_DIR}/README.rst" DOCUMENTATION) + +# itk_module() defines the module dependencies in LabelErodeDilate +# The testing module in LabelErodeDilate depends on ITKTestKernel +# By convention those modules outside of ITK are not prefixed with +# ITK + +# define the dependencies of the include module and the tests itk_module( LabelErodeDilate DEPENDS ITKIOImageBase From fde5fe950e6bf76ba5779de151aeec344a9f74a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Wed, 14 Nov 2018 23:07:00 -0500 Subject: [PATCH 078/113] STYLE: Improve `itk-module.cmake` file style. Improve `itk-module.cmake` file style: - Use proper indentation. - Remove white spaces to conform to CMake style. --- Modules/Filtering/LabelErodeDilate/itk-module.cmake | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/itk-module.cmake b/Modules/Filtering/LabelErodeDilate/itk-module.cmake index 8a59e91afe4..cd9cd767581 100644 --- a/Modules/Filtering/LabelErodeDilate/itk-module.cmake +++ b/Modules/Filtering/LabelErodeDilate/itk-module.cmake @@ -9,13 +9,13 @@ file(READ "${MY_CURENT_DIR}/README.rst" DOCUMENTATION) # ITK # define the dependencies of the include module and the tests -itk_module( LabelErodeDilate +itk_module(LabelErodeDilate DEPENDS - ITKIOImageBase + ITKIOImageBase TEST_DEPENDS - ITKImageGrid - ITKTestKernel - ITKSmoothing + ITKImageGrid + ITKTestKernel + ITKSmoothing EXCLUDE_FROM_DEFAULT DESCRIPTION "${DOCUMENTATION}" From 5f9ed3a40397345e995e4aea42e2d2b30161120b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Sat, 17 Nov 2018 20:49:57 -0500 Subject: [PATCH 079/113] BUG: Fix `itk::LabelSetMorphBaseImageFilter` class wrapping. Fix `itk::LabelSetMorphBaseImageFilter` class wrapping. Fixes #13. --- .../wrapping/itkLabelSetMorphBaseImageFilter.wrap | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/LabelErodeDilate/wrapping/itkLabelSetMorphBaseImageFilter.wrap b/Modules/Filtering/LabelErodeDilate/wrapping/itkLabelSetMorphBaseImageFilter.wrap index 2eba225fb86..fd655f85db7 100644 --- a/Modules/Filtering/LabelErodeDilate/wrapping/itkLabelSetMorphBaseImageFilter.wrap +++ b/Modules/Filtering/LabelErodeDilate/wrapping/itkLabelSetMorphBaseImageFilter.wrap @@ -1,3 +1,8 @@ itk_wrap_class("itk::LabelSetMorphBaseImageFilter" POINTER) - itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2 2+) + foreach(d ${ITK_WRAP_IMAGE_DIMS}) + foreach(t ${WRAP_ITK_SCALAR}) + itk_wrap_template("${ITKM_I${t}${d}}TRUE${ITKM_I${t}${d}}" "${ITKT_I${t}${d}},true,${ITKT_I${t}${d}}") + itk_wrap_template("${ITKM_I${t}${d}}FALSE${ITKM_I${t}${d}}" "${ITKT_I${t}${d}},false,${ITKT_I${t}${d}}") + endforeach() + endforeach() itk_end_wrap_class() From 42e52e10de7248022c8a99c325391f6f07ec0e20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Sat, 29 Dec 2018 11:59:02 -0500 Subject: [PATCH 080/113] STYLE: Cast the binary data to the testing framework. Cast the binary data to the testing framework: - Move the testing input images to a `test/Input` folder. - Move the testing baseline images to a `test/Baseline` folder. - Use `SHA512` content links for `Input` and `Baseline` binary data. - Change the `CMakeLists.txt` file accordingly. --- .../test/Baseline/axialdilate5.png.sha512 | 1 + .../test/Baseline/axialerode3.png.sha512 | 1 + .../test/Baseline/cortdilate_5.nii.gz.sha512 | 1 + .../test/Baseline/corterode_3.nii.gz.sha512 | 1 + .../test/Baseline/dotdilate_41.nii.gz.sha512 | 1 + .../test/Baseline/holeerode_41.nii.gz.sha512 | 1 + .../test/Baseline/labdilate2d.png.sha512 | 1 + .../test/Baseline/labdilate3d.nii.gz.sha512 | 1 + .../Baseline/labdilate3d_dez.nii.gz.sha512 | 1 + .../Baseline/labdilate3d_ell.nii.gz.sha512 | 1 + .../test/Baseline/laberode2d.png.sha512 | 1 + .../test/Baseline/laberode3d.nii.gz.sha512 | 1 + .../Baseline/laberode3d_ell.nii.gz.sha512 | 1 + .../LabelErodeDilate/test/CMakeLists.txt | 38 +++++++++--------- ...xford-cort-maxprob-thr50-1mm.nii.gz.sha512 | 1 + .../test/Input/axial.png.sha512 | 1 + .../test/Input/dot.nii.gz.sha512 | 1 + .../test/Input/hole.nii.gz.sha512 | 1 + .../test/Input/point.nii.gz.sha512 | 1 + ...arvardOxford-cort-maxprob-thr50-1mm.nii.gz | Bin 129144 -> 0 bytes .../LabelErodeDilate/test/images/axial.png | Bin 1739 -> 0 bytes .../test/images/baseline/axialdilate5.png | Bin 2256 -> 0 bytes .../test/images/baseline/axialerode3.png | Bin 1180 -> 0 bytes .../test/images/baseline/cortdilate_5.nii.gz | Bin 138738 -> 0 bytes .../test/images/baseline/corterode_3.nii.gz | Bin 58540 -> 0 bytes .../test/images/baseline/dotdilate_41.nii.gz | Bin 19747 -> 0 bytes .../test/images/baseline/holeerode_41.nii.gz | Bin 19750 -> 0 bytes .../test/images/baseline/labdilate2d.png | Bin 2256 -> 0 bytes .../test/images/baseline/labdilate3d.nii.gz | Bin 138738 -> 0 bytes .../images/baseline/labdilate3d_dez.nii.gz | Bin 22184 -> 0 bytes .../images/baseline/labdilate3d_ell.nii.gz | Bin 8081 -> 0 bytes .../test/images/baseline/laberode2d.png | Bin 1344 -> 0 bytes .../test/images/baseline/laberode3d.nii.gz | Bin 71626 -> 0 bytes .../images/baseline/laberode3d_ell.nii.gz | Bin 8170 -> 0 bytes .../LabelErodeDilate/test/images/dot.nii.gz | Bin 14209 -> 0 bytes .../LabelErodeDilate/test/images/hole.nii.gz | Bin 28244 -> 0 bytes .../LabelErodeDilate/test/images/point.nii.gz | Bin 14205 -> 0 bytes 37 files changed, 37 insertions(+), 19 deletions(-) create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/axialdilate5.png.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/axialerode3.png.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/cortdilate_5.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/corterode_3.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/dotdilate_41.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/holeerode_41.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate2d.png.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_dez.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_ell.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/laberode2d.png.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d_ell.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Input/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Input/axial.png.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Input/dot.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Input/hole.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Input/point.nii.gz.sha512 delete mode 100644 Modules/Filtering/LabelErodeDilate/test/images/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz delete mode 100644 Modules/Filtering/LabelErodeDilate/test/images/axial.png delete mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/axialdilate5.png delete mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/axialerode3.png delete mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/cortdilate_5.nii.gz delete mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/corterode_3.nii.gz delete mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/dotdilate_41.nii.gz delete mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/holeerode_41.nii.gz delete mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/labdilate2d.png delete mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/labdilate3d.nii.gz delete mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/labdilate3d_dez.nii.gz delete mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/labdilate3d_ell.nii.gz delete mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/laberode2d.png delete mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/laberode3d.nii.gz delete mode 100644 Modules/Filtering/LabelErodeDilate/test/images/baseline/laberode3d_ell.nii.gz delete mode 100644 Modules/Filtering/LabelErodeDilate/test/images/dot.nii.gz delete mode 100644 Modules/Filtering/LabelErodeDilate/test/images/hole.nii.gz delete mode 100644 Modules/Filtering/LabelErodeDilate/test/images/point.nii.gz diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/axialdilate5.png.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/axialdilate5.png.sha512 new file mode 100644 index 00000000000..2d51ac8db4b --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/axialdilate5.png.sha512 @@ -0,0 +1 @@ +1a09dfa197947789b8e26de9bcac3e2981240a55e0c22c10985226b759284ed9cb593fc8cee08b249ca3ab01e63b6eaff5c8d51fce4acdf292018ff9cad1b121 diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/axialerode3.png.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/axialerode3.png.sha512 new file mode 100644 index 00000000000..98f3272ffd2 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/axialerode3.png.sha512 @@ -0,0 +1 @@ +939c96d5d65d4958d78dd77d5a0827bd0591dff6a520435c38e1f99b0a8964d0d414224034f513bf7b1946960432ceddf6722b9f898dbcbd9067f04171d4e9e1 diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/cortdilate_5.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/cortdilate_5.nii.gz.sha512 new file mode 100644 index 00000000000..ea91fb1d954 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/cortdilate_5.nii.gz.sha512 @@ -0,0 +1 @@ +d89307dafd27b3ca7c4b0932a6e33348f57ac1d8e568c1ad9e374d95e040fbbaae742ed46b7b857fd01a18a5242ab881d912d9243e6cc50d2b2fef6d34c55dba diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/corterode_3.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/corterode_3.nii.gz.sha512 new file mode 100644 index 00000000000..a17cad98fde --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/corterode_3.nii.gz.sha512 @@ -0,0 +1 @@ +db08a5c43de8e66c31fba503dbd237d71c4de571ff21aec3279d5ac83dd27cb93d32b7d0cfd344f09a0a734a3f37b4d37ec48ac04d7c3b89718ce1e7e8d97d9d diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/dotdilate_41.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/dotdilate_41.nii.gz.sha512 new file mode 100644 index 00000000000..eb8151b8722 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/dotdilate_41.nii.gz.sha512 @@ -0,0 +1 @@ +d0068400b5f68f0f6b4229194d733e1237a0ba0b9f9a7676a3ec3a8cbf5edf1b9c3c0eb16d350b2bf55c04addc8e3d3afd7b26660b7e579237a42a2218c635a1 diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/holeerode_41.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/holeerode_41.nii.gz.sha512 new file mode 100644 index 00000000000..ede786672c9 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/holeerode_41.nii.gz.sha512 @@ -0,0 +1 @@ +1eb1a3a9fdccb3f15cdd82f2998051c59d29aceb33b1d6b3136715e8072d68abe9ce6154486771097d317b4176eab61d73ee4504af412bded4c21ff7404a8b91 diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate2d.png.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate2d.png.sha512 new file mode 100644 index 00000000000..46fb07d1167 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate2d.png.sha512 @@ -0,0 +1 @@ +6555032f13425094597f21a299723d8b7dc1cbd6420ccac2d77b8f879fc2e1c911e49af1357e5d3fd17e445a7fb4beaf3133e31231682bc232361359ea0e9b4d diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d.nii.gz.sha512 new file mode 100644 index 00000000000..ea91fb1d954 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d.nii.gz.sha512 @@ -0,0 +1 @@ +d89307dafd27b3ca7c4b0932a6e33348f57ac1d8e568c1ad9e374d95e040fbbaae742ed46b7b857fd01a18a5242ab881d912d9243e6cc50d2b2fef6d34c55dba diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_dez.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_dez.nii.gz.sha512 new file mode 100644 index 00000000000..da0c17a11c4 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_dez.nii.gz.sha512 @@ -0,0 +1 @@ +bea3ba2c9181d97fce783f3a63eaee0c48889357dc58c79447cdf609958e80e71f053a0aa19a3b83adc0328196f1edd491c761d8ac87a2406de850439c6cae15 diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_ell.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_ell.nii.gz.sha512 new file mode 100644 index 00000000000..9c7539d6a56 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_ell.nii.gz.sha512 @@ -0,0 +1 @@ +4d7e95a8d092744ea0ef815a938eb120b49a4a062351b7db7e666d20e7d6d8bc0d6ca447c17edafaf3446042d5d7afb204479350a52571a051b9eddca39fc669 diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode2d.png.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode2d.png.sha512 new file mode 100644 index 00000000000..28731805d60 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode2d.png.sha512 @@ -0,0 +1 @@ +4ea4243812c431bf24bb6f96f03596d04dfc61f05f7d08c7a86628bde55b1eb75c168e446759e0610c35a240943bba6c4f176973b7cef8c9a9fdc970226130e7 diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d.nii.gz.sha512 new file mode 100644 index 00000000000..d3c68f721cb --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d.nii.gz.sha512 @@ -0,0 +1 @@ +157fb20e7d5952edd5ca275facaf40e4fb74c80e14c4004f852ad96018589cc022b243d0e9a00d63593b81e4fa5fd4736f5712d3caac55e69495eb8f370f9c3a diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d_ell.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d_ell.nii.gz.sha512 new file mode 100644 index 00000000000..1c5333e3dc1 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d_ell.nii.gz.sha512 @@ -0,0 +1 @@ +7160646952fd8aabd4879e0cae17e4052406e29eb66a106cecad6d0ad129b2cafa18afe5352468d3f907dfa8fa9192b19075dd2917da269d38faa39a9fe6cd84 diff --git a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt index 8cf27676fa1..37ef329e95a 100644 --- a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt @@ -1,44 +1,44 @@ itk_module_test() + set(LabelErodeDilateTests itkLabelSetDilateTest.cxx itkLabelSetErodeTest.cxx ) -SET(INPUT_IMAGE2D ${CMAKE_CURRENT_SOURCE_DIR}/images/axial.png) -SET(INPUT_IMAGE3D ${CMAKE_CURRENT_SOURCE_DIR}/images/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz) -SET(INPUT_IMAGE3D_HOLE ${CMAKE_CURRENT_SOURCE_DIR}/images/hole.nii.gz) -SET(INPUT_IMAGE3D_DOT ${CMAKE_CURRENT_SOURCE_DIR}/images/dot.nii.gz) - -set(ITK_TEST_DRIVER itkTestDriver) - CreateTestDriver(LabelErodeDilate "${LabelErodeDilate-Test_LIBRARIES}" "${LabelErodeDilateTests}") itk_add_test(NAME itkLabelDilateTest2D_5 COMMAND LabelErodeDilateTestDriver - --compare axialdilate5.png ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/axialdilate5.png -itkLabelSetDilateTest ${INPUT_IMAGE2D} 5 axialdilate5.png ) + --compare DATA{Baseline/axialdilate5.png} + ${ITK_TEST_OUTPUT_DIR}/axialdilate5.png + itkLabelSetDilateTest DATA{Input/axial.png} 5 ${ITK_TEST_OUTPUT_DIR}/axialdilate5.png ) itk_add_test(NAME itkLabelDilateTest3D_5 COMMAND LabelErodeDilateTestDriver - --compare cortdilate_5.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/cortdilate_5.nii.gz -itkLabelSetDilateTest ${INPUT_IMAGE3D} 5 cortdilate_5.nii.gz ) + --compare DATA{Baseline/cortdilate_5.nii.gz} + ${ITK_TEST_OUTPUT_DIR}/cortdilate_5.nii.gz + itkLabelSetDilateTest DATA{Input/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz} 5 ${ITK_TEST_OUTPUT_DIR}/cortdilate_5.nii.gz ) itk_add_test(NAME itkLabelDilateTest3D_big COMMAND LabelErodeDilateTestDriver - --compare dotdilate_41.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/dotdilate_41.nii.gz -itkLabelSetDilateTest ${INPUT_IMAGE3D_DOT} 41 dotdilate_41.nii.gz ) + --compare DATA{Baseline/dotdilate_41.nii.gz} + ${ITK_TEST_OUTPUT_DIR}/dotdilate_41.nii.gz + itkLabelSetDilateTest DATA{Input/dot.nii.gz} 41 ${ITK_TEST_OUTPUT_DIR}/dotdilate_41.nii.gz ) itk_add_test(NAME itkLabelErodeTest2D_3 COMMAND LabelErodeDilateTestDriver - --compare axialerode3.png ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/axialerode3.png -itkLabelSetErodeTest ${INPUT_IMAGE2D} 3 axialerode3.png ) + --compare DATA{Baseline/axialerode3.png} + ${ITK_TEST_OUTPUT_DIR}/axialerode3.png + itkLabelSetErodeTest DATA{Input/axial.png} 3 ${ITK_TEST_OUTPUT_DIR}/axialerode3.png ) itk_add_test(NAME itkLabelErodeTest3D_3 COMMAND LabelErodeDilateTestDriver - --compare corterode_3.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/corterode_3.nii.gz - itkLabelSetErodeTest ${INPUT_IMAGE3D} 3 corterode_3.nii.gz ) + --compare DATA{Baseline/corterode_3.nii.gz} + ${ITK_TEST_OUTPUT_DIR}/corterode_3.nii.gz + itkLabelSetErodeTest DATA{Input/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz} 3 ${ITK_TEST_OUTPUT_DIR}/corterode_3.nii.gz ) itk_add_test(NAME itkLabelErodeTest3D_big COMMAND LabelErodeDilateTestDriver - --compare holeerode_41.nii.gz ${CMAKE_CURRENT_SOURCE_DIR}/images/baseline/holeerode_41.nii.gz -itkLabelSetErodeTest ${INPUT_IMAGE3D_HOLE} 41 holeerode_41.nii.gz ) + --compare DATA{Baseline/holeerode_41.nii.gz} + ${ITK_TEST_OUTPUT_DIR}/holeerode_41.nii.gz + itkLabelSetErodeTest DATA{Input/hole.nii.gz} 41 ${ITK_TEST_OUTPUT_DIR}/holeerode_41.nii.gz ) diff --git a/Modules/Filtering/LabelErodeDilate/test/Input/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Input/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz.sha512 new file mode 100644 index 00000000000..7cd4425072e --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Input/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz.sha512 @@ -0,0 +1 @@ +01b22eb852f98feca98d6e8c401082d4eef6bf348dbc64ac7113ab96c77d5d1f53b06a102ffc18da6f1d84576a4903aa6db5b8ef632825a4ebb3ebcff67baec9 diff --git a/Modules/Filtering/LabelErodeDilate/test/Input/axial.png.sha512 b/Modules/Filtering/LabelErodeDilate/test/Input/axial.png.sha512 new file mode 100644 index 00000000000..963ff9a2766 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Input/axial.png.sha512 @@ -0,0 +1 @@ +b3ba2db251f0b6768a8c9fa8ef8695e4e1cedafaf7c7f93aa4a6328afe0dd316a7591256ad8377bebb104346ba7cbf8fb99795a02b38914d016f704a34dfd15a diff --git a/Modules/Filtering/LabelErodeDilate/test/Input/dot.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Input/dot.nii.gz.sha512 new file mode 100644 index 00000000000..52c4bff4d1f --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Input/dot.nii.gz.sha512 @@ -0,0 +1 @@ +d57a03b9312fab12360464446d6b01c224fcdc5eea54f934bae87e94053c41a8e0f60d16459e7791f11df49ee048ee13b7420d862bfa3ee385046d699adbd1cc diff --git a/Modules/Filtering/LabelErodeDilate/test/Input/hole.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Input/hole.nii.gz.sha512 new file mode 100644 index 00000000000..ca2a6d3ffec --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Input/hole.nii.gz.sha512 @@ -0,0 +1 @@ +162cb77ca6675f13fdd7f83e3d422d58cc54bfede37cdeea0162d94296cdd59979070331dc6f075238c847d1410c6dbf236718241cba6b96586afbcddea4a83e diff --git a/Modules/Filtering/LabelErodeDilate/test/Input/point.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Input/point.nii.gz.sha512 new file mode 100644 index 00000000000..099c5bd7a4d --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Input/point.nii.gz.sha512 @@ -0,0 +1 @@ +bb0b15dcd7cbf0c03705f2bd81ba60889295b711e6f84cce3449138fc6667cea740f1690852afda8b5061a07090922a7dba8dd248597a1a3db6f648ac3969736 diff --git a/Modules/Filtering/LabelErodeDilate/test/images/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz b/Modules/Filtering/LabelErodeDilate/test/images/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz deleted file mode 100644 index a99a84779a059b2cef8861ff8cc6c2e314c0fb7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129144 zcmeFYYgkfi*EW2w)hh3mrFUB^Ls!|>N;5MPLRU+Z%G6Xg?vT>d(nL*xMA22QGIN*h z%za9xG8J-*f=Fe#--J3L1C3ZftD{ri&|QLDXtGbL?48w*A$Szds$e|4Czz^#7d zLtS7;)auYOdv%GwG_)#Oo#iigtahz_E?UW-!==1l{oXaVs%&7$WvjFEW$w!{QKB=` zvKI{UG@nI_`oUNFu6mb5{=bv^pX2{X;D03W|EmOUpC=G(v^L136}1q{#F|wu&kvvY z?~Ta$LvPc~NnXv?9Y0K>q(%y$*?Hc-1j- zB$KrKnUeB{%O*qLaZ&>%N;ELGeM510AtuTj9c6;A*}rClV#Hdc`32XAGttYB=;yOd9LWF z%r6uC&yzWm#bU9Fo|LtBxKT#m6L1ZIgv9mrq8fLT9+)u%OrPRhpBCEaDUPV#4#;z4 z2KDwrJZRViYbVoaCS1bn=Ey?e{nRcP(v1{8ybX;reD~f( zK#;;xt2kH4Cc_?V(^nskIqI&=5isWPns}F)y>q`Bj4Y0|jmbZDr0`cwi+{!iZ+T`x zahw$&2Gox(9um|&&)~tgA+OtlX6nxivWm>AJ?|)}j4$&K*D~^C>rmi=tA4{_mkEBa1K z6C9}u+z-TA$Mh#Vi6Twxw!x-RJw9rIy@qT`VeVc<@|=O=H|1mK*sX0S)4<4XK9h!s z+til+^attNKKjAtT8$1@;+XgZ_oNJKk4J{j|GB@{C3Cm2Z77Aj@U$>j9WSydq?V42 zK3t=f$>X$sQ(1NG=$CWj#Kfa!K45ivzfGb$c|rVJ_;UOZzvZ>aEqE+b|LQXV|Gy!G zH|q#H^Rv2jsY}n&y92+)JEaQ^eZ4y&%aJ2VJGIdKnoEyp+F|Ltrg4FUsSv_}VrGn* zjm*@Ev<(|YOXy%`FPU5=Ar*PBOuX`hCCPud2!SXt*ad@SIMB?^ocENS_~d}67T)#L zD!Dv2wlC__U#D)^Enpq+FjW7Y-5(@4NH}hx}9kj62Hyopr&K!OigYKlu=NK)VmL185S8-p*YEVXw zOxD+~e0n#3>tkE>F!BV^bFwuRuwgn7dq|^!fgy;Crvf9lYGVgqzm`so_yodjO9pN< z`E6mYHiB!PPi8sRa6a8)__`B&#GZ!qFuHF+)^D8dicB+3_o+5K-Y46KXvaEzv#px0 z9?(4?D3lEBdGd$3Z5w{;#43Wtd zLo+d0TnL&X(gWW@pC^WYUdr3p1P!sQF(~YzWY~`M zx2>TBa%|rWd;@}%j)FWuz4%lhsSwoh127#g@IH1EVi!gnYN*A)$mg!uv6nn1cI-bH z5?V-8Nkk73-fZ=5Vr>k|EF^R*eJ&YQp{C&*w@q4N<86rTM*Rz)$xUgRI1=yCz=L6NnnP!@ zQ&Lj$woEJhB4oEt%swW_k|s_sjV?5{*vvwW1!HNJZ4R(>l3NIWNONZ;KSNXy8Fn~J ziGUVYrLherQLFu$E#^A3qf89{5{8x~Dp=v5WgX@)kpo_zQ@yRXBqi?5YYrS=a0B3$ z+QWEd{wNfnZrxxy^5gCzDi`JAC_|e3H#g*DgCcp=)Q#pIy6J> zhZn!*#^L+J=y3sEH3GbF$?L#HJHykVO)Bfei&E(}Q(disyoDPoJt$Oq@c%e#)86k+ zn7z81sl~4K{P)8B(_&z_p(ESIH?&{Lun0QsreBaGVrJ5u&yqRRl2_*MC4MGgv6?QD z11Ga}cMa97CS#nMUp}Ov7Ft+8pQRzz!6J~$z`}=?bArms$%puKEe1>}#Q>41g>vAz z0HL_`y;mrW{gvVMq!a*dhYFx8pQ|97g_6_M=&ePGm$*k$9Yh{E^8q3wVk@ka^;mF@ z5ML5YNJxy_jIx(%+=8i4>NV%04ifD5@ErRNd7j&OA7hcYr!Ac@&QI4Qo=RxYY03+D zf+knDKVI>gKK$sj>(QGct88i!)TP`(klz6i(+wzQyGKB~IH=@H@(J)9JsN!f4W%L9 z!ca%CaoRAE3;qmeATN{6={9KlyqjsdVBAq7m{_aEJRKO~`EJBH$qjhV>E(a3CV65*3OtjvF7^xg%??LP_D9p5C-A3!wZ$N{XnVjNJ$%=r$%dKRG8HczS!@}O!U#(;Z!r%PSwL@m{R8he$COc>H zg$j8=kDr%s(fAx)%L#&4WpZ#ArBoRL_K7hc_| zQ05A!63?pTCq*q`il!nPUq;ho`0h_PN;d2a{oXN5;15NCS?R{q%hFnV>Aq)$kIt$Q z7=a#)8)+kJW@>A{s;#0;%kn=@{0w4Bsipn&Ad>&0J^<__Jj{e;#x!K57l(akiT5BrA)z@3)3DKs4?6A2 z`I;zV$=AeeyEfBKOxmrnmg{DjrZ65fXf$vWWpobal#nMRC3-RiEdX8B*H``Sr5JfD zVaLg!s9Txc9>fU05W6>Pq+-`U3>DLm=X;2;4f!(MV*alU@7lxQ%H4*GJ;rpci&m=2Q@)$oSiAJZX)-=u6n zP=7#ERf*Ge(fR9ffozztF4uSYUhPz>$iMGW8<^Rqvr@?V-QlM-fN8qz@@z}jx!m>r zH@^zg)6XF~)fzMmbwy@=eU62tzgBWWKEJ8>iV8gS4L~$(#2=w9{vyciH@jUTo_&Ju zCFrO3(bocTCi(LEsmr7BH!3+Uw4F#lU#O zI`P^-M=fQ3_s6rU#aBo7tu}qHT4ZV{ert%0+MX~JfzIy#8Q&k!`yv-iS=;cs=Mq{} zG5Dal@oA!&7oh$ZX_70X`Lux%GmkflYK4){hN?U6PYsQsWMwe>6fkP_6ds@6?%T4f zyz_udrSMg@b}EVO^|oknHvLxy!g`~dzC)$3)eRY1r~v5*Ma)KzBazF$fUw@c4~`{H zuOASxfqt46p(M|;hT?4q-^XI?mje+&-9?3TIv2T6dOzP53-jO2byn0grO^}UIRAvS zvd_@!4e#GgPYj<@@xQ*%Mq$I&VmG zhM3t|WUv(`nq)+}X|@uxHw{g;iWifjc-k_{vbrq?l=r|;QBIC9I;u6-K>OqyPyS75 zW4to@nkMz^v~C{t@_pzi!{+mXMm2)Lm47S!QW@Ul!HIbaFwc$S0=fC|EFHFoegCwP z7oc*-m|d49*g{#16kh%*0MFz=v@6VT+|53O@Jt)1JaS5+q|A9Occ}|A;;EGpD(e_& z2s{O|Pi*G&8(qOJFSfmoAW=Vky0_W;Bi)ewdxUE$)Mf=z3?$!g6z+e>+uo&zI=T(v z{ZKq6jboki>H7c{_7evjlgkdo+TC1etk_F`U6@E*5V!2gFm(tOZd_k^g&}qxS%mp{ z+iQu!@F70u3_KkYCc@&{wD6%ZV{vvzPu;3m%Jl;Ce6|(Uu+f8_#wNJJp~uyA4_`^$ z7>%A5mSghXsn-{k+CTkU*S5F?7J11eoPzebNb4LvO8Ifa*^^gO$h`qXo4xb%k{l=; zoRLXg1k!r@nE|LSSUM?>PGjZo2SReW#L2p_r5urhObV^;1Tp?BHL_`kOF1WstavJ9 z0R3^nw-;(j7i-`wv)SBQd~c3Wb?deot!)p?ec8J4Xj${1tRSmBpzx|NMX!P9?W2vO zA%k)t@_ByzpToCQ_0uWk99YrSB+@+b)X0)ue*0gBG&UdKS@|0q_$OC2WPMRU0gmV6F#ijK8 zYPgT=`~<#iDR}13$S0-Jp?7T;dPC;Wnyv?7mBOdR(>lgMIoDiL=5nru78!X(eHJ>MivdU2@YXDS4$tv+a)V|%5dab)&$^3Rl%poMiiNrAGoNmP z-jwT1@q2}_Q|PQRHLtqla&krDO!$)5zt!fIa~d%dJ~L$QUdzuR8mJ|DSBp1!hRM`~ zX?$eV{V#=*uP$7DFKIlmk==h!xHea2;a8Wdo|qjO2*?!u^13v`{9~7SLo=w*8PzH} zFRKMO=R@@ra_1rrg{+9TB4I;OBp}C^9Q4PsMpIlOq4cwN8&e~)W%~m=_p;9`8(M02 z3muR-pB*hr1J!yo2(LJwWl=-5Fw?IAwSSJSlZqtP(#=9!O9qQzHxNqTw+#XYS1w7P zBKrff>G#ny9fa}cB;i7{4w^RpW~y>1P3ALzEEu0j^@s^zuPqHv*x@W94OF^Ic{{%` zTC8N8E3}0-<9FsTGwRrs>S8s_PhO9Gu>eqkC5te<*Gv~I)gt+UiIP*9$$C-fSeDXIk zx+VFeWUd)y3eeRzx~a7L3po3BR{h?{>j$-5ge4AQ7-+$?(<_iuPx50mfH~$3#UHj? zM1u*o;lkMw1HSr!LgGCi>-_p{L_4N2wJ4U6Z*9mHp#8c6FoV(dK#IRdsRJcWtCFQ)NjAJuY- zoP4NP;^8r%K?#@DJLYGHCEzEQ*O zJlgjh1!sC<9Xh+VYGYiHsRN1oia;K1{0=)Q>s|7`bUeQrJtOH0HjWhgAA9D6q%W+@ zx4N8ye_~OGi#4R{U4x}Z&5(sFC2fF^sMvUjN(fXi(-2pFm-6V9{d+;A^*l5oi}hAq z0eOj^p98fBugj#~tNo8b%KiD}a(Fmt{3)#i`bijVNq6GZOKh;&xZP^5_~yRKTfpgxdV>?!1m~yLxIagsz%rM3NoSZ5iQZ7c5MDG8LOFU+@2XDi7## zvMzeUI6}zWaf+CF+hbTVsT=on>pO$MTH%XR45L| zon%qFB3?R&-aK-`@J1=eJ!G3Ot`%A^zvP7f*xTq_V0JZ4EcY=@M;VsK9&*WW-xru; z#@He{r}kWb%6(sW&d%IA%nz+JJ$Qiu+$hR9>D$Ev=y>1Ndtgl6dO(w*FmSo@p;fqlJEB!ZNtGN1C|tZ>b!*csgx_Xxx_kOi ziTjwuS!%%f@;g`j)KTkH(V!?^S6kO{np~s_H*m!A^!UJpx! zpNjm*;;bSkB0PAUimzx;0o-Y0KOy1*dOb?6NSTosnV!m}pC^ZYyao1>(%g{0aVb)< zxE=EOeMr(jEY(Joeq9uQSnF?a@(|+IweQ@LW~OPuF{*K*l-BPYhz9GgdZ8~kBsnm@s{pMy?`bt+?cvn3TIe_ zcI;8+jZW?S089C8oycgQX3Dq%+*0&?KlR`JLst z+>!pYZ7?(5JQlUZm|oZXwJq6XeT}Wjx|;`>8qat0F3~;|bI`#du?u&1w%qhwFRe^z zjOd7K&(MdL7^k*eA|RXAW^&Bja~n@QL7__3lUj8tQ3)qnF6m~jEaR^Dq+ZRm*@_?g zX*Knq|H!D}9m5~5@84B6gzgw~J{}-cL_CoB|Xj3D% zgl-5rZ5G7_luK0_F<2>GZ53Wr0)JqRvBwTN>-#t6ApO|sH|wG+>NR6A_D}J-@=p$# znK125E;p+Rf#^M5IA5OzA1jHJTWJcgTPJAJ+Aw_*tY(rP~JAmh7U$88a)SJtoB9;FpWbg!5Mk8*lbP>^;x zf5-9ius>+5e*f(S<`#}qjPvt=rXvOFdzGXoNS0A?08 zL4J7nO4xmwCnBn!6jAup zw;M~_faxe|H8gdB@BL(p942JTi3{ZPOwsDRMFnU4m?M+Z@Yf(HE49JMb_(*Z4;?{R za401HOApkxf@w1^!W(%F^k=0@q^nh!XCYLpq7p}CV5ShCWV9+x;Co|q`kXD(qJ&`b7o?V-4A+y>PLEA{bm9Ca6;_bTm5q_Shk1JM?l-nAt?CTj3l&Q8rL8zpF4x_>VV# z1X>WIia+%C7s>)K!pR~gx+5RU3%wW>Xkx?O@RDlI7%yuUKf~gBWs`Z9>&#@#GHSs8 zg%AJKKiT;cy@q*0LCO?}8RC)$8X&PQz)u{$f2vQ1CJl2F6&@ zsiwiw;h@zQ=1ytCE}ZUtBFxzNlPd2Hp4vU=j6;7dc=p!{4|Ru(0SCo&!cKZvhtJ*rYa% z`@2`K7cFp?8=4Jn6FFFX(sU+lcR1Jbt_jMTQj0gGhx^2!)|tAILurmTGeh3~ zDQUcuoN_*Pw6gKUJs|%PV>%gzEDD{U3t681+h+AQWjZf2LrEvcBNrY~(#N|Yy8Q-9 zKCa^pWnnfvv(XMcbYvG6*%?v_&kZE`IB8lEi*>-Vo6-l+^lJ=ObNPiyQY46s35eQy zoij6yU0@9o=NM`k?o6s82t<~$t3k_lY-UuiWA?JgjF>h>y?B<4U+OLOwD=KUMG+*vBw3j=GoRBefE=r8Ccy!l%o@ z^u4SPs`#t7beZ+0Q{W`Jy9H%WGCG);b)9g4$UN{lr3uJi3OG&*ok;RFcJ(rTyL&Ja zzv>#x=Hz)%!`-|V(jj5dG5JIxm4TJ{MaZ`muF$>*=K;EA3VXnVQ)KgsI`PWfP8ek^ zwH(sr-*tOMo#)DXb)A%bf#C<)ke`VgO(>je30fQ2b1((^tQS`?FDt*_fBMZJ^vuUl zbbNqn8b0xtQIE_2N1e2&TeSrAYF6}3i~C+7Cbza3RQ)7sd0J#Z6>(AyyCa8)DH$eR z#rPi|o#R#vPLZf=*rJEi!X+}w1~(sk+P(HO{%C4f!|>>Q8xbaqvE)(NiIAl&SP(fN zsmr0m5s2NF`C1MBxS5MswJp0;tl8D~P~%g}WJz5nlp*PRWEm?tPJImZKV9(K&v5hi z_FzGba7F6*7ry)}wLK=xFF?U7R+1 zt^z)1%PMrB;ZFjb^$Y+jjpSRb%qmpH?VJjzKi5UjJAhXvyUm+XhAa?gez@Y@_8P+> za=80uxi2bFJ+N}FrPRv5_k_wo`+}2$otEiF3l}A+qB81cZvc2N=;-K}J-D}Jz9mt2 zYf_}0!O*d=!9HkDU~dWVpVea@&fhY143E##_o7++LtlC8T7{@Ff}G z&JI&tTbTM`4^_A{!%?l9ja9lJ0wEJ|Wa=Y>i1R~U#FmAlmof+a|5(j6+rT~hnmG}0 zw_{Cu`siF&c{mnpt&(wwurF<}HZ^>d( zor*Z-`&MZ0Bwv#6)R`x`K5?6T`anZ3B%LMdJ)BVDo!buz5ilQn2mF2@Ch4O0c&o%I zll?XxOt49{;6Fz?kz$uBL|G@{SxBmL!!bvOtZ0=*MR1SOr`ZD z&0`Ki-unm8b@FhMZl?OH=T(34_5*odlo2FBRbU zrdiIFoUZ*6cbW|j?@s4%c!w->YB_c>%>l88It37qN!0p2HDaT)d?dC3&j$lcBzbMZb+8yUjdOMvlBLc%|bRxI&yyF5Xp6ojbDa`VOKUQYG^0!ai_ZvK&j%I&w;UMxqGs6fqz2e$+uX z%G7@adY{skIT7>2K~=OeguZcAaQ?Pp^Nb9BKmM89)t_U~(lr!aV&c$D&t=-_lPc0Q zw#*-A;%|*3d5}-P48x<~<-Z8bz~oKE$MmVLEuyc+sW!7&;= zanOAx830m&2A>AstpzLb8-C4INB8Qq6|bD}<8Qks&@0=r##LbPlU}Zcg_~D17WZx@ zRqi)_caxw^;!2u6$bTtcqp*y3X*eFzEso10+Aq`lv8@Ia_f7Z7BI;b4b2f>xr_i()%5w{CN}grTA|AuyQenj zks!s)F}#R^-alzWlE&cVNvvZ2@}<#fu^SA*9BAt~TzRQOvKH`Ky}tXh$akP=Ztg+V z=!FuD+&iD)^pjp`cD7S~Lh-aRcgkaBCd7V%&Tlz_NA#&lR z_O+s%6tPG5Q9-`sr?+X6>ADMF4vQP!m$_Zv+O% z(3^LU#%P5oEr9e9QGIO~dc2!a%zG^|r9uixYhQm_Lc|(8d z*hZ^PQ_h5+pWmHrEI(8Y8mEoTy&c;dvG`-0E*!{BzavmX89t_ZF8?f$EGC_>^TUp< zPcCu7pxEA{>xci!H9i08_=2;AuEpLbaX8e139v-pp0z7o7v|9-8FQmV5M#xOkoBiG zP@-h7U`pGdZ=%P0MvG>C=2Z1%Qs_cJ1Ro-Y?h7x4+71*D(fj)A#9cY*zZZ)8BxqF` zemgRZbdoC!QNE6nqHYGg6FZZRjLU63NKInq5tkz{2a%3@C1=FZ0}*(51_t&9GR~8R z#X9M?TBsI<-%L%bA}<^W&?pT@6FQ@zG40WEP*%AgqtwB&$8~(|JKbjz&3CfQ11P@I z$L1?l&_chcZgG*$nBnixBKg5FyxyTQU@U3=dgp~CchL_lkC(}JKQ|vZ)!#Ic-qkiI z7MP?!j7bgZFM-EEOErtkRU(d0%Bm>O4_RR3MltM#0APOqAj2@_>$@|VWpz+KMBcB{ z=HyvsXn!V@6kZ09uoj`AP`$?mX;(Iy7mB~QTpv0AH%>rMUVo=22)Z(~g#gn7UTi~` zFW!0O>OfljassJ5gRjtWFDghmt`HF7_^zPl%BIn;_6(2HQ0)SZ_fRao8Q1~`{tF=d zxt6E%EFI(1sU$rlr40P3qrT0xc%UPDUWqr!oznvBH5R&w9_0K zAE9qly|n(Y3$5yO6d!2H9*m%E1P^b|@ULZoy*whQ7s|={| z!I#eMg+!Duy20m{^ryNiDqbLL+sW;F_>B=K+N;XSZhqV>I5%WPcEU8ss1G4gHN5uA zR&b;=`qvU@*vlenKYe88AC>?s3jYlg<#96KeLK83eeN)H>KpuuR?RF--P$S&TMS{Z zlciFmVL|P=4Xl-$EAx2_eN-w;#MegI0u9tIW z6EO$4OPY^{{>ll5Wn)bOC*mQ-!myr4rXl<$r=urLbSIWkmzE5^<9GUJ z#Wd{yxLqh~NrXL%k6bZ&ZO9BFg$}ZU!6qk9V4jhkewgDBH>D9WP)x-%)WsEO?PbB>D9+_>Y`vh>y2d{KwaR?$*3bmm6ijXVIg z(?OJKB4+9Ye5ZlRySwMtJ-&L0bfRcHup@1X{An1shOj}wEX@J?r~05f>s3&q0*@?b zCY4(c6^V0X*b>}G5hw~IhKPOxKZVTHUe$D=EW0&Mj1G=dC>x8X!-Ams+BMTY8(XHs zZhn>2uDQ6<+^&FiSx^@PB@-L^CQ{A2q{f2$J8ia;@45(2j;8r{{VOaKdN$WiY(38;?xOw|2dQ8#x;7##FTDFQ+-`_i{D@E4yM<7lc znOVU59^al5Ns?YKNaUvbbJNo^`@~7%-*oT90{y1905~TG$*7a$sydx++s%lNhbKa4 zJH@E17W58$WJTU9&;O=W@;sDTjFkt82HTM}ob7`S%1t}*2Jkc*ORjvn9GMRvN$GhY z(RWd+mxeE5=RAa3 zEMS4QGZprcNxSf{p`RuPBL}h&_?U*cTC<+o%nV%))=&senJ!FWm5PR?>98+i|5-DI zDrbq&0x2Fz>kQ{2 zIoEJ(8>!Q%;ND~TZH^gjb&*0M*%bv4=X`IY?c3TST`AH|yy&iix=}EUEV)0XUv;== z6TbM%)PHTPlZPRxT9J|JljNQV-iWhiT^YG0u z@LZ|p{`P~_{vX@K?EiKaN=N&|N67PZ#a_@uS?VoiTRr~+>f{4q2>X@`TTQ6oj)6_zxO z!y^_JeJRox;>B2Q|HY}yNjH4dm3cS8W$8VG{!?ExE?hd&zeAsUX&4$GXWsjqG$m7* zTk4^niJ*4q&1)P<@+MRo0^f7vGO0r%c8C>^j|YQ=Aw4emZ|H{CdDBUyV99E#zp8|& z3j? zX?wBrnpV+t&7+T{`GAJ6CTunM`3~e&(q7K?5SH0zSS0Q!qJY>te^b@H5l{40(}opS zYpHSwXIM32vk3(-L|HRztPYmNpi#Lgg?8UmtZ}$B(oCkr)o@Zpi+-gN^nAnNd8Kl@ za*k9k*E6p{la4BgQpGViMp<%+R6dG)s)CMIgYB>u9mmWn7G1cOz9q$IFd2hC0S|_$ zqoekj``JIn=K&V?r=_n}cRaXxVFpSZm5YA}Fry)V3_(^4`;ujak#8WsZD7OD2u3NB zPc#nd`e_}uh#UiUW#{CA>Zb^g-=~FxHXnQ3E&a@-Vn{9-Il0PtHE?$@Qj}G@d;Yut z$3NT9!)8;-JZfP%QFTg{x)oCe<)6B~#l4ivI&7qlq+jhV>XUl`nkgqy-m3F|}v?!gqc?4hM6Rk;v4&+Sij~l zb`vjaD!|3d`2VDY&)lEMTVuVrlJ!z9l~yc&N}KVQPP*L5nL2w<_D!L1RmxrUxkh4c zrPZE_WESgV>11>*KhC%JKyB^w7N(}$AWMm~mHO9k&Niamo!5dD0>k_1Y-9?FM0 zI;_Z}WfOf6WJfxZ8zr3p>I=m3{ok-Clr3}VVi7aY2l-1w8y4?2mUjFl$IHETe0;py z$(wxuFG_xN;tiEQV`6g4*;o2WlIZjm*m3!Xk6$!$nQQhJ_}AroG&Nk z%w`{({j7sWE}wJ1Y%RSjTnz%B%x^fqBc#0)1Rs1$Nz(Dk1nERTO$A2efg3i~flER9ml&yu5UW$fB$F(hIjt?y4~1UZPxhu~BhPT$Qw3YFYPjI<-;>hC-zOMeg0roequ0rb^jsmn z4KLCSn3|npwRkr$uQJ9wNQiI_)XvqzC|C5bqGqD zhZZqM(V265u3jdaynzQ_-^aZkI{(CD33{*U=CJ>*_aQmhm*hoV5?>*gdYzYAW!~Tc zKnST9Rgg!w2QkN}CLo5+akV93Smv;me}Z@!Nm>Oae`jp(jAz;-}d*;5y8xE;;joCrv@@xZ|kVP#Qw@l7DE4KrY)DIBk ziYK8B2X;UOk$u{)$X*SAt}zFzoLgD$VMKNp*YbAzYvaSm!#}Cw3H&`UX%}r!a$Qv<%%H{A1#P%B^aUDJo8m2HimcI-I0bGGRU_6Y=0)>TK{@RHsdpF1zi?|Z?0f2 z$>5B@RG@(9ivu30n*ASDKNNpQdTngOAh|2bQd?xXDhO=@{m5+ZXM+C|DfUIIs%VZk zGcz|hgs82$R6%^?vC7Yr{sEUKXiG#i-(xf}V1s-*_pJr}d17dc7$O!}<*&_dplOgB%OW_sFs6SMngt>+*?;^#tv;3{BE- z7gt0a{bDzivJjlFs}U=4nj)Gyke^%jOH;ihsx&BA=6%f6k(XXYm9!L=QE?2ok=H!; zcN7V8lQm*_VvxIw5_&x6lMnm;ZpNgaiUo-x;k2k`mG`?@Qw3sI@+*0%r%x!zDGLOY zE3~2=JCq@REN9MCUNPZNwUni`y}gM!pp<*9TX7i3812=zL-;jl5rB891;+dm_#8|!T#S!n{(XS^dw^DmvHb91}FyaYgpgnMREOKrLd z&h0F#g_7%w_z_b3y6?u%{})u~nIC#yfe)2BRPvuE?(jp@QmeB`e;;k0Zo(g<_!ef_ zThGS}qk4N=`=Omf#;dj7fvkFs^b+~Z*cumg)~w9w+3l7UM1)wk;Wbm)m+Or`mHra3 zc=$vjPUf`Ky{Zp;y4^>%5kBY z!c#?wOxO;rFUr)gUo`ect}FmJX}KJ-XnJNou>Y0MHT0$p7u`MM}D=}8lAHIAgz_jVMHtBi%c41gH2H?H@8hEnqzt+`R>5TL2xW3 zkeD!C^|e=7jKj$Q-%ohFl$B)+m#%DLF;$8wX)A;vqv=P}kkfS@=OWH9ixyEs{Q`B% zD;`+SN23p}Okt9)V^AHbJoz9$WGE8UNX#fXFU>p1S?+gP?z{IS&?tpvpA$#{#*f8Q zsZ>scFrPYDRh9o_j*oCBVh8O1WqaxW-yLJ8}LB)a_hB03x@QT_8DlTjAe=JSpPOuQ|y zc*RjRcHVJF=FyhL43UU>WumJ5N?`B5V8Z@}Kqj`7t=i|dQc>^of1t-=gH*{2efQ6y zzl~0;@VqNj?d02Xsn}1@E9qr?a%7>3?>)SvkxO9RLYb;<c|4WSBeg3eJV+M<6iHHUtTt^1Ys8ar^AQ7A)yIgfTeUhOUUaKg~IvL*TU5n!(ngb^_c90xv z<%DCkgcwIWqvg9E$F2CWJk5vv#03BBa(&-N~=_e>8j{I?F zV7o6O{PWP`VsYKnz1!_#lW%jztyz=3wgE|gJ8A99MY>U3uCA(*Zk&t^yF~(sQzBZg zUPn}$3oWd{ZwjAe?5~!!lE#NueUaU3P|;i#nzoat=?<9%7ar_>&Wv0Eef>tBb~{yI z3^wirCn&YUAl~-_c0%d)dZ@}@Mc#ine2;KuR+Zf}FcaIu4LtD3+tM$TEKhXDVLJ7l z#Nj6fN=2DhxrI(ZA@3hJZD+2;?ue{kgVtm>iwToO9^DHKof|C!*mNL8;i95Cv}&xv zz&T&tl-36xujEx@k?ey9=hL_2}h2KNMK@YiYm5xt{L}YpV79>FJpt86&;NL#|(2eyy~vE@`UP z^_?)&wH;pHg=wfi;Lpj`6Ji8fUghx2E;jr*-hg9%M3sKMkm-)+4|VJXb*Hu+U`%gO z25+RXaD2@|gH1H;Q&n;$50KL zh(1~g8f3j~Fn~FY%ho#7?>?i#mfAUt0O}6==Cq|#py{4@)Et8Y7|c!(`~fx`8%8SKf_7Fu5F9B^6zx@wdQv!Uk!x@95aBXeKvXmL38l;B zQj__!Y|hHzk;36&^PE%e%~_o)+QgYeQtis}+MArD3%jP4bX26JRjsRoT*BS-)#X(` zT-J2(FKNF1zoE&W3RSh`%2N{7IG^7`Nnge&rT!D~cUIuuhM7j)1b~Z-R8C7fH+mI) zUsuS$)b6%djmpDq0S*Aq28E!0lmI-~Eht-l}E05TGU5o!s@tyAM zgI@g6$W-A|hn<_Rv@zgAhUc)f2O53PfJ8ep zbo5L|hi;qXwzRLkr$BDn>yKE(NW*UVmTgIYI#Gj4@lM*qvsNcHzcAd9`mZj~O$6n&qJk<2uiw2|a#Rn#`4&g`Mu>tHl1NeAXslJw$mLNfF`w&fL<3oSIvjAJIZaWG8j4Z z#w%u9(KLKdW%Dm!haRxS_XD74OMqcH@W|$){HbQ=p=yJ%Rl%dt);VZ5B2RO1k zf;L<^P}&JG=C-)Y<39p1t7{~C7%^_%^Dnp$8J~%4n}ZuFMTtcoKTx7XmdDr4nZ2!y zEDJ^X7kz?c@O<@%A{>(?%;SYsU!O($IRz(3&kzx z3pOTPU_M5dpSI~(y8f`pp@LmtMGEkn$ryDgk>ncIe=g|z)Si|I)!%{5g#dKJXR6Sq zX?8*uR}JX>4LR&j)X-OQI?w8dx6^CRf;*06nFQGiAg1KaejOOFa=!SuEeRLuOyk%a z#+JFNZ;eZooYRLF zFsHHX(iV)G(-Q$w#xZ(X`+L(ELm7Ug)>qZP5JWOLJ76$LmdQ?>CZ(Mvnpj;1=c{<{2c5bR!6+C$PL;6trB_GYgtmUj5#Q86fcv#>s zeFMIWHb!R;zIh^)0nus)<7#V(e*X1C+jGI$7RNRxSa{LM_Ue!?o;@xwu8AI~xgAzG zJpe7O8TpJ98P@M#@3k@j#l&gE*}W4$=YAf!`^qbjC!ei^S0`)IqOBOw9JP3&X(sm#%yS_BZs%NkMFkCIY-1u9RN$Ki0LQk@?7o1R#LJ5yqZndu= zz8|Hz6)eVKJDxDkF+zG5Cs_-T9hWm{+ACmtmKSS|aOR!QYRhOp{>y&d!M!2qam`dN zr#0PwbSm&-UZmcK!HT#IiH8@$kKT&A$S^B;Skb@m!(taFohd{?>3%zS^(eC8)c#)ed@<)RJR+Q#Wz zCiX7}i=AMs?6uu1hV304NtgZ2wihueV@s7^BRo>F3JWld2PEFUU|?T1jOV7sGiONI zDbXB}&6{~+rZ}vf2fe*w{uRHeJXikrw{ZwO?#&x18W;_|2|N&CM3QwT%WwV$3SH>+ z(xh=UlAH+Kp5bFQgM}0dRq%bDamHwZXuJk6spW~4CRNR`#!0^t5jJSq=cTWp=Lbty z(`SES;Lg4|78`=Sj=0P)SV2;Yeo=E4@)&eb|L#2K5P<+94j#*rA<{!rnQt=Q5aL4B zt3xvlVlsZo8bltJ9f_8@JR+ZmTRmmUz@XW_S)es>HOT@h5xBTAr_PMaOUJEh;Yv@x zD%sDxtL`pPyaNjgKK!jfBA#0|oHhMQ2YB4~g^d~e&T1y&)N7yO`ahnn!X#_9+uS%S z6v~Nbnva)q24DE}EWD}J)2{akP$K?~3&a~4gBE6IyyQ0aa3?iCnM3%#%s|hfpTuze zPnk=72OYZ{ak$O!xf_a)pegdq6>YjPIfXPPnTfB1Hj4m6Q`7acM3YD7;= zyy&GO>D*!B|EOj~Re)S`Kt8{3pw(F?=JMifdj&nkZhVPA@&TR%JGq4!Ubs7f%y1@~ ze?lrmJ`JZ2A=}-LdhHsGE>Fx!WO$=|xc1f#8W_ygiERZLdv4tuzG2nbeXO;r=RhFz zn=Mq|0NAMXnWSHII%r$I)Hab?edS54h>OI$VUlNlsdL^$xOFhhVpeSH-6pHBS14Y( zYL`G2J3Tgo<6lBs^dP7?gJ`}c#tuMwf{eGFdrIdj=b~tI&0#I>o0*pfdY=eKN9KoT zNCMmNFG5JO(acb3^Rg)oK4F#2*XjwUTx8uFwu3@j4bZM+o+pH?FvQvIqnhb45eRpm zK@hL20tke_^@~Ta)2sJ1+|Bt?QNb1n`gK;3r z)EdBo9$5kXeV&s^IA0~xfYpOjT_R#X9ZkN&0coDRCS_XyZK11i)uOB1sK_htrJYHVYjg!mw7rF)%%(ZR;WP_;wP*m zRlQwtj?ks}B^kYRP5wq%`G2qZTP*jDr8snqkNESNkI*58#JgmxwABHb<0)D<>U@Q( zj|w!A;>!{}-CMVHgl??8^>Wo75B{7`nNti{_;gNlH5M=x?uSQ98xDFxjamAw3a<|yUYxgf{2r`- z&E7CY4J7>Cp=&ozah|f`xWaMq617M;M9 zdx3p+QYVg`z~^O|es_q&BvAXO@R?uFRt5Tj-yYIU-of6zsCqLuVWz>zXpsyv$7M== z6#F=N>D|Ttz?+#6FKdDuqWSoTU-t|~g$agG z^zY%_c^?qrnCKQQwD^R6SgDX0V6-aVOz~tvnE|z6{RdnrlF3*xo5l^6gmp#bC`xD{ zw|V=Mo>VHs(7rG zbDA3xV4DIWFRZxw4OCpL<{r8m&d$Nr8EY@MFG(FxtzWHkHE3m@+_h}Ef;9CcU}^W! ze$K$zcP5Wbb(r*RzappjwAy>0eFatb!sTC7UB0{j@Ba37yIjzLayThz^+ma#Z?azt ztHIgz#f2r2XF-0^-1T?0+k*Yi?tWJo!rOzFTFz|TunaW*fDu{=z`IUK+zY+Ltb$&B zalQt&7xa5qM_7a-uh;(o=1}(a|}x2{KMVQQ*%|~vx9Qn zJ_A{Y8}auyk6v^qH>@R~y=v6=MJyzw26IC$@L5U&da>AQax5@3(NCf2~zynf!jV;6~sSFhsda2EpuPn`3diS;4G0Oo4k8LWZj zH{UJlb+`FP`8o8p;}UUmzxOe3#0S*$NuEiTu$A}`I9#V%NH~46?5`OyQBX!D37Ux#d??)teow4zgrhcwE#w9&q!_mEG%J%*sk}}3PqxtPb=qg zx`GwabMnNKp!Umm`#IYobC=JoaR)z*J6*mbeee-K53#HF(@r5@=v5hyTu?bpVu0xg zN?z`3t?I9c&-c}VWrRjg2CaHwPpqn?+txcIO_HoU-T3*T5BXcr(P<|l8AD;pO-7Pf zN^79v?@Hlw0~z>;cYPMvhb9%y^(BNm`3)1Zr;-G_lZ7`91TKChI4&Gg7eJeLBi+jl+D0D_Ici!Jh9OtmyLMKl zgOnx0M8LB%mvS5KA#+}r&ts^kakv)!hlI{3dOg{g64d&Gcpp3+po-S-A3N5kFNWKk zOWJ{i+y#L1Hq$Pj1KQQ@*W+si0b#s`Qc51i33GTe@EwVTfJmIqP-d5Vg@(tg0(1Q@ zP7!N$=96DMS5dBc2DzY5YiFv^p^VKBMsxg_D84h*Lt^MBR}7CEqfm@U)@^8<8kPc0 zQ%xf#HtL&J87HH6(=YPE0R~AFu9{S&w95C`1%7M)r@N^$r5^ZplQ+fjFy=vxg~Rx@ zAgk;y{*`8pIZFB#j-;@a$wt3{=1dFi|3@tUyLA57(@F6Hvbm#6 z$i1;hslwTh#)ZQNnS&NzdUQ(zNC;EW`yU7O=B%_~%~V50phWmraOD@ZbIBpvg&^+g z-ydo>MMDLX2Q?s#G<1v|z4RM9Mehh#q^)zTY80pM`{*bWg^M&mF4eW=r(7vMrU~o1 z-ys+UeKy%IU@4t|dN%5x8$W(yy_55~y0;JKk! zWYJE};+skH_N?_$106Tv^I)_3ajC*vO_oY-9jvJd0klEi{&plyu)o1>EGdX#;NQU3 zgG+6#Z-^XptW1~! z&E05gH;6OFqpbfPbm3 z&WLc;>Og;GzmoIL$vY|2R)Blw4VaDQAgYT{vP;ef)>tlWZVWuAo>udTg@kL({%USH z71v3vFOe7kXy>U9*+WLm!wDc;vd4- z=MFk@SHZKJ)J|D3j-_ym4A;a`12v!_Ki|EHqnJF+M=6sJzbjBKUG=ZR{`{Qq+)3Fs zrL~P!dm9EAr#4&9pgKA${+s>zMe$$!KZe5Y=d2BGBntNFry_HUgnhh{1);4n*jDwa z`HQwA-0D7KKu+C~ZejC zDlycg32Pyum*l}vOqi>Rzf^6+)jwT z(r*~C!B>{6rm~rno9l7eLc&D^OeBPC`5Y;3g+#ar-hm?G-f=Q1Z?-8WCedX&xM-4Y zgFuYg+?HIEkYsR+oiSr2m6W+6*i$U%_m5$pt{85cqS(oeiBDP2HZ1EY$e)QCh&J^} zv=@AaL!>-S`9?)g1$IsRwtk~>;h7VXYST!9m_U+gKFeZrWU@|{(f>tFV6Dq>k>NqDGf zxO36lk9+Myl(-r5mV0aK6Y`OB-lyzO!@4Jdvd{4Czcd>1vHxXH|4U>4Z_i5HC#8&0 zzjUA87AqG%vK2^a5Qn~8M9PI0c8~YRYvJ#i7Y_F>d;hjPJ~{bk{HS3*1#@xkjckO&^>Sm}da~Vw$SBprc^f1tA>qrn`EQ^*dGNgj|1! z-)Didd!=a(J;PDpwS67MwH?5;N`h#LzId&k0if8>1wk>@R=QG1$)B$#`r;_fJd_DV z6}`z+K*1QiC7ylL0TCb%Uelzk)yc<+fDY^iU%K3RJjDaWm*wZ;#x?LSks0DqSKrrD z2(IzB^~(cy$IgzAn@GF+idF2|Ev12>V@HZ!kAlmp6T_1~IGz@sa0 zwckc+q|wn_&b#jbG-v;W=a~?1xXm?4%cxb2b8w+fCRvr=gir`8!LjN`tY5OayODi| zFH8WOXTSRWO0&0lZ-c|^Xt2Q^y2Kp`SjvZJEG1?#*uzT5ijC(_1@-9+S(Tahb#6A< zIHR=RbxLPD$ordi1OXmnV_S-0(1H2L;crtiuUOPSrf3|YbooZ|xo_ne@ z!g^OXtgOd2alllFIbhJ(;mY&c5)=)+tagIsZs9XsnbK1MWP=hC^NDO$m&WHCo>;?> zB^tcy8+s0XNE$PMKi%IgrK_|UFUY@(8u09GV=Iv<%q{_2i{<%%7|VQ`%kx^vh_rQf+sm(4>Ia=n zR2_sX{~43^69)`0%l5{@glZq2835B@L0`;Q3pPP=rV)d0%nk#!Nz#o2pg|kmpAU$7 z{M{Quhtn>0&ST;afT$kAbHX~-#WZ~kR);$SK0dSVH&(1kg$3QdUKbzW+4$le->NoQ zgV`-A-!~WxW)2ianm<1WcZ_v)QCblFgc1!?hzt3F4evg@8l&N>H+XXruGKa-MSzEa z+7dh0K<572DE<<6O9D+GeIWHApT43e%DLRkW83@7{z|2Sl!;;}q3sPU(4t-b^2hm< ztSCxUQjNQJa*72iNk|F(+8Y zm*YGZ;)JzDx(;!l60g+3-1Aa|$_H8~Z}pr}{l$+79^3^es)R+x-|xFf?r_*1s|chr1R9@?#Y z{kw!(p@yUag~B9lg6*~v)WSQ95lAbF{GeNtPctVCq<_R&MC-cgHfkwtapc1}K@p-`#H4q?j4oIg2TJz^5QCDxBaLaw4tl2)-~`e0N+ z-jz;aSJ9F@E%BKs4ScDN3bh)dJiwM3F*b}YdsPc80%J`Z5usC0Z#%4q*4JI5n5^Vy3LqIlD4_GbXDP3&E{fmaLA)c zL_?@d>_F28C5x7JSxT#gaCtg(+mWTuK^o3~t;#$a!3}88ecAt8;XZavW#P?L$oAbq z6SyMP&Yb3XVQ3ZeN3-$MD<=+(L*g66pl~ z&L4JU&iJLYRA?-KpMOEu5}32KfcDW=B1!ba^T$WOun0&u>MJ-A2RW56VGGj=R5*uq zX4x|b>!l~KWc`+?EfGb9UWkL1n$?fs0QwrmF-N2#0iCWJMMz4TU=nV=o10^KIQh`X zO*CAz+YB)ntb!KaNDVlN)^V$TgT;?MA}BS!_i_V_PJN|Z`Fh)dV7T-8Cs%EuH651} zD~CV^c|Gc@{xWW$hvo97Auj#SdLhI8QKyEjLS3i&qsxwK?>qTke8HpzTRGjDjzlf%~RMP(t60qMwjxJgx<53u0%eVw0C~6RJgRfwvJh- zS8K`yoDz{>rSkC!P5uOpGEvS^!wn*rcSsu8=(x)xh6ikLzde>@WSbt=ph@`Eb-}`=7VY9dj0h zC@XV66d)gui$LW}6hlQ0h-1+yZm4nVV*j!{>S!wt&NjMw0}VAGr-i$2I9Ne)`-6pj z>%m*TFW|hfE=tg@@VI{IbVjkpMwiGdT$`ypq;@0*HgCYAzVfsQd)8JMoG~O%sQzP~ z1Si{H=2imD`ZRv?eQhJY42;Pt7j@WvjF|~m8d%*wKl*y3KG0qHz$&mCNmBUh0(X8iYQBQ`Fe4TL zcB+~T?PfND&ZHH`w_VPBUzh=&eMqtf_uqZ~L1M#Xv#|>``X(zM?oTO%Gl4Va?_-b5 zeL8*C>_|hYhG&2&RL?;XQ`j7}$0BQeAEvy4uNYZgSPbXQIH1ObCBiTfyj`4yfqqu? zB$j&m*Prq0Vy6AtPa<{oUVzIUSEJj^)C{SQi>WQrpu@<3L z+$o;|!1=VSW@Pydpix%d9pGA<_ADM9E+1nnDAvMc36BR~@$RguR=OFh&btogO?yYfs-`)~fmR>p0%PBsNwjY##Hnj%??Q$~t|#zJ9EYBH zwiwW4pTV05B`()_{OYP@o=|)kzR%vzddL*e%<27y_ZXhT_s2k5Wrq5Tr*Fc5ccUcp zhrt}H*wt&Alhr3VLmF$`zyrl`mj;)y|3Aa)xg4nLN_%I{$=sp)-orU-!mwe{0qaZ^ zD+}$+M1p~LFCPmn#k4uFa8dL6y6agE|D+PxLZ3H!$<}i?-s2&i&|%RMR~&Qu<}V6X z2KAC)&F~&}ruIJ4kzZhk^`t@W%FfzVx`Q3(Tly_DrUr6Ar>mYTn)PRAJ&KAms*kH? zIHWomub}T7u9mKnRhQ98<&|5f;+S$nYK;Vzc6XB2 zgTS}i&RJB|OL?j}B7Rq+{ci-45Xk_*{=tp0aQ-lbc#)ivXKB~bUnk|u@6g>nISw6v zrYn?x(F8XZYqH-od=wHuU#s{)JSAY$P<}h+)Pb?s-t*T;v0u9U0`{iQODhFJX(?^X zD_+}l|8d!Ai+io%`wh;Mofq*0HjLTo+tbIMoMzbBOA=e}{Swg{Zs^tk@zE}!0(|@I zP%oHEO4~l(fO$w*0{hU1mk9iHRA$C_eyL%*rD>wfoDxWjp()}%nap52y|rhD8Wq?O zwxbX7uRH>VXJu>j)0ic+x!iY{_OB-J*-tafE%+d7H?kJPTmz;|ef}oj z3%j<|i0b}wArFWW$>$p)sODs~(~9>7fH&xud9x=K^b)MYvK@TELGM%o-vV5Xt)8MQ zGM?9eVR-xzmTspC4lsP=aUOW+)M+Ba71^bk!G+Qt6ZvW>PDb!lu;_jUnA8kLZ zA7HvTl`y7i@&i5h<(Yj##>#8)qDgh_>MllqY%(N|C*3@e5fITld{m#u9oInK_agsi zphNux^4@~YBo|Uw`kNCc{ibE=Z0d_ z8fR-HcKreC92@n!RcdQi15h9R!H}3wLCI8@w(D3CdI9r}!uPd(3(iQ-KR7XC6_=qh z4MtAI!+dZ<0ocAl(Dqdw;2!VUxjbyxJi+B?gUad!j#e@$iaQu=aJqO+TMY1C&D6AUA<ZvK5m`E<$Ku)mjjj+R2{)R|)6P2<$)rfCB0 z&dOTdyb8^%H!sCvX?f>4i$H($aGG6c@FYFD^yyVA>E3TV@eTs0gyK#GD$_i3mHx5P zx{p?jNX?lsq{h#v=pU;#s{O-pPkYDbGPyai)c>|Vf5zly-1Cxo1^goG&%#4``||rJ znFrH#Iq3^JMGV|{$w;pH@tYXr=kMy#Y%<7UtDqwHQU21|5o=O}!=IxS7r{*aDx_+p z*iUy&oj7xh;(M$@wio>RaNn@8;KWg30hnpqn;%^wde}@A@{%57c35k*Z9R-R{gmH+ z4Yz@>nT#vft$o_fp(O=O&K#)umX?j1znr3Slzr(v){`0_GyVdwSO58MhO|0=g)G(g zoaE%&HwZ~O7@9h6QnwA;G<7BbaQMW-5ev6?{diItOKV)GPkqK6qg!S+Y50Kv-UI_>}d zqUjh|R&6YGI)cPnd@x`^KRX zpm{9_we_Rg-<81BZVanx=e+ZPmP>oZgz?btYxB>j%y$8I>aUC5?=`P;XQAU(`B>e3 zoM;s#J_M@!YGy&d7j81MC-_(l+PDWz;jI{fe4rl3JhRBVu>K;VAKWnqGPta>`%{+Y zU=xL1uj1!Fc{Eu3Ktd?6qcNJ)+mrLy>L+;;wPIHp)jhHZraoLUcjm2+KLs~F?kz0j zi*#~hZb{w5P&u`6IGZqg&6xG~SjUR^LK=9Vr(5~Ngl37a{L3ooL`TO0J=ygDiw_TX zo{@+<0`pGO6K8G3)<%~8!eW>GrL%FU^t;;CKpuyNud*+n=H_leKD!9!wN z^>B_ilrwogt2cSfN*~FVSI9tU`%5|OBi3FK4Ry{n!gHB57*pSHG8dJ z&be5jRH=@XdmP68R18|2@eRS_N2lUe8INdc%}}5Q)Je9_y_^t`ZPsLS@g4tws;*^1 zlhP4SOiE@ub;6c%bK%$PJ_gW8QQUOpO(yOOJ`<4^>8-G9$$=e@Z)miLk484+jFc=nvurK!pn*O(h!heSi#V78J zd4B`7T!KuEkm zQ1;P!H=+J<_)gooo%~2AuYRG~ds(7|$TZaq&8|h3o{&o0`Fxh8Xs^v^kgSQPgT+T& z@`iUDt3MrDG30{M%5%wDGMn$Z3PTU=uYL1uH#~M)je*L^Dq6+<}&wOa1an0>X21k^fXSLvc5EL?U z82&HGmO0q_W&cP~Jj2cFNSfoEbbN6hy|HMx?xlR<`8&i1UOC?eS!*Hx(224(p>nC8 zehBh{f0J2Hk_t-uuVPN9cNC$}YW0@<548hoG-XR@;F8=0hH0+ogKo@1?yIkeP zo_j*7+Pw8sOMXS#`2p>xOF|4nu;P9iSY*qSIX-Qis^1tFp$|3;7jgy#I(ukUoC@Yy zcL4VorveL<7_0iX_i*dYpRQXbI2mg3RekvMpDCOv1OJXn(IpLD4uT%&%D0CL# z5Cc3N)!O5>R(NHLJ5)3%@sggt&}KL_Y?{ZV-tJ}rU;qkT!%@r#{bsVXL! z2o4rO9<0fgxKs!h~BoWXa)!eV8$yJOo2z3KR)@@ z;@ZzsgcthM>h`t*eDdjYTC-QXbtXL(&XVy@GDy;=Dnd=iu3m}MCLQ>sWA(|`x$P+2 zc;HD}jCmq3-wb~QjywHSy_bp!4d`f`NJ`q+dJAH}_)oijeuF(Hgn`^r%``;{t?|WM zJ>{56c3jj30i0$BGOEmFZ}RCq{wt9He46b~>+pwDfia>!iPpUJlm7}IUr9&F)7M>J z)ekkQX#{^p&9DV(5UpPVInBVET=*ISd_h^Ijnh=|7)Z)GWC1XD-~Nem&==GW!+ z8y|Q~wr5@jxr9u(5dF`^f6T_AXT(#>m0!AUtB_H zwIsFryI)1wjk(UwWlN4+g3KpYe~M5maezS%#`;dtW_h>H+qtX3bp~MlWnL^G)6;!xp7vlzy$BY zk~i6eeCC5by%!9}!!0udf%7@@vFV)8vw;ns&iAV3{}xj=h@=|A2Q96?gPTSfG&ai; z+?&euoq0j3eK*pz!UCK_;7SqTb>q!vXXTVcQ8rd0(;BzQjp66%OXW{WSc5}i3IyBk z9$^x3O0}zjTQ=7RBVSIt(4XP;F2NKD#`}eBQfjf>M|<~&w&WJi)wjW`{ZSSokpreQ z7_8D1WZ&Zq87ccM&1h+*&el%CQjH~ncQiigk0+~^#NZcnVRZyIKcgbZA|cCop^Z=fY$H)MC9#1<-{VBmBTttVOAtU?60iI>DgAY@U$0}G@w{cup4nOWp(-3{}y1zf# zBcNhZJpeKvMPEbNNJyP@=mMjF$%Y}5y~JDStQ1}(fjbW~Xqe>d%Pdl;uz=kW>B3L! zKR2cnttVZJIaFL$_GNXX;i$6^2NH;x?>bxQXTnt(nFDu3TUgG#X78?X+;%zc7YpP2 zKB%N~j5{v0!@OVm69SMK1{ymE5B58m-{gAzx-G(EI?$;*by{mcz+>=f&wGr5i_Y^?ebc#FnJJ2xjTWl&r>N*Pn&B{CKIWIej6> zzJXIR8odtB9Wq_cmnrqTrD`709$Jir-v(Sbe~3E?@l{U@3<(jcQ(Q*jRSo}RyDvD+ zlo9XTXP3%;j0T^*0(>Iz`I_jjTGG-1?BKVVptujKS~D1w5zWVDXY?*S>A?u;)^JC1 zR)YW|GQWg3k!^YUIIBH##U^1XR`U3IeRa|BAFsoD*t*Phv+bR)GB;-{r{bsA5p6Xq zxRXl#)rzunFRG+TKc#4{fBpGs2HjK6qH=$H74Fy-z*cHhaoP3b3Lc1$+9fat=xm4l z--}T__X-w)B^xO;x)KzM_$-iB9$}XJnbFr4Y>Qid`e@3wgVUKIb?&mNvS6e7w4B-I zaIq_AIG)hfbo!`Bvaxqb&}LJNA`zM_#Ay=400UeAl9(Yph{pLIP2-O@qTqC+%w6G!EExNoT=V!ozgh)m=5G$%6ucx z!#J?Xi@*Ek7?Hjg&Hoy!{h^qxG{6H*BPsDL6ewu%64*q5F+$%hw@HKu9%eHi5W@Tt(f<9%`t>MRV6C!yzDkl4R2(D+S&gbzfog|k~ zTOnLiLU)#9m-u`5i!1x#273NHg1Rbo%E*vMt!Atrvu2)^CvQjzymzUzx&#Md4meOh zqff8NBKEOt5EcH&fUo|&XyGmyhY7{|Grva&$JHRC( z`UGR`ycve)7QouaD1=_X{$(%WUjQ<)0pDr*_JCrOMNGnbMsuPMq>qRNZ$LX0!MfbI5*MKjI+ ztn#DsbK2(GWk0m$Ou^0eAL80cSn8`8=C&!M5EVvi_(v%1jVk5g(0K*spLl8Re4^U<;{0gFdy~6OqDOOH z3CFOWQdx)u_lawk9{Y4JQ>u;V%!f%5aJCf!VTU4KrJJtE9!{f`qfEIsfTR1tKc`qvhPDgPIT}#!Z^l>Z$y8^Jv~j+{Tq~ zzgoU?o`#vw1m3c@sD-mHXYT87X1GdrButYR6~k5Er+YMS z+e1)JFR;0i?=*+kf@W!$q}LYy4L#b6;qEFq4`eXqRd|B#u8l*wS39;zbN4tg5{SN~ z-S?t2tUlsuwV=zq-N2#(@Nc8F4-&Hey(v~CKY1rsMDo#c@(8@?ZxYpp|H7z|al(Xv zaD&ms>pW}IZe03xVh=oZ@->(7Tyx>jfWa*&-;^~SN>Kp<0FN~mDhSla4Hych1yAE2 z5`UV6L?$6DR;zlT)t~td3FmgD=`cr3X_RnXWPnPD`>d_R*r9vZihLoj{eehHt^*ocZ~5L+mwhYGf~;{ixcwfnwci{m}C0yJZcHT zz2M2`yfI`U(;U^gU6gJzCzpVVoO>WUy!0qkrq9tY-$RVeeG5>q4%<6-!0u-|h z;R`SEf-eeZcmq#IR5IX4qu)Me+jK>}Wk@EiZ@4ao-^+{6lHwvT&3>+Fgc|uCmhFpv z7SsLu^l}_F(u?hNTYt=VyOlDre zil`<$GP>n;RSgJ&dW%6|@U}@WF+EkKl5tSA47r7BOskMRn8-A0GrnS}h-L=}OuRmro zCJNHiyCH*3+Q^XBr$^Us`t5BDC+AzMtQ!_Y5|jx;yHB5b`vmkEP{vD6hC^nHb*)W9 zvw96~ptVu&)Kkv7P=Zlu#@jwHWD2Bkz+DJgVkH`B5%VxW0Jo)~GZQ?Rg82FbP_#Fw zn4d0kpJOZ}I0tWV=FZZ(E~4Yfo3r}FCVJgOUr??L+{ORUW$Y$JlFo|_BBshb0Muf2 zH&<02Q1C@yGEj)&Fbic+cTA#$L^fv&xW40FLVVv`ah?|}frB@hD>2&Ix_n!rSj0gp0ryo51A0u}C9goQ%^XQV8mhmr8 zN8R9&!AN7u?*@Ig2cVfKIrTmA8_l%zC}u_wW0AxC6SVP{mJX6mk>9-BN)u#vhm1t< zJ3E$r$BAq5?g|rE+k)Mszk5jbrSIp8lxzlHZYq|XJY6}sG5x7&?ps_X=;IA^-|1PR z*xw&BNWRoL5v#C-b*0mU388mB9I~ApphE8B4wyVzfolO5z-X^|AD0_eAcFg05LZiy zQ!K|{aoK3oGj~%s%`^>!I49f-6y7Kp1^YV4#a+XBE({94tD{Upe#P4^=(V0MmW8{D z*Df?yOqw2|eej9Tza^q&@cHP5NzDM}>BRFg0HirU_L~v2Fo0j~HP$fVEUdK}PtHk( z8C25PVoQG$?vckY*6d}2KNC|UJp>Nl`%OT}_Isy)(v06vdNEDC3*1OyWi^m!Dy|1L z*f=W04|piRHSL2kp^Z{issRMi8=q$*SDl7>mf(okas0dBzBl!aE z{b4;@3sp8J0FV}7t2?81jPQ8|qBPL~+zwVT4{Z&1M*sPssE?Q7^b90^++|hL&~a!S z3@cj+N!Z3x!Jh!c&k(%|LpXmP0`NiMfGkMoO@}6~=ytq5h}B{@e;xgSAvu&AOpduA zx;$*gg6Z&t-DA~(gj(qnp5^xMt)l2AX5BrIsWImPq*V0Z*M2kjguQ8=fA?l1Dxeit zgNlmRKQmD_A7gWSgzS-$Ja(b?OH_ZxI=&W_uE;jpLe&Y(V~vqvQyw+~}iOf4EeX|^vm zK4~#mYOCQ7`3{=BU0>In>Sp{*LnM#y36$%s`g3!nTSdojOlGtj$3#T{i>b{_iJ92Z zYXEfD>YlW#!lAi)Hn@SGzZ?VuG<#xX6wjEX8X@UG6Za#;ml}* zX3gNOdQjYMgLAIbJ)T19m+xlL{d5}!8~ZZ--6oG>WUd;EN1ET}g>cG8mvGocPf?u} z<30~lt{nR6)|9h(JRbmfcsPv@8N4R8&5K+$6nAA<2Hp$k2^Rm3x_ndz??Bp9jni8U4QM&+Qb_kgDQ7laHu|FIk;6*JN6}-Pv$V*dG2w) z^C!(Lo~r@6fpxz$p1w`u!&7!n!vnJYVK6tHyj3DJZbKB?l1srH%^APOsmyk_1+h(S z^DAqr$j1E+F@Mw^N8xiD_(^Ny$L(Hx*v8QCQ{9I;FH>!mz5B24Cyrg=G&g7t7`N7$ zaMGzX5f&Ug@X%sK zdt6V#FSxrlYS@psUvP0E-kGjZh#xGGRe(;`Cv!O_eV(M8RLITHcn7^-_fyop!8MP` zS3Ku~KOrCHv&^!y+F*AwTz;2ZeDlW@>o9tkD$IDYBehmd{PF}<9t9nOa ziQfbXhbz)ufiB|=GJhoNcS|kq|D^B8aaz79f9&Y6n;KJYu@6+X>RGW+X-)iPr1DMo z>wjn8|JTzA=Q25O2T!?0n0jdiy7z9hF`J<9kS-a%rJQr{jZm^t*AtAUk+P2s(~@!& zl=$YAfREt{AC%ygTKUs8DB&1UI$ivY*+SeSlCMLOkM6})-}h!Eb0c1LcvRNb`%}8D z7ufANAYzAVKf*oyoVTBxy)$P1{*+x2v5apbo9(FJWalMWmS9p7D$QPyXBquw0(n|z zL$o&Gm5D*8ITeCahSRcg5zw=5)77rXneVw{zATf@A?9)S;JnDQw+y!RLd>-m$SxOh zntCF?<|{$Aiz$`VdSpY}@Vw~aJRbQUZB7Z0lzv%e9?OdcV_^4NRSRlYjA$_CV3)d~ zio`8f1)nA)w5F3pQL_YoAPJX!&-`v!p75go&;h(!!#XuUt_Do zX#uU8i-h++b=>CzF8mSt`?X8pcu}~>hwg=VM9R4xNq2d=|m!K!H$0)|1YX= zay$=P&0uKC_;wP_`dIPdt!<@cV78S`%}1QsHX(DZh?}Uo49?3p*w&+vg=FShT|{Nj ze!u67-L*^MqM2N1it`KOzU<~x$av87cjw0MT^Z1`vk!`ns1G_5zK_j-%R$s1Zvn_f z1l~}Z%3USXBTw*i9M^{LDO=NJY(?HmZzmnJ_{$S~fGfD&Y_2hr;@L>MpUrCPM)>V7 z@0K{Zdz^F1r*C?=3cR1RT}`h4j8zxOPH1)+yVG!MYzufHQ6*9@NPc-LJ+Mq%NaSro z&aEF^a?hBt{3CM8Hym6VukaZ`yT>0J<#+9AMp@z~0D_fH+f^Oosc&kfCbo}`3X(Ta z=Q)*&IwHW0>hl~>8|N%u++0PZo9}2Y$EuAJq~|tKlg@W&@=8Qz;|+)b2|6T04vTmL z24wnF?-CF~Ofb+!_u*Ie)}3&wKl)KikLr?%xfzt#|&nCi{|C z;SHCstbJ!OAR5M)xurWy37Ft0(^b?TX!xEXf>2_crBeB6!~OF zF|WS@&Nmm~2G-M^3f)aZRCO#@kV=!8m=bYz_#0y>}pYL_w_jO-)+e)BHQ(T{etxX$HobCR9>}sC8p=aFm$$}zduz53gFi<$ZYE8c^5RjuD> z{t0pW3%|yO`*EhX76ttQenr*qnT2ZC@Ou)vEDsd!?(utrF*?vrkJWV9yv^drDHFg2 zFO1{7kxK~*@f+U^C++yT#5XNhs6v#KEU<&%L{^QG-`;pzi$YmElS3rJUP?^EY$x3ZCUKW(OZgjV1l;r&tlD-vNhr6EhjI3N&a)uCa4#HO`w#s*zp? z3{jzzc0Xfd0*E(>n}S_~$Yt-w57-*6scjj~_-p<5gmxt8XMqY!up->Lk#S`3V>=!| zv36H%@Jv35sCEu157Y({c>N++LbGo>44SM~RO*Te%$xP%$Up>R45I=hF?i6$Aw}d< zC`z_5=@wQKV{CG#`wQlnjjgCB{!8&t%i(f<8YT_=nN>vq^C1W9t*CNG8nS!t5X=-a zbo529g)zaC>*Z@BEzm~u&ko<7_kPa~#uqPrX#QyV(kkV#=lGCSZ@*VfPM`W{5&X;$ zXOVMt>#|ZavGK?Ic+X|6x##I(XB#;+ri?-lVq{|p&d1IFX4PPIrWz7@Ja5GyLzt4k-RYafE%o7?(om)=M`T90gw zvagyrUD;M(6nt57@?q-mgg(#VN?(*E^G#Cy*fm>IOQ{VcrfIT?Ed(OPI=a3YpyIWa$;g){DwC$r6$>McZw{qzJOysCcWn$ir&Gc zx#9)&%y^pi$n~;l@?X))6;K*Qz@mgscD+v>PIftsV}cwjc#GFw1arg5Mj~Xb54x#} z6t7E_l*a2L1y%FZe8-K~s_Yis2H+-1eIS_{GdW-;B3aD}#L8x!N=Id8AhG5W`iyAQ znLW>4X%>*UaPpa>P&2DDBqT&5;}l37-XG-nYcC|Kg0bOTg}ulI)pfuUtZ{s-p3-Yf*9t4>|n3j*y{7vO1~A zg)h*F?o0>p-p~*9zB|W= zi$MKv%OX5E+k#~ri9x8>dX@C5!E$hSDqauo(cpH52RCPDvTl%JglAtH+@2lE8h>jb z=~5DTQ+^CO73D*xIGV_zI-LHS<=%IS>D;Wy?**l`Jtle>^6SQQMwa2i*J{A^)+|-( zKJ_v?=FO3{yfb9M;6EwkIiDF3w`1Q#7KhTE!0FlMxz9J&BQ3!y6p2m!{M-@^_p!TR z-{Y8%JxIREfN=ebAzwSGy4`M?^3u<&fJq){XHVl;Bvrm3$XN>U__IEYEHYMz&9L6y z0qJ3q)yp)6J3WmsCAt%~%zi?-Y;dGK@!gR^Tj? ziO|;DKFYUX+RF{3247HZyL0>OdFni91V6HQ4OwTk5}ra2qr8EV`+ZATf?H)~wB7JL z!>($5Csnm*#akIR;h*i;;&9iGnuhSzG_IGGum-c1`~ie%h{P5MOFFOgI#9AT{>qk6 zdz#$|PWtDU{a*#LjpGOJNFy{CE~?4NS}W56`7La!ElF!m7L^Nle<4;E*072bVv!CM zqxDfYPpTqHnOLMWg2k{#R7P2H;9b}v(;r%vr}J2&)wQtRw*a1R?eTSm_avjAjD$+H zBZbXh>G3$;2%Zpc8%lSPAPG>Jdd?8yfKe&V=KF|#wh?zZtR zM%d<0nSXNAa+=Juys|`}B3Y6ZqJauCw^IxJ=sA=LasF8PvW(P3uK#vavnoPSAO@*z ztfN0AS9}@a4x{j^z4`RfPeV3j(HqLEWz_{t-|VOh=Qc+zw(oERJ(sUJzg?p3oZ;e< zfrmB%t*E@clU#iKC+D$0z+2>}=cFbq>T)bf`1BTG!yIeEQ%vZ!&nE=#C^TF8{hN}& z1B$)Y?8zW?^eaBBz2_Gps49Mky&tv>Zq3)Au8D%87lq}Qd&M8ZfOS6|(xxn58CXAa z^Vz8ln_?xA5sHV0_YIZ53?3KH&?U{%*a&DiO5XuG-aWyJ@5qFNbQ3L^0K?$8Z{xH( z(25Uj_OYBH-I0+Lt-J3zUyzl2qVt(#y`ncs^%S1NF^tsBR<=4=6I@)jjm_=yKtp3Uj|l@^Yjvppz^uGX?Ung z+Z>CM2xxe(oWwAs8uvo$}LmoSyd%uKWR#1%k#>4J*;mq8rpDN3NhTLJ*Ct!1+%Fq$?2V@ zPseWt`u>sD&3RNw$srOwpXxE5;KacCN~EP?lo(pb0%DPBI_jn^N8Dz!k+l+TADS8~ z!{Q1&`g$gaBUYqgzz553)}(n)g$0g}tuT$%hEXK}69f)2x}9a~kL+nf?p0En3A+}j zN9zfKl#Rv?M&v;{Mw)3Q&UP;GQ>RQwXIti6FQri}m^PV$BhoIR|5%NEdZRNYE~&W- zOETMx;@hoh%j)Eq(kR(@eLeY+7Ah^Y3N}oqsoZ?4^cpVkcoGUzWy6EznJT~PijFHy zUm0G3Rg(aBpvm|9b^6K6!k+Rh`5C;tl=tQz%3tgd`r$l%;bLThiKs1?mz$`mq&?~l z%ppe4;O#cFAgP>^*)jBMLRu)Pa*gj?VYl!*nAjvkI?0eL0}aF_ zaF{7A#jk|`=|OkI9WE7Z8Fp7fslUkANn4ze1GE0Wazofi=ad_CZ3F}>{dtXseG$l3ykWi!B&t3_WT45)Sgi+qH z-FVv+iui>D%FVY zNQDA2jQ78I2o){kB)?O;#*}tQQE!>pLI6qCh}{q*HYxF92DgDeJ$64~+np;ypsstw zWQ-p}@jEh7J9NT65bxHYt^GM{!+NRmgS$w}xZyA%-(mtVyj5i+>V~St0P4jhd#2nJ zh>*#+DNeujR!(No5)V-X=V#$>HkD23tKt~%{7jk$B}~zXvM}B5$iPXw6$yy4c>6lD zE;nOV6eo}6i_M8e-2DTV1OVORX4zc*>S3izg%Vo&=J0m88+ok)UWT!!bI)-PtPv)$ zLkjTGP7OHDv#?JiTK^tIQX)OpkU?Z~_jh{HKPV&_c$=T5TcPO&JyVSVnslkBkBx&* zcVp+7w^>6t3tG?5{iu|N=@5F}HU>#Iux%m7E%ds#NjmZbuZF5&)wsOHp+77dejZ_; zlYp1jI^UQORjjjmgw{t=yv2m!_lx2URVOGmO2xyPB9C5|at;k}B}!30a& zxVzh~q0hSEV6Zi?0uWLFqGz*8HlxBA_^!EP5^2Tj!i}zXig-jS2J=-0CK9W4Z{}wS zJw+8XmeR@=9;6S^9kV*VCnp?#{cVyo3ak52@+eQtO76^5Tq2AksF+(8&5uB)CJ^o; zg=I&T{;Hi7NqvwTo~&=B9jxFfteYpZ`WEi7$M&XGulvc&#S#vFoP4hguy?zqU|)xm z0Ym)Ed3H{tFsje2J2@e2@n6!({+pn@vFlz~+pW{J?_N^(I5Ty9S~r+0@nN5)KX-ii zwY44s<3pIoPkrc*HD`|-y}=C%Y+~x$qbrMXVb|7HKq!9|_cHc(k;wdWON;NESI(rpM~RaU=sCgRv$~gv3bXYb~$pt>^B;(kAE*eluSw zGUusx>F=|YK-=mVlZ0DPouvxgHctRsS13y&U1>LH>bAUHdDE9zbE`wyOGqKky!UC% z9xVghukqdUBct`)VT-7Vh*%or$y@oV>n$@f+}7l$Zy(!}3P`Xcapz@Mu`sFbaIeN< zuve|hW#jdLnT82$E|u{ZEVs2D(JKb;P%gXw?3nXgXK_L2B~Z^1U>0eI#o!9!kRNe4 zS6avxF|}F2mdPUPSVPrJ;N_BZy2bOCPkzE)hmAf5w!=AhLmqsY8~+)~k)XFy7ReEO zpCjvXr7OLY2^)DmcJ}&FTrr|ZzK@+C;d9&j?=Q;_+FzR%bO!#bXkLkv%}0g2`XWvwDHaU32MfURWFQMu$Xdi| zNnT{3j55bk-4Y_+7guGOik>UXPjC6%rh0yK^mDRcoEG;D8eD=)hB~Lf&`E$cN?ms1 zl8CXWZi?VfB+9{soM`rHlN4;%lHC|gMua>xQ?jh(#T?+QBC~8NTGN*u4t%q}ySG%< z`z{0vGahiBrh`^;*s`E>%Mh+X))`O(u<>MpsZGzzx|#iyJm5+s+Vm9|&Y1Lq06#MeP_KL(IO7F>!AmHA+EUgGjdSNNBkuPqjCux~UZaKQM zC)tTSkXS&|q@v34+dKf|Q8sVq5<b21wME zR7OJ$3(`gCu4ePE*;=jL{vC$#}r*QcWG>S;E{aBdXs#s!F*uqpuo#nf$!z^-fG|D%40qqu}=IISU#dFlm>8OBk; zZAqBT1b17cn`DV7EtHvepr=Ym3WG*}hBm&h>Xx}=(O!U;67@-ds4 z=-7me_*6jDCky+Th2THJ{OQGr=V+rSy_qrI+L;PLJe8SnZLOe_wJ+3x3Qi>@X*Rnu z7UttP(bxpJ|Fxa0m6z=#4|UFSM0|#6%Al-+)1qb+ISdjUb9bYF++xTT86F^lJ>cDu>*5Y zhcZi{PASL<%4Z5M{~$eEZq*TgwwjyzoPAduYAR0`T8UW&Pz~m(&{hBOY^_@0R~Sc* zsq38I$Ekxc)26xy@Q)W0$YD}YPUR0mW!BKDMBoNqlpmOH^i9u@?hk0cLK}}lS$68P zM?MFbI*4-rBL6zeefae^E}EywR3N*)|0a@>@D^ON)|!n>son%!@O4}e-7Y{PK!l(E z#6%a6Eon8y2+T>@SsJ^&VxbF1*ExYsPhVq#2sQ!T-?qg(>)-fZTO5Z{alYm&3PB=! z1js2y6krUV>%Z`WF-yJdv%HGw)@ZXwxG0o~M%l!~G#5+kJ?zq5l&)(mBFpRv3J2Ej zj`KTmD^Hhf&M}M&-3)7C3s+RM(vvTVwwFtnGtkSRuHx*-D&o&J04oRKs3nQM-#~x* z58l^dc%>SlY2vS#+v+11oT&4ljgp4XfX5y|X_sBF?vb~|0iEF2JUs* zGsc6O7hx3iX>bW3)0RkXktbIgi-A&bTtD~ybt9Iwu3)YRpj)6C>!9iTjjc&|-c4zpBm+~l4Sn~QZCN7LCALS}gvbf}x(73+MU%5FFku^ob zDc8{Yo;Bi1;Ehr*rQC?|`zrCu_`G8)J6Y@@C?Qk71T876w}4>w?6Q0@hn_1S&uCNs z_*%E-nRc@i>&=rTrkj6JM*rZ)@_4#w zp*xBbtIKGxh2AV6t)UoxSnT$i`zKr%=)if%IVG)6yaM%nhUhBcaH4qyf0LbmSMiVE z;8$6`rz5TDH$-Cvi@%FQ=}gTS7O(GNdKbUWGErX{G-s}WyIr-ZlT8VhHwN@#j>;c{ zet6&10*swr8=%y^pOdFC8t(*7rm^?9Gt)JIkw0~)n1Ais$?v*1u?vgmBW**_{Ae=M zv^xep%4m2(D=wlHy@K1IAL9-6Mdb6(@%?>Qs?Jhfe7)dZrsNV};85^H>v9S3W_y9U zGMLL1^mH^d#&)DH)0Y`^A`3iNAfam>YBK*lQZ?C9>%&hwJ-Hh)mx7Sfl+>bZa|w(K za(WAS&3CL!g)kSLp1v8qjl2JE!7i{UTF_eOeB0!td118ir0tEIQg_=g&a{mRbxBX; zFB{tV;snHoo;Ri2t-m21r6vYY`FgaHr8bVt5FRu~J*24WHi6jR*ofi=j z;gjEu;gqwXDJ{(tnVF5(<*U~=vJk3+-Zt9CVYk@tVd6blLTcODJ<>+nLI?I=3SDqo zJ#kXeMTTCkIL$vzas;4=yclDvE^{9<8ehBfJ6V^O)Wr2F%PKmP0zHIVo^-kMYi!<0 zkRneEP3Ob}bBqX95UpR(Y+B$pJMsh6v*9)W+mDpLTqM1eZO}R5k6LiLGTu%rIQ#@6tM%y>{Ur0ipMS0&i+;Ah$ zcy>=k-4RPI>HhfV$YfToFr?{CtA$}~&cT!KGpY}V7Wn|#Q9?4y$*POPf3(=s9+Kjg znV-duX!&`%E>#4YEY97J!4Q_Np4RC*=_08nyVa?#eI|2_c%Bi{h1HKVY-VId+>ffu z`x-H7T}egCOaWT}mFZ)hMdKR{B$XF2d!%85-UzJjtHAVU*~x|%!f~{|J@Dzg1j1h* z;n6pTUDhZ6&>0;w;|F)f5B*CBsr~AQf8z45 z_|pA-Ciu>Spda;PEt&A)VT8v@9odzeb#+d1v*$7=)sT31S90v!e#ykbV-MJY4S8Za z>6G(KEwkmkT1z%$ZI)l=*9mBw`;yv}%h^Nf$K%0ujOFv8*E&V|YXz4l8z?n6E7(4z zEg#?UfvO+Qaq*xc#tSTL?CdtF;*m!F0}QW>s_GspDol@SeI>Fqh5PR4B!9wbxkGPX zDpIxkF_&qYr_q`ERE?AJX(57H?r3TdWQ^7QnjUZcp%{UiR9{P+Qul#t^9^8M5L6(U zn*{-wnorc#&UO<3@ru_(7~2iMdJ|C_6RS6{XkzJ|dIu9^+Ud0x&8H`~Nk_oir4yYS zU!iVS-7D;AE{T&dE>TmIjknHz;p-qNsVq4fEMGPDVCO>sNl1Orv!=S~gXwj+da4Da zxl&CEGyLIg4&gj?z0r7s-qJI9wIcG22ZI_u`gqR3zs? zi0gaVdVvDioe8%WguR!{R;5bH*ls!=_KMh-xE>BVH9*GJS5;Q$s;Y-ZrLYSeXNU8l zE(gPwUHj2rONUsc>Y?|M0^~b?*(HMWzxQSMIzSE%T>G8pFtxu}gWp{A6cG#QBBw8D zDbkxFVNLdHgwBR~*2ss?UVQD)B5mohWk5szEv=t?SdgBQ*3y%-5sk2UZLro2fU{;) zCLzYMo?*=^9ZY;Axk}J8wMIpguvK{rhzj}`u6INQ4E=r0Taak%_0PZW zbiex*Q2pXmw(Vg4P5iHWcSA2P&}ImT4@$>(?#BK85Cjp%5+6a(%-sgh0na%=Vnr z%|oHm&Pn06UNM6oTbYPl*YK4!xhHg##QOyoRhVU`^B|hfU?0pLt)R%QWpisav@Ml$ z>2RUc_I)-p-Kw^GxIjB1%4QFs8!SRJ-gm?A3pGW2s~uCH@t*iU=K&gS7ox1?_tnQ7e9wX+l>o^%KNxm|Wo*WCnda%(Kw2yH?+>KX{( z*)}f(K&@3aOm_Upcnz%gIH{J1k{M{&pLlcqdzG6n#)t|UI8V|kKA*%Z&DPZ)d#pRaGZM-!d zh~Y#9K+;c#1m)KF zDJG?%pwi&byuCsF-I@LF^@Jgob@XABrVKZgp})sn@=uwWVrJU}$ck(~H&;qzO3)U9qf|! z#}omfSA&f3$owol)_uPGp#ZC4XO}J7D9uo}L9?+sz$-odgP~$!2lLe}!gr?^E8PAu zj;)hdPPW@#J3T@!oCWKCyuhVgPbHOdPoc_Rm`AW3X)EwP?%C25N5YMvkvaQ83AL1v zEl|>Cv?ngVF`hl-*VLB;cZB5s>~LO2ygAc2J%J-v@ZCE?n}X=cTUZBAWAr2Uo7h(xIFEPeu+Q=~Bb;`~$^ zfL#uXp{ z?Alrp|7pdnk$93d4{W7{esd5agNsNnx&LL}Tp$8-MEzqP!I|#m0${I=I{AlB@k$rA zFm`ZHI}jffj3y{ue6g=awvh-mZ4@euS5m_`xR?7AgP&VlPM}}DQVR}z?u;=B2G-V> z#UufHPV7N>r*kQNBEsY_r`_&n;0+Jq{_G7OMB57@%KlHLOPiTM7mJq zvcWls{40R&1%WgjMmk|kQW`y#NsAES&c@=&Pp`KuU0^%Rc`z_gK4!E~s6N6->RJdf@{^O9w)m2f)*`=Q}d}9@7$vM_y%sSU@;dwL4%il#< z_2$GQk+}?V(#0N{am`WqPb-Om0le_?&vEn>cyebhG4b*3Oc&YP(<-6g{ZmhUxm<60 z{D4XdC{i4J;-vR{o0Z=C!K>xdYI|#3he;DB;=hI~|Cg3K4%k{&GoBh<(K=i6S2-Fk z@5@Daczfx5=wlb6pWbIn8^-yZu$K^MgFuM z*}!$9-2HtIyzM%Y4gNl5;Z3s%-S3uwgL|PJk`Z~WtZ!YVLPY&Ln-HeZJy)spwh;P| zgZ+dZQM;bkxxS?PP7ec3b9xe|?cE;|FF#dpzzhWJBMYI=oJ@YaTy-n-F-_pQw#o!rGO-|_W$78P3`1Q!anH2W2+kaQ}`19d?(B( zyTFboG5IM}>cQUt4zz8rv+NV*Rc(+;7xZ@_L5l zh-!l818T6hLX)L!yrbvsJ)x%=%&`DD8++EB;7|F(_f6cT`9!^_7-5uwAEe1s_qn@H zikqPK&#e-A2OYWMHUE72_Ex%iIWYb7<&Ro4QA@AQB)-%-EkL7C-6_-W`X znkcP+c;Az69V_-=%2a80H;I#%#ftRUyfpn&SqF#JifH_A{d-)wGpe^RuUuIt*R$Hb zeOh_T^BBN04|_KMz1qcHgm<kOS{<#?6=T)x2WPv#xc!0f&Y_Im_gmS z9Z}-Dh%f=5G2j#Q?Byan*`voCmfmzUF=CYj+Prg>c-hs9ewKUQzap6G+HI|C+2R5K z*jDG4fOeUe__2f52aw5`|D~@;T`T?!z~u#{&4OTC7Qej3ymLtWf>7|lOCuoqC-7GP z=9l@lG@OQl+5Ce@DIp#B@u<1BGwFGPkW0nS4|1Il&O1zf(c8681g6!7r!38lU#@+nH-eH&wfzZ8dGu}u@h;}v& zFVfLe2wBKan+!@SeJ+3qg;Zcef!2{NeHNEf`J}=zeP<|#&?%GqSqJ41<^BkGWC*m` z!>JVd{__&_X*SO9%uOUiQjYbsmW`SJ~|o*8lmV+!E=+;>$CL?$P?#aA?Sde3s+gu9ML7yDsxBq%32nuZ9Dc zcU^L*YuPhiDdkDI2(J{UTncs9^?#}`*xyyFy&{Kt%j(YL>{8%1-6aA2GQ)Gspq;;r z`Bq{CcFB2)Nzv6HzObnhsoPx+b6WkZR=DLvSu4wx0X$H#&C!1f_QvW`;PZ_Hup;R( z)*prpt1AXHvK$9s;*XL^ZT0;y=5LnHlfsy8g8hCE=DM+Ph5A!O*~|UFlgWr}6Vp2A z`K|NOVOJgCAEt)@mj)_TMHi+Tz6|dM^q@Hxoa&Q#^WcmTS3KDkk5{eq^y7UmYOkbf z);9LHE@`a=?S1YG%Rh;Krxyx)=+3mjY_HO!--$S9r~4) zv?o~Ki66^5*EXzlm?UQE-URf`iWhiZxEJ1O0#EkzKKNm*Hu$4ZBn-rdgCi8UGu3J0Mcc5uar(8(3pYVXUw!xz{_EaV5a^ijHd z%wwn4*4E<4izDrTg*WxyMB|kWw|@x6p0S?QqcV>P9TXIxy?DK7x_wn51}ZF(w3-FE zODww@GsOYngK*20iZBghdr+;#OhI_%7w&4L0YaXIbX`$4F1%~j@}=2$S$K3hL@`NJqg7h-Bz+C+vm{2}ZjNL_O&<_i^^8 zS~!}R2$_6)Ov2eyR<&Bm)J~f|uyFv`Pwra=qS&n0rM{p&8uaJI->;@IdAgXIUoYlL zr?PV4-2yuU3Yj0HxfyLrMK$i>S8iCHk z+I1aVjx#~=EseH2p80(+YKG_2?spnA(X;k)Qop81=s^e&_V3n3- z9jAlx)FRC-EQW*M-ZfEq-=syzO|nwfQIaNsBz*aSIE{0z%c;-PXSnA4;meCY0Jl1g z5^qr#O-KKSdhzVvv1doXUsLu1r6+#I^GrG)mh%I>G)=EG()m*_%TLnDOX+Us=}+cy z{ATIs3{;(0*M_k9-Jm(`L8Ui^`;ac-8KS9(mfyhauVX3 zt3`vrK9OkeSg8wTlc1Mv7OxdAFWxvyQe5)=#&>(;Qj*Vj+xK){8>1(jW1M6D56do4 zH%Nn@#&xV1i05&?A=MduzU8|t6S*Qkq3UX{qRS@T*ljU<>HFW`O0s9!YsJIngS8!M z-j<76JcEnC(f$04z>yTHP%q=BTLvj&OMik0K@t(c^!8&&;1p6T?Tw_vlKyK!_=0w-|w; zz2D2h8@d_J5Mk@>)l0KA=#ulL5<<3MqcXawX5(v)-nLa8R0v;?5!5>$dYLtyI`zna zX6NFfnN`l`my&$EmYEf)-M%z&R_{6UN%r`*<(Eocx6lrd<>Aa*l2z_JGBx0R1p?V! z_{~3x@ljeP)mwczNKZWQe~a$o@U!jEGP16j&<-zk$ilWp4)QY|MEGU1t_V1W@3qMi zE|V@u=C0F#NwZ?>vzWD5S>nOX6sU-)(^OGgeh$uV5E%@6i=|DzkWFV zX5dQ%fVH?TIIvDO4N7o14w+dsJ>;3hI26DlVd`U_Yw$03Ue?WwV2r>UFXfaD#plk&Fv?*bge2~yjdh_wccF;{Oo&C)u<<4XPUl!YzJhjAR)&i zWZ+o|o+*A8?oj_sYB%dcuW97;*FfuNR!D`B3mr=pD`2o2QXj4uAFniQeY*wx$|VqX z5tLoF7atN}EYWZwuX&DZTQGwSw9MGs@0hG15#CG|n|@P@H_2k*`6>eSsN@T@f~3p z*LI+=e+1W1G;qH3Z|BDmWOz7T%2U)3EnGLhb1bE~lp-d*^GbtkJ#L+orJtq~Fh}qY z#M~wL+$?WWi8t$`mA6ctAw!8!bJ8o`fTTy>kg74>VVsXMkKHn<*MIO;i*lp?Y+=bk_6So`+qRs!E2hc z>Rq`3xORIVhf9vF?nLpbjuw3R#pz8?xu<_EoiZ-ZnO8zW4LbP~FXYH@LnXzD8nCp< zM(ks-v4c9O>w(o~GichCRtiqAX_)GclN`fbPT^~900B6o$SKq21vs|D=I{q-#@WRv zr)gX5y!mW?XTT`H_;(w$L@5>XWdCUX34@MVXUJW#l3x`A(A`G!i$Ts`uT8L&?%yry zQcFp7&FJ+Q?mSL^{#LWt3?;za-Eq9)w>;XU5P;(lcC(DP4hY|X%7;w|IL z6Cvy<$`XAy5Eg9`x-dau@kGL@)IXrrEo5m@4-uNiEhmyf6(HirWbOVy^bWX7)=jwh zxBY`MxhtJ)f9hoekTMvmcQvqF=%g3n+b$@G;1Fxi=3lWVA8k^S`0=T-Hgl^zKH~4y za_$T@-G6^T&a96GX}*{yZ*9+ez2@xge-byWifFcPJA}tqdTbYyU^~sh&xB3 zdZ|M_>%+5toZq8A_iv(O0lfnI9r}0vl^&&IaeLwSK#~D^LAA*Nj)NXPY30vA8!I`l zIh${%IB!uG&5z}+D97V{37W4D4GOmCRGI3C?y5uHO|5~FhvsY`&V%@3PS9bgRT)-n z6GASz9k5aGDx~<(Gv^J8!4Y~|S2SKyXgE(|sE$Xln=EnDZ_#hw!{oIkF?Otczo;o< z#$$$HJq$W4b{_z&HDTbq^B26lA+fZ5_RPf$v_C?$EQ}U-yvbY_+ z(zcQIp6=m)(X^yFJ3@_ze-<2B5xv)xW#?rqm9ep>b}`?zhJ(c7d;u_7%!kouB1 zr^rnyZUDCq9`S%@a2SECRaRb8%+s6FLgSlocgkAJ6#v4p51ekNOeuZlY>ryyjoVHP zkbj1i*R#y@#JqQZ`JgtGDMyweFah5gf&FY|F`1e0bX(Gf8LBrO`9yGfx&N!*EpKZh z$n-B9IBJ&m@GQC9d9a-7&$0Vm!Yu8oM>Ke5?l~S)s=$FF2RKxzR!%eZX@GA&dRPYs zIylT}n7)8iaFq0LD89N)xaTV)iSJBh)RV)-=L|JiN|iUy&4+S|pU+%c+@!g{Wa>c< zc?{9+MO2LCA;PQ_?hDz-{f1akke% zRY+p=rWW#o!{JFy*!2Se>E%*_d}UnBIiRVHb%C~smt6+*A4r}gJSoL z7kaSybrOaUj|R8LhVJr`IgMVlYOsupgft6|3fLsXY^#O#*;a>u7VqW9O#Ox4`CgJd z_hwxTJPX!-dcF0G(YdXy#N~RE-kjhdiFaGT?YiJgZQ|RNUzOZe_6!pkXX%^?Fc2_( z_yO04$=zc{tvGcmO6uRofB0L)gF&aWyo{qG+;ZZK487#o)~v10`)bt!6Ob;>iluoh ziMdq4zHY_kWjR8=p(CX5T-~7^_(MjJ;A?gt_)L`+&gV5I~A|pFY(|(&yX3A zJhaK4qHU4^rtEaR_l#E`pOE|*td*j!g20LLd=X)je3!?iIngi(B2x7hv|#ck(fxQ9i>MU(u!ysYONUt!CIP98+!t;}N~eGcm$Mg;rF$$(XV)$dy)~| zvQppWPyVF1;6=qvdzZbr2RTC9X$uNyR>=CYN%!hmCC}fb>U@Xt-%d8fF^6lLGwj+J zsp5*8`Xb|IHWI50`2`j%tq0Gv%0*TG^_ehUT`j5kz1=^|FMXyt$-+aZIljma1xfvw z^T$V@D^vWWVZ_d;4m(5ukEiR_i!JHq6w zzg}7tHM&E3ibjtVryoWgwcd;GbpR7hQ-71*qvP2L>jr*x7uuOy3Y;<+pPFj)NJ(Ca zT)d_;QU2ZQYV4la9Ars(V3&A)aMe1p|kg&h3(IS$z{Ljogd50 z?n&_1HKM%f9F0T$()cUkSqkhaV6t=gi$8YFG4wFf#q?h87x-a${A-;WC<<1q496M~ z3VWx@E=Ygj0YpQW0~6uWidY_cqb7ft^QxnT%2x(GB7N%3D*WX#oB67~dai>q zlCi4=*eDM*zh|V`n1kO92FB)YxYsrhf3YmaBfk?wSl8{U8&QTBOE^~>t@4zyLaMX@ z@w_0{%Yc60@Pb6n$#;7eP6kSE*WsiMFBhBpS%M??>j1%Z8Fj^TjR_i?4QFYcx2>|M zXr_3oWbevGv{)w4(#U^x1AG~@qPbv48%N4qn(qaDsVcDZ-1g2fN#vrj6FrnMBCBJ~ z1#bB&P`^cbSKf(dR$+MAJW>!a=;pC35+%ze`_m8ZpY0^m$9a-2`}cy;R48R_J^93t z!?|SIQ0A~jLUxc=;nf#*KMGFa7h7QfX7YH-UkJu{O0a9~iXzaudqpg1@Bb%8NdWB| z_qH)kx97dm>?UZt*Ruhg`96>Ir7$gSVD-PbtO2+}7d?2o-5(&RIU<9yiDwRYl2b z0k^9T2#ktnH9NvrKsuq?I=s=l7e}it681wmO0#VSs%Hj)Ip3(SJNUt^*$6U)-xUaPBY)iOj)9aSSMr)(ALEC2}1aY9@= z<-EI9F*<_}y~J`oDxpd>l5b<8pqmRL^8I7a1wPU&a`u;8J>L$hSeV#Z2Dt0jln@xrRYN0xtrP*K0~NxOgbq&l zthj!b94Pjc6dS}^%zVZ>6PGhw?$fql&mPgVuL4qF*F^e=P_p5(yM1xNqgi#A6Sw~k z!W!Ft({P%2wgAPzT_b-_lERQVMMy6bZD+EUUvFyj6{M7|%1E(tz%_#JEz(Ne+q6Z} z=?y=p<4-lhN9r8k;qm<(EBoN@^&jarpYb;jmQ`$GhD4hzeSjh|IN#c>#|VuIH{);| zvsG5CdtL`Pp^>JxZ!kb5UxZr*1%XN(^vm^5QiGHygy$ zr%f9ALh9}JwziB-@ZsTEcz-#|+&Qu5dfj^H$RxI@xh*Nc+<;J6BDW=)pCfxf<%c_v zz?aK!p;)-8xumUd+Y9kG2%bP<#q^k8eEeT{%AWLa3_3)K>)ZdJ>%E_vj=OJP5dl#F z=>h^O3Ifszy(zu-ARPoLp_c^dB1lnsZ=u)3&_gwVBArkZdJ(Ax0@6F2Jl}g}?wxzi z^Gos%d}htsuf5)Ddt6aBB6b2h%AxCq7t^aix4*@HAjdZ>uCzLFMc2UWmc{^sT~jP> z`CKQ=N^B0S=AHZ4pIz`{No;%d!3u{LTJz}*HF*JHd3vhbxWQQNglzn<)YE#VmuRf~ch0by-xv$4V)9%vW zak;jc62?Ix!+x@HF|KUcw>db3je;PiDqgh;m7Lz)cvjX^XI zT|SM6RBWVRzs)?I`QN^_(skav6bQ`JhY z)c1I&0g26KWGz%V+As3*SnK<2aWG!=qs=={c%idl{|i23>0^De!*Z9|*;tL6WZ<8d zgW;rc|0*e(&Yt#{Euv3;OmE>tokkhLFp^DDUr<&l5AgcL1WM3(0!a_xe>#Kh{e;bubH(6Jy{g+)cJ%_!nUIB-c|}^3i+vOuzZzv5F;%*lANd$e zxq1}$JYjDI_JV3}4v*++~)TJZ+`@`mJ8*rzg@-?nG52RNlD#y&X-nalU zxnk((Cr#QlN;0#Ub*o|T7se>iL2bf1r;Ama2>iS7HW%<&(&@p*$Z41JQRS}XxcXua za{sdgOgH!q)bNjgAyF9D%TD?5b6+#N4lal4bhyGNDe^$1IqkKxD46>=09i#iK_UK; zqL8%aDdjSGnNBxwQN;rgo}CqEkiQ*R00JIM>&QOcbJ97IRtkQnFH%MBZeixKA&-Ap z11RP^zSW$d<;Y;!f{6oI4PeeZ2&aTIKoVna%e1y6|GNQ~o?B3lTw%GGND}n}@wY8$ z5p0YpyeivAUu=6}p?s!O6g9(*r=(i|`1zE;lM9e?@U51q0=IVx7uZ?qALuo`sQea~ z`|ou%z+*%ui=lRItaanJ7vJ57Z0~Bto0?yKN_YT<$64@OJkfhL3Oh{B&^ECis6-Nf zN|`EDaX;-ga02@XOgUS=3ml4l%KC%7uu5wd2&#% zeUi|8pfcaGf3-k3Ml5^tZ=prJbLYC~_ioIUTg}#I`RQ;Z6ZR^BdqzL>2svI@f06$P zQ-xik$O!0g>fjS=F|oXqy&41eUMU~i9p7);3cB==TGIz%W!!%W+K!Z2O)njA)w656 z8(Z&wXJ1+Yid2*{XJoUPqrd8OTZLd2Re(r{nuLZW&Ot8W!Hn*9q*ry?BL}tyVEV0v zN1JzWbXiLZi;^+enDv*t^KtMA`KUI$*y^6+NJ1dV6>g61Jtb|RJaS=3Db>ufNfgvu z(xL5EEDmdrX|1h#x);@|$q$%QIpHpjuSWY+WsR9)aEvn_<=7Iux(`U7>&)a8((It_bTx9hGA%3h5Q7(9Hz@~v}hzR z`$Av$B#3`o0$jWcW&_XPWE2N0q&ichRFb@^TwhComSVhP+>( zyvN@HKVY;}(a^3R@9J}1tP||mo|2hRj4()A%j9Pl_tJ0ZOjScD;gR`>7bC3P8|Gg~`3M-~L5N=CRvHvS?qF&P)-*bBXqqd`TLS)A#Cz^E z-aB>|Zw)(dbD_)HFl$l2ZtptNQXQ(|LjX~u>n`#M@j;DFVcDuRi#bO;@79E)% zF{WdA&a)D&QuNFX>R31Moj}y{r_7DosR{2iM15D4z*a{f{S}9G)h-CAWrT<)EKj}8nMzh;}+|HM(_MH&z893AwQXSmG^U4NqbR| zt)%s6C*RGgz3o8L27IH@vMT&P0_;rLN}RyJ>Gv9bKd}7HNxjbgqnk*eCflDCe9xBE z)Aav?(f)66OV@|eb^grZSG`^JT$-0oe!EKkEwxNRYnwrI<%2z5M$aAY0qX_=Ed2SbuOF_s%bsqXji5XmZihl`kYoo1Q`T;V2 z`}Ru5AisuCw0|LWVb8J$0*Zm)d!Wv|Uxg?{c?y~zMw*uQ*tLfF&|w^V&4s8?+^I^p zqzJruhWX8O37Yx=fgT+(5$tav@#gH!5tAgApWW!{dU%+WzBQQZNsc82@8Q1!&@so) z%E*yF#us_?(?&Hd%NH*+=({=|@jdOEues`JP3#)!V*UKDuL7$`a+-FKm}M|{bD+^< zfna}fhW*S=JbV-Yy^d%L?S@5lcVuJJw-UV!t8ohl#s3Pua3O?T@D{*?_shA4es3YN zbIjx@>=SOM-~+9Z_~2RO$eIG-2DtB=M8hmhjU%t>>)K?DP?$#p+sXqwY*Ha?Fp?y= z#UfLpb9C&>VRDxC5^fNPWt&B#j`w1EGz77t2})Rc6q~(@RTT`6AyP&QC78PJTN`b5&Y_Pcnpc z%`dOe=*B6(BcV{q^TeIqV&`fK2LDylNYpyzYA zE-@81zF3@)pmfB;lBnT!IUrcTF{3F8xIY)SZhYX;$O3&6oYVADYCS8Drc#Viq}~`Q zC#vFxnB)(oo)^Law?tO31KwBrjH>RUNXZmKl*L_1%pg&%V^7c{%dHG_*$HKqz?1ka z{fvhj0q#g2SEKqs$*xKOyDT-H>u>5JvA{!~V7@mKM zh0sQwixdZB(zVQpNFf3$nN{5MubBLmTBj~6EAx{pGA=$~Fa@6)MG&XlTWKR)4;5BWK zlcsFyb9r_)q~!gIMag7R1e!TCsje&x!|%g}bbPD?WyI%@*<>hnaZZBeI%!ShzRZmM zj+5fG7D{$iE?)p$d&ZN~P9zd?*PAdbLpFL~<= zP0B8?@6r6X6f9@Al_D^0W~1qLr=bB0mF%zaKct2j<{U`azooE#Xs&3{)dTVdtjW{! z0Q|`Dj%mNSuPG3Z7P{f^6yE=0d!MWObS!DoTC|AEO$Do4jf39QwWZ&d@Vou3jrVh= z*_)SKt)za@CG*DgfwmHAJ*>!P;|Mdz<@$N zx*r=|&147EM|#VZi%fp>2NWGagp^Fw4gMiKgn;jXf5TZZ}kx3p1AX_qY_y84R2b5k0jCSKb9 zO8&h=Z-GEn{(*fC2qgMf49haWIYx4@Z(yd-H^_;lQRh4RYiJfWG(s3|j6yJ}J)ML* zCnpJ6<4Z<1))XUwkeiy2gxTG*^2oJ01H>t%Jbl*Huj{-& zkJMwX-L<=~I*PA#PUIG>x33Y7d2^#P>qI$U+CuUEm^kx=QS4;z8#hP2IoDt*gpv3b zK2Qw2qHnk|v$1E?TfD&lY=kt>xE|>hyNN3jI!enWM>X`Hfm3eFx*mtHbsEAPVGBO+ ztbto8r-SZVX&UYc72(YRjz@@*(_Z1&)Q~-V8Kkzo(q{&JZ($p!QE;sFPEiC-Y>tMt zztC?xi84g@50^PCY=6w2&$3$hfTe~Oa{T;s?NP~Le#I3*f;aLx9JZWjax(zvx`^C- zs<}+nkzEMfrkVLpN7%P`^!#01NeY)$y&|-)R;MXSaDL9-`-E4~bp^qZ>HhVWy>{6w z<&z998Lpr$nqD$5Irb#NX0NJCimmq!C{Fu?(zJ0lyZ>7r;Y4qs0|xM`C1BCj8=rYr z?-Uo?_Rk+E!kV<#frc8+R84C1+yE1Jy%=R=ul>L9_E2>*1ciW32<*Xy?dx|%yYcE9 zqZwV@Zy-mCsM+v%;6+XmRvU6uzVY{8tT|L)R_E*NHZ@cU?=IYvRL5?ngm*I7eQ(s( zs|*qE$LugnZXwV3arsL74GQZT1$mziXIFr?WPvUR)>DU z=k$(3b)eq!Pq{8S0d9n3-ZpW)6jhEF-FxEMrw#hk#$o)JFAyD^`m*r+r}UoT4-Bl% z>Y$#4XWV>oXy^h*bh$}MUj6l9Bjqt=w>#X3Yym+(bc?fktaaACm{E6cK8#_&6fx1k}63NVO6bO9a%#J=*Rd%)I~kt8E+5|TAiLo(%{y3 zsUb&daq;YCckpam0pq7!&XS>%;w~){drnM;=kDAmvs8@2)d|3z1~&d^D<(EQM&+np zX^iv;?3)AE+@hYL}jFg}DWOIe&J3C!Xg!#y}mE!H*8tbrrcqO9tEa|d$e`7B+`g^%|!TtvI(81DRt#0|mA%~S^ zY_Qq%m-E%Y*6fp$cRMM=jXU>Wqy?akOCB1F{(?HyPniRj3*?{$+b7Rm6)F*O^gxc$ zFAocKyp<-Kev&A`{bzP};iX(TAH3%og@|(eO3qhNE~WV?6!3;Pg`v`A@;p%DTXk;T3K<>X*Tbj!#-5VgdRa4|Eo~^)e*JI{tyWWtaX$ktiDY z=|d!Lkl|l|KDJ3VKf^*Ix|2CXz?!)3R!czM)z59BHJX+w0f86OI8u+Th*VCsZte!J7I zub|4mt)o}Iy(3LJG$26B?WbMiE^_IrqaENUo+vkQ>FXp-b0j`?Lc(z|=g|90*XxxObS2s?NeYX5YRb(&{mS-gepZ)F|wB0}g=7FjMti!@DQ$AilTnfM+MSVk@C2=KfXMwEC0q`D zYm2oT#0yr=&!P>KhPBq+0i6`w0Wm;q;QrXAJD`zc&pMGx4l~8=4lA_(!a=R1z%x0p zJs$nthD(oE)&2v~E3BcuH$ZbOwZ-$>`gMBNad^4+fJFuDOfD|21>5`dF>z~&@yLlV zoMqhyVXd&<#(|yGSVvP5o__`6wco3H_DT#Neu_8Pf@8m0-|>q+$oA7JuqqR**+4Wp z3d6ArWuWpBeeoUafrFt-xfaX3gdGCyNsd_)i3a42{Z2zX?sHb zCt8%h`nY2o2=hq=%}Mf}tQp5D1`!ZFcP zLEHM%+1VA+yF-0i?+iNL#(a}UA;RMfo6;%(5L(|Rpx~8^Sv?pzr&0~`DyK?g9gQ>L zkQb>?z*34AWv00zqqYbjAeDLVGiB)g7^36+Hc^fb&D7S+)DZ!ld1(?`!UeXtdVwE} z5uk_CZ=j_3AbGT@;30qU>`|3j*DWVUZDCQT#a1ctSrJbt#Y^=HQk`!PD5PhJ&Bth& zg)4{^Uo+w`o2Lk#TI}!I_AUP`MC6d=j<1ZxU6j<@mWhDoOnAZ>lAfgI{k;gGK!u2XZ-Jta7s(QxN}?& z+wZc{+b1AcSJl)aH}O~WN=+}rJD=gW2xz78ayQ}mJH%>3jpLDe zi%9B;(Kd2?Lfuiok7zmuvsJ2(6Wu-G1f<|m2)$@*X)OF&c zF9b&H8D_VDx}uY(ALqxHg>9s1#?n{n{v+Pci=fy!fQ4OgW43ffF|$a)C!yk9(IM7X z5SbS2Z=zhBUu!E-VU)G!Vw&lg!+Q=-+!_C+L=om26Z|gDK!33T>sCRExFWp`EO$hd z$dCL&PVw@-Fszz;moV>gvVpvo-3^+0J@)`7RBBsj0p8%mOuLJG0LsjU3oMe3Vx%!d-mgIiL;quw(#fpu2=Ebm4p(F7<;W!|Se zxBc^xXDZ(!Wq`T)tEcO0Yo(%Li3phH{g*S(r5r;dQypyfi_1hwbJ=-Il@l*bFx=DI zrIca^v2=k#CS~4^5+5puD&_gUi3o?ZGp)x`R1PiKNl5ongm@Z8pP-8zBIelt?(SJX z<~Y7Um94*Px{Tbs|bMo)9Y@bXXUKNjf((eJ_f<5qZ& zJj60)e>ha+Wj_EY)>pa@S+l+q?g)S&LzLb!<2~6QTA~d$@3xt>?f<1>l{}9s(G#B} zl8j%@992f`dmU!wcgyuY2eqRo+aGNNa$t{tvg|szEUgb<-XdF$%bJTjgC9FeU4Lu_ z*4J5PBupb9Fk>-#m&TSzVR%}X_BUv~Njn5xNS%@RFlV;%`8Up~fGHoCtRhF%uD_BW8Jj#(ux|k4&)rNk$%F?)6YdGF|#Q?Xd!p%;R&YCVWh3w7o~B;+V#&rU1`13;OF?KN4>&{ z5Rfw(Sf#CpI;XZAdwT?io)uemD*T!&!bZG<<-_f257m z(KKRIb^)C-*~+p-jAF>^=AP!w1Ai{Y{SA2=3UR|Nz*-e2D=6F82N)2fJ9nk@z%FEl z=$B&fBv&mFt{EPxrU`72g{ovc>!uPi`8Hl&oVM-8=@UyzK_Sj3qhET_b8=0;OHRzu z`jgw=Q5NIyX~Bl@+suESAuW{X1$e*2>W_3t?2Tn-*aoPh>y~ zHr$aqr{MoY>fX3ypoWq&X&DJ=co>j|n0J&l8~To;tkBFhnWj7%u73reS+O$ASlARa zN0rLaeefG-1Ej1leMYm1>siKr@1c~j!aTMoW8-(-p`9Nw8{_TB!l<*Y^cw#Md186f z|2N+JKmPjHeb^0Wm%l`TO;YCQV%Z^01}aWmopobr&5Ar+t+)O9N*0W1r5n_ti0%&HEq$HCgUFBnif4ZrXYq2rQ>R?~(GW z%~dDBHG>Vl%YXUu=zN)nMnG(+5}LmJ+&4SqS;bPZ47FFKF1r83mv48sbhS#7~RlURQbJzo*0N(pQ(U{6SWBK7}Zp-%$PEtl?S`Cr#bRvy8aXz}WUHrR=6gp@OO#3wz`;Zwu%l_R z;2#jcqy1#n`GG1mF_|1ev*NCPm97WuW!jD%Ok2r}RpO5HU}@{+lC5Z?OGW z5lX;Rn!s`)q_PFVy|EUM-7Dz%wd0YRjpSpE`*$UMmn&j+72@m+Hta7E*pp@|A*bln|{`PKq}G zI|;Lx>wj`2rW4-YPWRKVSO--_+h(D75HMSI^w7)cny6Ct-i4vz>B#+Z^SWPczQRndzWqhvc zX0>m@7Kk`AS*6@@`0b$I6f^2R_fun@p|fM}fcCaYf9z@!jX@hDgMRhL zbdf)n=A~xARP$dC;B5$BpG$L#V6m8V&vkrU;h(rd5;^zBOf&nFO*PRUR~}&~%d-jNk$OW)!BVd?zISjAi|Uqxc$p{0LFbFg zP~P3$4-hlz=P$v09Us2iVY=MQR~5pAOz7&)0@m#92aZ|+kY3a=)AdU{d6|jMFg$x) zIJBzO=K?q0pdeP+9)R715iUdAQSciI*IHVg2OUK{Q(f5$h^hYYCtYHsdiBKFz?wgo zP4C(8WbE*8+3sO(T&1cj69D|Tgs-qnfUhFH@BOL@%(_{o<|XcX_)49S`(JxGBN_j{ z2Fzi@>DU~fjYV93e*U+Eq652<1~NKY6j7r#;pk_~x}%66NFxMNgm{Z{7y^{J+X0)^+9GoUm{8#V)k@U#>z3 ziVn%oO7wG&dF7IMel*{-cR_WWXf{V)p*6UZjdKEf4;sYDDP>tG?e%Nr00V zEJ4+5ZLC)C^Xwb;-b5Z^(D2Ro#;Pa1Z;{ARpQJC*3y-RGhA9h}2$yl%w)+YxbKN4R zm1{R2yH1fLsN*FUei;;#3DIRLy#85TrzWcSI;rpst9yWnP9B=O)RUKepVyaE{`8gh zgBQO|wOq@lDA{|25_e_8slMj*8ihl9O4jvXm%C}A0aXtI%t4bV2coCzwH9X*qM81$ zmV_VBsY4|nQ>D!XagvOgM2^@}T# zd;AuA2a?K+zc2bOZ!sAY%lOd1jHXSqf44h*m_Jh+HrGgV?B0*_;q#@~MmlD1y19x` zPz13j#poRvuY_-^6#BJk;f_Ko0-``KB4CjwWqRVx*Xn_C^4I>CE(if?W|*ArnESLV znbc?I9=QvHyA&7A;TV2zo(8*m)-I6ZMbF=ZNo->J1CX7~dvl6;P8z9F<_2Bfsf0_X z-$P@#_Dy<)@TfdTxsoS<|8ZLJAyI<`Np0_Cjqaj`fjj%M>FjujG#lo!J?(6C8ULS6 zb8D`XI3W;ez$h*~BaPotG2H#a_E&ID5Fu;zRQfd5VAUA1N&aH&HDq(I&Z%Rty~xO( z;JJp)#w;%zK>fj&&1T&iJR9o&C3_jODxZ0QBJ3FhGsf@oo^ZEcEKp^{F1;_>3X6Kn z52oL_HQ-hih8K=|wbC9iFQsIX)d!jm$y|ATV)-6B>6TG*3DH$8+S@KoDeuTO03Gnh zt#+j?xN5qEO33mK=DPumgQhoUo}YK*H1Q{dI8XWa+`A z1oXzK>vsvmbB=67uN4NpYkC7do>Sdv_bri~F80AI-Z2tjES51zPCKFdG7SBrP((a0>Bgvknt z*$vbPHo3B!G2G)|QU^q|{oyv-H@{a>@Wbkvnz9E(t)rqr~ zdTNLHH8!Aun^o4%)gCF}{86smE|_vFM#6^nJQ;e$eB<11@7U2(q3RX_9;$7BFt3?= z{<-euzP(_Dx@&+~b$lfOn}0tO2uczVm2Vy#)ZDS_PRh`(vliF|bKFpqn}CQxBgtv=%N6kT_x3RmnBjIDXv zY$YO{v3BhZhjwt_gcVFV1<1AYo-(Bb+xjPF`pkXw`?aK>=+Kqg?l^oIxUbKQG)E*RDwIa@HajLBb z!Sx&sX0^2FTEg9-_T8Qqx;t;@WpB1+@S(1aku+7`9<>?NXZc$h zSn7`gdsHGW_x=o3Aqv}T_YA->x1(8b9Kx-)A~T)@ni?oEfvqGdLUUNZQbMc0V1Fbi z*X`Do;Cy4)THgbTodCMJaW{WRv==SirNFz3W_iu?lGc|KkK)TtDNkRq0p`A{KKOrh z?$`wGZ`9J`W`=(ADPcvwKKkK-L{-pZ=3mX|;Qm-zAF4|iABma<&s3ZB+8Tc=>35G) zvN7Ywg<8Dj?&ZIu_A0n{P3Oj^$*cf%(G?C#v=}~ZbPQ)r45%^T52oz8Hc#wR9P;yp zpssuWcJfR~E7IU$eYjjL+mZY50Il1;3fA=Fuu{b`aZy^8!84XIv>h0@3zW-{ICLjl zdKd)BJP&KDTEy!iBWz|4I&wrRgvgo8 zFXs3f!|x^B;E^pC|4k<%{#|v`bHi{_U{oZkg_phi(rH9%MG{+RtH=f4$~L*p+F|k@ zQ)~A%bHS$=^S6XIoH!*e>Pz9&%%J6@-P&l?@<7lUr6$l5F6&BgX_Biz4_xz47X15N zU*DD1wu+gqN&RJ2&CgYY<;2nu<STlq-N9Sl*%=4dnKZW;dz!k0vvzeXEX_`!COP z2=m^+#$u`HPaR$F&K<&2qECB+I}QW4SjjtI`2zlZ9Ehp(uSJNlVn!P(dWegLq^%}dUa7j zkA#~!i^Z~4X7Njb#x=g;z)TwXEo~|)O0ihPOTM{WW%iz_JGtFHoClTV*I0tkT{>SY zT+qNb&atMUtshwoVQJ_7BPiX-!kiZ2G_$2tUif&NYw+Je4o6ro)RGT(l>qgNKdDHdBhDS)PJz0_L57+{Duz}ol`UAL0?0z-luaB z7znF}u0iK8)cS^I!6>V*!>Sw0sAF!5*Q>4e?fSC~*>D)pTA{SX%(==qpMm9@s}S%i zTf><%BC=8yx0QJJ-n-f@&sPR_&yiXE`mPwWE!t@(mhbT)*in0cI|3a4T6#O1saK^M zKy?TIQz(z_@~17}3ZPoqyS)0@{`eQ_q3Q&!&ri<77t%S)D?$Au!0I<|Pb&D}J^Uzw z{H30+eXhfSTX$A6tWxzJ+pSE_KC6UPW+DsS~YGi*0c_7 z<_p_76XJ+BCi&ycP9cY>>k26v==S?|GbZfs?`%A}4t~_yp8gbpo?mF5WS6v~+CGZ0rV~JihBZtp!x=qi{Uu}bSv^VSg4iB`| z_a^0R`xPOdJb7iW#@z*(`^ihlKslldf&z< z?9m9{`CxBSpHDraA_AWoiIxQb@$Xgpf#p501d5}2EzMW0F_!F-qJIWVk}Y9R+(E8H zTs&8!x7W*^`BBfr&%#0i24s>rbQLv368+!VIR^dJb;afGGG%1%V(lW`G*D=i!-eSj z0!|yoQgt7){#9;@bM3n9&v|l8b)r#rSK;PqdgFHI&$6@z#g_y#9Fb0ls!$OIQSCXJ z84D+xHX1-xWhsnm2xLTWjE?3^MGCn-kFQ3Q)_o1>O2jHpG_v^SY<|KmP#(*CwJ<W>4-lVKtR$x}F_ix@N*k@I0jSAJgr<**IP$AexRsJrxvPAr|3XkYL}~$P z?#Oxm$DShG!Q+D-m=qE7fLvR>`*6`QMHoz^kagSAPM5gC%~J#5G~X&EGApjj@|HDw znAG>V5$(v`f@d$7C47Fi^0U7f?L6`ODOKhFVstOi_zo+|^!;d3oAEu?Uj9hZp}d_s zcHU^KnVmICTA+8i$@G95K5XF|1Ulx7d%nbV9{&Q<))}zDPD-9`_Zxz zm9-i0n<)LhC7E=mcQLO`l*PI1Nl(C=_nWWjTP>6E%1g3+_vU+u1haH(y&3^?({5bV zm)y0Sfnsw_4f9N1^F~T*)n1uKp6WWOO-)VXcY+qzSDDEI|MZ$^tDFdy-dLZ;u(QKu zXMV3d=zNtc#Z8d7EHRY%%(Phcx8bIlgOAO&1F#3UnQy0+$^q}+G|sl4#%Kdwcp9zR zg;%Ls#p0Mvt~aQrp{a4et{IBebKQI1s)9Jq;|bOsw}<%(bj)Wee?U`mpFnz>4WM78 z@fGXui?OGW5XgA7z={dYv039AzpFBghll!fj2v%#NDsHO98VrOivi0{a_|&?Ls*0{ zgq+nfjJfrXRFX3&?>nGk_ZK|5)tRUcyVU<{vVH$ACMLK$@?SbeqE@3G57T6?&%}>FbD_yTUa|B=@{lldB%PI{9`7 z8AKOzR6X0n4Str$&LdQ!)L=6%x0|Vadr=nq^>!FyahUK3?GF|WaM$&*^6Z3i zwSH~Y5Q5OrRJ-4+$oT*`icosNrmeZE$@e*4{_R-@leLvbP^?}3d$2Q!n7L?1zwSwg zP$?h$j9Ga8bcXc8MJLq92Nc{@tkJgi*UE3|dd*W6c3}cN#-G>Gw&+VzW-7`;>E6Ba zwSY=*eE|@x|O8ekg`)VN8>xrt%n`0}M zUlWqZ(zz}5VDq1t`4?HOc1zoWSn*?H`wnaK+Pq+sKYBj9XF-?8G1y#JyC;h3PWAcu zE2x*g&^&62}-3@pV0U)e2}_pd4}|;(^n5Gt*@wkpfHHGDOiRNAu7@1qse& zB*>hAkhpaA_9kF#2$U|sR6luJ5PsH9{5_3OiHK1DaePcI@N^i^FE%HXr;CTa(TPW` zn~1l|&5GLrk+hxS9D=3E?J|Zk!Mz-{BPjmQvqCvl5Pq!!h?bneO#A0;(A4jj$OLVk zUqfpq(v499y>>j{ftm`R`UDx=(7(40vz_;dhv$=}uKD=k{3Z{D#M~vXrXFeJjzgdBzfO@T6KW4S{WfhIBp|<069+eaJ8G*1VxaSVl#>1V zPF{~M#qz%=JwldME7FMscQ+q2+qij3{9a!=LO5PDp|sSka=R<+v$nIdIS*l=<*YHU z%cju&F!Be}Okc=pVN3y%X)CQ`8v6jzbP#dO0U6Cg!rcil18hzk&@}fW&nfFZT>4lF z#pzqUh`%LmMax`OW~K0v>>*Q4wr5MEiCz5!O~_6kN#Qagb-QN!I_luxu1JN*mBR&B zuJnrk$KlY_H;UMe7qcUuF`X&F5XZFKyKc2nLhFLjvkZ=gRNjHJtx~+R;=`G$O6C9K z>&ohg=()!_vwm!;%7RYD+;bUGx1BbDXYE}JTN7V`4XJ$w3+$Gb-)uJbuZ;@T6J$(x zBPeQ5LI03BupJ?wUDAfncsnpn`1L0aI$ZjikkZ33}Qwx*9y zAnXn9ZbnbNFLv>YvcbX>1vl*I`@&!09hA3!JCM3FfVb`$t}&!LuLl$j%0Cn%1F# zNzqA+6hopX+Lk9S1EJ73rgiBl-0Uk?41>RX9B%djXr84F)+lw>J^3+H9XI|R$LWyR zD#|w}#pnfc6e6C;i>SCcxLYKN>maouo*4twozDeo=%7sP zojd~INf8~jvAbMqW1RQ(8i&oxqr zO5GRmtlvar@6MaVxos833F4K-P467Gcx3MpT-ILsoIvvsQE^#4?x-3q5vDY4mN++^SxE8@f$y)(;;Ou^7OMtze)buv2N85p|f-0 zX%@XuZf>`*jll<+Te^Qv1`T|gLtg<7SpMpXp(u>E2R(V}h34NcLyvRN9c5gk$Y zl*`2_UtbQ1s6hJ+>ipn=$3ESlT?cu2k-FZv>0Qa`i%y4w%8cP(I8H0sV5w9CwuY4m z(StU11L<^oJu07`vu#|Y>cXazotzcktmyav&Uy<1F!>&552l1XLKnFwS1uf==c`O* zi>m&T>$I=6?qipT~7(uHrfyKPPMAJvf5%1E*GJKsz;XOFu#z=DR{i)`Okqws@mP zKg;uz!w;(_fsIjoy>_|T0gXl8u|P%}_NEFs?~3|1j) z?JE+~h_hH07$}viaRV$LH5rMOGhchZ>sF@P+{%9vo{ z`gSsr1=2^99Mu{Wb}QK56t5kcnoY=JXLr~iG9RfF)lJmxulgs9bajjrSaDXC%S!y7 zr!_z7IaF;HMl%t`O9+gG@RyM89M3S-^RUde%*5Mn;X;tkI;9Y|csph-D23bZakE_- zT=w8F%*9Dfl^*1)O4PU(X;h*_>tPx7P`ok5BOn-v~nXqkB}pc(Blp zQvG#`EXyCrtjMojI$Zb1LDRp`62GW$J*`g%jX zTdcfNx^R?QbN0t)0iXH|*D}|zR%?dkpO!s*OR`^}(N_Gd(NAEPQ_3?|qYxURC~L{2 zS&v@k#qBVyOk{s@b!pIbdu5)N8wZQ`i+)(*ty(fe?lL^m9 z-!9>dk$W`zl?x-=ogX#x^|K?c*7XAOa3pZ;9kcb!C_x8}Ceg36=bJU!>U|;gnCt59 zO!q3CddUw3&I{<-kLLMct#5Z43dmc$0W4yUA=dRfc&U-d`HoQV@nMbJU7L#n8A zj0{<-6CRTOtEv1v^)!O|5_Bq+EOmMz!1??LOz!*Z^eY7|OJ)1)(;*HsG=o!$b?h%y z(vtxc=(21hdc{5y_esi8#{SDWSS^D`Ux@bI#3}* ze?A;9U#xRCg?XmPI`_gnUqJgJLS>f{rASt1Ma=|&B$P+k^Zw!TOHybqc@=fbA3l-%IY(=D*5C&0AETOqb&YQ zm*a{L_p^X=ZSB33`SU>M!}L0J-=WfS8{wi3wq@Kv(}cBk?vB>k`7GOornd6~QES4^ z;CkBbkr}pC)IIRcrvanwJEc~lgAqzO)CwYpObfhU}Zvix^O0Zl!H(E;d1cTJ;u;S7y93u%eaklX$SKoz>Ivs#M zY#qUDfQ#OqeHhst1cYC2;6%vCq`a0%3F#6uK2myYd87t9NxowOw6?tmV3%&j(jifi z)~t&lHt;8oKhAc>7vfRbPqMY~3#{H2mZHA@{1~koLS?F@bSrRo=yE^SMML-UNA{?3 z2Ee=SqNduREn|{w{oB!g+&sP9tJt9@o6{Wz(EQ+4J$4^!^>+lo~4FZ2M2(c^V~YL{6vodX(w@OX53wWq0!u4wSp>&?ulLzM#l9Gg(doP z8J%$fr>mGLIx581ma#$UILwfc+i)y@hA4OI-}ZKHs<_rIP=@jY3jGpp<(p+OlY7AQ ziD$wY!c?~J^0cwumU9`&Tz|9(IvXIAHJsJ9d9hu;^;pBSo?p=pZ+w{8CFjk6+|9Bf1@ZK(}?XK6@*xB5X;myA|i*s{WT(s z%+_T_R`G(VMYR?rnqQ3Ri8+AZxO%#$N)-ZR9?7&|fU0Qzn6mujWQUCpmVygLJEiU8 zLEC@J_7zAR^36llj7>gKHg`=H*;ku`jbkY56{#4NtAFw+S6}*>A~yMnOcAScA?5_3 z(y?4vm2kW zsA5jAr^wOV(YD{CwGZ^?*BK(>@dq}nU(T2oziK-)_(v7GzgqBYdpXy>A!k`UWy1AN zJ=Z^wmrw9uZ;$%JA%eIAgD{bhPG4L zGwpG{`HaO-pEo~sTTDBcj&ic-kTTH4fGX;kMFs0nWS-!DIi^5) zYAd#^dF5C98@&~g!C18- z(p(yR&&v9mcVR*?%+4yP1IzflEkDNMw^KoVApdJtc1;S$lSNH(WL#vuBu1dbm>Tz$ zW_&y9jC!E82$%5^8A9dj+(5u_1Mw|R>4v=#Yad53)YX9FdNsM}72zToGwq>4O+w9K zgnQAbc475_aQ>fZd*jexA^P`9p_ytEG(ngFMC!p{N#b9I~T+2T^q~c-e4!W{Ok*6n(UE^VOl~L_bz{f8!w`a zNTWFBBPetUCedqmokkF*%C5h>D?ZPu1WE}NnAHxXVH-V__iGZ&jo2kIEi=7u!Aa=-Q>AcZ8kTva%JrElVKS?h9WWmiRr@Bd=#y`q}n zqix?$5fo{5I*2HUC`Cx^`LN41(_pk9oBYe>K0Xk1AZkh#!S(C5|3pT~VJl z-#GuTr*2h<6TQ%^zF4->RPis!6}cet8ILjpxF+Z@L-{Ulo^ws4D0kIlC+ZvHMvGqc zx5Xc6Pq)5ZphPw+;n=}{f-+_a`a44<+ER@_glVfrA{%=|M?C+jUjf07KomK*-)KGZ zxyJhQvj!b&bJ0kWCQS1qRZg%Q_i;ksCMlUur6Y>Ew_O?sva!=>mzzQ4J;W??f+e_9N-brtcJ!=O} zl(p5Xr}*I=Fj8Rdv{lF*NVj1ZMip1mvze79(o9pWPRg#~8{X%n_FV31HjE@y8L7{o zQ_uNx0MW}}c(x9mtPpK@_VrA48ChrqW9Ap;@=*5A3Gg0UG-k1lCHBwP$yWN8nyy8~ zxUrkg?&^reCp=!Vi%QgfI8pm^fP-vSq<`KO#|TLr{rJvq7Wvsu*SF9)|)J34(ECeF<|XBK%7it5tt&-hv} zdB@fx}2WHxo{4BD7zy>z|qLzMut z&RRSSE>U1q?*j~FGF`|2TTpC*Ve$v9|C#y}_G)yd1Pv4w%2v8$#FPr}>KFf#xf<#f zu$?u3>oYpo&Zm1U*j7q&^+X7udBt&gF>C(q(}YMlhr#N3WFL;TM~Y96Ad z2RSYe>|2C45JIQ(>?#4&7isb_bN@hu596c`JygBP5>z7^XeY-HIHtz^yT$!^20Y$d zM-T-(Y4}zClbiYfI`IFe8ePoH?HvES=CiG*rpUJUZTmP5>o#Mq&IRR<>`iQ4c;UTUp2aplNgsLn#5ZeGqKM&H}nyn$6M%$4gSHzbjK!XC(D(}a5Ehu(8d^5 zvDw5U&5f^D4);(0sTVS-Y^(fLe*EVT*vQlIdqEG-8VDdB?`-PaxfJ9g1ZEs+6l6zaWd zVQn?EJIk)uXvkIG+` ztu`!@t|5AYv)THo4D}IIb;Q|u&SpMo7ybB?{-C+GcdJ=}Mbk4B-9N9K-w1g)g6I2I zcU@FdX1Me@lu-pHsAv68$(S5hrg|GGsyXT6Kjmg!VF@dGG)R-~8vkug((qitNDRkr zp{py?tV$D)=#M=Y{fQN>&RAqoXgzH2ZUg=3u)R=#=-psHmH73T<DFF zMGHC^r^p%1m$pnw16K0ZO7;Vrhg=kO+k@OhClb1M7K*)2@r#8EX7gv;Eu)AF_R7Y& zy(qPXsJqhK+z8LpXVJz?ptl*EQ75MCgXd+89# zw0MHcgL>HFK{Lj9kuF*CSmkA)<5}x#R+a$K-n*aA>)4M6yK9>JcC>~2=|Wk)8}v+2 zFm?Cl#r>RR#%gKhnEu1^!%*p|b8Ybea#prPxD7m1*Z8A06)uc4DM2G0&d;>LGY|SX zly?#1&SPMRNu&F95g$nZM@dUy^)GUOC*;l5t9GYB?d&H<7zP{j^{|U8(*2J!mAe!a z<$%}fp71H+Hp0jWtIB8(S+EX6*!wB{;+`kefyXxvTkeuOE6WSMqF5u}ddV^xE#cUY zgOzJMPp^!UZKuMuC+8uw?cD^7#IRIm68vSe?)nyTFx z;Fv+Q?u^&D4gWS0l#?3OVQ%p4`ew*+6zoXTE85~xEFel|=$IS~d zZe~>^O19@MO|Gi7Pf{Lb5^wNBEc5U8;hgFP_->az=}z=5R#AZhf$vnBG%(Kmx5n%2+CgFWso`Iy?IHes{~Q&a zuKWUbG(&ALc)@omV#yC2Jl}n|^!PwV>#04dXrKagyi^$O;SmjmiB;8jSpX|{NquMB z6}hP(LaPA5`D3m;onRXt|6VGV#nPX>AAeik)sLEJ5bJB{ag%I`>Ntj=A_>txa1-Rs z(EHCeJb*e}i{ zFVeWTZD@b}GLq6^!v!t~N5k1y{Q)Ii0dd6`VHb~B>YOUxKECHJf&B#?X1`Ne^pfkJ z87$}BrgNCR>&ZXQjw^~ejxb8Lp^i_(`W)G*(Z0V&Qd#zjHR`-Im99@7h)j*O$pex7 zgrHIb?2|h8wBT)gbm;W+=Be9!7#qB3|FPnc>ztQF%aI6+q|+wkD?Ke26p zACfEVmsL%ytFxF6r&3OMLck-)v&>u<)W%6NY|^T(#@Xpe%bXcWJNfU@dquTr@Jgs>3iDY1THL?f@R{CGCJAc2?i}yWNBr#M$;e9{*z-?#@jLus3`gtb_};i+w)i1aagu-g zAzSh%LRM33&c6cX2nhvVm%RLDueWB)dFczO9kp@k+I{jRhO>GVRxp&%Mw_Os6=`F% zrsDowOR;$-E6{LFs7}IC?%kcy8aTDlWMgue$;?wK;>4Y9a%{(1Q;}tvj~i}ULE4A~ zI=0hyz+8)Q_sXm3YCjejI&j5aJey-F3e1T%`@^pwScv4CXueY@kmZVC)ma;y#Ijm9 zK?7f3jBEbj}q>AIKG%^tLJ?eX)5*PL9S+E!2bG+ zYGu2QWqH9V0DKXCMJB8^XVd|AkXq=c_EeJ`*4`yU}4xE8Ey2Ggrv9Y0m3{dmj6!gpNHX%+H z)a<3HaV7(({mwn*)Q-hBf@uM<}GHAfzv7(6!-D*~RbPQ-OtBF&Tk=0T6_E3M9P^11HzIJGAC zk5W5`N(3A~vGeFi;9=ZxE6YP!k8g*^JexjF8Hg9yqA$X*-mhI_usTjntP}ecKvIWc zvy()uWm~Q`a08%!_m2!se)siqC$%nMM87N|S&72k7He-{qPsx=nqJ9x>5bvx`)@ja9{gPX`_s%skhOvoN4Io^h*E zKQEMXtI+UQPB^%(7}m@&0t+=Y8ttYg7>HQ_1ZS0Ii|^YwW@naeyBPvsRdW0SKn_+( z&%Kc8KgG^1Mk4?XsO&F^I|(@KSl$r4c#6&Y$eOfKhx>iV;bEPOcf zhJT7Ox?kxS>CjeB0xPw1%0@G@<2T>(n8?g*X5I^h9NVl1&{uob)4=7|%PwQe@>G=l z%Wr-(0idyqn>T`9G160Pyox!H$9d*{X>aZ{SK=@bZY&RDxUPTD>Y( zrxH4RFTUu%rLW?)fz2GGl;v~FGkhI-a&BlTaH9!uw`FYny*pZ?FsZE4J4~&>nS1

tIgEM>txr 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 diff --git a/Modules/Filtering/LabelErodeDilate/test/images/baseline/axialdilate5.png b/Modules/Filtering/LabelErodeDilate/test/images/baseline/axialdilate5.png deleted file mode 100644 index 78001fee1ba7b94b071a45f891bbd8d78555fdce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2256 zcmV;>2ru`EP)D=;tsF)lDLFfcGMFfcGMFfe5+Ffd{8D&_zH2xUn`K~#90?VYc3 z97hnwTdCZp$|WF!BMwjns0@Mx%tJ0u5n^JX@)I0MOhiRo0U<~96bdmn4sacC9Z-lt z46Y1(Kmq%2cBi|id%AaTZSMzkce{Jjzx}4CXLhZ%0A|gaHEY(aS+i!%`T}&~*3zPS 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 diff --git a/Modules/Filtering/LabelErodeDilate/test/images/baseline/corterode_3.nii.gz b/Modules/Filtering/LabelErodeDilate/test/images/baseline/corterode_3.nii.gz deleted file mode 100644 index ac2f2332f937d5159988fb5f78703c797b5f7ab1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58540 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±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 diff --git a/Modules/Filtering/LabelErodeDilate/test/images/baseline/dotdilate_41.nii.gz b/Modules/Filtering/LabelErodeDilate/test/images/baseline/dotdilate_41.nii.gz deleted file mode 100644 index 5c88450b1c6d238ec8e808594951f848c53de0fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19747 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 U1r8Y28OFVOW_oAJqHv4<2O7yVVE_OC diff --git a/Modules/Filtering/LabelErodeDilate/test/images/baseline/labdilate2d.png b/Modules/Filtering/LabelErodeDilate/test/images/baseline/labdilate2d.png deleted file mode 100644 index d7b13c7a3ec5ea462f69c8333e420c36c7f4cee2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2256 zcmV;>2ru`EP)D=;tsF)lDLFfcGMFfcGMFfe5+FfiJPX@}8Nk4ugY8D0&z*toNDaB*dTd|nOl~cXpcP6fAPZYQYIb}J;r zP8uOd%-4=~`&N?CB*XSFTXLA#ZV|Q@wI8=jk|-*!)7>-)w(G*rXRiD{eF%MTazStu z)$3>cYYxkH0X8k%xuWw9MQ5}S^<5fUY)wIJt;kSM_U>=rrS986UkSzvE!I8^likAESDng;|$sPUbP-d6G+GXI9*djKNm3A7wFb%#a2^)Qb%lMICFZIynq6^r~bZt`8hu#0DKbEpW?Pg40I2UwH`={_FXIxbw!4U%EvViul^T*E_^xgJA2C`=MNt$0Z?LEgH+6Lre&sU& zz^+LU0BEx$FSqL?3C{kP>b29qWS&S0U{S!XNA0gSP&+S?tZwhXm%8qwaAd#P36TL5 z(@mG!mLrk~yz*vATm5s8WJtnYZ)Z!L>vmJPJ0hl-zOcQ6JrEkR-`n-|Ilx zsoi|B;{g+?rzCdNl(X4++~m!)3#yqgPJST?RwYb&letY|ljSJDwv@kcHARA}XGuvB z^(@-0M2TYheG-f4#p_+;IK6ZwuthW0qhaiZnw(j1AIs(=glQ_F(ldtw|(_z6%L#rer$F)>V|-2>039+1Z&X7%8>g)CzD90O9ZK zG`v3s2bmn}Oq2H?0nPwEc8*}WoWS0gHVl&LwIZJN_l37TgK@KHO1( zF9G0`{I&#p2=0LTzPsmf5T4{degV9Xw(J|z_R+pdS&vl2k+f>fj@sIjtby_#V6k%> zTk?9!DN`}EERyG=a3hMqj)!oU+bK(O%_iNZOQxeD>V>pZ$s~!m7mK)2=cQ}ZK4~6( z<$j7(%|&3l?oD< zU~Y6sipCIzebv4lom)8Y2e>W20RVU|I`p)|t*BM*LvphzUt~uIq^b$o+wBH-^Su4U zSf4o?@NREcD_wJ&&f87A)kzq3GY+=^pyUpsy_m#q z2a33V$B(;+nO}+Hyk)DxkOgqNjhx0#5O*go1);{S+c7uQr>v$o-H60tBQ;|x`U>4X zuGqe2vB$`gtPz=T8|98SqSe?a-m;7&$@8a@(-|hPz0*WYod`VLA;~I*eWco*3Y&Br zX~2}+g7yW5u}q1>6yjCXaG*Zpca^4th)VyQJElVnMv^qZh|T)GHzJIReBt<#67BLRT?hQqaSj*&Vo z>{oFmxhCG%dWF7S$D71aI4S;?Q{(sb1N!aiqWljC|7Z4+gQE_+Q9On;e}bwC&{Fpr z_#H}U0BFd6pc;E>L+7CH{3wGHGN!l?${v~@9{NJBCC7U_-_2=&EVupsOm@Dq7+j4Ts{n#4 zcOF1)k9&b<#?MYvAMV`n`QyujJ3G3eEbwa(!C4t%o2nU&b|UBvOK4*eCfJfILTg~- z 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 diff --git a/Modules/Filtering/LabelErodeDilate/test/images/baseline/labdilate3d_dez.nii.gz b/Modules/Filtering/LabelErodeDilate/test/images/baseline/labdilate3d_dez.nii.gz deleted file mode 100644 index 450fa20a3fb2dc3a95fd3f09d37e7b13f7772698..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22184 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 KB#Ju>@)!UzPGpt< diff --git a/Modules/Filtering/LabelErodeDilate/test/images/baseline/laberode2d.png b/Modules/Filtering/LabelErodeDilate/test/images/baseline/laberode2d.png deleted file mode 100644 index 332c3232886c2aa250362f6d268f7cb20e60281e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1344 zcmV-G1;6@D=;tsF)lDLFfcGMFfcGMFfe5+FfiI=ss7BiuSO`RqQoIaSiR0 zSru97tTy^e>I&L{=xMzgu4sxEYF}C)?B?pqa=5LKA4Pjdt)m-sH&PgHinO!V0T=IL z@q#94b61fU+J26WhQpnBNUObEUbRlq*|ezQLTzzQC2v`i^fN}Py}bSjboUiEiby+a z4eu=V7Bq?Ggh?8zY}}U6FR-u%d~NN?sVE-1w+C7H?HPs;G`LNZyj~VwQ=2si>dmb- zRP0wGdZx4eb2bRS+)Qm~@)=fm=v_F568&UtjaVaXK~(j;6KAJ5ylMm5G3!{ldjZ+y zW@#fy8tv!KvV}K?WkYJ4{@9W47$9T>PPMsL1+1XFn2d4T_TCLI`uKAa74RnETu;3b z{bk4Hv+Lv> z<4l%!@t*mq)M~ZTOqeHH~Sc9b| zRC}}@LCGJIAM`OfYrUT@>VWpP<2ZBT;U-BRvT4)f_6XL8LC%Nb#A6hD;0=}g_C&oi z`!MfsM^Y5C76fH#ulX5(pnPwhb`$@OohFT>-W-gyi4IJ0$#*yU)@%Unwh{)P<)s9? z*m>>4AmkS-Lk5|5R{PL~v_5bc@iW(whv3nc1EE7~T6-MZFePA~Y?6WXDd3&)SOOGF z_T{zOK^cGld2g1s$*DaSIqRM5?R7MWW`}$UgCTdN)OGF|W6e|IC|TWU|YOOiZJ)m#5xD)vM~PwHX&q?_a)JKlaDtg|CP=w7++ ziJs1X=ZsOY9mjDL0LJaj4vzLhL_}Mu3=X1A1c|@2i{|3M#C1os*;spA*g(0Esnl*m zbc%(yOAD`Y!1_RQl5?z#b=xJ|;Zu zOi>+4iiP1r2-ikKZWC*n`1pa(I7?zDotP)+&KRyZO|k=y$${Z^oMumwom85i9%YO- z?{*x=aU4g6!H-32tH2$!qmSWCg;zKAm1i33diZ*BX9i_;se=eXt?PJ>x;$~&J-|h` zX7%OCaHHs+MU-9wFBaj4y@)P`dzGdw+@FZ*CQ9sR47=#`TzOK38xE<`MP90lOC66Z zBtP`UN-t!z|4mSI9+RSB+HoAmaU92S9LI4S$DaSGcixp&u8+w80000 C@Pc3f diff --git a/Modules/Filtering/LabelErodeDilate/test/images/baseline/laberode3d.nii.gz b/Modules/Filtering/LabelErodeDilate/test/images/baseline/laberode3d.nii.gz deleted file mode 100644 index cb85d8c4a91045fee627feb2f422b7471089ec8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71626 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 z 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 diff --git a/Modules/Filtering/LabelErodeDilate/test/images/baseline/laberode3d_ell.nii.gz b/Modules/Filtering/LabelErodeDilate/test/images/baseline/laberode3d_ell.nii.gz deleted file mode 100644 index c6ce652617a9c6a89aaedd5a4c2b16e9a5bf5224..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8170 zcmeI0YfMvj7{79(<>D-xlvYG8Zi_7g z+%OrpS}ZUV?wxjk^jN?^7!D3?-O6m_6i}(PlyZ@Rv{2SU-1JkMEPhyW&WDqnoRjBy z|G)QrpAQF9`Zi+gveAs+Dc_UkaA{gS6YhPLjj+4tu>%?T3)bNs+reF#10L@qC3U`p z)NY^%qv|8Bn()|S^Z)ic_XRF_$)4|NMSgUoUAxvTolg&Vt#y|aY4Dp zs@Pml)-NoD5({biIYUbyk-V|=bOvZE0*ITdIhbT(PAAbY1J3&t>Xi>h3~z4N1m9r- zFaekVOaLYT6MzZ81YiO%f&WBcVY0bJZYOR%4%Tt45(?`Q)}oibJAaxn$`b|>GCrZ` z66qN$8XmSrR^w0k>At-+GS_5Tj6r|3NFE%aR%m`sb(3xg@QpzF5jL%^T_0H?t@qzc zPx7e&7Rd=XD+CwPnwImlL3wrWa2bAMbg$$4;3Q!FkYAf+1g|4!T^FUr1RBTjNv9Bp73;-bk?xI0=WRQ5ujosS4W9uv>J45r~`z1S>0X~Q8~() z-;G=I@^-OoFy*8h*HmN8rT2o5wbKOY83B_6Ffb(Ms5_fhZ8C6zyk9mjm;ceSGXAZ7 zeZL>rVc8)l!bF^|@ecM_KbkYEkqel=H!YF;YTo2 zRp^@(#RU`o(te6%bq_Kb{PY~jY@zB1;;pCTJkmnS4u~a13v3$~<<*^`q6 z4Z|u4+)OM5h5KOkD}14`_zf^(uyZtIcuTU{j+XUCCn|tT(j+w?a%7?sB#!%`aq{t93PJ8rD4aH_BB;IY$Z!Fp+q1 z^wu7^I)?B~n$NAu7zDydjuAxEoyZ0+yPoQ%+P+)T)?11M>(Bvv1tB??+8jAn#5V$w z(bPiqJk0kB%xAzqkgS-ES3l{WoV$ZHb1vp>@v zCp>uZLo&6QljnXm*Q!}ryI$=UQeCr1Z1<0|i;8Sr>$g^!=tpikzvzEQ`0T)i87a2S z|LcCwsrhOppZZKI-DdvQ<)4ox?X26k{@(W;XLrfE$?yxlRJ^Y`>G)sE{a;io{YCCA zYqk1*`PIIBMu^i!$C!v7&5-;=knMpjQ0J9N5qc$Vl)IsLtr!nMnhmU1V%$(M20}j39Aw5?@>>W zhQMeDjE2By2#^;7Q*12+z&bzG=dy&3g3%Bd4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C;T{50zddMR0S*Q@T=;+eEk_7>0}7+MMnhmU1V%$(Gz3ONU_e8lVI{*K M`>7=x;_om30Nh`$@c;k- diff --git a/Modules/Filtering/LabelErodeDilate/test/images/hole.nii.gz b/Modules/Filtering/LabelErodeDilate/test/images/hole.nii.gz deleted file mode 100644 index 86f12e3b2cb618e7f3e0a4ac33b99ec3be42357c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28244 zcmeI(&nv@m9LMo5n;$DtQYNiw+z?3?@?*InT%@^hLR`tFG%h16TcL&&H7AD^wJple zgw2m6nQ7v*1Epw|AM@4t7nItb@5AT%{=6Qa+q=(OX-XD;O7eJC(;KhJNV;?Sw0h~s zqII{u*y66w-zm8%lzDCbTwR8#GhdftzRN23T$@u!Mys|%+0|D4i*Z)lb)K`*b5NF= zc|B|^cWj(*oVfk_u2=QE({}szm&(iZZEMHR<}X#zg#9Tn^bk^-)!{}})5myl z^SxnuAY8E(oM~;&>%KZ#cLzLut7*SC<3s=f1Q0*~0R#|0009ILKmdU#5$JxsACX3~ z9Ew+yEngyq00IagfB*srAbb!(j3IPNVKmY**5I_I{1Q0;rj|DD0!c^FGDr~yqz5(e>uG;_r diff --git a/Modules/Filtering/LabelErodeDilate/test/images/point.nii.gz b/Modules/Filtering/LabelErodeDilate/test/images/point.nii.gz deleted file mode 100644 index 0e380e4359b43836a310f74873e17c3c97205a49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14205 zcmb2|=3oE=<~QdJvz#0S7%mtt+jL6t&5?$L^%@b8nW_=T{FH9osA{Pf;oc}})8_tx zN38CzSD5EV?$h7f8t0}?n>#aXQA=t_viNZu?e89QSIz%eYQ6S*W!b+^SC`Ef*}7-> z@B8`9A2 Date: Sat, 9 Mar 2019 08:42:00 -0500 Subject: [PATCH 081/113] BUG: Remove unused variable. Remove unused variable `R`. Fixes: ``` [CTest: warning matched] /Users/Kitware/Dashboards/TestsModules/Remote/LabelErodeDilate/ include/itkLabelSetMorphBaseImageFilter.hxx:180:16: warning: unused variable 'R' [-Wunused-variable] RadiusType R; ^ ``` reported at: http://testing.cdash.org/viewBuildError.php?type=1&buildid=5793030 --- .../include/itkLabelSetMorphBaseImageFilter.hxx | 2 -- 1 file changed, 2 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index cc59c578f7b..f68c5b768d9 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -176,8 +176,6 @@ LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > } else { - // radius is in pixels - RadiusType R; // this gives us a little bit of a margin for ( unsigned P = 0; P < InputImageType::ImageDimension; P++ ) { From 458ac988757cbf4b69936f54e40e115cbd7df969 Mon Sep 17 00:00:00 2001 From: "Mathew J. Seng" Date: Tue, 20 Aug 2019 15:35:35 -0500 Subject: [PATCH 082/113] ENH: Change to enum to new enum class definitions Changed to reference enum class: FileModeType Located in namespace ITK --- Modules/Filtering/LabelErodeDilate/test/read_info.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx index a53439f73da..f536d07890c 100644 --- a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx @@ -22,7 +22,7 @@ ///////////////////////////////// static int readImageInfo(char *filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim) { - itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(filename, itk::ImageIOFactory::ReadMode); + itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(filename, itk::ImageIOFactory::FileModeType::ReadMode); if ( imageIO.IsNull() ) { From dcf980c249b169af4ba5a71179b2be8fed4be187 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Wed, 19 Feb 2020 15:37:36 -0600 Subject: [PATCH 083/113] ENH: Add .gitattributes to allow running ITK clang-formatting scripts ``` git filter-branch -f \ --tree-filter "~/ITK/Utilities/Maintenance/clang-format.bash --clang-format ~/Dashboard/src/ITK-clang11/clang-format-Linux --tracked" \ master.. ``` --- .../include/itkLabelSetDilateImageFilter.h | 27 +- .../include/itkLabelSetDilateImageFilter.hxx | 95 +-- .../include/itkLabelSetErodeImageFilter.h | 29 +- .../include/itkLabelSetErodeImageFilter.hxx | 99 ++-- .../include/itkLabelSetMorphBaseImageFilter.h | 48 +- .../itkLabelSetMorphBaseImageFilter.hxx | 174 +++--- .../include/itkLabelSetUtils.h | 555 +++++++++--------- .../LabelErodeDilate/include/itkinstance.h | 10 +- .../test/itkLabelSetDilateTest.cxx | 68 +-- .../test/itkLabelSetErodeTest.cxx | 68 +-- .../LabelErodeDilate/test/read_info.cxx | 14 +- 11 files changed, 610 insertions(+), 577 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h index 0aaaa25cce4..b98e04ad55f 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h @@ -35,20 +35,18 @@ namespace itk * * \author Richard Beare, Department of Medicine, Monash University, * Australia. -**/ -template< typename TInputImage, - typename TOutputImage = TInputImage > -class ITK_EXPORT LabelSetDilateImageFilter: - public LabelSetMorphBaseImageFilter< TInputImage, true, TOutputImage > + **/ +template +class ITK_EXPORT LabelSetDilateImageFilter : public LabelSetMorphBaseImageFilter { public: ITK_DISALLOW_COPY_AND_ASSIGN(LabelSetDilateImageFilter); /** Standard class type alias. */ using Self = LabelSetDilateImageFilter; - using Superclass = LabelSetMorphBaseImageFilter< TInputImage, true, TOutputImage >; - using Pointer = SmartPointer< Self >; - using ConstPointer = SmartPointer< const Self >; + using Superclass = LabelSetMorphBaseImageFilter; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -60,9 +58,9 @@ class ITK_EXPORT LabelSetDilateImageFilter: using InputImageType = TInputImage; using OutputImageType = TOutputImage; using PixelType = typename TInputImage::PixelType; - using RealType = typename NumericTraits< PixelType >::FloatType; + using RealType = typename NumericTraits::FloatType; using OutputPixelType = typename TOutputImage::PixelType; - using ScalarRealType = typename NumericTraits< PixelType >::ScalarRealType; + using ScalarRealType = typename NumericTraits::ScalarRealType; /** Smart pointer type alias support. */ using InputImagePointer = typename TInputImage::Pointer; @@ -76,12 +74,13 @@ class ITK_EXPORT LabelSetDilateImageFilter: static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; static constexpr unsigned int OutputImageDimension = TOutputImage::ImageDimension; static constexpr unsigned int InputImageDimension = TInputImage::ImageDimension; + protected: - LabelSetDilateImageFilter() - { this->DynamicMultiThreadingOn(); } + LabelSetDilateImageFilter() { this->DynamicMultiThreadingOn(); } ~LabelSetDilateImageFilter() override {} - void DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) override; + void + DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) override; private: using DistanceImageType = typename Superclass::DistanceImageType; @@ -89,7 +88,7 @@ class ITK_EXPORT LabelSetDilateImageFilter: } // end namespace itk #ifndef ITK_MANUAL_INSTANTIATION -#include "itkLabelSetDilateImageFilter.hxx" +# include "itkLabelSetDilateImageFilter.hxx" #endif #endif diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx index 80857e3250f..a94eba0f214 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx @@ -29,10 +29,10 @@ namespace itk { -template< typename TInputImage, typename TOutputImage > +template void -LabelSetDilateImageFilter< TInputImage, TOutputImage > -::DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) +LabelSetDilateImageFilter::DynamicThreadedGenerateData( + const OutputImageRegionType & outputRegionForThread) { // this is where the work happens. We use a distance image with // floating point pixel to perform the parabolic operations. The @@ -43,28 +43,28 @@ LabelSetDilateImageFilter< TInputImage, TOutputImage > // Similarly, the thresholding on output needs to be integrated // with the last processing stage. - using InputConstIteratorType = ImageLinearConstIteratorWithIndex< TInputImage >; - using OutputIteratorType = ImageLinearIteratorWithIndex< TOutputImage >; + using InputConstIteratorType = ImageLinearConstIteratorWithIndex; + using OutputIteratorType = ImageLinearIteratorWithIndex; - using InputDistIteratorType = ImageLinearConstIteratorWithIndex< DistanceImageType >; - using OutputDistIteratorType = ImageLinearIteratorWithIndex< DistanceImageType >; + using InputDistIteratorType = ImageLinearConstIteratorWithIndex; + using OutputDistIteratorType = ImageLinearIteratorWithIndex; // for stages after the first // using OutputConstIteratorType = ImageLinearConstIteratorWithIndex< TOutputImage > ; - using RegionType = ImageRegion< TInputImage::ImageDimension >; + using RegionType = ImageRegion; - typename TInputImage::ConstPointer inputImage( this->GetInput () ); - typename TOutputImage::Pointer outputImage( this->GetOutput() ); + typename TInputImage::ConstPointer inputImage(this->GetInput()); + typename TOutputImage::Pointer outputImage(this->GetOutput()); - outputImage->SetBufferedRegion( outputImage->GetRequestedRegion() ); + outputImage->SetBufferedRegion(outputImage->GetRequestedRegion()); outputImage->Allocate(); RegionType region = outputRegionForThread; - InputConstIteratorType inputIterator(inputImage, region); - InputConstIteratorType inputIteratorStage2(outputImage, region); + InputConstIteratorType inputIterator(inputImage, region); + InputConstIteratorType inputIteratorStage2(outputImage, region); OutputIteratorType outputIterator(outputImage, region); - //OutputConstIteratorType inputIteratorStage2( outputImage, region ); + // OutputConstIteratorType inputIteratorStage2( outputImage, region ); InputDistIteratorType inputDistIterator(this->m_DistanceImage, region); OutputDistIteratorType outputDistIterator(this->m_DistanceImage, region); @@ -75,44 +75,47 @@ LabelSetDilateImageFilter< TInputImage, TOutputImage > // flag to indicate whether the internal distance image has been // initialized using the special first pass erosion - if ( this->m_Scale[this->m_CurrentDimension] > 0 ) - { + if (this->m_Scale[this->m_CurrentDimension] > 0) + { // Perform as normal - //RealType magnitude = 1.0/(2.0 * m_Scale[0]); + // RealType magnitude = 1.0/(2.0 * m_Scale[0]); unsigned long LineLength = region.GetSize()[this->m_CurrentDimension]; RealType image_scale = this->GetInput()->GetSpacing()[this->m_CurrentDimension]; - //bool lastpass = (m_CurrentDimension == ImageDimension - 1); + // bool lastpass = (m_CurrentDimension == ImageDimension - 1); - if ( !this->m_FirstPassDone ) - { - LabSet::doOneDimensionDilateFirstPass< InputConstIteratorType, OutputDistIteratorType, OutputIteratorType, - RealType >(inputIterator, outputDistIterator, outputIterator, - LineLength, - this->m_CurrentDimension, - this->m_MagnitudeSign, - this->m_UseImageSpacing, - image_scale, - this->m_Scale[this->m_CurrentDimension]); - } + if (!this->m_FirstPassDone) + { + LabSet:: + doOneDimensionDilateFirstPass( + inputIterator, + outputDistIterator, + outputIterator, + LineLength, + this->m_CurrentDimension, + this->m_MagnitudeSign, + this->m_UseImageSpacing, + image_scale, + this->m_Scale[this->m_CurrentDimension]); + } else - { - LabSet::doOneDimensionDilate< InputConstIteratorType, - InputDistIteratorType, - OutputIteratorType, - OutputDistIteratorType, - RealType >(inputIteratorStage2, - inputDistIterator, - outputDistIterator, - outputIterator, - LineLength, - this->m_CurrentDimension, - this->m_MagnitudeSign, - this->m_UseImageSpacing, - this->m_Extreme, - image_scale, - this->m_Scale[this->m_CurrentDimension]); - } + { + LabSet::doOneDimensionDilate(inputIteratorStage2, + inputDistIterator, + outputDistIterator, + outputIterator, + LineLength, + this->m_CurrentDimension, + this->m_MagnitudeSign, + this->m_UseImageSpacing, + this->m_Extreme, + image_scale, + this->m_Scale[this->m_CurrentDimension]); } + } } } // namespace itk #endif diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h index 52f97651c83..ce50fe9cbf8 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h @@ -37,20 +37,18 @@ namespace itk * * \author Richard Beare, Department of Medicine, Monash University, * Australia. -**/ -template< typename TInputImage, - typename TOutputImage = TInputImage > -class ITK_EXPORT LabelSetErodeImageFilter: - public LabelSetMorphBaseImageFilter< TInputImage, false, TOutputImage > + **/ +template +class ITK_EXPORT LabelSetErodeImageFilter : public LabelSetMorphBaseImageFilter { public: ITK_DISALLOW_COPY_AND_ASSIGN(LabelSetErodeImageFilter); /** Standard class type alias. */ using Self = LabelSetErodeImageFilter; - using Superclass = LabelSetMorphBaseImageFilter< TInputImage, false, TOutputImage >; - using Pointer = SmartPointer< Self >; - using ConstPointer = SmartPointer< const Self >; + using Superclass = LabelSetMorphBaseImageFilter; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -62,9 +60,9 @@ class ITK_EXPORT LabelSetErodeImageFilter: using InputImageType = TInputImage; using OutputImageType = TOutputImage; using PixelType = typename TInputImage::PixelType; - using RealType = typename NumericTraits< PixelType >::FloatType; + using RealType = typename NumericTraits::FloatType; using OutputPixelType = typename TOutputImage::PixelType; - using ScalarRealType = typename NumericTraits< PixelType >::ScalarRealType; + using ScalarRealType = typename NumericTraits::ScalarRealType; /** Smart pointer type alias support. */ using InputImagePointer = typename TInputImage::Pointer; @@ -73,7 +71,7 @@ class ITK_EXPORT LabelSetErodeImageFilter: using OutputSizeType = typename TOutputImage::SizeType; /** a type to represent the "kernel radius" */ - using RadiusType = typename itk::FixedArray< ScalarRealType, TInputImage::ImageDimension >; + using RadiusType = typename itk::FixedArray; /** Image dimension. */ using OutputImageRegionType = typename OutputImageType::RegionType; @@ -81,12 +79,13 @@ class ITK_EXPORT LabelSetErodeImageFilter: static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; static constexpr unsigned int OutputImageDimension = TOutputImage::ImageDimension; static constexpr unsigned int InputImageDimension = TInputImage::ImageDimension; + protected: - LabelSetErodeImageFilter() - { this->DynamicMultiThreadingOn(); } + LabelSetErodeImageFilter() { this->DynamicMultiThreadingOn(); } ~LabelSetErodeImageFilter() override {} - void DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) override; + void + DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) override; // Override since the filter produces the entire dataset. private: @@ -95,7 +94,7 @@ class ITK_EXPORT LabelSetErodeImageFilter: } // end namespace itk #ifndef ITK_MANUAL_INSTANTIATION -#include "itkLabelSetErodeImageFilter.hxx" +# include "itkLabelSetErodeImageFilter.hxx" #endif #endif diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx index 874e4c21bfa..07117a7b201 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx @@ -29,10 +29,10 @@ namespace itk { -template< typename TInputImage, typename TOutputImage > +template void -LabelSetErodeImageFilter< TInputImage, TOutputImage > -::DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) +LabelSetErodeImageFilter::DynamicThreadedGenerateData( + const OutputImageRegionType & outputRegionForThread) { // this is where the work happens. We use a distance image with // floating point pixel to perform the parabolic operations. The @@ -43,24 +43,24 @@ LabelSetErodeImageFilter< TInputImage, TOutputImage > // Similarly, the thresholding on output needs to be integrated // with the last processing stage. - using InputConstIteratorType = ImageLinearConstIteratorWithIndex< TInputImage >; - using OutputIteratorType = ImageLinearIteratorWithIndex< TOutputImage >; + using InputConstIteratorType = ImageLinearConstIteratorWithIndex; + using OutputIteratorType = ImageLinearIteratorWithIndex; - using InputDistIteratorType = ImageLinearConstIteratorWithIndex< DistanceImageType >; - using OutputDistIteratorType = ImageLinearIteratorWithIndex< DistanceImageType >; + using InputDistIteratorType = ImageLinearConstIteratorWithIndex; + using OutputDistIteratorType = ImageLinearIteratorWithIndex; - using RegionType = ImageRegion< TInputImage::ImageDimension >; + using RegionType = ImageRegion; - typename TInputImage::ConstPointer inputImage( this->GetInput () ); - typename TOutputImage::Pointer outputImage( this->GetOutput() ); + typename TInputImage::ConstPointer inputImage(this->GetInput()); + typename TOutputImage::Pointer outputImage(this->GetOutput()); - outputImage->SetBufferedRegion( outputImage->GetRequestedRegion() ); + outputImage->SetBufferedRegion(outputImage->GetRequestedRegion()); outputImage->Allocate(); RegionType region = outputRegionForThread; - InputConstIteratorType inputIterator(inputImage, region); + InputConstIteratorType inputIterator(inputImage, region); OutputIteratorType outputIterator(outputImage, region); - //OutputConstIteratorType inputIteratorStage2( outputImage, region ); + // OutputConstIteratorType inputIteratorStage2( outputImage, region ); InputDistIteratorType inputDistIterator(this->m_DistanceImage, region); OutputDistIteratorType outputDistIterator(this->m_DistanceImage, region); @@ -71,48 +71,51 @@ LabelSetErodeImageFilter< TInputImage, TOutputImage > // flag to indicate whether the internal distance image has been // initialized using the special first pass erosion - if ( this->m_Scale[this->m_CurrentDimension] > 0 ) - { + if (this->m_Scale[this->m_CurrentDimension] > 0) + { // Perform as normal - //RealType magnitude = 1.0/(2.0 * m_Scale[0]); + // RealType magnitude = 1.0/(2.0 * m_Scale[0]); unsigned long LineLength = region.GetSize()[this->m_CurrentDimension]; RealType image_scale = this->GetInput()->GetSpacing()[this->m_CurrentDimension]; - bool lastpass = ( this->m_CurrentDimension == ImageDimension - 1 ); + bool lastpass = (this->m_CurrentDimension == ImageDimension - 1); - if ( !this->m_FirstPassDone ) - { - LabSet::doOneDimensionErodeFirstPass< InputConstIteratorType, OutputDistIteratorType, OutputIteratorType, - RealType >(inputIterator, outputDistIterator, outputIterator, - LineLength, - this->m_CurrentDimension, - this->m_MagnitudeSign, - this->m_UseImageSpacing, - image_scale, - this->m_Scale[this->m_CurrentDimension], - lastpass); - } + if (!this->m_FirstPassDone) + { + LabSet:: + doOneDimensionErodeFirstPass( + inputIterator, + outputDistIterator, + outputIterator, + LineLength, + this->m_CurrentDimension, + this->m_MagnitudeSign, + this->m_UseImageSpacing, + image_scale, + this->m_Scale[this->m_CurrentDimension], + lastpass); + } else - { + { // do a standard erosion - LabSet::doOneDimensionErode< InputConstIteratorType, - InputDistIteratorType, - OutputIteratorType, - OutputDistIteratorType, - RealType >(inputIterator, - inputDistIterator, - outputDistIterator, - outputIterator, - LineLength, - this->m_CurrentDimension, - this->m_MagnitudeSign, - this->m_UseImageSpacing, - this->m_Extreme, - image_scale, - this->m_Scale[this->m_CurrentDimension], - this->m_BaseSigma, - lastpass); - } + LabSet::doOneDimensionErode(inputIterator, + inputDistIterator, + outputDistIterator, + outputIterator, + LineLength, + this->m_CurrentDimension, + this->m_MagnitudeSign, + this->m_UseImageSpacing, + this->m_Extreme, + image_scale, + this->m_Scale[this->m_CurrentDimension], + this->m_BaseSigma, + lastpass); } + } } } // namespace itk #endif diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index 7485e8217b8..34509fd03b5 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -23,7 +23,7 @@ namespace itk { -#if ITK_VERSION_MAJOR < 4 +#if ITK_VERSION_MAJOR < 4 using ThreadIdType = int; using RegionIndexType = int; #else @@ -41,20 +41,18 @@ using RegionIndexType = unsigned int; * * \author Richard Beare, Department of Medicine, Monash University, * Australia. -**/ -template< typename TInputImage, bool doDilate, - typename TOutputImage = TInputImage > -class ITK_EXPORT LabelSetMorphBaseImageFilter: - public ImageToImageFilter< TInputImage, TOutputImage > + **/ +template +class ITK_EXPORT LabelSetMorphBaseImageFilter : public ImageToImageFilter { public: ITK_DISALLOW_COPY_AND_ASSIGN(LabelSetMorphBaseImageFilter); /** Standard class type alias. */ using Self = LabelSetMorphBaseImageFilter; - using Superclass = ImageToImageFilter< TInputImage, TOutputImage >; - using Pointer = SmartPointer< Self >; - using ConstPointer = SmartPointer< const Self >; + using Superclass = ImageToImageFilter; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -66,9 +64,9 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter: using InputImageType = TInputImage; using OutputImageType = TOutputImage; using PixelType = typename TInputImage::PixelType; - using RealType = typename NumericTraits< PixelType >::FloatType; + using RealType = typename NumericTraits::FloatType; using OutputPixelType = typename TOutputImage::PixelType; - using ScalarRealType = typename NumericTraits< PixelType >::ScalarRealType; + using ScalarRealType = typename NumericTraits::ScalarRealType; using OutputIndexType = typename OutputImageType::IndexType; using OutputIndexValueType = typename OutputImageType::IndexValueType; @@ -80,13 +78,14 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter: using OutputSizeType = typename TOutputImage::SizeType; /** a type to represent the "kernel radius" */ - using RadiusType = typename itk::FixedArray< ScalarRealType, TInputImage::ImageDimension >; + using RadiusType = typename itk::FixedArray; /** Image dimension. */ using OutputImageRegionType = typename OutputImageType::RegionType; // set all of the scales the same - void SetRadius(ScalarRealType scale); + void + SetRadius(ScalarRealType scale); itkSetMacro(Radius, RadiusType); itkGetConstReferenceMacro(Radius, RadiusType); @@ -108,28 +107,33 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter: RealType is usually 'double' in NumericTraits. Here we prefer float in order to save memory. */ - void writeDist(std::string fname); + void + writeDist(std::string fname); protected: LabelSetMorphBaseImageFilter(); ~LabelSetMorphBaseImageFilter() override {} - RegionIndexType SplitRequestedRegion(RegionIndexType i, RegionIndexType num, - OutputImageRegionType & splitRegion) override; + RegionIndexType + SplitRequestedRegion(RegionIndexType i, RegionIndexType num, OutputImageRegionType & splitRegion) override; - void DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) override; + void + DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) override; - void GenerateData(void) override; + void + GenerateData(void) override; // Override since the filter produces the entire dataset. - void EnlargeOutputRequestedRegion(DataObject *output) override; + void + EnlargeOutputRequestedRegion(DataObject * output) override; bool m_UseImageSpacing; - void PrintSelf(std::ostream & os, Indent indent) const override; + void + PrintSelf(std::ostream & os, Indent indent) const override; RadiusType m_Radius; RadiusType m_Scale; - using DistanceImageType = typename itk::Image< RealType, TInputImage::ImageDimension >; + using DistanceImageType = typename itk::Image; RealType m_Extreme; typename DistanceImageType::Pointer m_DistanceImage; @@ -145,7 +149,7 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter: } // end namespace itk #ifndef ITK_MANUAL_INSTANTIATION -#include "itkLabelSetMorphBaseImageFilter.hxx" +# include "itkLabelSetMorphBaseImageFilter.hxx" #endif #endif diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index f68c5b768d9..5d424a7cfd3 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -30,26 +30,25 @@ namespace itk { -template< typename TInputImage, bool doDilate, typename TOutputImage > -LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > -::LabelSetMorphBaseImageFilter() +template +LabelSetMorphBaseImageFilter::LabelSetMorphBaseImageFilter() { this->SetNumberOfRequiredOutputs(1); this->SetNumberOfRequiredInputs(1); -// needs to be selected according to erosion/dilation + // needs to be selected according to erosion/dilation m_DistanceImage = DistanceImageType::New(); - if ( doDilate ) - { - m_Extreme = NumericTraits< RealType >::NonpositiveMin(); + if (doDilate) + { + m_Extreme = NumericTraits::NonpositiveMin(); m_MagnitudeSign = 1; - } + } else - { - m_Extreme = NumericTraits< RealType >::max(); + { + m_Extreme = NumericTraits::max(); m_MagnitudeSign = -1; - } + } m_UseImageSpacing = false; this->SetRadius(1); @@ -57,22 +56,24 @@ LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > this->DynamicMultiThreadingOn(); } -template< typename TInputImage, bool doDilate, typename TOutputImage > +template void -LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > -::DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) +LabelSetMorphBaseImageFilter::DynamicThreadedGenerateData( + const OutputImageRegionType & outputRegionForThread) { // stop warnings (void)outputRegionForThread; } -template< typename TInputImage, bool doDilate, typename TOutputImage > +template RegionIndexType -LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > -::SplitRequestedRegion(RegionIndexType i, RegionIndexType num, OutputImageRegionType & splitRegion) +LabelSetMorphBaseImageFilter::SplitRequestedRegion( + RegionIndexType i, + RegionIndexType num, + OutputImageRegionType & splitRegion) { // Get the output pointer - OutputImageType *outputPtr = this->GetOutput(); + OutputImageType * outputPtr = this->GetOutput(); // Initialize the splitRegion to the output requested region splitRegion = outputPtr->GetRequestedRegion(); @@ -80,41 +81,39 @@ LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > const OutputSizeType & requestedRegionSize = splitRegion.GetSize(); OutputIndexType splitIndex = splitRegion.GetIndex(); - OutputSizeType splitSize = splitRegion.GetSize(); + OutputSizeType splitSize = splitRegion.GetSize(); // split on the outermost dimension available // and avoid the current dimension - int splitAxis = static_cast< int >( outputPtr->GetImageDimension() ) - 1; - while ( ( requestedRegionSize[splitAxis] == 1 ) - || ( splitAxis == static_cast< int >( m_CurrentDimension ) ) ) - { + int splitAxis = static_cast(outputPtr->GetImageDimension()) - 1; + while ((requestedRegionSize[splitAxis] == 1) || (splitAxis == static_cast(m_CurrentDimension))) + { --splitAxis; - if ( splitAxis < 0 ) - { // cannot split + if (splitAxis < 0) + { // cannot split itkDebugMacro("Cannot Split"); return 1; - } } + } // determine the actual number of pieces that will be generated - auto range = static_cast< double >( requestedRegionSize[splitAxis] ); + auto range = static_cast(requestedRegionSize[splitAxis]); - auto valuesPerThread = static_cast< unsigned int >( std::ceil( range / static_cast< double >( num ) ) ); - unsigned int maxThreadIdUsed = - static_cast< unsigned int >( std::ceil( range / static_cast< double >( valuesPerThread ) ) ) - 1; + auto valuesPerThread = static_cast(std::ceil(range / static_cast(num))); + unsigned int maxThreadIdUsed = static_cast(std::ceil(range / static_cast(valuesPerThread))) - 1; // Split the region - if ( i < maxThreadIdUsed ) - { + if (i < maxThreadIdUsed) + { splitIndex[splitAxis] += i * valuesPerThread; splitSize[splitAxis] = valuesPerThread; - } - if ( i == maxThreadIdUsed ) - { + } + if (i == maxThreadIdUsed) + { splitIndex[splitAxis] += i * valuesPerThread; // last thread needs to process the "rest" dimension being split splitSize[splitAxis] = splitSize[splitAxis] - i * valuesPerThread; - } + } // set the split region ivars splitRegion.SetIndex(splitIndex); @@ -125,10 +124,9 @@ LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > return maxThreadIdUsed + 1; } -template< typename TInputImage, bool doDilate, typename TOutputImage > +template void -LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > -::SetRadius(ScalarRealType radius) +LabelSetMorphBaseImageFilter::SetRadius(ScalarRealType radius) { RadiusType s; @@ -136,52 +134,50 @@ LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > this->SetRadius(s); } -template< typename TInputImage, bool doDilate, typename TOutputImage > +template void -LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > -::EnlargeOutputRequestedRegion(DataObject *output) +LabelSetMorphBaseImageFilter::EnlargeOutputRequestedRegion(DataObject * output) { - auto *out = dynamic_cast< TOutputImage * >( output ); + auto * out = dynamic_cast(output); - if ( out ) - { - out->SetRequestedRegion( out->GetLargestPossibleRegion() ); - } + if (out) + { + out->SetRequestedRegion(out->GetLargestPossibleRegion()); + } } -template< typename TInputImage, bool doDilate, typename TOutputImage > +template void -LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > -::GenerateData(void) +LabelSetMorphBaseImageFilter::GenerateData(void) { ThreadIdType nbthreads = this->GetNumberOfWorkUnits(); - typename TInputImage::ConstPointer inputImage( this->GetInput () ); - typename TOutputImage::Pointer outputImage( this->GetOutput() ); + typename TInputImage::ConstPointer inputImage(this->GetInput()); + typename TOutputImage::Pointer outputImage(this->GetOutput()); this->AllocateOutputs(); - m_DistanceImage->SetBufferedRegion( outputImage->GetRequestedRegion() ); + m_DistanceImage->SetBufferedRegion(outputImage->GetRequestedRegion()); m_DistanceImage->Allocate(); m_DistanceImage->FillBuffer(0); m_DistanceImage->CopyInformation(inputImage); - if ( this->GetUseImageSpacing() ) - { + if (this->GetUseImageSpacing()) + { // radius is in mm - for ( unsigned P = 0; P < InputImageType::ImageDimension; P++ ) - { + for (unsigned P = 0; P < InputImageType::ImageDimension; P++) + { m_Scale[P] = 0.5 * m_Radius[P] * m_Radius[P]; - } } + } else - { + { // this gives us a little bit of a margin - for ( unsigned P = 0; P < InputImageType::ImageDimension; P++ ) - { - m_Scale[P] = ( 0.5 * m_Radius[P] * m_Radius[P] + 1 ); - } + for (unsigned P = 0; P < InputImageType::ImageDimension; P++) + { + m_Scale[P] = (0.5 * m_Radius[P] * m_Radius[P] + 1); } + } // set up the scaling parameter // first non zero element of m_Scale sets the value used the first @@ -190,69 +186,67 @@ LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > // value to support elliptical operations. // The first value needs to be recorded for use by the erosion operation. unsigned firstval = 0; - for ( unsigned P = 0; P < InputImageType::ImageDimension; P++ ) + for (unsigned P = 0; P < InputImageType::ImageDimension; P++) + { + if (m_Radius[P] != 0) { - if ( m_Radius[P] != 0 ) - { firstval = P; break; - } } + } m_BaseSigma = m_Scale[firstval]; - for ( unsigned P = firstval + 1; P < InputImageType::ImageDimension; P++ ) - { + for (unsigned P = firstval + 1; P < InputImageType::ImageDimension; P++) + { m_Scale[P] = m_Scale[P] / m_Scale[firstval]; - } + } m_FirstPassDone = false; // Set up the multithreaded processing - typename ImageSource< TOutputImage >::ThreadStruct str; + typename ImageSource::ThreadStruct str; str.Filter = this; - ProcessObject::MultiThreaderType *multithreader = this->GetMultiThreader(); + ProcessObject::MultiThreaderType * multithreader = this->GetMultiThreader(); multithreader->SetNumberOfWorkUnits(nbthreads); multithreader->SetSingleMethod(this->ThreaderCallback, &str); // multithread the execution - for ( unsigned int d = 0; d < ImageDimension; d++ ) - { + for (unsigned int d = 0; d < ImageDimension; d++) + { m_CurrentDimension = d; multithreader->SingleMethodExecute(); - if ( this->m_Scale[m_CurrentDimension] > 0 ) - { + if (this->m_Scale[m_CurrentDimension] > 0) + { // needs to be set outside the multithreaded code // first pass is completed as soon as we hit a structuring // element dimension that is non zero. m_FirstPassDone = true; - } } + } } -template< typename TInputImage, bool doDilate, typename TOutputImage > +template void -LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > -::PrintSelf(std::ostream & os, Indent indent) const +LabelSetMorphBaseImageFilter::PrintSelf(std::ostream & os, Indent indent) const { Superclass::PrintSelf(os, indent); - if ( m_UseImageSpacing ) - { + if (m_UseImageSpacing) + { os << "Scale in world units: " << m_Radius << std::endl; - } + } else - { + { os << "Scale in voxels: " << m_Radius << std::endl; - } + } } -template< typename TInputImage, bool doDilate, typename TOutputImage > +template void -LabelSetMorphBaseImageFilter< TInputImage, doDilate, TOutputImage > -::writeDist(std::string fname) +LabelSetMorphBaseImageFilter::writeDist(std::string fname) { - using WriterType = typename itk::ImageFileWriter< DistanceImageType >; + using WriterType = typename itk::ImageFileWriter; typename WriterType::Pointer writer = WriterType::New(); writer->SetInput(m_DistanceImage); - writer->SetFileName( fname.c_str() ); + writer->SetFileName(fname.c_str()); writer->Update(); } } // namespace itk diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index 85c6d668ec9..daafe44d7c1 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -25,226 +25,238 @@ namespace itk { namespace LabSet { -template< class LineBufferType, class RealType > -void DoLineErodeFirstPass(LineBufferType & LineBuf, RealType leftend, RealType rightend, - const RealType magnitude, const RealType Sigma) +template +void +DoLineErodeFirstPass(LineBufferType & LineBuf, + RealType leftend, + RealType rightend, + const RealType magnitude, + const RealType Sigma) { // This is the first pass algorithm. We can write down the values // because we know the inputs are binary const long LineLength = LineBuf.size(); - for ( long pos = 0; pos < LineLength; pos++ ) - { + for (long pos = 0; pos < LineLength; pos++) + { // compute the height of the parabola starting at each end and // keep the minimum RealType left, right; unsigned offset = LineLength - pos; - left = leftend - magnitude * ( pos + 1 ) * ( pos + 1 ); + left = leftend - magnitude * (pos + 1) * (pos + 1); right = rightend - magnitude * offset * offset; // note hard coded value here - could be a parameter -// LineBuf[pos] = std::min(std::min(left, right), -// itk::NumericTraits::One); + // LineBuf[pos] = std::min(std::min(left, right), + // itk::NumericTraits::One); LineBuf[pos] = std::min(std::min(left, right), Sigma); - } + } } -template< class LineBufferType, class LabLineBufferType, class RealType > -void DoLineDilateFirstPass(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, - LabLineBufferType & LabBuf, - LabLineBufferType & NewLabBuf, - const RealType magnitude) +template +void +DoLineDilateFirstPass(LineBufferType & LineBuf, + LineBufferType & tmpLineBuf, + LabLineBufferType & LabBuf, + LabLineBufferType & NewLabBuf, + const RealType magnitude) { // need to propagate the labels here const long LineLength = LineBuf.size(); long lastcontact = 0; RealType lastval = LineBuf[0]; - for ( long pos = 0; pos < LineLength; pos++ ) - { + for (long pos = 0; pos < LineLength; pos++) + { // left pass RealType krange = pos - lastcontact; RealType thisval = lastval - magnitude * krange * krange; - if ( LineBuf[pos] >= LineBuf[lastcontact] ) - { + if (LineBuf[pos] >= LineBuf[lastcontact]) + { lastcontact = pos; lastval = LineBuf[pos]; - } + } tmpLineBuf[pos] = std::max(LineBuf[pos], thisval); - if ( thisval > LineBuf[pos] ) - { + if (thisval > LineBuf[pos]) + { NewLabBuf[pos] = LabBuf[lastcontact]; - } + } else - { + { NewLabBuf[pos] = LabBuf[pos]; - } } + } lastcontact = LineLength - 1; lastval = tmpLineBuf[lastcontact]; - for ( long pos = LineLength - 1; pos >= 0; pos-- ) - { + for (long pos = LineLength - 1; pos >= 0; pos--) + { // right pass RealType krange = lastcontact - pos; RealType thisval = lastval - magnitude * krange * krange; - if ( tmpLineBuf[pos] >= tmpLineBuf[lastcontact] ) - { + if (tmpLineBuf[pos] >= tmpLineBuf[lastcontact]) + { lastcontact = pos; lastval = tmpLineBuf[pos]; - } + } LineBuf[pos] = std::max(tmpLineBuf[pos], thisval); - if ( thisval > tmpLineBuf[pos] ) - { + if (thisval > tmpLineBuf[pos]) + { NewLabBuf[pos] = LabBuf[lastcontact]; - } + } // only need to do this bit on the first pass - it doubles as a // way of initializing NewLabPos // else // { // NewLabBuf[pos] = LabBuf[pos]; // } - } + } } -template< class LineBufferType, class RealType, bool doDilate > -void DoLine(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, - const RealType magnitude, const RealType m_Extreme) +template +void +DoLine(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, const RealType magnitude, const RealType m_Extreme) { // contact point algorithm - long koffset = 0, newcontact = 0; // how far away the search starts. + long koffset = 0, newcontact = 0; // how far away the search starts. const long LineLength = LineBuf.size(); // negative half of the parabola - for ( long pos = 0; pos < LineLength; pos++ ) - { + for (long pos = 0; pos < LineLength; pos++) + { auto BaseVal = (RealType)m_Extreme; // the base value for - // comparison - for ( long krange = koffset; krange <= 0; krange++ ) - { + // comparison + for (long krange = koffset; krange <= 0; krange++) + { // difference needs to be paramaterised RealType T = LineBuf[pos + krange] - magnitude * krange * krange; // switch on template parameter - hopefully gets optimized away. - if ( doDilate ? ( T >= BaseVal ) : ( T <= BaseVal ) ) - { + if (doDilate ? (T >= BaseVal) : (T <= BaseVal)) + { BaseVal = T; newcontact = krange; - } } + } tmpLineBuf[pos] = BaseVal; koffset = newcontact - 1; - } + } // positive half of parabola koffset = newcontact = 0; - for ( long pos = LineLength - 1; pos >= 0; pos-- ) - { + for (long pos = LineLength - 1; pos >= 0; pos--) + { auto BaseVal = (RealType)m_Extreme; // the base value for comparison - for ( long krange = koffset; krange >= 0; krange-- ) - { + for (long krange = koffset; krange >= 0; krange--) + { RealType T = tmpLineBuf[pos + krange] - magnitude * krange * krange; - if ( doDilate ? ( T >= BaseVal ) : ( T <= BaseVal ) ) - { + if (doDilate ? (T >= BaseVal) : (T <= BaseVal)) + { BaseVal = T; newcontact = krange; - } } + } LineBuf[pos] = BaseVal; koffset = newcontact + 1; - } + } } -template< class LineBufferType, class LabBufferType, class RealType, bool doDilate > -void DoLineLabelProp(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, - LabBufferType & LabelBuf, LabBufferType & tmpLabelBuf, - const RealType magnitude, const RealType m_Extreme) +template +void +DoLineLabelProp(LineBufferType & LineBuf, + LineBufferType & tmpLineBuf, + LabBufferType & LabelBuf, + LabBufferType & tmpLabelBuf, + const RealType magnitude, + const RealType m_Extreme) { // contact point algorithm - long koffset = 0, newcontact = 0; // how far away the search starts. + long koffset = 0, newcontact = 0; // how far away the search starts. using LabelType = typename LabBufferType::ValueType; const long LineLength = LineBuf.size(); // negative half of the parabola - for ( long pos = 0; pos < LineLength; pos++ ) - { + for (long pos = 0; pos < LineLength; pos++) + { auto BaseVal = (RealType)m_Extreme; // the base value for - // comparison + // comparison LabelType BaseLab = LabelBuf[pos]; - for ( long krange = koffset; krange <= 0; krange++ ) - { + for (long krange = koffset; krange <= 0; krange++) + { // difference needs to be paramaterised RealType T = LineBuf[pos + krange] - magnitude * krange * krange; // switch on template parameter - hopefully gets optimized away. - if ( doDilate ? ( T >= BaseVal ) : ( T <= BaseVal ) ) - { + if (doDilate ? (T >= BaseVal) : (T <= BaseVal)) + { BaseVal = T; newcontact = krange; BaseLab = LabelBuf[pos + krange]; - } } + } tmpLineBuf[pos] = BaseVal; tmpLabelBuf[pos] = BaseLab; koffset = newcontact - 1; - } + } // positive half of parabola koffset = newcontact = 0; #if 1 - for ( long pos = LineLength - 1; pos >= 0; pos-- ) - { + for (long pos = LineLength - 1; pos >= 0; pos--) + { auto BaseVal = (RealType)m_Extreme; // the base value for comparison // initialize the label to the previously pro LabelType BaseLab = tmpLabelBuf[pos]; - for ( long krange = koffset; krange >= 0; krange-- ) - { + for (long krange = koffset; krange >= 0; krange--) + { RealType T = tmpLineBuf[pos + krange] - magnitude * krange * krange; - if ( doDilate ? ( T >= BaseVal ) : ( T <= BaseVal ) ) - { + if (doDilate ? (T >= BaseVal) : (T <= BaseVal)) + { BaseVal = T; newcontact = krange; BaseLab = tmpLabelBuf[pos + krange]; - } } + } LineBuf[pos] = BaseVal; LabelBuf[pos] = BaseLab; koffset = newcontact + 1; - } + } #else - for ( long pos = LineLength - 1; pos >= 0; pos-- ) - { + for (long pos = LineLength - 1; pos >= 0; pos--) + { LineBuf[pos] = tmpLineBuf[pos]; LabelBuf[pos] = tmpLabelBuf[pos]; - } + } #endif } -template< class TInIter, class TOutDistIter, class TOutLabIter, class RealType > -void doOneDimensionErodeFirstPass(TInIter & inputIterator, TOutDistIter & outputIterator, - TOutLabIter & outputLabIterator, - const unsigned LineLength, - const unsigned direction, - const int m_MagnitudeSign, - const bool m_UseImageSpacing, - const RealType image_scale, - const RealType Sigma, - const bool lastpass) +template +void +doOneDimensionErodeFirstPass(TInIter & inputIterator, + TOutDistIter & outputIterator, + TOutLabIter & outputLabIterator, + const unsigned LineLength, + const unsigned direction, + const int m_MagnitudeSign, + const bool m_UseImageSpacing, + const RealType image_scale, + const RealType Sigma, + const bool lastpass) { // specialised version for binary erosion during first pass. We can // compute the results directly because the inputs are flat. - using LineBufferType = typename itk::Array< RealType >; - using LabelBufferType = typename itk::Array< typename TInIter::PixelType >; + using LineBufferType = typename itk::Array; + using LabelBufferType = typename itk::Array; RealType iscale = 1.0; - if ( m_UseImageSpacing ) - { + if (m_UseImageSpacing) + { iscale = image_scale; - } + } // restructure equation to reduce numerical error -// const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 * -// Sigma); - const RealType magnitude = ( m_MagnitudeSign * iscale * iscale ) / ( 2.0 ); + // const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 * + // Sigma); + const RealType magnitude = (m_MagnitudeSign * iscale * iscale) / (2.0); LineBufferType LineBuf(LineLength); LabelBufferType LabBuf(LineLength); @@ -256,52 +268,52 @@ void doOneDimensionErodeFirstPass(TInIter & inputIterator, TOutDistIter & output outputIterator.GoToBegin(); outputLabIterator.GoToBegin(); - while ( !inputIterator.IsAtEnd() && !outputIterator.IsAtEnd() ) - { + while (!inputIterator.IsAtEnd() && !outputIterator.IsAtEnd()) + { // process this direction // fetch the line into the buffer - this methodology is like // the gaussian filters unsigned int i = 0; // copy the scanline to a buffer - while ( !inputIterator.IsAtEndOfLine() ) + while (!inputIterator.IsAtEndOfLine()) + { + LabBuf[i] = (inputIterator.Get()); + if (LabBuf[i]) { - LabBuf[i] = ( inputIterator.Get() ); - if ( LabBuf[i] ) - { LineBuf[i] = 1.0; - } + } ++i; ++inputIterator; - } + } // runlength encode the line buffer (could be integrated with extraction) - using EndType = std::vector< unsigned >; + using EndType = std::vector; EndType firsts; EndType lasts; - for ( unsigned idx = 0; idx < LineLength; idx++ ) - { + for (unsigned idx = 0; idx < LineLength; idx++) + { RealType val = LabBuf[idx]; - if ( val != 0 ) - { + if (val != 0) + { // found a run firsts.push_back(idx); unsigned idxend = idx; - for (; idxend < LineLength; idxend++ ) + for (; idxend < LineLength; idxend++) + { + if (val != LabBuf[idxend]) { - if ( val != LabBuf[idxend] ) - { break; - } } + } lasts.push_back(idxend - 1); idx = idxend - 1; - } } + } - for ( unsigned R = 0; R < firsts.size(); R++ ) - { + for (unsigned R = 0; R < firsts.size(); R++) + { unsigned first = firsts[R]; unsigned last = lasts[R]; unsigned SLL = last - first + 1; @@ -309,69 +321,77 @@ void doOneDimensionErodeFirstPass(TInIter & inputIterator, TOutDistIter & output // if one end of the run touches the image edge, then we leave // the value as 1 RealType leftend = 0, rightend = 0; - if ( first == 0 ) { leftend = Sigma; } - if ( last == LineLength - 1 ) { rightend = Sigma; } + if (first == 0) + { + leftend = Sigma; + } + if (last == LineLength - 1) + { + rightend = Sigma; + } - DoLineErodeFirstPass< LineBufferType, RealType >(ShortLineBuf, leftend, rightend, magnitude, Sigma); + DoLineErodeFirstPass(ShortLineBuf, leftend, rightend, magnitude, Sigma); // copy the segment back into the full line buffer - std::copy( ShortLineBuf.begin(), ShortLineBuf.end(), &( LineBuf[first] ) ); - } + std::copy(ShortLineBuf.begin(), ShortLineBuf.end(), &(LineBuf[first])); + } // copy the line buffer back to the image unsigned j = 0; - while ( !outputIterator.IsAtEndOfLine() ) - { - outputIterator.Set( static_cast< typename TOutDistIter::PixelType >( LineBuf[j++] ) ); + while (!outputIterator.IsAtEndOfLine()) + { + outputIterator.Set(static_cast(LineBuf[j++])); ++outputIterator; - } + } - if ( lastpass ) - { + if (lastpass) + { // copy to the output image - this would be a weird case of only // using a one dimensional SE unsigned j2 = 0; - while ( !outputLabIterator.IsAtEndOfLine() ) - { + while (!outputLabIterator.IsAtEndOfLine()) + { typename TInIter::PixelType val = 0; - if ( LineBuf[j2] == Sigma ) - { + if (LineBuf[j2] == Sigma) + { val = LabBuf[j2]; - } + } outputLabIterator.Set(val); ++outputLabIterator; ++j2; - } - outputLabIterator.NextLine(); } + outputLabIterator.NextLine(); + } // now onto the next line inputIterator.NextLine(); outputIterator.NextLine(); - } + } } -template< class TInIter, class TOutDistIter, class TOutLabIter, class RealType > -void doOneDimensionDilateFirstPass(TInIter & inputIterator, TOutDistIter & outputIterator, - TOutLabIter & outputLabIterator, - const unsigned LineLength, - const unsigned direction, - const int m_MagnitudeSign, - const bool m_UseImageSpacing, - const RealType image_scale, - const RealType Sigma) +template +void +doOneDimensionDilateFirstPass(TInIter & inputIterator, + TOutDistIter & outputIterator, + TOutLabIter & outputLabIterator, + const unsigned LineLength, + const unsigned direction, + const int m_MagnitudeSign, + const bool m_UseImageSpacing, + const RealType image_scale, + const RealType Sigma) { // specialised version for binary erosion during first pass. We can // compute the results directly because the inputs are flat. - using LineBufferType = typename itk::Array< RealType >; - using LabelBufferType = typename itk::Array< typename TInIter::PixelType >; + using LineBufferType = typename itk::Array; + using LabelBufferType = typename itk::Array; RealType iscale = 1.0; - if ( m_UseImageSpacing ) - { + if (m_UseImageSpacing) + { iscale = image_scale; - } + } // restructure equation to reduce numerical error - //const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 * + // const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 * // Sigma); - const RealType magnitude = ( m_MagnitudeSign * iscale * iscale ) / ( 2.0 ); + const RealType magnitude = (m_MagnitudeSign * iscale * iscale) / (2.0); LineBufferType LineBuf(LineLength); LabelBufferType LabBuf(LineLength); LineBufferType tmpLineBuf(LineLength); @@ -385,74 +405,73 @@ void doOneDimensionDilateFirstPass(TInIter & inputIterator, TOutDistIter & outpu outputIterator.GoToBegin(); outputLabIterator.GoToBegin(); - while ( !inputIterator.IsAtEnd() && !outputIterator.IsAtEnd() ) - { + while (!inputIterator.IsAtEnd() && !outputIterator.IsAtEnd()) + { // process this direction // fetch the line into the buffer - this methodology is like // the gaussian filters unsigned int i = 0; // copy the scanline to a buffer - while ( !inputIterator.IsAtEndOfLine() ) + while (!inputIterator.IsAtEndOfLine()) + { + LabBuf[i] = (inputIterator.Get()); + if (LabBuf[i]) { - LabBuf[i] = ( inputIterator.Get() ); - if ( LabBuf[i] ) - { LineBuf[i] = Sigma; - } + } else - { + { LineBuf[i] = 0; - } + } ++i; ++inputIterator; - } + } - DoLineDilateFirstPass< LineBufferType, LabelBufferType, RealType >(LineBuf, - tmpLineBuf, - LabBuf, - newLabBuf, - magnitude); + DoLineDilateFirstPass(LineBuf, tmpLineBuf, LabBuf, newLabBuf, magnitude); // copy the line buffer back to the image unsigned j = 0; - while ( !outputIterator.IsAtEndOfLine() ) - { - outputIterator.Set( static_cast< typename TOutDistIter::PixelType >( LineBuf[j] ) ); + while (!outputIterator.IsAtEndOfLine()) + { + outputIterator.Set(static_cast(LineBuf[j])); outputLabIterator.Set(newLabBuf[j]); ++outputLabIterator; ++outputIterator; ++j; - } + } // now onto the next line inputIterator.NextLine(); outputIterator.NextLine(); outputLabIterator.NextLine(); - } + } } -template< class TInIter, class TDistIter, class TOutLabIter, class TOutDistIter, class RealType > -void doOneDimensionErode(TInIter & inputIterator, TDistIter & inputDistIterator, - TOutDistIter & outputDistIterator, TOutLabIter & outputLabIterator, - const unsigned LineLength, - const unsigned direction, - const int m_MagnitudeSign, - const bool m_UseImageSpacing, - const RealType m_Extreme, - const RealType image_scale, - const RealType Sigma, - const RealType BaseSigma, - const bool lastpass) +template +void +doOneDimensionErode(TInIter & inputIterator, + TDistIter & inputDistIterator, + TOutDistIter & outputDistIterator, + TOutLabIter & outputLabIterator, + const unsigned LineLength, + const unsigned direction, + const int m_MagnitudeSign, + const bool m_UseImageSpacing, + const RealType m_Extreme, + const RealType image_scale, + const RealType Sigma, + const RealType BaseSigma, + const bool lastpass) { // traditional erosion - can't optimise the same way as the first pass - using LineBufferType = typename itk::Array< RealType >; - using LabelBufferType = typename itk::Array< typename TInIter::PixelType >; + using LineBufferType = typename itk::Array; + using LabelBufferType = typename itk::Array; RealType iscale = 1.0; - if ( m_UseImageSpacing ) - { + if (m_UseImageSpacing) + { iscale = image_scale; - } - const RealType magnitude = ( m_MagnitudeSign * iscale * iscale ) / ( 2.0 * Sigma ); + } + const RealType magnitude = (m_MagnitudeSign * iscale * iscale) / (2.0 * Sigma); LineBufferType LineBuf(LineLength); LabelBufferType LabBuf(LineLength); @@ -466,48 +485,48 @@ void doOneDimensionErode(TInIter & inputIterator, TDistIter & inputDistIterator, inputDistIterator.GoToBegin(); outputLabIterator.GoToBegin(); - while ( !inputIterator.IsAtEnd() && !outputDistIterator.IsAtEnd() ) - { + while (!inputIterator.IsAtEnd() && !outputDistIterator.IsAtEnd()) + { // process this direction // fetch the line into the buffer - this methodology is like // the gaussian filters unsigned int i = 0; // copy the scanline to a buffer - while ( !inputIterator.IsAtEndOfLine() ) - { - LineBuf[i] = static_cast< RealType >( inputDistIterator.Get() ); - LabBuf[i] = inputIterator.Get(); + while (!inputIterator.IsAtEndOfLine()) + { + LineBuf[i] = static_cast(inputDistIterator.Get()); + LabBuf[i] = inputIterator.Get(); ++i; ++inputDistIterator; ++inputIterator; - } + } // runlength encode the line buffer (could be integrated with extraction) - using EndType = std::vector< unsigned >; + using EndType = std::vector; EndType firsts; EndType lasts; - for ( unsigned idx = 0; idx < LineLength; idx++ ) - { + for (unsigned idx = 0; idx < LineLength; idx++) + { RealType val = LabBuf[idx]; - if ( val != 0 ) - { + if (val != 0) + { // found a run firsts.push_back(idx); unsigned idxend = idx; - for (; idxend < LineLength; idxend++ ) + for (; idxend < LineLength; idxend++) + { + if (val != LabBuf[idxend]) { - if ( val != LabBuf[idxend] ) - { break; - } } + } lasts.push_back(idxend - 1); idx = idxend - 1; - } } + } - for ( unsigned R = 0; R < firsts.size(); R++ ) - { + for (unsigned R = 0; R < firsts.size(); R++) + { unsigned first = firsts[R]; unsigned last = lasts[R]; unsigned SLL = last - first + 1; @@ -517,74 +536,82 @@ void doOneDimensionErode(TInIter & inputIterator, TDistIter & inputDistIterator, // if one end of the run touches the image edge, then we leave // the value as 1 RealType leftend = 0, rightend = 0; - if ( first == 0 ) { leftend = BaseSigma; } - if ( last == LineLength - 1 ) { rightend = BaseSigma; } + if (first == 0) + { + leftend = BaseSigma; + } + if (last == LineLength - 1) + { + rightend = BaseSigma; + } ShortLineBuf[0] = leftend; ShortLineBuf[SLL + 1] = rightend; - std::copy( &( LineBuf[first] ), &( LineBuf[last + 1] ), &( ShortLineBuf[1] ) ); + std::copy(&(LineBuf[first]), &(LineBuf[last + 1]), &(ShortLineBuf[1])); - DoLine< LineBufferType, RealType, false >(ShortLineBuf, tmpShortLineBuf, magnitude, m_Extreme); + DoLine(ShortLineBuf, tmpShortLineBuf, magnitude, m_Extreme); // copy the segment back into the full line buffer - std::copy( &( ShortLineBuf[1] ), &( ShortLineBuf[SLL + 1] ), &( LineBuf[first] ) ); - } + std::copy(&(ShortLineBuf[1]), &(ShortLineBuf[SLL + 1]), &(LineBuf[first])); + } // copy the line buffer back to the image - don't need to do it on // the last pass - move when we are sure it is working unsigned j = 0; - while ( !outputDistIterator.IsAtEndOfLine() ) - { - outputDistIterator.Set( static_cast< typename TOutDistIter::PixelType >( LineBuf[j++] ) ); + while (!outputDistIterator.IsAtEndOfLine()) + { + outputDistIterator.Set(static_cast(LineBuf[j++])); ++outputDistIterator; - } + } - if ( lastpass ) - { + if (lastpass) + { unsigned j2 = 0; - while ( !outputLabIterator.IsAtEndOfLine() ) - { + while (!outputLabIterator.IsAtEndOfLine()) + { typename TInIter::PixelType val = 0; - if ( LineBuf[j2] == BaseSigma ) - { + if (LineBuf[j2] == BaseSigma) + { val = LabBuf[j2]; - } + } outputLabIterator.Set(val); ++outputLabIterator; ++j2; - } - outputLabIterator.NextLine(); } + outputLabIterator.NextLine(); + } // now onto the next line inputIterator.NextLine(); inputDistIterator.NextLine(); outputDistIterator.NextLine(); - } + } } -template< class TInIter, class TDistIter, class TOutLabIter, class TOutDistIter, class RealType > -void doOneDimensionDilate(TInIter & inputIterator, TDistIter & inputDistIterator, - TOutDistIter & outputDistIterator, TOutLabIter & outputLabIterator, - const unsigned LineLength, - const unsigned direction, - const int m_MagnitudeSign, - const bool m_UseImageSpacing, - const RealType m_Extreme, - const RealType image_scale, - const RealType Sigma - ) +template +void +doOneDimensionDilate(TInIter & inputIterator, + TDistIter & inputDistIterator, + TOutDistIter & outputDistIterator, + TOutLabIter & outputLabIterator, + const unsigned LineLength, + const unsigned direction, + const int m_MagnitudeSign, + const bool m_UseImageSpacing, + const RealType m_Extreme, + const RealType image_scale, + const RealType Sigma) { // specialised version for binary erosion during first pass. We can // compute the results directly because the inputs are flat. - using LineBufferType = typename itk::Array< RealType >; - using LabelBufferType = typename itk::Array< typename TInIter::PixelType >; + using LineBufferType = typename itk::Array; + using LabelBufferType = typename itk::Array; RealType iscale = 1.0; - if ( m_UseImageSpacing ) - { + if (m_UseImageSpacing) + { iscale = image_scale; - } + } // restructure equation to reduce numerical error - const RealType magnitude = ( m_MagnitudeSign * iscale * iscale ) / ( 2.0 * Sigma ); -// const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 ); + const RealType magnitude = (m_MagnitudeSign * iscale * iscale) / (2.0 * Sigma); + // const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 ); LineBufferType LineBuf(LineLength); LabelBufferType LabBuf(LineLength); LineBufferType tmpLineBuf(LineLength); @@ -601,47 +628,43 @@ void doOneDimensionDilate(TInIter & inputIterator, TDistIter & inputDistIterator outputDistIterator.GoToBegin(); outputLabIterator.GoToBegin(); - while ( !inputDistIterator.IsAtEnd() && !outputLabIterator.IsAtEnd() ) - { + while (!inputDistIterator.IsAtEnd() && !outputLabIterator.IsAtEnd()) + { // process this direction // fetch the line into the buffer - this methodology is like // the gaussian filters unsigned int i = 0; // copy the scanline to a buffer - while ( !inputDistIterator.IsAtEndOfLine() ) - { + while (!inputDistIterator.IsAtEndOfLine()) + { LineBuf[i] = inputDistIterator.Get(); - LabBuf[i] = inputIterator.Get(); + LabBuf[i] = inputIterator.Get(); ++i; ++inputIterator; ++inputDistIterator; - } + } - DoLineLabelProp< LineBufferType, LabelBufferType, RealType, true >(LineBuf, - tmpLineBuf, - LabBuf, - tmpLabBuf, - magnitude, - m_Extreme); + DoLineLabelProp( + LineBuf, tmpLineBuf, LabBuf, tmpLabBuf, magnitude, m_Extreme); // copy the line buffer back to the image unsigned j = 0; - while ( !outputDistIterator.IsAtEndOfLine() ) - { - outputDistIterator.Set( static_cast< typename TOutDistIter::PixelType >( LineBuf[j] ) ); + while (!outputDistIterator.IsAtEndOfLine()) + { + outputDistIterator.Set(static_cast(LineBuf[j])); outputLabIterator.Set(LabBuf[j]); ++outputDistIterator; ++outputLabIterator; j++; - } + } // now onto the next line inputIterator.NextLine(); outputLabIterator.NextLine(); inputDistIterator.NextLine(); outputDistIterator.NextLine(); - } -} -} + } } +} // namespace LabSet +} // namespace itk #endif diff --git a/Modules/Filtering/LabelErodeDilate/include/itkinstance.h b/Modules/Filtering/LabelErodeDilate/include/itkinstance.h index 8fb6bfe50fa..30a7abf4b57 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkinstance.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkinstance.h @@ -22,12 +22,14 @@ #include namespace itk { -template< typename T > -class Instance:public T::Pointer +template +class Instance : public T::Pointer { public: - Instance():SmartPointer< T >( T::New() ) {} + Instance() + : SmartPointer(T::New()) + {} }; -} +} // namespace itk #endif diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index 67c5aaa5cd9..403721b2f3e 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -22,82 +22,84 @@ #include "itkLabelSetDilateImageFilter.h" #include "read_info.cxx" -template< class MaskPixType, int dim > -int doDilate(char *In, char *Out, int radius) +template +int +doDilate(char * In, char * Out, int radius) { - using MaskImType = typename itk::Image< MaskPixType, dim >; + using MaskImType = typename itk::Image; // load - using ReaderType = typename itk::ImageFileReader< MaskImType >; + using ReaderType = typename itk::ImageFileReader; typename ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(In); try - { + { reader->Update(); - } - catch ( itk::ExceptionObject & excp ) - { + } + catch (itk::ExceptionObject & excp) + { std::cerr << excp << std::endl; return EXIT_FAILURE; - } + } // Label dilation - using FilterType = typename itk::LabelSetDilateImageFilter< MaskImType, MaskImType >; + using FilterType = typename itk::LabelSetDilateImageFilter; typename FilterType::Pointer filter = FilterType::New(); - filter->SetInput( reader->GetOutput() ); + filter->SetInput(reader->GetOutput()); filter->SetRadius(radius); filter->SetUseImageSpacing(true); - using WriterType = typename itk::ImageFileWriter< MaskImType >; + using WriterType = typename itk::ImageFileWriter; typename WriterType::Pointer writer = WriterType::New(); - writer->SetInput( filter->GetOutput() ); + writer->SetInput(filter->GetOutput()); writer->SetFileName(Out); try - { + { writer->Update(); - } - catch ( itk::ExceptionObject & excp ) - { + } + catch (itk::ExceptionObject & excp) + { std::cerr << excp << std::endl; return EXIT_FAILURE; - } + } return EXIT_SUCCESS; } ///////////////////////////////// -int itkLabelSetDilateTest(int argc, char *argv[]) +int +itkLabelSetDilateTest(int argc, char * argv[]) { int dim1; itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads(1); itk::ImageIOBase::IOComponentType ComponentType; - if ( argc != 4 ) - { + if (argc != 4) + { std::cerr << "Usage: " << argv[0] << "inputimage radius outputimage" << std::endl; - return ( EXIT_FAILURE ); - } + return (EXIT_FAILURE); + } - if ( !readImageInfo(argv[1], &ComponentType, &dim1) ) - { + if (!readImageInfo(argv[1], &ComponentType, &dim1)) + { std::cerr << "Failed to open " << argv[1] << std::endl; - return ( EXIT_FAILURE ); - } + return (EXIT_FAILURE); + } int status = EXIT_FAILURE; - switch ( dim1 ) - { + switch (dim1) + { case 2: - status = doDilate< unsigned char, 2 >( argv[1], argv[3], std::stoi(argv[2]) ); + status = doDilate(argv[1], argv[3], std::stoi(argv[2])); break; case 3: - status = doDilate< unsigned char, 3 >( argv[1], argv[3], std::stoi(argv[2]) ); + status = doDilate(argv[1], argv[3], std::stoi(argv[2])); break; default: std::cerr << "Unsupported dimension" << std::endl; - return ( EXIT_FAILURE ); + return (EXIT_FAILURE); break; - } + } return status; } diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx index 2091757feca..59fdece859d 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx @@ -23,82 +23,84 @@ #include "read_info.cxx" -template< class MaskPixType, int dim > -int doErode(char *In, char *Out, int radius) +template +int +doErode(char * In, char * Out, int radius) { - using MaskImType = typename itk::Image< MaskPixType, dim >; + using MaskImType = typename itk::Image; // load - using ReaderType = typename itk::ImageFileReader< MaskImType >; + using ReaderType = typename itk::ImageFileReader; typename ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(In); try - { + { reader->Update(); - } - catch ( itk::ExceptionObject & excp ) - { + } + catch (itk::ExceptionObject & excp) + { std::cerr << excp << std::endl; return EXIT_FAILURE; - } + } // Label dilation - using FilterType = typename itk::LabelSetErodeImageFilter< MaskImType, MaskImType >; + using FilterType = typename itk::LabelSetErodeImageFilter; typename FilterType::Pointer filter = FilterType::New(); - filter->SetInput( reader->GetOutput() ); + filter->SetInput(reader->GetOutput()); filter->SetRadius(radius); filter->SetUseImageSpacing(true); - using WriterType = typename itk::ImageFileWriter< MaskImType >; + using WriterType = typename itk::ImageFileWriter; typename WriterType::Pointer writer = WriterType::New(); - writer->SetInput( filter->GetOutput() ); + writer->SetInput(filter->GetOutput()); writer->SetFileName(Out); try - { + { writer->Update(); - } - catch ( itk::ExceptionObject & excp ) - { + } + catch (itk::ExceptionObject & excp) + { std::cerr << excp << std::endl; return EXIT_FAILURE; - } + } return EXIT_SUCCESS; } ///////////////////////////////////////////// -int itkLabelSetErodeTest(int argc, char *argv[]) +int +itkLabelSetErodeTest(int argc, char * argv[]) { int dim1; itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads(1); itk::ImageIOBase::IOComponentType ComponentType; - if ( argc != 4 ) - { + if (argc != 4) + { std::cerr << "Usage: " << argv[0] << "inputimage radius outputimage" << std::endl; - return ( EXIT_FAILURE ); - } + return (EXIT_FAILURE); + } - if ( !readImageInfo(argv[1], &ComponentType, &dim1) ) - { + if (!readImageInfo(argv[1], &ComponentType, &dim1)) + { std::cerr << "Failed to open " << argv[1] << std::endl; - return ( EXIT_FAILURE ); - } + return (EXIT_FAILURE); + } int status = EXIT_FAILURE; - switch ( dim1 ) - { + switch (dim1) + { case 2: - status = doErode< unsigned char, 2 >( argv[1], argv[3], std::stoi(argv[2]) ); + status = doErode(argv[1], argv[3], std::stoi(argv[2])); break; case 3: - status = doErode< unsigned char, 3 >( argv[1], argv[3], std::stoi(argv[2]) ); + status = doErode(argv[1], argv[3], std::stoi(argv[2])); break; default: std::cerr << "Unsupported dimension" << std::endl; - return ( EXIT_FAILURE ); + return (EXIT_FAILURE); break; - } + } return status; } diff --git a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx index f536d07890c..cd81810b1a5 100644 --- a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx @@ -20,21 +20,23 @@ #define read_info_cxx ///////////////////////////////// -static int readImageInfo(char *filename, itk::ImageIOBase::IOComponentType *ComponentType, int *dim) +static int +readImageInfo(char * filename, itk::ImageIOBase::IOComponentType * ComponentType, int * dim) { - itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(filename, itk::ImageIOFactory::FileModeType::ReadMode); + itk::ImageIOBase::Pointer imageIO = + itk::ImageIOFactory::CreateImageIO(filename, itk::ImageIOFactory::FileModeType::ReadMode); - if ( imageIO.IsNull() ) - { + if (imageIO.IsNull()) + { return 0; - } + } imageIO->SetFileName(filename); imageIO->ReadImageInformation(); *ComponentType = imageIO->GetComponentType(); *dim = imageIO->GetNumberOfDimensions(); - return ( 1 ); + return (1); } ///////////////////////////////// From 5e01d09fec8bea35ab1b085d269d9495e8c7abfd Mon Sep 17 00:00:00 2001 From: Mathew Seng Date: Tue, 18 Feb 2020 09:03:38 -0600 Subject: [PATCH 084/113] ENH: Update enums from recent enum changes in ITK --- .../LabelErodeDilate/test/itkLabelSetDilateTest.cxx | 2 +- .../Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx | 2 +- Modules/Filtering/LabelErodeDilate/test/read_info.cxx | 5 ++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index 403721b2f3e..ddaea7a915b 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -73,7 +73,7 @@ itkLabelSetDilateTest(int argc, char * argv[]) int dim1; itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads(1); - itk::ImageIOBase::IOComponentType ComponentType; + itk::IOComponentEnum ComponentType; if (argc != 4) { diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx index 59fdece859d..ead9e6afd7e 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx @@ -74,7 +74,7 @@ itkLabelSetErodeTest(int argc, char * argv[]) int dim1; itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads(1); - itk::ImageIOBase::IOComponentType ComponentType; + itk::IOComponentEnum ComponentType; if (argc != 4) { diff --git a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx index cd81810b1a5..ce6b57e2ae2 100644 --- a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx @@ -21,10 +21,9 @@ ///////////////////////////////// static int -readImageInfo(char * filename, itk::ImageIOBase::IOComponentType * ComponentType, int * dim) +readImageInfo(char * filename, itk::IOComponentEnum * ComponentType, int * dim) { - itk::ImageIOBase::Pointer imageIO = - itk::ImageIOFactory::CreateImageIO(filename, itk::ImageIOFactory::FileModeType::ReadMode); + itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(filename, itk::IOFileModeEnum::ReadMode); if (imageIO.IsNull()) { From 42382df574d3dd054ef7442ff5813083224e7d33 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Mon, 17 Feb 2020 14:29:58 -0600 Subject: [PATCH 085/113] STYLE: Prefer = default to explicitly trivial implementations This check replaces default bodies of special member functions with = default;. The explicitly defaulted function declarations enable more opportunities in optimization, because the compiler might treat explicitly defaulted functions as trivial. Additionally, the C++11 use of = default more clearly expreses the intent for the special member functions. --- .../LabelErodeDilate/include/itkLabelSetDilateImageFilter.h | 2 +- .../LabelErodeDilate/include/itkLabelSetErodeImageFilter.h | 2 +- .../LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h index b98e04ad55f..21505da0913 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h @@ -77,7 +77,7 @@ class ITK_EXPORT LabelSetDilateImageFilter : public LabelSetMorphBaseImageFilter protected: LabelSetDilateImageFilter() { this->DynamicMultiThreadingOn(); } - ~LabelSetDilateImageFilter() override {} + ~LabelSetDilateImageFilter() override = default; void DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) override; diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h index ce50fe9cbf8..4fe8785aea2 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h @@ -82,7 +82,7 @@ class ITK_EXPORT LabelSetErodeImageFilter : public LabelSetMorphBaseImageFilter< protected: LabelSetErodeImageFilter() { this->DynamicMultiThreadingOn(); } - ~LabelSetErodeImageFilter() override {} + ~LabelSetErodeImageFilter() override = default; void DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) override; diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index 34509fd03b5..6d3f4601a4e 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -112,7 +112,7 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter : public ImageToImageFilter Date: Mon, 17 Feb 2020 14:48:32 -0600 Subject: [PATCH 086/113] STYLE: Remove redundant void argument lists Find and remove redundant void argument lists. --- .../LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h | 2 +- .../include/itkLabelSetMorphBaseImageFilter.hxx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index 6d3f4601a4e..3dbd93abdf8 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -121,7 +121,7 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter : public ImageToImageFilter::EnlargeOutput template void -LabelSetMorphBaseImageFilter::GenerateData(void) +LabelSetMorphBaseImageFilter::GenerateData() { ThreadIdType nbthreads = this->GetNumberOfWorkUnits(); From 5bea530fa98c62b6792cce4fe6eaec9ddc4d9e0d Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Wed, 19 Feb 2020 10:45:25 -0600 Subject: [PATCH 087/113] DOC: Update copyright assignment to NumFOCUS The mission of NumFOCUS is to promote open practices in research, data, and scientific computing. https://numfocus.org --- .../LabelErodeDilate/include/itkLabelSetDilateImageFilter.h | 2 +- .../LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx | 2 +- .../LabelErodeDilate/include/itkLabelSetErodeImageFilter.h | 2 +- .../LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx | 2 +- .../LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h | 2 +- .../include/itkLabelSetMorphBaseImageFilter.hxx | 2 +- Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h | 2 +- Modules/Filtering/LabelErodeDilate/include/itkinstance.h | 2 +- .../Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx | 2 +- .../Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx | 2 +- Modules/Filtering/LabelErodeDilate/test/read_info.cxx | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h index 21505da0913..d891ae7e670 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h @@ -1,6 +1,6 @@ /*========================================================================= * - * Copyright Insight Software Consortium + * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx index a94eba0f214..1e21b2619da 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx @@ -1,6 +1,6 @@ /*========================================================================= * - * Copyright Insight Software Consortium + * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h index 4fe8785aea2..fdc9d25a769 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h @@ -1,6 +1,6 @@ /*========================================================================= * - * Copyright Insight Software Consortium + * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx index 07117a7b201..8cbb732ce26 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx @@ -1,6 +1,6 @@ /*========================================================================= * - * Copyright Insight Software Consortium + * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index 3dbd93abdf8..c4a858ac29a 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -1,6 +1,6 @@ /*========================================================================= * - * Copyright Insight Software Consortium + * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index a7b19da8bfc..d37f4d70f08 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -1,6 +1,6 @@ /*========================================================================= * - * Copyright Insight Software Consortium + * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index daafe44d7c1..a263cfcd8f0 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -1,6 +1,6 @@ /*========================================================================= * - * Copyright Insight Software Consortium + * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Modules/Filtering/LabelErodeDilate/include/itkinstance.h b/Modules/Filtering/LabelErodeDilate/include/itkinstance.h index 30a7abf4b57..571c2d3c0d9 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkinstance.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkinstance.h @@ -1,6 +1,6 @@ /*========================================================================= * - * Copyright Insight Software Consortium + * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index ddaea7a915b..5d1802285df 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -1,6 +1,6 @@ /*========================================================================= * - * Copyright Insight Software Consortium + * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx index ead9e6afd7e..0215faba849 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx @@ -1,6 +1,6 @@ /*========================================================================= * - * Copyright Insight Software Consortium + * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx index ce6b57e2ae2..00cbe709614 100644 --- a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx @@ -1,6 +1,6 @@ /*========================================================================= * - * Copyright Insight Software Consortium + * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From cc680234ce108fbf0ece44237e78e0617d48eff5 Mon Sep 17 00:00:00 2001 From: Mathew Seng Date: Fri, 3 Apr 2020 12:04:20 -0500 Subject: [PATCH 088/113] BUG: Change dim to Dim to support KWStyle test --- .../Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx | 4 ++-- .../Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index 5d1802285df..51bb5a2a007 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -22,11 +22,11 @@ #include "itkLabelSetDilateImageFilter.h" #include "read_info.cxx" -template +template int doDilate(char * In, char * Out, int radius) { - using MaskImType = typename itk::Image; + using MaskImType = typename itk::Image; // load using ReaderType = typename itk::ImageFileReader; diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx index 0215faba849..8deca72c850 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx @@ -23,11 +23,11 @@ #include "read_info.cxx" -template +template int doErode(char * In, char * Out, int radius) { - using MaskImType = typename itk::Image; + using MaskImType = typename itk::Image; // load using ReaderType = typename itk::ImageFileReader; From 24db2183af83acdb35aa513e2338be4d8221f6c5 Mon Sep 17 00:00:00 2001 From: Mathew Seng Date: Tue, 14 Apr 2020 12:59:21 -0500 Subject: [PATCH 089/113] BUG: Fix test errors resulting from incorrect multi-threading format. The filters were originlly setup to utilize the new Multi-threader format. However, these filters utilize a custom region splitter that requires the classic multi-threader. The changes required changing: - DynamiicMultThreadingOn() to DynamiicMultThreadingOff() in filter's constructor, in order to utilize classic multi-threader - DynamicThreadedGenerateData() to ThreadedGenerateData with theadId passed as a parameter - Add ProgressReporter object as parameter to doOneDimension methods. --- .../include/itkLabelSetDilateImageFilter.h | 4 +-- .../include/itkLabelSetDilateImageFilter.hxx | 30 +++++++++++++++++-- .../include/itkLabelSetErodeImageFilter.h | 4 +-- .../include/itkLabelSetErodeImageFilter.hxx | 29 ++++++++++++++++-- .../include/itkLabelSetMorphBaseImageFilter.h | 2 +- .../itkLabelSetMorphBaseImageFilter.hxx | 11 +++---- .../include/itkLabelSetUtils.h | 9 ++++++ 7 files changed, 73 insertions(+), 16 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h index d891ae7e670..7b9b7c63db0 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h @@ -76,11 +76,11 @@ class ITK_EXPORT LabelSetDilateImageFilter : public LabelSetMorphBaseImageFilter static constexpr unsigned int InputImageDimension = TInputImage::ImageDimension; protected: - LabelSetDilateImageFilter() { this->DynamicMultiThreadingOn(); } + LabelSetDilateImageFilter() { this->DynamicMultiThreadingOff(); } ~LabelSetDilateImageFilter() override = default; void - DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) override; + ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) override; private: using DistanceImageType = typename Superclass::DistanceImageType; diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx index 1e21b2619da..9213d6cc377 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx @@ -31,9 +31,33 @@ namespace itk { template void -LabelSetDilateImageFilter::DynamicThreadedGenerateData( - const OutputImageRegionType & outputRegionForThread) +LabelSetDilateImageFilter::ThreadedGenerateData( + const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) { + // compute the number of rows first, so we can setup a progress reporter + typename std::vector< unsigned int > NumberOfRows; + InputSizeType size = outputRegionForThread.GetSize(); + + for ( unsigned int i = 0; i < InputImageDimension; i++ ) + { + NumberOfRows.push_back(1); + for ( unsigned int d = 0; d < InputImageDimension; d++ ) + { + if ( d != i ) + { + NumberOfRows[i] *= size[d]; + } + } + } + float progressPerDimension = 1.0 / ImageDimension; + + auto *progress = new ProgressReporter(this, + threadId, + NumberOfRows[this->m_CurrentDimension], + 30, + this->m_CurrentDimension * progressPerDimension, + progressPerDimension); + // this is where the work happens. We use a distance image with // floating point pixel to perform the parabolic operations. The // input image specifies the size of the SE at each location. These @@ -90,6 +114,7 @@ LabelSetDilateImageFilter::DynamicThreadedGenerateDat inputIterator, outputDistIterator, outputIterator, + *progress, LineLength, this->m_CurrentDimension, this->m_MagnitudeSign, @@ -107,6 +132,7 @@ LabelSetDilateImageFilter::DynamicThreadedGenerateDat inputDistIterator, outputDistIterator, outputIterator, + *progress, LineLength, this->m_CurrentDimension, this->m_MagnitudeSign, diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h index fdc9d25a769..dbd21817962 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h @@ -81,11 +81,11 @@ class ITK_EXPORT LabelSetErodeImageFilter : public LabelSetMorphBaseImageFilter< static constexpr unsigned int InputImageDimension = TInputImage::ImageDimension; protected: - LabelSetErodeImageFilter() { this->DynamicMultiThreadingOn(); } + LabelSetErodeImageFilter() { this->DynamicMultiThreadingOff(); } ~LabelSetErodeImageFilter() override = default; void - DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) override; + ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) override; // Override since the filter produces the entire dataset. private: diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx index 8cbb732ce26..beacc914212 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx @@ -31,8 +31,8 @@ namespace itk { template void -LabelSetErodeImageFilter::DynamicThreadedGenerateData( - const OutputImageRegionType & outputRegionForThread) +LabelSetErodeImageFilter::ThreadedGenerateData( + const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) { // this is where the work happens. We use a distance image with // floating point pixel to perform the parabolic operations. The @@ -43,6 +43,29 @@ LabelSetErodeImageFilter::DynamicThreadedGenerateData // Similarly, the thresholding on output needs to be integrated // with the last processing stage. + typename std::vector< unsigned int > NumberOfRows; + InputSizeType size = outputRegionForThread.GetSize(); + + for ( unsigned int i = 0; i < InputImageDimension; i++ ) + { + NumberOfRows.push_back(1); + for ( unsigned int d = 0; d < InputImageDimension; d++ ) + { + if ( d != i ) + { + NumberOfRows[i] *= size[d]; + } + } + } + float progressPerDimension = 1.0 / ImageDimension; + + auto *progress = new ProgressReporter(this, + threadId, + NumberOfRows[this->m_CurrentDimension], + 30, + this->m_CurrentDimension * progressPerDimension, + progressPerDimension); + using InputConstIteratorType = ImageLinearConstIteratorWithIndex; using OutputIteratorType = ImageLinearIteratorWithIndex; @@ -86,6 +109,7 @@ LabelSetErodeImageFilter::DynamicThreadedGenerateData inputIterator, outputDistIterator, outputIterator, + *progress, LineLength, this->m_CurrentDimension, this->m_MagnitudeSign, @@ -105,6 +129,7 @@ LabelSetErodeImageFilter::DynamicThreadedGenerateData inputDistIterator, outputDistIterator, outputIterator, + *progress, LineLength, this->m_CurrentDimension, this->m_MagnitudeSign, diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index c4a858ac29a..c192e612c1b 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -118,7 +118,7 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter : public ImageToImageFilter::LabelSetMorph this->SetRadius(1); - this->DynamicMultiThreadingOn(); + this->DynamicMultiThreadingOff(); } template void -LabelSetMorphBaseImageFilter::DynamicThreadedGenerateData( - const OutputImageRegionType & outputRegionForThread) -{ - // stop warnings - (void)outputRegionForThread; -} +LabelSetMorphBaseImageFilter::ThreadedGenerateData( + const OutputImageRegionType &, ThreadIdType) +{} template RegionIndexType diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index a263cfcd8f0..95abdbc042b 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -20,6 +20,7 @@ #include +#include "itkProgressReporter.h" #include namespace itk { @@ -236,6 +237,7 @@ void doOneDimensionErodeFirstPass(TInIter & inputIterator, TOutDistIter & outputIterator, TOutLabIter & outputLabIterator, + ProgressReporter & progress, const unsigned LineLength, const unsigned direction, const int m_MagnitudeSign, @@ -364,6 +366,7 @@ doOneDimensionErodeFirstPass(TInIter & inputIterator, // now onto the next line inputIterator.NextLine(); outputIterator.NextLine(); + progress.CompletedPixel(); } } @@ -372,6 +375,7 @@ void doOneDimensionDilateFirstPass(TInIter & inputIterator, TOutDistIter & outputIterator, TOutLabIter & outputLabIterator, + ProgressReporter & progress, const unsigned LineLength, const unsigned direction, const int m_MagnitudeSign, @@ -444,6 +448,7 @@ doOneDimensionDilateFirstPass(TInIter & inputIterator, inputIterator.NextLine(); outputIterator.NextLine(); outputLabIterator.NextLine(); + progress.CompletedPixel(); } } @@ -453,6 +458,7 @@ doOneDimensionErode(TInIter & inputIterator, TDistIter & inputDistIterator, TOutDistIter & outputDistIterator, TOutLabIter & outputLabIterator, + ProgressReporter & progress, const unsigned LineLength, const unsigned direction, const int m_MagnitudeSign, @@ -583,6 +589,7 @@ doOneDimensionErode(TInIter & inputIterator, inputIterator.NextLine(); inputDistIterator.NextLine(); outputDistIterator.NextLine(); + progress.CompletedPixel(); } } @@ -592,6 +599,7 @@ doOneDimensionDilate(TInIter & inputIterator, TDistIter & inputDistIterator, TOutDistIter & outputDistIterator, TOutLabIter & outputLabIterator, + ProgressReporter & progress, const unsigned LineLength, const unsigned direction, const int m_MagnitudeSign, @@ -663,6 +671,7 @@ doOneDimensionDilate(TInIter & inputIterator, outputLabIterator.NextLine(); inputDistIterator.NextLine(); outputDistIterator.NextLine(); + progress.CompletedPixel(); } } } // namespace LabSet From dac499406577fde19b0ac3b934ccae98220c83d7 Mon Sep 17 00:00:00 2001 From: Mathew Seng Date: Fri, 20 Nov 2020 10:36:26 -0600 Subject: [PATCH 090/113] STYLE: Adjust several scripts to adhere to clang format --- .../include/itkLabelSetDilateImageFilter.hxx | 43 +++++----- .../include/itkLabelSetErodeImageFilter.hxx | 33 +++---- .../itkLabelSetMorphBaseImageFilter.hxx | 4 +- .../include/itkLabelSetUtils.h | 86 +++++++++---------- 4 files changed, 84 insertions(+), 82 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx index 9213d6cc377..1036bd58cca 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx @@ -32,31 +32,32 @@ namespace itk template void LabelSetDilateImageFilter::ThreadedGenerateData( - const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) + const OutputImageRegionType & outputRegionForThread, + ThreadIdType threadId) { - // compute the number of rows first, so we can setup a progress reporter - typename std::vector< unsigned int > NumberOfRows; - InputSizeType size = outputRegionForThread.GetSize(); + // compute the number of rows first, so we can setup a progress reporter + typename std::vector NumberOfRows; + InputSizeType size = outputRegionForThread.GetSize(); - for ( unsigned int i = 0; i < InputImageDimension; i++ ) + for (unsigned int i = 0; i < InputImageDimension; i++) + { + NumberOfRows.push_back(1); + for (unsigned int d = 0; d < InputImageDimension; d++) { - NumberOfRows.push_back(1); - for ( unsigned int d = 0; d < InputImageDimension; d++ ) - { - if ( d != i ) - { - NumberOfRows[i] *= size[d]; - } - } + if (d != i) + { + NumberOfRows[i] *= size[d]; + } } - float progressPerDimension = 1.0 / ImageDimension; - - auto *progress = new ProgressReporter(this, - threadId, - NumberOfRows[this->m_CurrentDimension], - 30, - this->m_CurrentDimension * progressPerDimension, - progressPerDimension); + } + float progressPerDimension = 1.0 / ImageDimension; + + auto * progress = new ProgressReporter(this, + threadId, + NumberOfRows[this->m_CurrentDimension], + 30, + this->m_CurrentDimension * progressPerDimension, + progressPerDimension); // this is where the work happens. We use a distance image with // floating point pixel to perform the parabolic operations. The diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx index beacc914212..41b2a21971b 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx @@ -32,7 +32,8 @@ namespace itk template void LabelSetErodeImageFilter::ThreadedGenerateData( - const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) + const OutputImageRegionType & outputRegionForThread, + ThreadIdType threadId) { // this is where the work happens. We use a distance image with // floating point pixel to perform the parabolic operations. The @@ -43,28 +44,28 @@ LabelSetErodeImageFilter::ThreadedGenerateData( // Similarly, the thresholding on output needs to be integrated // with the last processing stage. - typename std::vector< unsigned int > NumberOfRows; - InputSizeType size = outputRegionForThread.GetSize(); + typename std::vector NumberOfRows; + InputSizeType size = outputRegionForThread.GetSize(); - for ( unsigned int i = 0; i < InputImageDimension; i++ ) + for (unsigned int i = 0; i < InputImageDimension; i++) { - NumberOfRows.push_back(1); - for ( unsigned int d = 0; d < InputImageDimension; d++ ) + NumberOfRows.push_back(1); + for (unsigned int d = 0; d < InputImageDimension; d++) + { + if (d != i) { - if ( d != i ) - { - NumberOfRows[i] *= size[d]; - } + NumberOfRows[i] *= size[d]; } + } } float progressPerDimension = 1.0 / ImageDimension; - auto *progress = new ProgressReporter(this, - threadId, - NumberOfRows[this->m_CurrentDimension], - 30, - this->m_CurrentDimension * progressPerDimension, - progressPerDimension); + auto * progress = new ProgressReporter(this, + threadId, + NumberOfRows[this->m_CurrentDimension], + 30, + this->m_CurrentDimension * progressPerDimension, + progressPerDimension); using InputConstIteratorType = ImageLinearConstIteratorWithIndex; using OutputIteratorType = ImageLinearIteratorWithIndex; diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index 57d836269e3..2276b84cc53 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -58,8 +58,8 @@ LabelSetMorphBaseImageFilter::LabelSetMorph template void -LabelSetMorphBaseImageFilter::ThreadedGenerateData( - const OutputImageRegionType &, ThreadIdType) +LabelSetMorphBaseImageFilter::ThreadedGenerateData(const OutputImageRegionType &, + ThreadIdType) {} template diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index 95abdbc042b..288974f135d 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -234,17 +234,17 @@ DoLineLabelProp(LineBufferType & LineBuf, template void -doOneDimensionErodeFirstPass(TInIter & inputIterator, - TOutDistIter & outputIterator, - TOutLabIter & outputLabIterator, +doOneDimensionErodeFirstPass(TInIter & inputIterator, + TOutDistIter & outputIterator, + TOutLabIter & outputLabIterator, ProgressReporter & progress, - const unsigned LineLength, - const unsigned direction, - const int m_MagnitudeSign, - const bool m_UseImageSpacing, - const RealType image_scale, - const RealType Sigma, - const bool lastpass) + const unsigned LineLength, + const unsigned direction, + const int m_MagnitudeSign, + const bool m_UseImageSpacing, + const RealType image_scale, + const RealType Sigma, + const bool lastpass) { // specialised version for binary erosion during first pass. We can // compute the results directly because the inputs are flat. @@ -372,16 +372,16 @@ doOneDimensionErodeFirstPass(TInIter & inputIterator, template void -doOneDimensionDilateFirstPass(TInIter & inputIterator, - TOutDistIter & outputIterator, - TOutLabIter & outputLabIterator, +doOneDimensionDilateFirstPass(TInIter & inputIterator, + TOutDistIter & outputIterator, + TOutLabIter & outputLabIterator, ProgressReporter & progress, - const unsigned LineLength, - const unsigned direction, - const int m_MagnitudeSign, - const bool m_UseImageSpacing, - const RealType image_scale, - const RealType Sigma) + const unsigned LineLength, + const unsigned direction, + const int m_MagnitudeSign, + const bool m_UseImageSpacing, + const RealType image_scale, + const RealType Sigma) { // specialised version for binary erosion during first pass. We can // compute the results directly because the inputs are flat. @@ -454,20 +454,20 @@ doOneDimensionDilateFirstPass(TInIter & inputIterator, template void -doOneDimensionErode(TInIter & inputIterator, - TDistIter & inputDistIterator, - TOutDistIter & outputDistIterator, - TOutLabIter & outputLabIterator, +doOneDimensionErode(TInIter & inputIterator, + TDistIter & inputDistIterator, + TOutDistIter & outputDistIterator, + TOutLabIter & outputLabIterator, ProgressReporter & progress, - const unsigned LineLength, - const unsigned direction, - const int m_MagnitudeSign, - const bool m_UseImageSpacing, - const RealType m_Extreme, - const RealType image_scale, - const RealType Sigma, - const RealType BaseSigma, - const bool lastpass) + const unsigned LineLength, + const unsigned direction, + const int m_MagnitudeSign, + const bool m_UseImageSpacing, + const RealType m_Extreme, + const RealType image_scale, + const RealType Sigma, + const RealType BaseSigma, + const bool lastpass) { // traditional erosion - can't optimise the same way as the first pass using LineBufferType = typename itk::Array; @@ -595,18 +595,18 @@ doOneDimensionErode(TInIter & inputIterator, template void -doOneDimensionDilate(TInIter & inputIterator, - TDistIter & inputDistIterator, - TOutDistIter & outputDistIterator, - TOutLabIter & outputLabIterator, +doOneDimensionDilate(TInIter & inputIterator, + TDistIter & inputDistIterator, + TOutDistIter & outputDistIterator, + TOutLabIter & outputLabIterator, ProgressReporter & progress, - const unsigned LineLength, - const unsigned direction, - const int m_MagnitudeSign, - const bool m_UseImageSpacing, - const RealType m_Extreme, - const RealType image_scale, - const RealType Sigma) + const unsigned LineLength, + const unsigned direction, + const int m_MagnitudeSign, + const bool m_UseImageSpacing, + const RealType m_Extreme, + const RealType image_scale, + const RealType Sigma) { // specialised version for binary erosion during first pass. We can // compute the results directly because the inputs are flat. From b852eaaecf44a85c2235d026e4a15e730dddfc0d Mon Sep 17 00:00:00 2001 From: Mathew Seng Date: Mon, 19 Oct 2020 09:47:46 -0500 Subject: [PATCH 091/113] STYLE: Rename ITK_DISALLOW_COPY_AND_ASSIGN to ITK_DISALLOW_COPY_AND_MOVE Fixes changes made in #2053. ITK_DISALLOW_COPY_AND_ASSIGN will be used if ITK_FUTURE_LEGACY_REMOVE=OFF. --- .../LabelErodeDilate/include/itkLabelSetDilateImageFilter.h | 2 +- .../LabelErodeDilate/include/itkLabelSetErodeImageFilter.h | 2 +- .../LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h index 7b9b7c63db0..fd4d36af684 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h @@ -40,7 +40,7 @@ template class ITK_EXPORT LabelSetDilateImageFilter : public LabelSetMorphBaseImageFilter { public: - ITK_DISALLOW_COPY_AND_ASSIGN(LabelSetDilateImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(LabelSetDilateImageFilter); /** Standard class type alias. */ using Self = LabelSetDilateImageFilter; diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h index dbd21817962..94e705b2375 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h @@ -42,7 +42,7 @@ template class ITK_EXPORT LabelSetErodeImageFilter : public LabelSetMorphBaseImageFilter { public: - ITK_DISALLOW_COPY_AND_ASSIGN(LabelSetErodeImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(LabelSetErodeImageFilter); /** Standard class type alias. */ using Self = LabelSetErodeImageFilter; diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index c192e612c1b..b7069814e3c 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -46,7 +46,7 @@ template { public: - ITK_DISALLOW_COPY_AND_ASSIGN(LabelSetMorphBaseImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(LabelSetMorphBaseImageFilter); /** Standard class type alias. */ using Self = LabelSetMorphBaseImageFilter; From 9b12469f4e0a11a7e06483ecd5de6dbfbfe9f953 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Fri, 17 Dec 2021 09:37:15 -0600 Subject: [PATCH 092/113] COMP: Remove inclusion of .hxx files as headers The ability to include either .h or .hxx files as header files required recursively reading the .h files twice. The added complexity is unnecessary, costly, and can confuse static analysis tools that monitor header guardes (due to reaching the maximum depth of recursion limits for nested #ifdefs in checking). --- .../LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx | 1 - .../LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx | 1 - .../LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx | 1 - 3 files changed, 3 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx index 1036bd58cca..2a7c4d14ba3 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx @@ -18,7 +18,6 @@ #ifndef itkLabelSetDilateImageFilter_hxx #define itkLabelSetDilateImageFilter_hxx -#include "itkLabelSetDilateImageFilter.h" #include "itkImageRegionConstIterator.h" #include "itkImageRegionIterator.h" diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx index 41b2a21971b..af95cbc19e9 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx @@ -18,7 +18,6 @@ #ifndef itkLabelSetErodeImageFilter_hxx #define itkLabelSetErodeImageFilter_hxx -#include "itkLabelSetErodeImageFilter.h" #include "itkImageRegionConstIterator.h" #include "itkImageRegionIterator.h" diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index 2276b84cc53..09bbb1a3017 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -18,7 +18,6 @@ #ifndef itkLabelSetMorphBaseImageFilter_hxx #define itkLabelSetMorphBaseImageFilter_hxx -#include "itkLabelSetMorphBaseImageFilter.h" #include "itkImageRegionConstIterator.h" #include "itkImageRegionIterator.h" From c268d7e15bcaea7d625bc79fdd7eb6216cf06ebe Mon Sep 17 00:00:00 2001 From: Tom Birdsong Date: Tue, 31 May 2022 11:28:01 -0400 Subject: [PATCH 093/113] ENH: Bump ITK and replace http with https using script --- .../LabelErodeDilate/include/itkLabelSetDilateImageFilter.h | 2 +- .../LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx | 2 +- .../LabelErodeDilate/include/itkLabelSetErodeImageFilter.h | 2 +- .../LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx | 2 +- .../LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h | 2 +- .../include/itkLabelSetMorphBaseImageFilter.hxx | 2 +- Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h | 2 +- Modules/Filtering/LabelErodeDilate/include/itkinstance.h | 2 +- .../Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx | 2 +- .../Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx | 2 +- Modules/Filtering/LabelErodeDilate/test/read_info.cxx | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h index fd4d36af684..008f66bb683 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h @@ -6,7 +6,7 @@ * 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 + * 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, diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx index 2a7c4d14ba3..f6518a2856a 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx @@ -6,7 +6,7 @@ * 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 + * 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, diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h index 94e705b2375..c56656f8e44 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h @@ -6,7 +6,7 @@ * 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 + * 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, diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx index af95cbc19e9..8956c9fdbf0 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx @@ -6,7 +6,7 @@ * 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 + * 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, diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index b7069814e3c..55fc4c88eba 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -6,7 +6,7 @@ * 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 + * 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, diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index 09bbb1a3017..9ccdede05c8 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -6,7 +6,7 @@ * 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 + * 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, diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index 288974f135d..177df0b8b73 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -6,7 +6,7 @@ * 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 + * 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, diff --git a/Modules/Filtering/LabelErodeDilate/include/itkinstance.h b/Modules/Filtering/LabelErodeDilate/include/itkinstance.h index 571c2d3c0d9..10553136378 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkinstance.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkinstance.h @@ -6,7 +6,7 @@ * 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 + * 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, diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index 51bb5a2a007..90659f7a43d 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -6,7 +6,7 @@ * 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 + * 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, diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx index 8deca72c850..89ac163efd4 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx @@ -6,7 +6,7 @@ * 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 + * 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, diff --git a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx index 00cbe709614..af716d94a2d 100644 --- a/Modules/Filtering/LabelErodeDilate/test/read_info.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/read_info.cxx @@ -6,7 +6,7 @@ * 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 + * 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, From 8073dc4dfd1359bc5ee35fcaa47333fe51e912bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Sun, 2 Feb 2025 11:59:57 -0500 Subject: [PATCH 094/113] COMP: Bump to minimum CMake 3.16.3 Bump to minimum CMake 3.16.3: use same `cmake_minimum_required` values as ITK. Bumped in ITK in commit https://github.com/InsightSoftwareConsortium/ITK/pull/2588/commits/b01b3258bddaedc365c1fcbffd3332b82d7f539f Fixes: ``` -- cmake_minimum_required of 3.10.2 is not enough. CMake Warning at D:/a/ITKLabelErodeDilate/ITK/CMake/ITKModuleExternal.cmake:15 (message): cmake_minimum_required must be at least 3.16.3 Call Stack (most recent call first): CMakeLists.txt:7 (include) ``` raised for example in: https://open.cdash.org/builds/10184812/configure --- Modules/Filtering/LabelErodeDilate/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt index ee8c60177e0..f949f15f571 100644 --- a/Modules/Filtering/LabelErodeDilate/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.10.2) +cmake_minimum_required(VERSION 3.16.3) project(LabelErodeDilate) if(NOT ITK_SOURCE_DIR) From 69f98f2e9a7a38dce7ddeb50de48051040cc5dc4 Mon Sep 17 00:00:00 2001 From: Bradley Lowekamp Date: Mon, 24 Feb 2025 16:46:19 -0500 Subject: [PATCH 095/113] BUG: Addressed memory leak of progress object A raw new was used with no memory management. Switch to a stack based object. --- .../include/itkLabelSetDilateImageFilter.hxx | 16 ++++++++-------- .../include/itkLabelSetErodeImageFilter.hxx | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx index f6518a2856a..92b617d63a2 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.hxx @@ -51,12 +51,12 @@ LabelSetDilateImageFilter::ThreadedGenerateData( } float progressPerDimension = 1.0 / ImageDimension; - auto * progress = new ProgressReporter(this, - threadId, - NumberOfRows[this->m_CurrentDimension], - 30, - this->m_CurrentDimension * progressPerDimension, - progressPerDimension); + ProgressReporter progress(this, + threadId, + NumberOfRows[this->m_CurrentDimension], + 30, + this->m_CurrentDimension * progressPerDimension, + progressPerDimension); // this is where the work happens. We use a distance image with // floating point pixel to perform the parabolic operations. The @@ -114,7 +114,7 @@ LabelSetDilateImageFilter::ThreadedGenerateData( inputIterator, outputDistIterator, outputIterator, - *progress, + progress, LineLength, this->m_CurrentDimension, this->m_MagnitudeSign, @@ -132,7 +132,7 @@ LabelSetDilateImageFilter::ThreadedGenerateData( inputDistIterator, outputDistIterator, outputIterator, - *progress, + progress, LineLength, this->m_CurrentDimension, this->m_MagnitudeSign, diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx index 8956c9fdbf0..c5993480751 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.hxx @@ -59,12 +59,12 @@ LabelSetErodeImageFilter::ThreadedGenerateData( } float progressPerDimension = 1.0 / ImageDimension; - auto * progress = new ProgressReporter(this, - threadId, - NumberOfRows[this->m_CurrentDimension], - 30, - this->m_CurrentDimension * progressPerDimension, - progressPerDimension); + ProgressReporter progress(this, + threadId, + NumberOfRows[this->m_CurrentDimension], + 30, + this->m_CurrentDimension * progressPerDimension, + progressPerDimension); using InputConstIteratorType = ImageLinearConstIteratorWithIndex; using OutputIteratorType = ImageLinearIteratorWithIndex; @@ -109,7 +109,7 @@ LabelSetErodeImageFilter::ThreadedGenerateData( inputIterator, outputDistIterator, outputIterator, - *progress, + progress, LineLength, this->m_CurrentDimension, this->m_MagnitudeSign, @@ -129,7 +129,7 @@ LabelSetErodeImageFilter::ThreadedGenerateData( inputDistIterator, outputDistIterator, outputIterator, - *progress, + progress, LineLength, this->m_CurrentDimension, this->m_MagnitudeSign, From 6674dedfbf39b23d27d3a765899695f914380c00 Mon Sep 17 00:00:00 2001 From: Bradley Lowekamp Date: Mon, 24 Feb 2025 16:49:09 -0500 Subject: [PATCH 096/113] BUG: Address uninitialized value Directly initialize IVARs and don't call virutal methods which checks the existing uninitialized value. --- .../include/itkLabelSetMorphBaseImageFilter.hxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index 9ccdede05c8..d04a4e19378 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -50,7 +50,7 @@ LabelSetMorphBaseImageFilter::LabelSetMorph } m_UseImageSpacing = false; - this->SetRadius(1); + this->m_Radius.Fill(1); this->DynamicMultiThreadingOff(); } From ab9ef818b6d80395d6916cf76a02401fd9bbc3be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Sat, 1 Mar 2025 18:32:45 -0500 Subject: [PATCH 097/113] STYLE: Use `ITK_TRY_EXPECT_NO_EXCEPTION` macro in tests Use `ITK_TRY_EXPECT_NO_EXCEPTION` macro in tests in lieu of `try/catch` blocks for the sake of readability and compactness, and to save typing/avoid boilerplate code. --- .../test/itkLabelSetDilateTest.cxx | 22 ++++--------------- .../test/itkLabelSetErodeTest.cxx | 22 ++++--------------- 2 files changed, 8 insertions(+), 36 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index 90659f7a43d..051e51a5b20 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -20,6 +20,7 @@ #include "itkImageFileWriter.h" #include "itkLabelSetDilateImageFilter.h" +#include "itkTestingMacros.h" #include "read_info.cxx" template @@ -32,15 +33,7 @@ doDilate(char * In, char * Out, int radius) using ReaderType = typename itk::ImageFileReader; typename ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(In); - try - { - reader->Update(); - } - catch (itk::ExceptionObject & excp) - { - std::cerr << excp << std::endl; - return EXIT_FAILURE; - } + ITK_TRY_EXPECT_NO_EXCEPTION(reader->Update()); // Label dilation using FilterType = typename itk::LabelSetDilateImageFilter; @@ -52,15 +45,8 @@ doDilate(char * In, char * Out, int radius) typename WriterType::Pointer writer = WriterType::New(); writer->SetInput(filter->GetOutput()); writer->SetFileName(Out); - try - { - writer->Update(); - } - catch (itk::ExceptionObject & excp) - { - std::cerr << excp << std::endl; - return EXIT_FAILURE; - } + ITK_TRY_EXPECT_NO_EXCEPTION(writer->Update()); + return EXIT_SUCCESS; } diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx index 89ac163efd4..e8309978b5b 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx @@ -20,6 +20,7 @@ #include "itkImageFileWriter.h" #include "itkLabelSetErodeImageFilter.h" +#include "itkTestingMacros.h" #include "read_info.cxx" @@ -33,15 +34,7 @@ doErode(char * In, char * Out, int radius) using ReaderType = typename itk::ImageFileReader; typename ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(In); - try - { - reader->Update(); - } - catch (itk::ExceptionObject & excp) - { - std::cerr << excp << std::endl; - return EXIT_FAILURE; - } + ITK_TRY_EXPECT_NO_EXCEPTION(reader->Update()); // Label dilation using FilterType = typename itk::LabelSetErodeImageFilter; @@ -53,15 +46,8 @@ doErode(char * In, char * Out, int radius) typename WriterType::Pointer writer = WriterType::New(); writer->SetInput(filter->GetOutput()); writer->SetFileName(Out); - try - { - writer->Update(); - } - catch (itk::ExceptionObject & excp) - { - std::cerr << excp << std::endl; - return EXIT_FAILURE; - } + ITK_TRY_EXPECT_NO_EXCEPTION(writer->Update()); + return EXIT_SUCCESS; } From dc9ac994bc431ee6c63560467aac94b7fa93ddb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Sat, 1 Mar 2025 18:35:17 -0500 Subject: [PATCH 098/113] STYLE: Make the input argument checking be the first task in tests Make the input argument checking be the first task in tests. --- .../LabelErodeDilate/test/itkLabelSetDilateTest.cxx | 9 +++++---- .../LabelErodeDilate/test/itkLabelSetErodeTest.cxx | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index 051e51a5b20..c3cf0a76af0 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -56,10 +56,6 @@ doDilate(char * In, char * Out, int radius) int itkLabelSetDilateTest(int argc, char * argv[]) { - int dim1; - - itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads(1); - itk::IOComponentEnum ComponentType; if (argc != 4) { @@ -67,6 +63,11 @@ itkLabelSetDilateTest(int argc, char * argv[]) return (EXIT_FAILURE); } + int dim1; + + itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads(1); + itk::IOComponentEnum ComponentType; + if (!readImageInfo(argv[1], &ComponentType, &dim1)) { std::cerr << "Failed to open " << argv[1] << std::endl; diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx index e8309978b5b..9841d2fc49c 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx @@ -57,10 +57,6 @@ doErode(char * In, char * Out, int radius) int itkLabelSetErodeTest(int argc, char * argv[]) { - int dim1; - - itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads(1); - itk::IOComponentEnum ComponentType; if (argc != 4) { @@ -68,6 +64,11 @@ itkLabelSetErodeTest(int argc, char * argv[]) return (EXIT_FAILURE); } + int dim1; + + itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads(1); + itk::IOComponentEnum ComponentType; + if (!readImageInfo(argv[1], &ComponentType, &dim1)) { std::cerr << "Failed to open " << argv[1] << std::endl; From ec7be76d87567e7ed441438e1d410c7b70c705e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Sat, 1 Mar 2025 18:37:15 -0500 Subject: [PATCH 099/113] STYLE: Conform to ITK style guidelines in test arg check Conform to ITK style guidelines in test argument check message: - Add the missing argument message. - Use the `itkNameOfTestExecutableMacro` macro to print the test name. - Remove the unnecessary brackets around `EXIT_FAILURE`. --- .../LabelErodeDilate/test/itkLabelSetDilateTest.cxx | 6 ++++-- .../LabelErodeDilate/test/itkLabelSetErodeTest.cxx | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index c3cf0a76af0..c902a16057a 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -59,8 +59,10 @@ itkLabelSetDilateTest(int argc, char * argv[]) if (argc != 4) { - std::cerr << "Usage: " << argv[0] << "inputimage radius outputimage" << std::endl; - return (EXIT_FAILURE); + std::cerr << "Missing parameters." << std::endl; + std::cerr << "Usage: " << itkNameOfTestExecutableMacro(argv); + std::cerr << " inputimage radius outputimage" << std::endl; + return EXIT_FAILURE; } int dim1; diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx index 9841d2fc49c..a01ad282068 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx @@ -60,8 +60,10 @@ itkLabelSetErodeTest(int argc, char * argv[]) if (argc != 4) { - std::cerr << "Usage: " << argv[0] << "inputimage radius outputimage" << std::endl; - return (EXIT_FAILURE); + std::cerr << "Missing parameters." << std::endl; + std::cerr << "Usage: " << itkNameOfTestExecutableMacro(argv); + std::cerr << " inputimage radius outputimage" << std::endl; + return EXIT_FAILURE; } int dim1; From a09573831684ddaed86df4c818d88e497a9ae67f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Sat, 1 Mar 2025 18:40:02 -0500 Subject: [PATCH 100/113] STYLE: Remove unnecessary brackets around `EXIT_FAILURE` Remove unnecessary brackets around `EXIT_FAILURE`. --- .../Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx | 4 ++-- .../Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index c902a16057a..a9bce7cca64 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -73,7 +73,7 @@ itkLabelSetDilateTest(int argc, char * argv[]) if (!readImageInfo(argv[1], &ComponentType, &dim1)) { std::cerr << "Failed to open " << argv[1] << std::endl; - return (EXIT_FAILURE); + return EXIT_FAILURE; } int status = EXIT_FAILURE; @@ -87,7 +87,7 @@ itkLabelSetDilateTest(int argc, char * argv[]) break; default: std::cerr << "Unsupported dimension" << std::endl; - return (EXIT_FAILURE); + return EXIT_FAILURE; break; } return status; diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx index a01ad282068..e71fbf65003 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx @@ -74,7 +74,7 @@ itkLabelSetErodeTest(int argc, char * argv[]) if (!readImageInfo(argv[1], &ComponentType, &dim1)) { std::cerr << "Failed to open " << argv[1] << std::endl; - return (EXIT_FAILURE); + return EXIT_FAILURE; } int status = EXIT_FAILURE; @@ -88,7 +88,7 @@ itkLabelSetErodeTest(int argc, char * argv[]) break; default: std::cerr << "Unsupported dimension" << std::endl; - return (EXIT_FAILURE); + return EXIT_FAILURE; break; } return status; From 508588560e0757a4ec7c6dcbfb3e1dda51631fed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Sat, 1 Mar 2025 18:40:50 -0500 Subject: [PATCH 101/113] STYLE: Remove unreachable `break` after `return` statement Remove unreachable `break` after `return` statement in `switch` `default` cases. --- .../Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx | 1 - Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx | 1 - 2 files changed, 2 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index a9bce7cca64..1618d4817f4 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -88,7 +88,6 @@ itkLabelSetDilateTest(int argc, char * argv[]) default: std::cerr << "Unsupported dimension" << std::endl; return EXIT_FAILURE; - break; } return status; } diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx index e71fbf65003..eb418859008 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx @@ -89,7 +89,6 @@ itkLabelSetErodeTest(int argc, char * argv[]) default: std::cerr << "Unsupported dimension" << std::endl; return EXIT_FAILURE; - break; } return status; } From 60c0bc42c69d987ae43e5123f16679c42d718065 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Sat, 1 Mar 2025 18:41:40 -0500 Subject: [PATCH 102/113] STYLE: Remove unnecessary/empty comment statements in tests Remove unnecessary/empty comment statements in tests. Improves readability. --- .../Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx | 1 - Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx | 1 - 2 files changed, 2 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx index 1618d4817f4..11787cdff6e 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetDilateTest.cxx @@ -51,7 +51,6 @@ doDilate(char * In, char * Out, int radius) return EXIT_SUCCESS; } -///////////////////////////////// int itkLabelSetDilateTest(int argc, char * argv[]) diff --git a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx index eb418859008..9da220054eb 100644 --- a/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx +++ b/Modules/Filtering/LabelErodeDilate/test/itkLabelSetErodeTest.cxx @@ -52,7 +52,6 @@ doErode(char * In, char * Out, int radius) return EXIT_SUCCESS; } -///////////////////////////////////////////// int itkLabelSetErodeTest(int argc, char * argv[]) From 9910a1d857c76e02c6d76f8498d6275e2a45211a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Sat, 1 Mar 2025 18:51:22 -0500 Subject: [PATCH 103/113] STYLE: Conform to ITK style guidelines in local variable naming Conform to ITK style guidelines in local variable naming: use lowercase for first letter. --- .../include/itkLabelSetUtils.h | 246 +++++++++--------- 1 file changed, 122 insertions(+), 124 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index 177df0b8b73..1a2b3e31aea 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -28,70 +28,70 @@ namespace LabSet { template void -DoLineErodeFirstPass(LineBufferType & LineBuf, +DoLineErodeFirstPass(LineBufferType & lineBuf, RealType leftend, RealType rightend, const RealType magnitude, - const RealType Sigma) + const RealType sigma) { // This is the first pass algorithm. We can write down the values // because we know the inputs are binary - const long LineLength = LineBuf.size(); + const long lineLength = lineBuf.size(); - for (long pos = 0; pos < LineLength; pos++) + for (long pos = 0; pos < lineLength; pos++) { // compute the height of the parabola starting at each end and // keep the minimum RealType left, right; - unsigned offset = LineLength - pos; + unsigned offset = lineLength - pos; left = leftend - magnitude * (pos + 1) * (pos + 1); right = rightend - magnitude * offset * offset; // note hard coded value here - could be a parameter - // LineBuf[pos] = std::min(std::min(left, right), + // lineBuf[pos] = std::min(std::min(left, right), // itk::NumericTraits::One); - LineBuf[pos] = std::min(std::min(left, right), Sigma); + lineBuf[pos] = std::min(std::min(left, right), sigma); } } template void -DoLineDilateFirstPass(LineBufferType & LineBuf, +DoLineDilateFirstPass(LineBufferType & lineBuf, LineBufferType & tmpLineBuf, - LabLineBufferType & LabBuf, + LabLineBufferType & labBuf, LabLineBufferType & NewLabBuf, const RealType magnitude) { // need to propagate the labels here - const long LineLength = LineBuf.size(); + const long lineLength = lineBuf.size(); long lastcontact = 0; - RealType lastval = LineBuf[0]; + RealType lastval = lineBuf[0]; - for (long pos = 0; pos < LineLength; pos++) + for (long pos = 0; pos < lineLength; pos++) { // left pass RealType krange = pos - lastcontact; RealType thisval = lastval - magnitude * krange * krange; - if (LineBuf[pos] >= LineBuf[lastcontact]) + if (lineBuf[pos] >= lineBuf[lastcontact]) { lastcontact = pos; - lastval = LineBuf[pos]; + lastval = lineBuf[pos]; } - tmpLineBuf[pos] = std::max(LineBuf[pos], thisval); - if (thisval > LineBuf[pos]) + tmpLineBuf[pos] = std::max(lineBuf[pos], thisval); + if (thisval > lineBuf[pos]) { - NewLabBuf[pos] = LabBuf[lastcontact]; + NewLabBuf[pos] = labBuf[lastcontact]; } else { - NewLabBuf[pos] = LabBuf[pos]; + NewLabBuf[pos] = labBuf[pos]; } } - lastcontact = LineLength - 1; + lastcontact = lineLength - 1; lastval = tmpLineBuf[lastcontact]; - for (long pos = LineLength - 1; pos >= 0; pos--) + for (long pos = lineLength - 1; pos >= 0; pos--) { // right pass RealType krange = lastcontact - pos; @@ -102,72 +102,71 @@ DoLineDilateFirstPass(LineBufferType & LineBuf, lastcontact = pos; lastval = tmpLineBuf[pos]; } - LineBuf[pos] = std::max(tmpLineBuf[pos], thisval); + lineBuf[pos] = std::max(tmpLineBuf[pos], thisval); if (thisval > tmpLineBuf[pos]) { - NewLabBuf[pos] = LabBuf[lastcontact]; + NewLabBuf[pos] = labBuf[lastcontact]; } // only need to do this bit on the first pass - it doubles as a // way of initializing NewLabPos // else // { - // NewLabBuf[pos] = LabBuf[pos]; + // NewLabBuf[pos] = labBuf[pos]; // } } } template void -DoLine(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, const RealType magnitude, const RealType m_Extreme) +DoLine(LineBufferType & lineBuf, LineBufferType & tmpLineBuf, const RealType magnitude, const RealType m_Extreme) { // contact point algorithm long koffset = 0, newcontact = 0; // how far away the search starts. - const long LineLength = LineBuf.size(); + const long lineLength = lineBuf.size(); // negative half of the parabola - for (long pos = 0; pos < LineLength; pos++) + for (long pos = 0; pos < lineLength; pos++) { - auto BaseVal = (RealType)m_Extreme; // the base value for - // comparison + auto baseVal = (RealType)m_Extreme; // the base value for comparison for (long krange = koffset; krange <= 0; krange++) { // difference needs to be paramaterised - RealType T = LineBuf[pos + krange] - magnitude * krange * krange; + RealType T = lineBuf[pos + krange] - magnitude * krange * krange; // switch on template parameter - hopefully gets optimized away. - if (doDilate ? (T >= BaseVal) : (T <= BaseVal)) + if (doDilate ? (T >= baseVal) : (T <= baseVal)) { - BaseVal = T; + baseVal = T; newcontact = krange; } } - tmpLineBuf[pos] = BaseVal; + tmpLineBuf[pos] = baseVal; koffset = newcontact - 1; } // positive half of parabola koffset = newcontact = 0; - for (long pos = LineLength - 1; pos >= 0; pos--) + for (long pos = lineLength - 1; pos >= 0; pos--) { - auto BaseVal = (RealType)m_Extreme; // the base value for comparison + auto baseVal = (RealType)m_Extreme; // the base value for comparison for (long krange = koffset; krange >= 0; krange--) { RealType T = tmpLineBuf[pos + krange] - magnitude * krange * krange; - if (doDilate ? (T >= BaseVal) : (T <= BaseVal)) + if (doDilate ? (T >= baseVal) : (T <= baseVal)) { - BaseVal = T; + baseVal = T; newcontact = krange; } } - LineBuf[pos] = BaseVal; + lineBuf[pos] = baseVal; koffset = newcontact + 1; } } template void -DoLineLabelProp(LineBufferType & LineBuf, +DoLineLabelProp(LineBufferType & lineBuf, LineBufferType & tmpLineBuf, - LabBufferType & LabelBuf, + LabBufferType & labelBuf, LabBufferType & tmpLabelBuf, const RealType magnitude, const RealType m_Extreme) @@ -177,56 +176,55 @@ DoLineLabelProp(LineBufferType & LineBuf, using LabelType = typename LabBufferType::ValueType; - const long LineLength = LineBuf.size(); + const long lineLength = lineBuf.size(); // negative half of the parabola - for (long pos = 0; pos < LineLength; pos++) + for (long pos = 0; pos < lineLength; pos++) { - auto BaseVal = (RealType)m_Extreme; // the base value for - // comparison - LabelType BaseLab = LabelBuf[pos]; + auto baseVal = (RealType)m_Extreme; // the base value for comparison + LabelType baseLab = labelBuf[pos]; for (long krange = koffset; krange <= 0; krange++) { // difference needs to be paramaterised - RealType T = LineBuf[pos + krange] - magnitude * krange * krange; + RealType T = lineBuf[pos + krange] - magnitude * krange * krange; // switch on template parameter - hopefully gets optimized away. - if (doDilate ? (T >= BaseVal) : (T <= BaseVal)) + if (doDilate ? (T >= baseVal) : (T <= baseVal)) { - BaseVal = T; + baseVal = T; newcontact = krange; - BaseLab = LabelBuf[pos + krange]; + baseLab = labelBuf[pos + krange]; } } - tmpLineBuf[pos] = BaseVal; - tmpLabelBuf[pos] = BaseLab; + tmpLineBuf[pos] = baseVal; + tmpLabelBuf[pos] = baseLab; koffset = newcontact - 1; } // positive half of parabola koffset = newcontact = 0; #if 1 - for (long pos = LineLength - 1; pos >= 0; pos--) + for (long pos = lineLength - 1; pos >= 0; pos--) { - auto BaseVal = (RealType)m_Extreme; // the base value for comparison + auto baseVal = (RealType)m_Extreme; // the base value for comparison // initialize the label to the previously pro - LabelType BaseLab = tmpLabelBuf[pos]; + LabelType baseLab = tmpLabelBuf[pos]; for (long krange = koffset; krange >= 0; krange--) { RealType T = tmpLineBuf[pos + krange] - magnitude * krange * krange; - if (doDilate ? (T >= BaseVal) : (T <= BaseVal)) + if (doDilate ? (T >= baseVal) : (T <= baseVal)) { - BaseVal = T; + baseVal = T; newcontact = krange; - BaseLab = tmpLabelBuf[pos + krange]; + baseLab = tmpLabelBuf[pos + krange]; } } - LineBuf[pos] = BaseVal; - LabelBuf[pos] = BaseLab; + lineBuf[pos] = baseVal; + labelBuf[pos] = baseLab; koffset = newcontact + 1; } #else - for (long pos = LineLength - 1; pos >= 0; pos--) + for (long pos = lineLength - 1; pos >= 0; pos--) { - LineBuf[pos] = tmpLineBuf[pos]; - LabelBuf[pos] = tmpLabelBuf[pos]; + lineBuf[pos] = tmpLineBuf[pos]; + labelBuf[pos] = tmpLabelBuf[pos]; } #endif @@ -238,12 +236,12 @@ doOneDimensionErodeFirstPass(TInIter & inputIterator, TOutDistIter & outputIterator, TOutLabIter & outputLabIterator, ProgressReporter & progress, - const unsigned LineLength, + const unsigned lineLength, const unsigned direction, const int m_MagnitudeSign, const bool m_UseImageSpacing, const RealType image_scale, - const RealType Sigma, + const RealType sigma, const bool lastpass) { // specialised version for binary erosion during first pass. We can @@ -257,10 +255,10 @@ doOneDimensionErodeFirstPass(TInIter & inputIterator, } // restructure equation to reduce numerical error // const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 * - // Sigma); + // sigma); const RealType magnitude = (m_MagnitudeSign * iscale * iscale) / (2.0); - LineBufferType LineBuf(LineLength); - LabelBufferType LabBuf(LineLength); + LineBufferType lineBuf(lineLength); + LabelBufferType labBuf(lineLength); inputIterator.SetDirection(direction); outputIterator.SetDirection(direction); @@ -280,10 +278,10 @@ doOneDimensionErodeFirstPass(TInIter & inputIterator, // copy the scanline to a buffer while (!inputIterator.IsAtEndOfLine()) { - LabBuf[i] = (inputIterator.Get()); - if (LabBuf[i]) + labBuf[i] = (inputIterator.Get()); + if (labBuf[i]) { - LineBuf[i] = 1.0; + lineBuf[i] = 1.0; } ++i; ++inputIterator; @@ -294,17 +292,17 @@ doOneDimensionErodeFirstPass(TInIter & inputIterator, EndType firsts; EndType lasts; - for (unsigned idx = 0; idx < LineLength; idx++) + for (unsigned idx = 0; idx < lineLength; idx++) { - RealType val = LabBuf[idx]; + RealType val = labBuf[idx]; if (val != 0) { // found a run firsts.push_back(idx); unsigned idxend = idx; - for (; idxend < LineLength; idxend++) + for (; idxend < lineLength; idxend++) { - if (val != LabBuf[idxend]) + if (val != labBuf[idxend]) { break; } @@ -325,22 +323,22 @@ doOneDimensionErodeFirstPass(TInIter & inputIterator, RealType leftend = 0, rightend = 0; if (first == 0) { - leftend = Sigma; + leftend = sigma; } - if (last == LineLength - 1) + if (last == lineLength - 1) { - rightend = Sigma; + rightend = sigma; } - DoLineErodeFirstPass(ShortLineBuf, leftend, rightend, magnitude, Sigma); + DoLineErodeFirstPass(ShortLineBuf, leftend, rightend, magnitude, sigma); // copy the segment back into the full line buffer - std::copy(ShortLineBuf.begin(), ShortLineBuf.end(), &(LineBuf[first])); + std::copy(ShortLineBuf.begin(), ShortLineBuf.end(), &(lineBuf[first])); } // copy the line buffer back to the image unsigned j = 0; while (!outputIterator.IsAtEndOfLine()) { - outputIterator.Set(static_cast(LineBuf[j++])); + outputIterator.Set(static_cast(lineBuf[j++])); ++outputIterator; } @@ -352,9 +350,9 @@ doOneDimensionErodeFirstPass(TInIter & inputIterator, while (!outputLabIterator.IsAtEndOfLine()) { typename TInIter::PixelType val = 0; - if (LineBuf[j2] == Sigma) + if (lineBuf[j2] == sigma) { - val = LabBuf[j2]; + val = labBuf[j2]; } outputLabIterator.Set(val); ++outputLabIterator; @@ -376,12 +374,12 @@ doOneDimensionDilateFirstPass(TInIter & inputIterator, TOutDistIter & outputIterator, TOutLabIter & outputLabIterator, ProgressReporter & progress, - const unsigned LineLength, + const unsigned lineLength, const unsigned direction, const int m_MagnitudeSign, const bool m_UseImageSpacing, const RealType image_scale, - const RealType Sigma) + const RealType sigma) { // specialised version for binary erosion during first pass. We can // compute the results directly because the inputs are flat. @@ -394,12 +392,12 @@ doOneDimensionDilateFirstPass(TInIter & inputIterator, } // restructure equation to reduce numerical error // const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 * - // Sigma); + // sigma); const RealType magnitude = (m_MagnitudeSign * iscale * iscale) / (2.0); - LineBufferType LineBuf(LineLength); - LabelBufferType LabBuf(LineLength); - LineBufferType tmpLineBuf(LineLength); - LabelBufferType newLabBuf(LineLength); + LineBufferType lineBuf(lineLength); + LabelBufferType labBuf(lineLength); + LineBufferType tmpLineBuf(lineLength); + LabelBufferType newLabBuf(lineLength); inputIterator.SetDirection(direction); outputIterator.SetDirection(direction); @@ -419,25 +417,25 @@ doOneDimensionDilateFirstPass(TInIter & inputIterator, // copy the scanline to a buffer while (!inputIterator.IsAtEndOfLine()) { - LabBuf[i] = (inputIterator.Get()); - if (LabBuf[i]) + labBuf[i] = (inputIterator.Get()); + if (labBuf[i]) { - LineBuf[i] = Sigma; + lineBuf[i] = sigma; } else { - LineBuf[i] = 0; + lineBuf[i] = 0; } ++i; ++inputIterator; } - DoLineDilateFirstPass(LineBuf, tmpLineBuf, LabBuf, newLabBuf, magnitude); + DoLineDilateFirstPass(lineBuf, tmpLineBuf, labBuf, newLabBuf, magnitude); // copy the line buffer back to the image unsigned j = 0; while (!outputIterator.IsAtEndOfLine()) { - outputIterator.Set(static_cast(LineBuf[j])); + outputIterator.Set(static_cast(lineBuf[j])); outputLabIterator.Set(newLabBuf[j]); ++outputLabIterator; ++outputIterator; @@ -459,13 +457,13 @@ doOneDimensionErode(TInIter & inputIterator, TOutDistIter & outputDistIterator, TOutLabIter & outputLabIterator, ProgressReporter & progress, - const unsigned LineLength, + const unsigned lineLength, const unsigned direction, const int m_MagnitudeSign, const bool m_UseImageSpacing, const RealType m_Extreme, const RealType image_scale, - const RealType Sigma, + const RealType sigma, const RealType BaseSigma, const bool lastpass) { @@ -477,9 +475,9 @@ doOneDimensionErode(TInIter & inputIterator, { iscale = image_scale; } - const RealType magnitude = (m_MagnitudeSign * iscale * iscale) / (2.0 * Sigma); - LineBufferType LineBuf(LineLength); - LabelBufferType LabBuf(LineLength); + const RealType magnitude = (m_MagnitudeSign * iscale * iscale) / (2.0 * sigma); + LineBufferType lineBuf(lineLength); + LabelBufferType labBuf(lineLength); inputIterator.SetDirection(direction); outputDistIterator.SetDirection(direction); @@ -501,8 +499,8 @@ doOneDimensionErode(TInIter & inputIterator, // copy the scanline to a buffer while (!inputIterator.IsAtEndOfLine()) { - LineBuf[i] = static_cast(inputDistIterator.Get()); - LabBuf[i] = inputIterator.Get(); + lineBuf[i] = static_cast(inputDistIterator.Get()); + labBuf[i] = inputIterator.Get(); ++i; ++inputDistIterator; ++inputIterator; @@ -511,17 +509,17 @@ doOneDimensionErode(TInIter & inputIterator, using EndType = std::vector; EndType firsts; EndType lasts; - for (unsigned idx = 0; idx < LineLength; idx++) + for (unsigned idx = 0; idx < lineLength; idx++) { - RealType val = LabBuf[idx]; + RealType val = labBuf[idx]; if (val != 0) { // found a run firsts.push_back(idx); unsigned idxend = idx; - for (; idxend < LineLength; idxend++) + for (; idxend < lineLength; idxend++) { - if (val != LabBuf[idxend]) + if (val != labBuf[idxend]) { break; } @@ -546,7 +544,7 @@ doOneDimensionErode(TInIter & inputIterator, { leftend = BaseSigma; } - if (last == LineLength - 1) + if (last == lineLength - 1) { rightend = BaseSigma; } @@ -554,18 +552,18 @@ doOneDimensionErode(TInIter & inputIterator, ShortLineBuf[0] = leftend; ShortLineBuf[SLL + 1] = rightend; - std::copy(&(LineBuf[first]), &(LineBuf[last + 1]), &(ShortLineBuf[1])); + std::copy(&(lineBuf[first]), &(lineBuf[last + 1]), &(ShortLineBuf[1])); DoLine(ShortLineBuf, tmpShortLineBuf, magnitude, m_Extreme); // copy the segment back into the full line buffer - std::copy(&(ShortLineBuf[1]), &(ShortLineBuf[SLL + 1]), &(LineBuf[first])); + std::copy(&(ShortLineBuf[1]), &(ShortLineBuf[SLL + 1]), &(lineBuf[first])); } // copy the line buffer back to the image - don't need to do it on // the last pass - move when we are sure it is working unsigned j = 0; while (!outputDistIterator.IsAtEndOfLine()) { - outputDistIterator.Set(static_cast(LineBuf[j++])); + outputDistIterator.Set(static_cast(lineBuf[j++])); ++outputDistIterator; } @@ -575,9 +573,9 @@ doOneDimensionErode(TInIter & inputIterator, while (!outputLabIterator.IsAtEndOfLine()) { typename TInIter::PixelType val = 0; - if (LineBuf[j2] == BaseSigma) + if (lineBuf[j2] == BaseSigma) { - val = LabBuf[j2]; + val = labBuf[j2]; } outputLabIterator.Set(val); ++outputLabIterator; @@ -600,13 +598,13 @@ doOneDimensionDilate(TInIter & inputIterator, TOutDistIter & outputDistIterator, TOutLabIter & outputLabIterator, ProgressReporter & progress, - const unsigned LineLength, + const unsigned lineLength, const unsigned direction, const int m_MagnitudeSign, const bool m_UseImageSpacing, const RealType m_Extreme, const RealType image_scale, - const RealType Sigma) + const RealType sigma) { // specialised version for binary erosion during first pass. We can // compute the results directly because the inputs are flat. @@ -618,13 +616,13 @@ doOneDimensionDilate(TInIter & inputIterator, iscale = image_scale; } // restructure equation to reduce numerical error - const RealType magnitude = (m_MagnitudeSign * iscale * iscale) / (2.0 * Sigma); + const RealType magnitude = (m_MagnitudeSign * iscale * iscale) / (2.0 * sigma); // const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 ); - LineBufferType LineBuf(LineLength); - LabelBufferType LabBuf(LineLength); - LineBufferType tmpLineBuf(LineLength); - LabelBufferType newLabBuf(LineLength); - LabelBufferType tmpLabBuf(LineLength); + LineBufferType lineBuf(lineLength); + LabelBufferType labBuf(lineLength); + LineBufferType tmpLineBuf(lineLength); + LabelBufferType newLabBuf(lineLength); + LabelBufferType tmpLabBuf(lineLength); inputIterator.SetDirection(direction); inputDistIterator.SetDirection(direction); @@ -646,21 +644,21 @@ doOneDimensionDilate(TInIter & inputIterator, // copy the scanline to a buffer while (!inputDistIterator.IsAtEndOfLine()) { - LineBuf[i] = inputDistIterator.Get(); - LabBuf[i] = inputIterator.Get(); + lineBuf[i] = inputDistIterator.Get(); + labBuf[i] = inputIterator.Get(); ++i; ++inputIterator; ++inputDistIterator; } DoLineLabelProp( - LineBuf, tmpLineBuf, LabBuf, tmpLabBuf, magnitude, m_Extreme); + lineBuf, tmpLineBuf, labBuf, tmpLabBuf, magnitude, m_Extreme); // copy the line buffer back to the image unsigned j = 0; while (!outputDistIterator.IsAtEndOfLine()) { - outputDistIterator.Set(static_cast(LineBuf[j])); - outputLabIterator.Set(LabBuf[j]); + outputDistIterator.Set(static_cast(lineBuf[j])); + outputLabIterator.Set(labBuf[j]); ++outputDistIterator; ++outputLabIterator; j++; From fa9d24f74f5456769762f41eff97b14f66c66981 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Sat, 1 Mar 2025 18:53:55 -0500 Subject: [PATCH 104/113] STYLE: Do no use `m_` to start function parameter names Do no use `m_` to start function parameter names: as per ITK style guidelines `m_` is reserved for member variables. --- .../include/itkLabelSetUtils.h | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index 1a2b3e31aea..54a35c19ffe 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -118,7 +118,7 @@ DoLineDilateFirstPass(LineBufferType & lineBuf, template void -DoLine(LineBufferType & lineBuf, LineBufferType & tmpLineBuf, const RealType magnitude, const RealType m_Extreme) +DoLine(LineBufferType & lineBuf, LineBufferType & tmpLineBuf, const RealType magnitude, const RealType extreme) { // contact point algorithm long koffset = 0, newcontact = 0; // how far away the search starts. @@ -128,7 +128,7 @@ DoLine(LineBufferType & lineBuf, LineBufferType & tmpLineBuf, const RealType mag // negative half of the parabola for (long pos = 0; pos < lineLength; pos++) { - auto baseVal = (RealType)m_Extreme; // the base value for comparison + auto baseVal = (RealType)extreme; // the base value for comparison for (long krange = koffset; krange <= 0; krange++) { // difference needs to be paramaterised @@ -147,7 +147,7 @@ DoLine(LineBufferType & lineBuf, LineBufferType & tmpLineBuf, const RealType mag koffset = newcontact = 0; for (long pos = lineLength - 1; pos >= 0; pos--) { - auto baseVal = (RealType)m_Extreme; // the base value for comparison + auto baseVal = (RealType)extreme; // the base value for comparison for (long krange = koffset; krange >= 0; krange--) { RealType T = tmpLineBuf[pos + krange] - magnitude * krange * krange; @@ -169,7 +169,7 @@ DoLineLabelProp(LineBufferType & lineBuf, LabBufferType & labelBuf, LabBufferType & tmpLabelBuf, const RealType magnitude, - const RealType m_Extreme) + const RealType extreme) { // contact point algorithm long koffset = 0, newcontact = 0; // how far away the search starts. @@ -180,7 +180,7 @@ DoLineLabelProp(LineBufferType & lineBuf, // negative half of the parabola for (long pos = 0; pos < lineLength; pos++) { - auto baseVal = (RealType)m_Extreme; // the base value for comparison + auto baseVal = (RealType)extreme; // the base value for comparison LabelType baseLab = labelBuf[pos]; for (long krange = koffset; krange <= 0; krange++) { @@ -203,7 +203,7 @@ DoLineLabelProp(LineBufferType & lineBuf, #if 1 for (long pos = lineLength - 1; pos >= 0; pos--) { - auto baseVal = (RealType)m_Extreme; // the base value for comparison + auto baseVal = (RealType)extreme; // the base value for comparison // initialize the label to the previously pro LabelType baseLab = tmpLabelBuf[pos]; for (long krange = koffset; krange >= 0; krange--) @@ -238,8 +238,8 @@ doOneDimensionErodeFirstPass(TInIter & inputIterator, ProgressReporter & progress, const unsigned lineLength, const unsigned direction, - const int m_MagnitudeSign, - const bool m_UseImageSpacing, + const int magnitudeSign, + const bool useImageSpacing, const RealType image_scale, const RealType sigma, const bool lastpass) @@ -249,14 +249,14 @@ doOneDimensionErodeFirstPass(TInIter & inputIterator, using LineBufferType = typename itk::Array; using LabelBufferType = typename itk::Array; RealType iscale = 1.0; - if (m_UseImageSpacing) + if (useImageSpacing) { iscale = image_scale; } // restructure equation to reduce numerical error - // const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 * + // const RealType magnitude = (magnitudeSign * iscale * iscale)/(2.0 * // sigma); - const RealType magnitude = (m_MagnitudeSign * iscale * iscale) / (2.0); + const RealType magnitude = (magnitudeSign * iscale * iscale) / (2.0); LineBufferType lineBuf(lineLength); LabelBufferType labBuf(lineLength); @@ -376,8 +376,8 @@ doOneDimensionDilateFirstPass(TInIter & inputIterator, ProgressReporter & progress, const unsigned lineLength, const unsigned direction, - const int m_MagnitudeSign, - const bool m_UseImageSpacing, + const int magnitudeSign, + const bool useImageSpacing, const RealType image_scale, const RealType sigma) { @@ -386,14 +386,14 @@ doOneDimensionDilateFirstPass(TInIter & inputIterator, using LineBufferType = typename itk::Array; using LabelBufferType = typename itk::Array; RealType iscale = 1.0; - if (m_UseImageSpacing) + if (useImageSpacing) { iscale = image_scale; } // restructure equation to reduce numerical error - // const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 * + // const RealType magnitude = (magnitudeSign * iscale * iscale)/(2.0 * // sigma); - const RealType magnitude = (m_MagnitudeSign * iscale * iscale) / (2.0); + const RealType magnitude = (magnitudeSign * iscale * iscale) / (2.0); LineBufferType lineBuf(lineLength); LabelBufferType labBuf(lineLength); LineBufferType tmpLineBuf(lineLength); @@ -459,9 +459,9 @@ doOneDimensionErode(TInIter & inputIterator, ProgressReporter & progress, const unsigned lineLength, const unsigned direction, - const int m_MagnitudeSign, - const bool m_UseImageSpacing, - const RealType m_Extreme, + const int magnitudeSign, + const bool useImageSpacing, + const RealType extreme, const RealType image_scale, const RealType sigma, const RealType BaseSigma, @@ -471,11 +471,11 @@ doOneDimensionErode(TInIter & inputIterator, using LineBufferType = typename itk::Array; using LabelBufferType = typename itk::Array; RealType iscale = 1.0; - if (m_UseImageSpacing) + if (useImageSpacing) { iscale = image_scale; } - const RealType magnitude = (m_MagnitudeSign * iscale * iscale) / (2.0 * sigma); + const RealType magnitude = (magnitudeSign * iscale * iscale) / (2.0 * sigma); LineBufferType lineBuf(lineLength); LabelBufferType labBuf(lineLength); @@ -554,7 +554,7 @@ doOneDimensionErode(TInIter & inputIterator, std::copy(&(lineBuf[first]), &(lineBuf[last + 1]), &(ShortLineBuf[1])); - DoLine(ShortLineBuf, tmpShortLineBuf, magnitude, m_Extreme); + DoLine(ShortLineBuf, tmpShortLineBuf, magnitude, extreme); // copy the segment back into the full line buffer std::copy(&(ShortLineBuf[1]), &(ShortLineBuf[SLL + 1]), &(lineBuf[first])); } @@ -600,9 +600,9 @@ doOneDimensionDilate(TInIter & inputIterator, ProgressReporter & progress, const unsigned lineLength, const unsigned direction, - const int m_MagnitudeSign, - const bool m_UseImageSpacing, - const RealType m_Extreme, + const int magnitudeSign, + const bool useImageSpacing, + const RealType extreme, const RealType image_scale, const RealType sigma) { @@ -611,13 +611,13 @@ doOneDimensionDilate(TInIter & inputIterator, using LineBufferType = typename itk::Array; using LabelBufferType = typename itk::Array; RealType iscale = 1.0; - if (m_UseImageSpacing) + if (useImageSpacing) { iscale = image_scale; } // restructure equation to reduce numerical error - const RealType magnitude = (m_MagnitudeSign * iscale * iscale) / (2.0 * sigma); - // const RealType magnitude = (m_MagnitudeSign * iscale * iscale)/(2.0 ); + const RealType magnitude = (magnitudeSign * iscale * iscale) / (2.0 * sigma); + // const RealType magnitude = (magnitudeSign * iscale * iscale)/(2.0 ); LineBufferType lineBuf(lineLength); LabelBufferType labBuf(lineLength); LineBufferType tmpLineBuf(lineLength); @@ -652,7 +652,7 @@ doOneDimensionDilate(TInIter & inputIterator, } DoLineLabelProp( - lineBuf, tmpLineBuf, labBuf, tmpLabBuf, magnitude, m_Extreme); + lineBuf, tmpLineBuf, labBuf, tmpLabBuf, magnitude, extreme); // copy the line buffer back to the image unsigned j = 0; while (!outputDistIterator.IsAtEndOfLine()) From 8b16575bc0e481699d08b95f09fae12b1ece9320 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Sat, 1 Mar 2025 19:38:31 -0500 Subject: [PATCH 105/113] STYLE: Use medial capitals for variable naming in C++ code Use medial capitals for variable naming in C++ code. Avoid underscores. --- .../LabelErodeDilate/include/itkLabelSetUtils.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index 54a35c19ffe..ac905e797c2 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -240,7 +240,7 @@ doOneDimensionErodeFirstPass(TInIter & inputIterator, const unsigned direction, const int magnitudeSign, const bool useImageSpacing, - const RealType image_scale, + const RealType imageScale, const RealType sigma, const bool lastpass) { @@ -251,7 +251,7 @@ doOneDimensionErodeFirstPass(TInIter & inputIterator, RealType iscale = 1.0; if (useImageSpacing) { - iscale = image_scale; + iscale = imageScale; } // restructure equation to reduce numerical error // const RealType magnitude = (magnitudeSign * iscale * iscale)/(2.0 * @@ -378,7 +378,7 @@ doOneDimensionDilateFirstPass(TInIter & inputIterator, const unsigned direction, const int magnitudeSign, const bool useImageSpacing, - const RealType image_scale, + const RealType imageScale, const RealType sigma) { // specialised version for binary erosion during first pass. We can @@ -388,7 +388,7 @@ doOneDimensionDilateFirstPass(TInIter & inputIterator, RealType iscale = 1.0; if (useImageSpacing) { - iscale = image_scale; + iscale = imageScale; } // restructure equation to reduce numerical error // const RealType magnitude = (magnitudeSign * iscale * iscale)/(2.0 * @@ -462,7 +462,7 @@ doOneDimensionErode(TInIter & inputIterator, const int magnitudeSign, const bool useImageSpacing, const RealType extreme, - const RealType image_scale, + const RealType imageScale, const RealType sigma, const RealType BaseSigma, const bool lastpass) @@ -473,7 +473,7 @@ doOneDimensionErode(TInIter & inputIterator, RealType iscale = 1.0; if (useImageSpacing) { - iscale = image_scale; + iscale = imageScale; } const RealType magnitude = (magnitudeSign * iscale * iscale) / (2.0 * sigma); LineBufferType lineBuf(lineLength); @@ -603,7 +603,7 @@ doOneDimensionDilate(TInIter & inputIterator, const int magnitudeSign, const bool useImageSpacing, const RealType extreme, - const RealType image_scale, + const RealType imageScale, const RealType sigma) { // specialised version for binary erosion during first pass. We can @@ -613,7 +613,7 @@ doOneDimensionDilate(TInIter & inputIterator, RealType iscale = 1.0; if (useImageSpacing) { - iscale = image_scale; + iscale = imageScale; } // restructure equation to reduce numerical error const RealType magnitude = (magnitudeSign * iscale * iscale) / (2.0 * sigma); From e5d7fcc92230dfac3c555eb1d2959864d2a88b35 Mon Sep 17 00:00:00 2001 From: Bradley Lowekamp Date: Mon, 3 Mar 2025 18:15:06 +0000 Subject: [PATCH 106/113] BUG: Fix Valgrind defect with uninitialized array in doOneDimensionErode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-author: Jon Haitz Legarreta Gorroño --- Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index ac905e797c2..e4e34c4c017 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -257,7 +257,7 @@ doOneDimensionErodeFirstPass(TInIter & inputIterator, // const RealType magnitude = (magnitudeSign * iscale * iscale)/(2.0 * // sigma); const RealType magnitude = (magnitudeSign * iscale * iscale) / (2.0); - LineBufferType lineBuf(lineLength); + LineBufferType lineBuf(lineLength, 0.0); LabelBufferType labBuf(lineLength); inputIterator.SetDirection(direction); From 82097b44dcc693f259c94b90a1dc232af8feb4d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Sat, 1 Mar 2025 19:00:23 -0500 Subject: [PATCH 107/113] ENH: Initialize all arrays in `LabelSetUtils.h` file Initialize all arrays in `LabelSetUtils.h` file. --- .../include/itkLabelSetUtils.h | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index e4e34c4c017..c767451a073 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -256,9 +256,10 @@ doOneDimensionErodeFirstPass(TInIter & inputIterator, // restructure equation to reduce numerical error // const RealType magnitude = (magnitudeSign * iscale * iscale)/(2.0 * // sigma); - const RealType magnitude = (magnitudeSign * iscale * iscale) / (2.0); - LineBufferType lineBuf(lineLength, 0.0); - LabelBufferType labBuf(lineLength); + const RealType magnitude = (magnitudeSign * iscale * iscale) / (2.0); + const typename TInIter::PixelType initPixelValue = 0.0; + LineBufferType lineBuf(lineLength, 0.0); + LabelBufferType labBuf(lineLength, 0.0); inputIterator.SetDirection(direction); outputIterator.SetDirection(direction); @@ -393,11 +394,13 @@ doOneDimensionDilateFirstPass(TInIter & inputIterator, // restructure equation to reduce numerical error // const RealType magnitude = (magnitudeSign * iscale * iscale)/(2.0 * // sigma); - const RealType magnitude = (magnitudeSign * iscale * iscale) / (2.0); - LineBufferType lineBuf(lineLength); - LabelBufferType labBuf(lineLength); - LineBufferType tmpLineBuf(lineLength); - LabelBufferType newLabBuf(lineLength); + const RealType magnitude = (magnitudeSign * iscale * iscale) / (2.0); + const RealType initRealValue = 0.0; + const typename TInIter::PixelType initPixelValue = 0.0; + LineBufferType lineBuf(lineLength, initRealValue); + LabelBufferType labBuf(lineLength, initPixelValue); + LineBufferType tmpLineBuf(lineLength, initRealValue); + LabelBufferType newLabBuf(lineLength, initPixelValue); inputIterator.SetDirection(direction); outputIterator.SetDirection(direction); @@ -476,8 +479,8 @@ doOneDimensionErode(TInIter & inputIterator, iscale = imageScale; } const RealType magnitude = (magnitudeSign * iscale * iscale) / (2.0 * sigma); - LineBufferType lineBuf(lineLength); - LabelBufferType labBuf(lineLength); + LineBufferType lineBuf(lineLength, 0.0); + LabelBufferType labBuf(lineLength, 0.0); inputIterator.SetDirection(direction); outputDistIterator.SetDirection(direction); @@ -618,11 +621,13 @@ doOneDimensionDilate(TInIter & inputIterator, // restructure equation to reduce numerical error const RealType magnitude = (magnitudeSign * iscale * iscale) / (2.0 * sigma); // const RealType magnitude = (magnitudeSign * iscale * iscale)/(2.0 ); - LineBufferType lineBuf(lineLength); - LabelBufferType labBuf(lineLength); - LineBufferType tmpLineBuf(lineLength); - LabelBufferType newLabBuf(lineLength); - LabelBufferType tmpLabBuf(lineLength); + const RealType initRealValue = 0.0; + const typename TInIter::PixelType initPixelValue = 0.0; + LineBufferType lineBuf(lineLength, initRealValue); + LabelBufferType labBuf(lineLength, initPixelValue); + LineBufferType tmpLineBuf(lineLength, initRealValue); + LabelBufferType newLabBuf(lineLength, initPixelValue); + LabelBufferType tmpLabBuf(lineLength, initPixelValue); inputIterator.SetDirection(direction); inputDistIterator.SetDirection(direction); From 5184be7c13f6ab6a03ac9511143ef6cf1ee809b0 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Sun, 26 Jan 2025 08:59:10 -0600 Subject: [PATCH 108/113] STYLE: Add itkVirtualGetNameOfClassMacro + itkOverrideGetNameOfClassMacro Added two new macro's, intended to replace the old 'itkTypeMacro' and 'itkTypeMacroNoParent'. The main aim is to be clearer about what those macro's do: add a virtual 'GetNameOfClass()' member function and override it. Unlike 'itkTypeMacro', 'itkOverrideGetNameOfClassMacro' does not have a 'superclass' parameter, as it was not used anyway. Note that originally 'itkTypeMacro' did not use its 'superclass' parameter either, looking at commit 699b66cb04d410e555656828e8892107add38ccb, Will Schroeder, June 27, 2001: https://github.com/InsightSoftwareConsortium/ITK/blob/699b66cb04d410e555656828e8892107add38ccb/Code/Common/itkMacro.h#L331-L337 --- .../LabelErodeDilate/include/itkLabelSetDilateImageFilter.h | 2 +- .../LabelErodeDilate/include/itkLabelSetErodeImageFilter.h | 2 +- .../LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h index 008f66bb683..503bfc02671 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetDilateImageFilter.h @@ -52,7 +52,7 @@ class ITK_EXPORT LabelSetDilateImageFilter : public LabelSetMorphBaseImageFilter itkNewMacro(Self); /** Runtime information support. */ - itkTypeMacro(LabelSetDilateImageFilter, LabelSetMorphBaseImageFilter); + itkOverrideGetNameOfClassMacro(LabelSetDilateImageFilter); /** Pixel Type of the input image */ using InputImageType = TInputImage; diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h index c56656f8e44..8492409a57b 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetErodeImageFilter.h @@ -54,7 +54,7 @@ class ITK_EXPORT LabelSetErodeImageFilter : public LabelSetMorphBaseImageFilter< itkNewMacro(Self); /** Runtime information support. */ - itkTypeMacro(LabelSetErodeImageFilter, LabelSetMorphBaseImageFilter); + itkOverrideGetNameOfClassMacro(LabelSetErodeImageFilter); /** Pixel Type of the input image */ using InputImageType = TInputImage; diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h index 55fc4c88eba..eb5b5fed5b0 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.h @@ -58,7 +58,7 @@ class ITK_EXPORT LabelSetMorphBaseImageFilter : public ImageToImageFilter Date: Sun, 13 Apr 2025 14:02:13 -0400 Subject: [PATCH 109/113] COMP: Remove unused variable Remove unused variable. Fixes: ``` Modules/Remote/LabelErodeDilate/include/itkLabelSetUtils.h:260:37: warning: unused variable 'initPixelValue' [-Wunused-variable] 260 | const typename TInIter::PixelType initPixelValue = 0.0; | ^~~~~~~~~~~~~~ ``` raised for example in: https://open.cdash.org/viewBuildError.php?type=1&buildid=10316578 Introducing the variable was an oversight in commit 82097b4. --- .../Filtering/LabelErodeDilate/include/itkLabelSetUtils.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h index c767451a073..e214a0fe33f 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetUtils.h @@ -256,10 +256,9 @@ doOneDimensionErodeFirstPass(TInIter & inputIterator, // restructure equation to reduce numerical error // const RealType magnitude = (magnitudeSign * iscale * iscale)/(2.0 * // sigma); - const RealType magnitude = (magnitudeSign * iscale * iscale) / (2.0); - const typename TInIter::PixelType initPixelValue = 0.0; - LineBufferType lineBuf(lineLength, 0.0); - LabelBufferType labBuf(lineLength, 0.0); + const RealType magnitude = (magnitudeSign * iscale * iscale) / (2.0); + LineBufferType lineBuf(lineLength, 0.0); + LabelBufferType labBuf(lineLength, 0.0); inputIterator.SetDirection(direction); outputIterator.SetDirection(direction); From cd79dadc52462edabc6c0206183d94f52db43971 Mon Sep 17 00:00:00 2001 From: Niels Dekker Date: Mon, 5 Jan 2026 18:48:18 +0100 Subject: [PATCH 110/113] COMP: Use `MultiThreaderBase` directly, instead of `MultiThreaderType` Following ITK pull request https://github.com/InsightSoftwareConsortium/ITK/pull/5692 "Deprecate `MultiThreaderType` aliases, use `MultiThreaderBase` directly" --- .../include/itkLabelSetMorphBaseImageFilter.hxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx index d04a4e19378..33a46cb62b5 100644 --- a/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx +++ b/Modules/Filtering/LabelErodeDilate/include/itkLabelSetMorphBaseImageFilter.hxx @@ -201,7 +201,7 @@ LabelSetMorphBaseImageFilter::GenerateData( // Set up the multithreaded processing typename ImageSource::ThreadStruct str; str.Filter = this; - ProcessObject::MultiThreaderType * multithreader = this->GetMultiThreader(); + MultiThreaderBase * multithreader = this->GetMultiThreader(); multithreader->SetNumberOfWorkUnits(nbthreads); multithreader->SetSingleMethod(this->ThreaderCallback, &str); From 6492ab33e52d50a12443182240a8c32ac2e17421 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Wed, 29 Apr 2026 07:39:59 -0500 Subject: [PATCH 111/113] ENH: Convert ExternalData .md5/.sha512 tags to .cid (IPFS content IDs) Migrate ExternalData tag files to CIDv1-raw form. The CID blobs are added to ITKTestingData gh-pages in InsightSoftwareConsortium/ITKTestingData#43. --- .../LabelErodeDilate/test/Baseline/axialdilate5.png.cid | 1 + .../LabelErodeDilate/test/Baseline/axialdilate5.png.sha512 | 1 - .../Filtering/LabelErodeDilate/test/Baseline/axialerode3.png.cid | 1 + .../LabelErodeDilate/test/Baseline/axialerode3.png.sha512 | 1 - .../LabelErodeDilate/test/Baseline/cortdilate_5.nii.gz.cid | 1 + .../LabelErodeDilate/test/Baseline/cortdilate_5.nii.gz.sha512 | 1 - .../LabelErodeDilate/test/Baseline/corterode_3.nii.gz.cid | 1 + .../LabelErodeDilate/test/Baseline/corterode_3.nii.gz.sha512 | 1 - .../LabelErodeDilate/test/Baseline/dotdilate_41.nii.gz.cid | 1 + .../LabelErodeDilate/test/Baseline/dotdilate_41.nii.gz.sha512 | 1 - .../LabelErodeDilate/test/Baseline/holeerode_41.nii.gz.cid | 1 + .../LabelErodeDilate/test/Baseline/holeerode_41.nii.gz.sha512 | 1 - .../Filtering/LabelErodeDilate/test/Baseline/labdilate2d.png.cid | 1 + .../LabelErodeDilate/test/Baseline/labdilate2d.png.sha512 | 1 - .../LabelErodeDilate/test/Baseline/labdilate3d.nii.gz.cid | 1 + .../LabelErodeDilate/test/Baseline/labdilate3d.nii.gz.sha512 | 1 - .../LabelErodeDilate/test/Baseline/labdilate3d_dez.nii.gz.cid | 1 + .../LabelErodeDilate/test/Baseline/labdilate3d_dez.nii.gz.sha512 | 1 - .../LabelErodeDilate/test/Baseline/labdilate3d_ell.nii.gz.cid | 1 + .../LabelErodeDilate/test/Baseline/labdilate3d_ell.nii.gz.sha512 | 1 - .../Filtering/LabelErodeDilate/test/Baseline/laberode2d.png.cid | 1 + .../LabelErodeDilate/test/Baseline/laberode2d.png.sha512 | 1 - .../LabelErodeDilate/test/Baseline/laberode3d.nii.gz.cid | 1 + .../LabelErodeDilate/test/Baseline/laberode3d.nii.gz.sha512 | 1 - .../LabelErodeDilate/test/Baseline/laberode3d_ell.nii.gz.cid | 1 + .../LabelErodeDilate/test/Baseline/laberode3d_ell.nii.gz.sha512 | 1 - .../test/Input/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz.cid | 1 + .../Input/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz.sha512 | 1 - Modules/Filtering/LabelErodeDilate/test/Input/axial.png.cid | 1 + Modules/Filtering/LabelErodeDilate/test/Input/axial.png.sha512 | 1 - Modules/Filtering/LabelErodeDilate/test/Input/dot.nii.gz.cid | 1 + Modules/Filtering/LabelErodeDilate/test/Input/dot.nii.gz.sha512 | 1 - Modules/Filtering/LabelErodeDilate/test/Input/hole.nii.gz.cid | 1 + Modules/Filtering/LabelErodeDilate/test/Input/hole.nii.gz.sha512 | 1 - Modules/Filtering/LabelErodeDilate/test/Input/point.nii.gz.cid | 1 + .../Filtering/LabelErodeDilate/test/Input/point.nii.gz.sha512 | 1 - 36 files changed, 18 insertions(+), 18 deletions(-) create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/axialdilate5.png.cid delete mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/axialdilate5.png.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/axialerode3.png.cid delete mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/axialerode3.png.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/cortdilate_5.nii.gz.cid delete mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/cortdilate_5.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/corterode_3.nii.gz.cid delete mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/corterode_3.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/dotdilate_41.nii.gz.cid delete mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/dotdilate_41.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/holeerode_41.nii.gz.cid delete mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/holeerode_41.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate2d.png.cid delete mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate2d.png.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d.nii.gz.cid delete mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_dez.nii.gz.cid delete mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_dez.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_ell.nii.gz.cid delete mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_ell.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/laberode2d.png.cid delete mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/laberode2d.png.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d.nii.gz.cid delete mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d_ell.nii.gz.cid delete mode 100644 Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d_ell.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Input/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz.cid delete mode 100644 Modules/Filtering/LabelErodeDilate/test/Input/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Input/axial.png.cid delete mode 100644 Modules/Filtering/LabelErodeDilate/test/Input/axial.png.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Input/dot.nii.gz.cid delete mode 100644 Modules/Filtering/LabelErodeDilate/test/Input/dot.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Input/hole.nii.gz.cid delete mode 100644 Modules/Filtering/LabelErodeDilate/test/Input/hole.nii.gz.sha512 create mode 100644 Modules/Filtering/LabelErodeDilate/test/Input/point.nii.gz.cid delete mode 100644 Modules/Filtering/LabelErodeDilate/test/Input/point.nii.gz.sha512 diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/axialdilate5.png.cid b/Modules/Filtering/LabelErodeDilate/test/Baseline/axialdilate5.png.cid new file mode 100644 index 00000000000..7983fe8b000 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/axialdilate5.png.cid @@ -0,0 +1 @@ +bafkreignohgnupjs5so6tgy5upo3n2iew3i3xwb5mzfhqp74h2gtdzib2q diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/axialdilate5.png.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/axialdilate5.png.sha512 deleted file mode 100644 index 2d51ac8db4b..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/Baseline/axialdilate5.png.sha512 +++ /dev/null @@ -1 +0,0 @@ -1a09dfa197947789b8e26de9bcac3e2981240a55e0c22c10985226b759284ed9cb593fc8cee08b249ca3ab01e63b6eaff5c8d51fce4acdf292018ff9cad1b121 diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/axialerode3.png.cid b/Modules/Filtering/LabelErodeDilate/test/Baseline/axialerode3.png.cid new file mode 100644 index 00000000000..909c7c54fe5 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/axialerode3.png.cid @@ -0,0 +1 @@ +bafkreihutkwlxnie2aapzz3s2ysie74z7rszkhqt3znrw5uidvo56sxqta diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/axialerode3.png.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/axialerode3.png.sha512 deleted file mode 100644 index 98f3272ffd2..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/Baseline/axialerode3.png.sha512 +++ /dev/null @@ -1 +0,0 @@ -939c96d5d65d4958d78dd77d5a0827bd0591dff6a520435c38e1f99b0a8964d0d414224034f513bf7b1946960432ceddf6722b9f898dbcbd9067f04171d4e9e1 diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/cortdilate_5.nii.gz.cid b/Modules/Filtering/LabelErodeDilate/test/Baseline/cortdilate_5.nii.gz.cid new file mode 100644 index 00000000000..d4ad435b163 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/cortdilate_5.nii.gz.cid @@ -0,0 +1 @@ +bafkreidx5qgnfstu7teg6zcpcswhltdi3d6oe64i4xojbyevcrkbcqje5a diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/cortdilate_5.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/cortdilate_5.nii.gz.sha512 deleted file mode 100644 index ea91fb1d954..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/Baseline/cortdilate_5.nii.gz.sha512 +++ /dev/null @@ -1 +0,0 @@ -d89307dafd27b3ca7c4b0932a6e33348f57ac1d8e568c1ad9e374d95e040fbbaae742ed46b7b857fd01a18a5242ab881d912d9243e6cc50d2b2fef6d34c55dba diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/corterode_3.nii.gz.cid b/Modules/Filtering/LabelErodeDilate/test/Baseline/corterode_3.nii.gz.cid new file mode 100644 index 00000000000..9de305fe568 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/corterode_3.nii.gz.cid @@ -0,0 +1 @@ +bafkreib4xillmbq46xyekntmegrixhggvhbh7ko5nvyzbnbrgfpvhqaprq diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/corterode_3.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/corterode_3.nii.gz.sha512 deleted file mode 100644 index a17cad98fde..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/Baseline/corterode_3.nii.gz.sha512 +++ /dev/null @@ -1 +0,0 @@ -db08a5c43de8e66c31fba503dbd237d71c4de571ff21aec3279d5ac83dd27cb93d32b7d0cfd344f09a0a734a3f37b4d37ec48ac04d7c3b89718ce1e7e8d97d9d diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/dotdilate_41.nii.gz.cid b/Modules/Filtering/LabelErodeDilate/test/Baseline/dotdilate_41.nii.gz.cid new file mode 100644 index 00000000000..a5fd30ec990 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/dotdilate_41.nii.gz.cid @@ -0,0 +1 @@ +bafkreibstbqwgyaqq564m42fn4lz2d2idanccbgme7y5zu7lm7aekmsxme diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/dotdilate_41.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/dotdilate_41.nii.gz.sha512 deleted file mode 100644 index eb8151b8722..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/Baseline/dotdilate_41.nii.gz.sha512 +++ /dev/null @@ -1 +0,0 @@ -d0068400b5f68f0f6b4229194d733e1237a0ba0b9f9a7676a3ec3a8cbf5edf1b9c3c0eb16d350b2bf55c04addc8e3d3afd7b26660b7e579237a42a2218c635a1 diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/holeerode_41.nii.gz.cid b/Modules/Filtering/LabelErodeDilate/test/Baseline/holeerode_41.nii.gz.cid new file mode 100644 index 00000000000..a728614d8d0 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/holeerode_41.nii.gz.cid @@ -0,0 +1 @@ +bafkreigpzzhdxcwf4h6lqd7g5kbashk5aocrznygd7yh73yf5gbzpnyp7u diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/holeerode_41.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/holeerode_41.nii.gz.sha512 deleted file mode 100644 index ede786672c9..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/Baseline/holeerode_41.nii.gz.sha512 +++ /dev/null @@ -1 +0,0 @@ -1eb1a3a9fdccb3f15cdd82f2998051c59d29aceb33b1d6b3136715e8072d68abe9ce6154486771097d317b4176eab61d73ee4504af412bded4c21ff7404a8b91 diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate2d.png.cid b/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate2d.png.cid new file mode 100644 index 00000000000..8570dedebfc --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate2d.png.cid @@ -0,0 +1 @@ +bafkreih4wdtayxyd4eidg4elaitxly52aav77jieynvqxgcqtxvvv7a7ue diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate2d.png.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate2d.png.sha512 deleted file mode 100644 index 46fb07d1167..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate2d.png.sha512 +++ /dev/null @@ -1 +0,0 @@ -6555032f13425094597f21a299723d8b7dc1cbd6420ccac2d77b8f879fc2e1c911e49af1357e5d3fd17e445a7fb4beaf3133e31231682bc232361359ea0e9b4d diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d.nii.gz.cid b/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d.nii.gz.cid new file mode 100644 index 00000000000..d4ad435b163 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d.nii.gz.cid @@ -0,0 +1 @@ +bafkreidx5qgnfstu7teg6zcpcswhltdi3d6oe64i4xojbyevcrkbcqje5a diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d.nii.gz.sha512 deleted file mode 100644 index ea91fb1d954..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d.nii.gz.sha512 +++ /dev/null @@ -1 +0,0 @@ -d89307dafd27b3ca7c4b0932a6e33348f57ac1d8e568c1ad9e374d95e040fbbaae742ed46b7b857fd01a18a5242ab881d912d9243e6cc50d2b2fef6d34c55dba diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_dez.nii.gz.cid b/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_dez.nii.gz.cid new file mode 100644 index 00000000000..c8b315e29c0 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_dez.nii.gz.cid @@ -0,0 +1 @@ +bafkreicdjwvwnesgl4debf4az55l53bioupi2opuyqcnxm4rv7u6lwcira diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_dez.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_dez.nii.gz.sha512 deleted file mode 100644 index da0c17a11c4..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_dez.nii.gz.sha512 +++ /dev/null @@ -1 +0,0 @@ -bea3ba2c9181d97fce783f3a63eaee0c48889357dc58c79447cdf609958e80e71f053a0aa19a3b83adc0328196f1edd491c761d8ac87a2406de850439c6cae15 diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_ell.nii.gz.cid b/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_ell.nii.gz.cid new file mode 100644 index 00000000000..bc59737f4d2 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_ell.nii.gz.cid @@ -0,0 +1 @@ +bafkreihdcjzlzajfqzxjorxumyv7i4w63xve356jlya5pae3s4a4akgzhy diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_ell.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_ell.nii.gz.sha512 deleted file mode 100644 index 9c7539d6a56..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/Baseline/labdilate3d_ell.nii.gz.sha512 +++ /dev/null @@ -1 +0,0 @@ -4d7e95a8d092744ea0ef815a938eb120b49a4a062351b7db7e666d20e7d6d8bc0d6ca447c17edafaf3446042d5d7afb204479350a52571a051b9eddca39fc669 diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode2d.png.cid b/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode2d.png.cid new file mode 100644 index 00000000000..710119f001c --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode2d.png.cid @@ -0,0 +1 @@ +bafkreihc2acgtjlasa5hzs5u4uh3gyzxy64fdhq4vewq3mzx23s656gute diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode2d.png.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode2d.png.sha512 deleted file mode 100644 index 28731805d60..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode2d.png.sha512 +++ /dev/null @@ -1 +0,0 @@ -4ea4243812c431bf24bb6f96f03596d04dfc61f05f7d08c7a86628bde55b1eb75c168e446759e0610c35a240943bba6c4f176973b7cef8c9a9fdc970226130e7 diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d.nii.gz.cid b/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d.nii.gz.cid new file mode 100644 index 00000000000..5e84b8e422d --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d.nii.gz.cid @@ -0,0 +1 @@ +bafkreibw5okurput5fxz637uev44dwc6o6jowlo3t6epqlarqjtaotucpm diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d.nii.gz.sha512 deleted file mode 100644 index d3c68f721cb..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d.nii.gz.sha512 +++ /dev/null @@ -1 +0,0 @@ -157fb20e7d5952edd5ca275facaf40e4fb74c80e14c4004f852ad96018589cc022b243d0e9a00d63593b81e4fa5fd4736f5712d3caac55e69495eb8f370f9c3a diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d_ell.nii.gz.cid b/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d_ell.nii.gz.cid new file mode 100644 index 00000000000..af0e70a5ba5 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d_ell.nii.gz.cid @@ -0,0 +1 @@ +bafkreihz4dy3rid4m52hncbw3ltrb7adhz6hkyeiu6cyvtspondubzznfq diff --git a/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d_ell.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d_ell.nii.gz.sha512 deleted file mode 100644 index 1c5333e3dc1..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/Baseline/laberode3d_ell.nii.gz.sha512 +++ /dev/null @@ -1 +0,0 @@ -7160646952fd8aabd4879e0cae17e4052406e29eb66a106cecad6d0ad129b2cafa18afe5352468d3f907dfa8fa9192b19075dd2917da269d38faa39a9fe6cd84 diff --git a/Modules/Filtering/LabelErodeDilate/test/Input/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz.cid b/Modules/Filtering/LabelErodeDilate/test/Input/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz.cid new file mode 100644 index 00000000000..d6f63eb31a2 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Input/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz.cid @@ -0,0 +1 @@ +bafkreibvmnnjqoxw32pn6grevl43jo5jn45e3pnnovxjt4cygjccj5bm5u diff --git a/Modules/Filtering/LabelErodeDilate/test/Input/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Input/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz.sha512 deleted file mode 100644 index 7cd4425072e..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/Input/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz.sha512 +++ /dev/null @@ -1 +0,0 @@ -01b22eb852f98feca98d6e8c401082d4eef6bf348dbc64ac7113ab96c77d5d1f53b06a102ffc18da6f1d84576a4903aa6db5b8ef632825a4ebb3ebcff67baec9 diff --git a/Modules/Filtering/LabelErodeDilate/test/Input/axial.png.cid b/Modules/Filtering/LabelErodeDilate/test/Input/axial.png.cid new file mode 100644 index 00000000000..bd0253ed50d --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Input/axial.png.cid @@ -0,0 +1 @@ +bafkreidin7opdyo7vwldry6q4jxpsiglj4a6cukaojvhw5vten3njmp6t4 diff --git a/Modules/Filtering/LabelErodeDilate/test/Input/axial.png.sha512 b/Modules/Filtering/LabelErodeDilate/test/Input/axial.png.sha512 deleted file mode 100644 index 963ff9a2766..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/Input/axial.png.sha512 +++ /dev/null @@ -1 +0,0 @@ -b3ba2db251f0b6768a8c9fa8ef8695e4e1cedafaf7c7f93aa4a6328afe0dd316a7591256ad8377bebb104346ba7cbf8fb99795a02b38914d016f704a34dfd15a diff --git a/Modules/Filtering/LabelErodeDilate/test/Input/dot.nii.gz.cid b/Modules/Filtering/LabelErodeDilate/test/Input/dot.nii.gz.cid new file mode 100644 index 00000000000..6263c79899a --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Input/dot.nii.gz.cid @@ -0,0 +1 @@ +bafkreiexf76zzkideuqez6nryen2ucat3i3yb7a53i7ydtrhyqmxnxx7zi diff --git a/Modules/Filtering/LabelErodeDilate/test/Input/dot.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Input/dot.nii.gz.sha512 deleted file mode 100644 index 52c4bff4d1f..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/Input/dot.nii.gz.sha512 +++ /dev/null @@ -1 +0,0 @@ -d57a03b9312fab12360464446d6b01c224fcdc5eea54f934bae87e94053c41a8e0f60d16459e7791f11df49ee048ee13b7420d862bfa3ee385046d699adbd1cc diff --git a/Modules/Filtering/LabelErodeDilate/test/Input/hole.nii.gz.cid b/Modules/Filtering/LabelErodeDilate/test/Input/hole.nii.gz.cid new file mode 100644 index 00000000000..446ed5632f7 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Input/hole.nii.gz.cid @@ -0,0 +1 @@ +bafkreidr4hcmonqqjagd4wqlejhdrb4uzrccbja3wpbph6isxmo6fa47ky diff --git a/Modules/Filtering/LabelErodeDilate/test/Input/hole.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Input/hole.nii.gz.sha512 deleted file mode 100644 index ca2a6d3ffec..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/Input/hole.nii.gz.sha512 +++ /dev/null @@ -1 +0,0 @@ -162cb77ca6675f13fdd7f83e3d422d58cc54bfede37cdeea0162d94296cdd59979070331dc6f075238c847d1410c6dbf236718241cba6b96586afbcddea4a83e diff --git a/Modules/Filtering/LabelErodeDilate/test/Input/point.nii.gz.cid b/Modules/Filtering/LabelErodeDilate/test/Input/point.nii.gz.cid new file mode 100644 index 00000000000..6003e586478 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/test/Input/point.nii.gz.cid @@ -0,0 +1 @@ +bafkreie35wxlvvtapcrssnackka5fipw4w6aajermzeiv3dfiyyhbyxe2y diff --git a/Modules/Filtering/LabelErodeDilate/test/Input/point.nii.gz.sha512 b/Modules/Filtering/LabelErodeDilate/test/Input/point.nii.gz.sha512 deleted file mode 100644 index 099c5bd7a4d..00000000000 --- a/Modules/Filtering/LabelErodeDilate/test/Input/point.nii.gz.sha512 +++ /dev/null @@ -1 +0,0 @@ -bb0b15dcd7cbf0c03705f2bd81ba60889295b711e6f84cce3449138fc6667cea740f1690852afda8b5061a07090922a7dba8dd248597a1a3db6f648ac3969736 From 1cc8bbd3b40787657b5884ac1a144a7c5575c2e8 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Wed, 29 Apr 2026 18:06:17 -0500 Subject: [PATCH 112/113] DOC: Add README for in-tree LabelErodeDilate; drop remote fetch Add Modules/Filtering/LabelErodeDilate/README.md documenting the ingested module and pointing at the upstream archive, remove Modules/Remote/LabelErodeDilate.remote.cmake, and add -DModule_LabelErodeDilate:BOOL=ON to the pyproject.toml configure-ci task so the in-tree module is exercised on every CI run. --- Modules/Filtering/LabelErodeDilate/README.md | 23 ++++++++ Modules/Remote/LabelErodeDilate.remote.cmake | 56 -------------------- pyproject.toml | 1 + 3 files changed, 24 insertions(+), 56 deletions(-) create mode 100644 Modules/Filtering/LabelErodeDilate/README.md delete mode 100644 Modules/Remote/LabelErodeDilate.remote.cmake diff --git a/Modules/Filtering/LabelErodeDilate/README.md b/Modules/Filtering/LabelErodeDilate/README.md new file mode 100644 index 00000000000..3092dd001f3 --- /dev/null +++ b/Modules/Filtering/LabelErodeDilate/README.md @@ -0,0 +1,23 @@ +# LabelErodeDilate + +In-tree ITK module providing morphological erosion and dilation +filters for label images. Label collisions are handled consistently +and the operations execute in approximately constant time with +respect to structuring-element size. Only circular, spherical, and +hyperspherical structuring elements are supported. + +The flagship classes are `itk::LabelSetDilateImageFilter` and +`itk::LabelSetErodeImageFilter`, with shared infrastructure in +`itk::LabelSetMorphBaseImageFilter`. + +## Origin + +Ingested from the standalone remote module +[**InsightSoftwareConsortium/ITKLabelErodeDilate**](https://github.com/InsightSoftwareConsortium/ITKLabelErodeDilate) +on 2026-04-29. The upstream repository will be archived read-only +after this PR merges; it remains reachable at the URL above. + +## References + +- Beare R. *A morphological approach to vessel segmentation.* The Insight Journal. 2018. +- Beare R. *Histogram-based thresholding — some missing methods.* The Insight Journal. 2011. diff --git a/Modules/Remote/LabelErodeDilate.remote.cmake b/Modules/Remote/LabelErodeDilate.remote.cmake deleted file mode 100644 index 409da5f51ec..00000000000 --- a/Modules/Remote/LabelErodeDilate.remote.cmake +++ /dev/null @@ -1,56 +0,0 @@ -#-- # Grading Level Criteria Report -#-- EVALUATION DATE: 2020-03-01 -#-- EVALUATORS: [<>,<>] -#-- -#-- ## Compliance level 5 star (AKA ITK main modules, or remote modules that could become core modules) -#-- - [ ] Widespread community dependance -#-- - [ ] Above 90% code coverage -#-- - [ ] CI dashboards and testing monitored rigorously -#-- - [ ] Key API features are exposed in wrapping interface -#-- - [ ] All requirements of Levels 4,3,2,1 -#-- -#-- ## Compliance Level 4 star (Very high-quality code, perhaps small community dependance) -#-- - [ ] Meets all ITK code style standards -#-- - [ ] No external requirements beyond those needed by ITK proper -#-- - [ ] Builds and passes tests on all supported platforms within 1 month of each core tagged release -#-- - [ ] Windows Shared Library Build with Visual Studio -#-- - [ ] Mac with clang compiller -#-- - [ ] Linux with gcc compiler -#-- - [ ] Active developer community dedicated to maintaining code-base -#-- - [ ] 75% code coverage demonstrated for testing suite -#-- - [ ] Continuous integration testing performed -#-- - [ ] All requirements of Levels 3,2,1 -#-- -#-- ## Compliance Level 3 star (Quality beta code) -#-- - [X] API | executable interface is considered mostly stable and feature complete -#-- - [X] 10% C0-code coverage demonstrated for testing suite -#-- - [X] Some tests exist and pass on at least some platform -#-- - [X] All requirements of Levels 2,1 -#-- -#-- ## Compliance Level 2 star (Alpha code feature API development or niche community/execution environment dependance ) -#-- - [X] Compiles for at least 1 niche set of execution envirionments, and perhaps others -#-- (may depend on specific external tools like a java environment, or specific external libraries to work ) -#-- - [X] All requirements of Levels 1 -#-- -#-- ## Compliance Level 1 star (Pre-alpha features under development and code of unknown quality) -#-- - [X] Code complies on at least 1 platform -#-- -#-- ## Compliance Level 0 star ( Code/Feature of known poor-quality or deprecated status ) -#-- - [ ] Code reviewed and explicitly identified as not recommended for use -#-- -#-- ### Please document here any justification for the criteria above -# Code style enforced by clang-format on 2020-02-19, and clang-tidy modernizations completed - -itk_fetch_module( - LabelErodeDilate - "Classes performing morphology efficiently on label images. - Label collisions are consistently handled, and - operations are efficient (approximately constant time wrt - structuring element size). Only circular/spherical/hyperspherical - structuring elements are supported. - https://doi.org/10.54294/j8lsa66 - https://doi.org/10.54294/aq68pt" - MODULE_COMPLIANCE_LEVEL 3 - GIT_REPOSITORY https://github.com/InsightSoftwareConsortium/ITKLabelErodeDilate.git - GIT_TAG 5850a0f75214b72f0fe6e93f2d6101fc888c95c9 - ) diff --git a/pyproject.toml b/pyproject.toml index 13c20a78be1..d75121de752 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,6 +56,7 @@ cmd = '''cmake -DModule_Montage:BOOL=ON -DModule_FastBilateral:BOOL=ON -DModule_GenericLabelInterpolator:BOOL=ON + -DModule_LabelErodeDilate:BOOL=ON -DModule_MeshNoise:BOOL=ON -DModule_MGHIO:BOOL=ON -DITK_COMPUTER_MEMORY_SIZE:STRING=11 From 77edee27b53734e004bb6943cef8e4746272b821 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Wed, 29 Apr 2026 18:07:28 -0500 Subject: [PATCH 113/113] STYLE: Apply gersemi + trim trailing whitespace to LabelErodeDilate --- .../LabelErodeDilate/itk-module.cmake | 23 ++-- .../LabelErodeDilate/test/CMakeLists.txt | 123 ++++++++++++------ .../LabelErodeDilate/wrapping/CMakeLists.txt | 10 +- 3 files changed, 99 insertions(+), 57 deletions(-) diff --git a/Modules/Filtering/LabelErodeDilate/itk-module.cmake b/Modules/Filtering/LabelErodeDilate/itk-module.cmake index cd9cd767581..618891acbdd 100644 --- a/Modules/Filtering/LabelErodeDilate/itk-module.cmake +++ b/Modules/Filtering/LabelErodeDilate/itk-module.cmake @@ -1,15 +1,13 @@ -# the top-level README is used for describing this module, just -# re-used it for documentation here -get_filename_component(MY_CURENT_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) -file(READ "${MY_CURENT_DIR}/README.rst" DOCUMENTATION) - -# itk_module() defines the module dependencies in LabelErodeDilate -# The testing module in LabelErodeDilate depends on ITKTestKernel -# By convention those modules outside of ITK are not prefixed with -# ITK +set( + DOCUMENTATION + "Morphological erosion and dilation for label images. Label collisions are +handled consistently and operations execute in approximately constant time +with respect to structuring-element size. Only circular, spherical, and +hyperspherical structuring elements are supported." +) -# define the dependencies of the include module and the tests -itk_module(LabelErodeDilate +itk_module( + LabelErodeDilate DEPENDS ITKIOImageBase TEST_DEPENDS @@ -17,6 +15,5 @@ itk_module(LabelErodeDilate ITKTestKernel ITKSmoothing EXCLUDE_FROM_DEFAULT - DESCRIPTION - "${DOCUMENTATION}" + DESCRIPTION "${DOCUMENTATION}" ) diff --git a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt index 37ef329e95a..41dfb34841f 100644 --- a/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/test/CMakeLists.txt @@ -1,44 +1,87 @@ itk_module_test() -set(LabelErodeDilateTests -itkLabelSetDilateTest.cxx -itkLabelSetErodeTest.cxx +set( + LabelErodeDilateTests + itkLabelSetDilateTest.cxx + itkLabelSetErodeTest.cxx ) -CreateTestDriver(LabelErodeDilate "${LabelErodeDilate-Test_LIBRARIES}" "${LabelErodeDilateTests}") - -itk_add_test(NAME itkLabelDilateTest2D_5 - COMMAND LabelErodeDilateTestDriver - --compare DATA{Baseline/axialdilate5.png} - ${ITK_TEST_OUTPUT_DIR}/axialdilate5.png - itkLabelSetDilateTest DATA{Input/axial.png} 5 ${ITK_TEST_OUTPUT_DIR}/axialdilate5.png ) - -itk_add_test(NAME itkLabelDilateTest3D_5 - COMMAND LabelErodeDilateTestDriver - --compare DATA{Baseline/cortdilate_5.nii.gz} - ${ITK_TEST_OUTPUT_DIR}/cortdilate_5.nii.gz - itkLabelSetDilateTest DATA{Input/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz} 5 ${ITK_TEST_OUTPUT_DIR}/cortdilate_5.nii.gz ) - -itk_add_test(NAME itkLabelDilateTest3D_big - COMMAND LabelErodeDilateTestDriver - --compare DATA{Baseline/dotdilate_41.nii.gz} - ${ITK_TEST_OUTPUT_DIR}/dotdilate_41.nii.gz - itkLabelSetDilateTest DATA{Input/dot.nii.gz} 41 ${ITK_TEST_OUTPUT_DIR}/dotdilate_41.nii.gz ) - -itk_add_test(NAME itkLabelErodeTest2D_3 - COMMAND LabelErodeDilateTestDriver - --compare DATA{Baseline/axialerode3.png} - ${ITK_TEST_OUTPUT_DIR}/axialerode3.png - itkLabelSetErodeTest DATA{Input/axial.png} 3 ${ITK_TEST_OUTPUT_DIR}/axialerode3.png ) - -itk_add_test(NAME itkLabelErodeTest3D_3 - COMMAND LabelErodeDilateTestDriver - --compare DATA{Baseline/corterode_3.nii.gz} - ${ITK_TEST_OUTPUT_DIR}/corterode_3.nii.gz - itkLabelSetErodeTest DATA{Input/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz} 3 ${ITK_TEST_OUTPUT_DIR}/corterode_3.nii.gz ) - -itk_add_test(NAME itkLabelErodeTest3D_big - COMMAND LabelErodeDilateTestDriver - --compare DATA{Baseline/holeerode_41.nii.gz} - ${ITK_TEST_OUTPUT_DIR}/holeerode_41.nii.gz - itkLabelSetErodeTest DATA{Input/hole.nii.gz} 41 ${ITK_TEST_OUTPUT_DIR}/holeerode_41.nii.gz ) +createtestdriver(LabelErodeDilate "${LabelErodeDilate-Test_LIBRARIES}" "${LabelErodeDilateTests}") + +itk_add_test( + NAME itkLabelDilateTest2D_5 + COMMAND + LabelErodeDilateTestDriver + --compare + DATA{Baseline/axialdilate5.png} + ${ITK_TEST_OUTPUT_DIR}/axialdilate5.png + itkLabelSetDilateTest + DATA{Input/axial.png} + 5 + ${ITK_TEST_OUTPUT_DIR}/axialdilate5.png +) + +itk_add_test( + NAME itkLabelDilateTest3D_5 + COMMAND + LabelErodeDilateTestDriver + --compare + DATA{Baseline/cortdilate_5.nii.gz} + ${ITK_TEST_OUTPUT_DIR}/cortdilate_5.nii.gz + itkLabelSetDilateTest + DATA{Input/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz} + 5 + ${ITK_TEST_OUTPUT_DIR}/cortdilate_5.nii.gz +) + +itk_add_test( + NAME itkLabelDilateTest3D_big + COMMAND + LabelErodeDilateTestDriver + --compare + DATA{Baseline/dotdilate_41.nii.gz} + ${ITK_TEST_OUTPUT_DIR}/dotdilate_41.nii.gz + itkLabelSetDilateTest + DATA{Input/dot.nii.gz} + 41 + ${ITK_TEST_OUTPUT_DIR}/dotdilate_41.nii.gz +) + +itk_add_test( + NAME itkLabelErodeTest2D_3 + COMMAND + LabelErodeDilateTestDriver + --compare + DATA{Baseline/axialerode3.png} + ${ITK_TEST_OUTPUT_DIR}/axialerode3.png + itkLabelSetErodeTest + DATA{Input/axial.png} + 3 + ${ITK_TEST_OUTPUT_DIR}/axialerode3.png +) + +itk_add_test( + NAME itkLabelErodeTest3D_3 + COMMAND + LabelErodeDilateTestDriver + --compare + DATA{Baseline/corterode_3.nii.gz} + ${ITK_TEST_OUTPUT_DIR}/corterode_3.nii.gz + itkLabelSetErodeTest + DATA{Input/HarvardOxford-cort-maxprob-thr50-1mm.nii.gz} + 3 + ${ITK_TEST_OUTPUT_DIR}/corterode_3.nii.gz +) + +itk_add_test( + NAME itkLabelErodeTest3D_big + COMMAND + LabelErodeDilateTestDriver + --compare + DATA{Baseline/holeerode_41.nii.gz} + ${ITK_TEST_OUTPUT_DIR}/holeerode_41.nii.gz + itkLabelSetErodeTest + DATA{Input/hole.nii.gz} + 41 + ${ITK_TEST_OUTPUT_DIR}/holeerode_41.nii.gz +) diff --git a/Modules/Filtering/LabelErodeDilate/wrapping/CMakeLists.txt b/Modules/Filtering/LabelErodeDilate/wrapping/CMakeLists.txt index 88e5b7b64f2..297722e3ceb 100644 --- a/Modules/Filtering/LabelErodeDilate/wrapping/CMakeLists.txt +++ b/Modules/Filtering/LabelErodeDilate/wrapping/CMakeLists.txt @@ -1,9 +1,11 @@ itk_wrap_module(LabelErodeDilate) -set(WRAPPER_SUBMODULE_ORDER - itkLabelSetDilateImageFilter - itkLabelSetErodeImageFilter - itkLabelSetMorphBaseImageFilter) +set( + WRAPPER_SUBMODULE_ORDER + itkLabelSetDilateImageFilter + itkLabelSetErodeImageFilter + itkLabelSetMorphBaseImageFilter +) itk_auto_load_submodules() itk_end_wrap_module()