From cb16434fd1795c0b5e1aa5d69d57b09c2b15bf25 Mon Sep 17 00:00:00 2001 From: "gaetan.lehmann" Date: Wed, 9 Nov 2005 23:27:16 +1100 Subject: [PATCH 001/165] COMP: add cmake files darcs-hash:20051109122716-2fc9d-acb27dbff3dc34f3fbd2fc8cb97a131115267015.gz --- .../ParabolicMorphology/CMakeLists.txt | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 Modules/Filtering/ParabolicMorphology/CMakeLists.txt diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt new file mode 100644 index 00000000000..0fed55dea4c --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -0,0 +1,48 @@ +#Change PROJECT_NAME to the name of your project +PROJECT(PROJECT_NAME) + +#include some macros from another file... +INCLUDE(${ CMAKE_SOURCE_DIR } / IJMacros.txt) + +#The following lines are required to use Dart +ENABLE_TESTING() +INCLUDE(Dart) + +#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 +#list packages here +) + +#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 +#list libraries here +) + +#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 +SET(CurrentExe "MyExe") +ADD_EXECUTABLE(${ CurrentExe } MyClass.h MyClass.cxx) +TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) + +#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) + +#Once you're done modifying this template, you should rename it to "CMakeLists.txt" From 6aae6e1dc5d153718ca8c0ce86c80bf62221aaa0 Mon Sep 17 00:00:00 2001 From: "gaetan.lehmann" Date: Thu, 10 Nov 2005 00:18:08 +1100 Subject: [PATCH 002/165] ENH: enhance default settings darcs-hash:20051109131808-2fc9d-bda793d1f6d093383391578ab1c9190a3dc5c433.gz --- .../Filtering/ParabolicMorphology/CMakeLists.txt | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 0fed55dea4c..d653008a2a8 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -2,7 +2,7 @@ PROJECT(PROJECT_NAME) #include some macros from another file... -INCLUDE(${ CMAKE_SOURCE_DIR } / IJMacros.txt) +INCLUDE(IJMacros.txt) #The following lines are required to use Dart ENABLE_TESTING() @@ -12,9 +12,7 @@ INCLUDE(Dart) #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 -#list packages here -) +SET(Required_Packages) #this foreach loads all of the packages that you specified as required. #It shouldn't need to be modified. @@ -24,9 +22,7 @@ ENDFOREACH(Package) #Set any libraries that your project depends on. #examples : ITKCommon, VTKRendering, etc -SET(Libraries -#list libraries here -) +SET(Libraries ITKCommon) #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. @@ -44,5 +40,4 @@ TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) #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) - -#Once you're done modifying this template, you should rename it to "CMakeLists.txt" +ADD_TEST(CompareImage ImageCompare ${ CMAKE_SOURCE_DIR } / img1.png ${ CMAKE_SOURCE_DIR } / img1.png.base.png) From 83c42f0f38fba3610bb425daf2b5ebaaee725aad Mon Sep 17 00:00:00 2001 From: "gaetan.lehmann" Date: Thu, 10 Nov 2005 00:20:11 +1100 Subject: [PATCH 003/165] ENH: add ITK as default package darcs-hash:20051109132011-2fc9d-7679cc77ecd65e27e5cf37066d1d752b81a40161.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index d653008a2a8..27f03969d98 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -12,7 +12,7 @@ INCLUDE(Dart) #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) +SET(Required_Packages ITK) #this foreach loads all of the packages that you specified as required. #It shouldn't need to be modified. From 5abd96b8a8117dac988c244a7a13dab06f2850c4 Mon Sep 17 00:00:00 2001 From: "gaetan.lehmann" Date: Thu, 10 Nov 2005 00:22:33 +1100 Subject: [PATCH 004/165] ENH: more default libraires darcs-hash:20051109132233-2fc9d-315108934bf2954cd94e927ca46159eff911f492.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 27f03969d98..1df450fb3eb 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -22,7 +22,7 @@ ENDFOREACH(Package) #Set any libraries that your project depends on. #examples : ITKCommon, VTKRendering, etc -SET(Libraries ITKCommon) +SET(Libraries ITKCommon ITKBasicFilters ITKIO) #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. From f8afc418bfadee22fd0c2e6e314143557f2c730e Mon Sep 17 00:00:00 2001 From: "gaetan.lehmann" Date: Thu, 10 Nov 2005 07:24:01 +1100 Subject: [PATCH 005/165] COMP: enhance template CMakeLists.txt file darcs-hash:20051109202401-2fc9d-20efe8d390feba8f9cb800a162639e5138f81042.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 1df450fb3eb..75fc9ec3f60 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -1,5 +1,5 @@ #Change PROJECT_NAME to the name of your project -PROJECT(PROJECT_NAME) +PROJECT() #include some macros from another file... INCLUDE(IJMacros.txt) @@ -39,5 +39,7 @@ TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) #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(CompareImage ImageCompare ${ CMAKE_SOURCE_DIR } / img1.png ${ CMAKE_SOURCE_DIR } / img1.png.base.png) +#ADD_TEST(Testname ExecutableToRun arg1 arg2 arg3) + +ADD_TEST(${ CMAKE_SOURCE_DIR } /.png out.png) +ADD_TEST(CompareImage ImageCompare out.png ${ CMAKE_SOURCE_DIR } /.png) From be2dd77a6ccafbc1eaa2a7e99d4bf4d1b5737d90 Mon Sep 17 00:00:00 2001 From: "gaetan.lehmann" Date: Thu, 10 Nov 2005 07:30:41 +1100 Subject: [PATCH 006/165] COMP: enhance template CMakeLists.txt file darcs-hash:20051109203041-2fc9d-f48fd76e0608a3b1cb403c37f4bf5ae2cc602046.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 75fc9ec3f60..45c696a2539 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -29,8 +29,8 @@ SET(Libraries ITKCommon ITKBasicFilters ITKIO) #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 -SET(CurrentExe "MyExe") -ADD_EXECUTABLE(${ CurrentExe } MyClass.h MyClass.cxx) +SET(CurrentExe "") +ADD_EXECUTABLE(${ CurrentExe } test.cxx) TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) #the following line is an example of how to add a test to your project. @@ -41,5 +41,5 @@ TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) #any tests you can comment out or delete the following line. #ADD_TEST(Testname ExecutableToRun arg1 arg2 arg3) -ADD_TEST(${ CMAKE_SOURCE_DIR } /.png out.png) -ADD_TEST(CompareImage ImageCompare out.png ${ CMAKE_SOURCE_DIR } /.png) +ADD_TEST(${ CurrentExe } ${ CMAKE_SOURCE_DIR } /.png out.png) +ADD_TEST(CompareImage ImageCompare out.png ${ CMAKE_SOURCE_DIR } / ${ CurrentExe }.png) From 07b994f9b09a53d6aeb9a49add34ee5612f66bfb Mon Sep 17 00:00:00 2001 From: "gaetan.lehmann" Date: Thu, 10 Nov 2005 07:32:42 +1100 Subject: [PATCH 007/165] COMP: enhance template CMakeLists.txt file darcs-hash:20051109203242-2fc9d-483e94e9f2c525b9158fbc5536df82c13e5f68ac.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 45c696a2539..e4666b0f44c 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -41,5 +41,5 @@ TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) #any tests you can comment out or delete the following line. #ADD_TEST(Testname ExecutableToRun arg1 arg2 arg3) -ADD_TEST(${ CurrentExe } ${ CMAKE_SOURCE_DIR } /.png out.png) +ADD_TEST(Run ${ CurrentExe } ${ CMAKE_SOURCE_DIR } /.png out.png) ADD_TEST(CompareImage ImageCompare out.png ${ CMAKE_SOURCE_DIR } / ${ CurrentExe }.png) From 6a5a02ae2985e3a7856460d1c5cd805ecdbe2a55 Mon Sep 17 00:00:00 2001 From: "gaetan.lehmann" Date: Thu, 10 Nov 2005 07:36:54 +1100 Subject: [PATCH 008/165] COMP: enhance template CMakeLists.txt file darcs-hash:20051109203654-2fc9d-c1a55843ff51b11e66c479d4448f5adf4c9c0174.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index e4666b0f44c..12144594a4f 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -1,6 +1,9 @@ #Change PROJECT_NAME to the name of your project PROJECT() +#set the name of the input image used to run the test +SET(INPUT_IMAGE "") + #include some macros from another file... INCLUDE(IJMacros.txt) @@ -29,9 +32,8 @@ SET(Libraries ITKCommon ITKBasicFilters ITKIO) #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 -SET(CurrentExe "") -ADD_EXECUTABLE(${ CurrentExe } test.cxx) -TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) +ADD_EXECUTABLE(test test.cxx) +TARGET_LINK_LIBRARIES(test ${ Libraries }) #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 @@ -41,5 +43,5 @@ TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) #any tests you can comment out or delete the following line. #ADD_TEST(Testname ExecutableToRun arg1 arg2 arg3) -ADD_TEST(Run ${ CurrentExe } ${ CMAKE_SOURCE_DIR } /.png out.png) -ADD_TEST(CompareImage ImageCompare out.png ${ CMAKE_SOURCE_DIR } / ${ CurrentExe }.png) +ADD_TEST(Run test ${ CMAKE_SOURCE_DIR } / ${ INPUT_IMAGE } out.png) +ADD_TEST(CompareImage ImageCompare out.png ${ CMAKE_SOURCE_DIR } / test.png) From 6bc345a46f50977b9fbb2e22f3a7a87e1287cce0 Mon Sep 17 00:00:00 2001 From: "gaetan.lehmann" Date: Mon, 21 Nov 2005 21:26:04 +1100 Subject: [PATCH 009/165] COMP: rename test to check to avoid make warnings darcs-hash:20051121102604-2fc9d-e7d217544f07bdc56d59a97b12447138bbe63367.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 12144594a4f..a39785e28e6 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -32,8 +32,8 @@ SET(Libraries ITKCommon ITKBasicFilters ITKIO) #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 -ADD_EXECUTABLE(test test.cxx) -TARGET_LINK_LIBRARIES(test ${ Libraries }) +ADD_EXECUTABLE(check check.cxx) +TARGET_LINK_LIBRARIES(check ${ Libraries }) #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 @@ -43,5 +43,5 @@ TARGET_LINK_LIBRARIES(test ${ Libraries }) #any tests you can comment out or delete the following line. #ADD_TEST(Testname ExecutableToRun arg1 arg2 arg3) -ADD_TEST(Run test ${ CMAKE_SOURCE_DIR } / ${ INPUT_IMAGE } out.png) +ADD_TEST(Run check ${ CMAKE_SOURCE_DIR } / ${ INPUT_IMAGE } out.png) ADD_TEST(CompareImage ImageCompare out.png ${ CMAKE_SOURCE_DIR } / test.png) From 019d432a824a32f557a47bd4c838282fa08f1189 Mon Sep 17 00:00:00 2001 From: "gaetan.lehmann" Date: Fri, 30 Dec 2005 04:29:25 +1100 Subject: [PATCH 010/165] ENH: set cthead1.png and default test.png location to images dir darcs-hash:20051229172925-2fc9d-e44c67bb82cf94aed7d4aa50f252771ba352994c.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index a39785e28e6..64d87c3dde3 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -2,7 +2,7 @@ PROJECT() #set the name of the input image used to run the test -SET(INPUT_IMAGE "") +SET(INPUT_IMAGE ${ CMAKE_SOURCE_DIR } / images / cthead1.png) #include some macros from another file... INCLUDE(IJMacros.txt) @@ -43,5 +43,5 @@ TARGET_LINK_LIBRARIES(check ${ Libraries }) #any tests you can comment out or delete the following line. #ADD_TEST(Testname ExecutableToRun arg1 arg2 arg3) -ADD_TEST(Run check ${ CMAKE_SOURCE_DIR } / ${ INPUT_IMAGE } out.png) -ADD_TEST(CompareImage ImageCompare out.png ${ CMAKE_SOURCE_DIR } / test.png) +ADD_TEST(Run check ${ INPUT_IMAGE } out.png) +ADD_TEST(CompareImage ImageCompare out.png ${ CMAKE_SOURCE_DIR } / images / test.png) From 3f9e3e7df1a6936a0a8a17c616bdac110e48ef4d Mon Sep 17 00:00:00 2001 From: "gaetan.lehmann" Date: Fri, 30 Dec 2005 04:31:59 +1100 Subject: [PATCH 011/165] ENH: find ImageCompare with the FIND_PROGRAM macro darcs-hash:20051229173159-2fc9d-ad652881b1c2926f6b88b19d37043e6bcb8b15e2.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 64d87c3dde3..eadeec3ee5b 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -10,6 +10,7 @@ INCLUDE(IJMacros.txt) #The following lines are required to use Dart ENABLE_TESTING() INCLUDE(Dart) +FIND_PROGRAM(IMAGE_COMPARE ImageCompare) #Declare any external dependencies that your project may have here. #examples include : ITK, VTK, JPEG, PNG, OpenGL, ZLIB, Perl, Java @@ -44,4 +45,4 @@ TARGET_LINK_LIBRARIES(check ${ Libraries }) #ADD_TEST(Testname ExecutableToRun arg1 arg2 arg3) ADD_TEST(Run check ${ INPUT_IMAGE } out.png) -ADD_TEST(CompareImage ImageCompare out.png ${ CMAKE_SOURCE_DIR } / images / test.png) +ADD_TEST(CompareImage ${ IMAGE_COMPARE } out.png ${ CMAKE_SOURCE_DIR } / images / test.png) From b2179e79be0dce2fe7491d3b383c8453e4803911 Mon Sep 17 00:00:00 2001 From: "gaetan.lehmann" Date: Thu, 19 Jan 2006 02:51:57 +1100 Subject: [PATCH 012/165] ENH: make binary creation easier darcs-hash:20060118155157-2fc9d-7c0bf62f4b97729564aaaa6315de7e025b0dff6d.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index eadeec3ee5b..435e45c3afb 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -33,8 +33,10 @@ SET(Libraries ITKCommon ITKBasicFilters ITKIO) #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 -ADD_EXECUTABLE(check check.cxx) -TARGET_LINK_LIBRARIES(check ${ Libraries }) + +SET(CurrentExe "check") +ADD_EXECUTABLE(${ CurrentExe } ${ CurrentExe }.cxx) +TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) #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 From 420ea31adca9f19dc8cf5ac939fef20a59f38e99 Mon Sep 17 00:00:00 2001 From: "gaetan.lehmann" Date: Mon, 30 Jan 2006 22:40:01 +1100 Subject: [PATCH 013/165] ENH: add wrappers support darcs-hash:20060130114001-2fc9d-4284e491de9dc2e195efdf3c34857f2b1c3ea7f5.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 435e45c3afb..8d0c28becc3 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -28,6 +28,13 @@ ENDFOREACH(Package) #examples : ITKCommon, VTKRendering, etc SET(Libraries ITKCommon ITKBasicFilters ITKIO) +#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 From 5b549e64c48e93844a3781155cecc460684f8846 Mon Sep 17 00:00:00 2001 From: "gaetan.lehmann" Date: Mon, 30 Jan 2006 22:42:52 +1100 Subject: [PATCH 014/165] ENH: install devel files darcs-hash:20060130114252-2fc9d-616afd60eac3ecb7f4bca7e62b977cef636c8d64.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 8d0c28becc3..29d30df674a 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -28,6 +28,14 @@ ENDFOREACH(Package) #examples : ITKCommon, VTKRendering, etc SET(Libraries ITKCommon ITKBasicFilters ITKIO) + +#install devel files +FILE(GLOB develFiles *.h *.txx) +FOREACH(f ${ develFiles }) +INSTALL_FILES(/ include / InsightToolkit / BasicFilters FILES ${ f }) +ENDFOREACH(f) + + #option for wrapping OPTION(BUILD_WRAPPERS "Wrap library" OFF) IF(BUILD_WRAPPERS) From 741a8454505ddc7a2f5d31fa7e0501c3db3227b8 Mon Sep 17 00:00:00 2001 From: "gaetan.lehmann" Date: Tue, 14 Mar 2006 08:10:01 +1100 Subject: [PATCH 015/165] COMP: build test program only if asked by the user darcs-hash:20060313211001-2fc9d-c274c1221639324944b9181033327abc4a26d46e.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 29d30df674a..f7fcff03fed 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -49,10 +49,14 @@ ENDIF(BUILD_WRAPPERS) #be linked to all the libraries you specified above. #You can build more than one executable per project +IF(BUILD_TESTING) + SET(CurrentExe "check") ADD_EXECUTABLE(${ CurrentExe } ${ CurrentExe }.cxx) TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) +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 From f0705152a2cd5e79a069ee93b868fda33ec4a1bf Mon Sep 17 00:00:00 2001 From: "gaetan.lehmann" Date: Tue, 14 Mar 2006 08:18:41 +1100 Subject: [PATCH 016/165] ENH: install devel files only if requested by the user darcs-hash:20060313211841-2fc9d-f3f644c13719c470df5ced82474f783a6338a257.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index f7fcff03fed..b2072f566d8 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -30,10 +30,13 @@ SET(Libraries ITKCommon ITKBasicFilters ITKIO) #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 From 53ff1cb7c2240d50ed9cf05c5c5181362fc65016 Mon Sep 17 00:00:00 2001 From: richardb Date: Tue, 16 Oct 2007 12:33:13 +1000 Subject: [PATCH 017/165] ENH: Repository bootstrap darcs-hash:20071016023313-fafb9-6b618b217687b06e15d28c95a57841e1b6fe313d.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index b2072f566d8..dc71bdd11c8 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -1,5 +1,5 @@ #Change PROJECT_NAME to the name of your project -PROJECT() +PROJECT(parabolicMorpholgy) #set the name of the input image used to run the test SET(INPUT_IMAGE ${ CMAKE_SOURCE_DIR } / images / cthead1.png) From f11e8ac21211f93e6fe167d0a92805fd540de858 Mon Sep 17 00:00:00 2001 From: richardb Date: Thu, 18 Oct 2007 12:23:19 +1000 Subject: [PATCH 018/165] ENH: working opening filter with padding darcs-hash:20071018022319-fafb9-6ba31a630281c4f507ab1641154b5cc34b6615c7.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index dc71bdd11c8..d322d6166c9 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -54,9 +54,11 @@ ENDIF(BUILD_WRAPPERS) IF(BUILD_TESTING) -SET(CurrentExe "check") +FOREACH(CurrentExe "check" + "testOpen") ADD_EXECUTABLE(${ CurrentExe } ${ CurrentExe }.cxx) TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) +ENDFOREACH(CurrentExe) ENDIF(BUILD_TESTING) From 53a6933146b82fe7ff0751857ffbfa8b0bf5dad0 Mon Sep 17 00:00:00 2001 From: "gaetan.lehmann" Date: Wed, 28 Feb 2007 01:37:16 +1100 Subject: [PATCH 019/165] ENH: use itkTestDriver to run the tests darcs-hash:20070227143716-2fc9d-0e4eaae030f1fb2523fdd328975b536b53a0f9d0.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index d322d6166c9..b231e18d3e3 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -10,7 +10,8 @@ INCLUDE(IJMacros.txt) #The following lines are required to use Dart ENABLE_TESTING() INCLUDE(Dart) -FIND_PROGRAM(IMAGE_COMPARE ImageCompare) +FIND_PROGRAM(ITK_TEST_DRIVER itkTestDriver) +SET(TEST_COMMAND $ { ITK_TEST_DRIVER } --add - before - env PATH ${ CMAKE_BINARY_DIR }) #Declare any external dependencies that your project may have here. #examples include : ITK, VTK, JPEG, PNG, OpenGL, ZLIB, Perl, Java @@ -70,5 +71,5 @@ ENDIF(BUILD_TESTING) #any tests you can comment out or delete the following line. #ADD_TEST(Testname ExecutableToRun arg1 arg2 arg3) -ADD_TEST(Run check ${ INPUT_IMAGE } out.png) -ADD_TEST(CompareImage ${ IMAGE_COMPARE } out.png ${ CMAKE_SOURCE_DIR } / images / test.png) +ADD_TEST(Test ${ TEST_COMMAND } check ${ INPUT_IMAGE } out.png-- compare out.png ${ CMAKE_SOURCE_DIR } / images / + test.png) From 834a8495d2f5f6ec7551778e21514f1361b4e371 Mon Sep 17 00:00:00 2001 From: "gaetan.lehmann" Date: Thu, 19 Jul 2007 22:40:51 +1000 Subject: [PATCH 020/165] ENH: make the project work as a subproject darcs-hash:20070719124051-2fc9d-2ed957c0a30670f0a25f35130893bfcee76a93e0.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index b231e18d3e3..4301cd95c54 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -2,7 +2,7 @@ PROJECT(parabolicMorpholgy) #set the name of the input image used to run the test -SET(INPUT_IMAGE ${ CMAKE_SOURCE_DIR } / images / cthead1.png) +SET(INPUT_IMAGE ${ CMAKE_CURRENT_SOURCE_DIR } / images / cthead1.png) #include some macros from another file... INCLUDE(IJMacros.txt) @@ -11,7 +11,7 @@ INCLUDE(IJMacros.txt) ENABLE_TESTING() INCLUDE(Dart) FIND_PROGRAM(ITK_TEST_DRIVER itkTestDriver) -SET(TEST_COMMAND $ { ITK_TEST_DRIVER } --add - before - env PATH ${ CMAKE_BINARY_DIR }) +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 @@ -71,5 +71,5 @@ ENDIF(BUILD_TESTING) #any tests you can comment out or delete the following line. #ADD_TEST(Testname ExecutableToRun arg1 arg2 arg3) -ADD_TEST(Test ${ TEST_COMMAND } check ${ INPUT_IMAGE } out.png-- compare out.png ${ CMAKE_SOURCE_DIR } / images / - test.png) +ADD_TEST(Test ${ TEST_COMMAND } check ${ INPUT_IMAGE } out.png-- compare out.png ${ CMAKE_CURRENT_SOURCE_DIR } / + images / test.png) From df5b110f1b7a2625285a1c997d2ee982c86f5c0e Mon Sep 17 00:00:00 2001 From: "gaetan.lehmann" Date: Sat, 20 Oct 2007 06:27:37 +1000 Subject: [PATCH 021/165] ENH: add tests darcs-hash:20071019202737-2fc9d-cf809ce7b480aec8389644b5dedc1e276b43918f.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 4301cd95c54..66f4a8d3370 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -73,3 +73,6 @@ ENDIF(BUILD_TESTING) ADD_TEST(Test ${ TEST_COMMAND } check ${ INPUT_IMAGE } out.png-- compare out.png ${ CMAKE_CURRENT_SOURCE_DIR } / images / test.png) + +ADD_TEST(Open ${ TEST_COMMAND } testOpen ${ INPUT_IMAGE } open.png-- compare open.png ${ CMAKE_CURRENT_SOURCE_DIR } / + images / open.png) From d47d760021d34b9e10bcc89c1014d18c8bc18809 Mon Sep 17 00:00:00 2001 From: richardb Date: Thu, 15 Nov 2007 11:56:18 +1100 Subject: [PATCH 022/165] ENH: added test of image spacing based scales darcs-hash:20071115005618-fafb9-849f9d3c4e6fa1f4d3e373578428b24fdff3b284.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 66f4a8d3370..1c05d29685d 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -56,7 +56,8 @@ ENDIF(BUILD_WRAPPERS) IF(BUILD_TESTING) FOREACH(CurrentExe "check" - "testOpen") + "testOpen" + "testSpacing") ADD_EXECUTABLE(${ CurrentExe } ${ CurrentExe }.cxx) TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) ENDFOREACH(CurrentExe) @@ -76,3 +77,4 @@ ADD_TEST(Test ${ TEST_COMMAND } check ${ INPUT_IMAGE } out.png-- compare out.png ADD_TEST(Open ${ TEST_COMMAND } testOpen ${ INPUT_IMAGE } open.png-- compare open.png ${ CMAKE_CURRENT_SOURCE_DIR } / images / open.png) +ADD_TEST(Spacing ${ TEST_COMMAND } testSpacing ${ INPUT_IMAGE } o1.png o2.png-- compare o1.png o2.png) From 6697cbca14885f411c1c4afb0092939220862c04 Mon Sep 17 00:00:00 2001 From: richardb Date: Mon, 10 Dec 2007 14:22:55 +1100 Subject: [PATCH 023/165] ENH: working towards sharpening filter darcs-hash:20071210032255-fafb9-bf67e0e1f84bf6970b2c24cf0d08e61d963b9f83.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 1c05d29685d..4a2350db22e 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -57,7 +57,8 @@ IF(BUILD_TESTING) FOREACH(CurrentExe "check" "testOpen" - "testSpacing") + "testSpacing" + "testSharpen") ADD_EXECUTABLE(${ CurrentExe } ${ CurrentExe }.cxx) TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) ENDFOREACH(CurrentExe) From d91f483a06e98e5242b59c471842e8908d9b1707 Mon Sep 17 00:00:00 2001 From: richardb Date: Tue, 1 Jan 2008 21:46:33 +1100 Subject: [PATCH 024/165] ENH: Basic sharpening operational darcs-hash:20080101104633-fafb9-07162096bea8fb67cb98a94c45d36d197db59177.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 4a2350db22e..f7a0f308d8a 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -79,3 +79,9 @@ ADD_TEST(Test ${ TEST_COMMAND } check ${ INPUT_IMAGE } out.png-- compare out.png ADD_TEST(Open ${ TEST_COMMAND } testOpen ${ INPUT_IMAGE } open.png-- compare open.png ${ CMAKE_CURRENT_SOURCE_DIR } / images / open.png) ADD_TEST(Spacing ${ TEST_COMMAND } testSpacing ${ INPUT_IMAGE } o1.png o2.png-- compare o1.png o2.png) + +ADD_TEST(Sharpen1 ${ TEST_COMMAND } testSharpen 1 sharp1.mha) + +ADD_TEST(Sharpen2 ${ TEST_COMMAND } testSharpen 2 sharp2.mha) + +ADD_TEST(Sharpen3 ${ TEST_COMMAND } testSharpen 3 sharp3.mha) From e600b0120b6f84534f134eb0c55d702143123372 Mon Sep 17 00:00:00 2001 From: richardb Date: Thu, 3 Jan 2008 22:22:16 +1100 Subject: [PATCH 025/165] ENH: Sharpening filter included in article darcs-hash:20080103112216-fafb9-30dda179bfd5313bd05a6fff8d662c3ceaac11c6.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index f7a0f308d8a..b62297cb7b7 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -80,8 +80,10 @@ ADD_TEST(Open ${ TEST_COMMAND } testOpen ${ INPUT_IMAGE } open.png-- compare ope images / open.png) ADD_TEST(Spacing ${ TEST_COMMAND } testSpacing ${ INPUT_IMAGE } o1.png o2.png-- compare o1.png o2.png) -ADD_TEST(Sharpen1 ${ TEST_COMMAND } testSharpen 1 sharp1.mha) +ADD_TEST(Sharpen1 ${ TEST_COMMAND } testSharpen 1 sharp1.mha sharp1.txt) -ADD_TEST(Sharpen2 ${ TEST_COMMAND } testSharpen 2 sharp2.mha) +ADD_TEST(Sharpen2 ${ TEST_COMMAND } testSharpen 2 sharp2.mha sharp2.txt) -ADD_TEST(Sharpen3 ${ TEST_COMMAND } testSharpen 3 sharp3.mha) +ADD_TEST(Sharpen3 ${ TEST_COMMAND } testSharpen 3 sharp3.mha sharp3.txt) +ADD_TEST(Sharpen10 ${ TEST_COMMAND } testSharpen 10 sharp10.mha sharp10.txt) +ADD_TEST(Sharpen100 ${ TEST_COMMAND } testSharpen 100 sharp100.mha sharp100.txt) From 4066f925458ca8aa8c38e316f1f3715569a20e49 Mon Sep 17 00:00:00 2001 From: richardb Date: Sat, 5 Jan 2008 21:25:49 +1100 Subject: [PATCH 026/165] ENH: working distance transform darcs-hash:20080105102549-fafb9-d53a3a204e68c8f3c99c05d8e33b2c5c122baf01.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index b62297cb7b7..2c8c287af37 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -58,7 +58,8 @@ IF(BUILD_TESTING) FOREACH(CurrentExe "check" "testOpen" "testSpacing" - "testSharpen") + "testSharpen" + "testDT") ADD_EXECUTABLE(${ CurrentExe } ${ CurrentExe }.cxx) TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) ENDFOREACH(CurrentExe) @@ -87,3 +88,7 @@ ADD_TEST(Sharpen2 ${ TEST_COMMAND } testSharpen 2 sharp2.mha sharp2.txt) ADD_TEST(Sharpen3 ${ TEST_COMMAND } testSharpen 3 sharp3.mha sharp3.txt) ADD_TEST(Sharpen10 ${ TEST_COMMAND } testSharpen 10 sharp10.mha sharp10.txt) ADD_TEST(Sharpen100 ${ TEST_COMMAND } testSharpen 100 sharp100.mha sharp100.txt) + +ADD_TEST(Dist1 ${ TEST_COMMAND } testDT $ { INPUT_IMAGE } 100 0 mask.png dist1.mha) + +ADD_TEST(Dist2 ${ TEST_COMMAND } testDT $ { INPUT_IMAGE } 100 255 mask.png dist2.mha) From dee5827f2acf641d33d54ca894aaa2bfb31ba7a3 Mon Sep 17 00:00:00 2001 From: richardb Date: Mon, 18 Feb 2008 10:02:21 +1100 Subject: [PATCH 027/165] ENH: Progress meter added darcs-hash:20080217230221-fafb9-e2bc1ff1bd782df5479bbee817d0b36e8f8c2a3f.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 2c8c287af37..ea0efb31cea 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -27,7 +27,7 @@ ENDFOREACH(Package) #Set any libraries that your project depends on. #examples : ITKCommon, VTKRendering, etc -SET(Libraries ITKCommon ITKBasicFilters ITKIO) +SET(Libraries ITKCommon ITKBasicFilters ITKIO ITKAlgorithms) #install devel files From fcfc5fe24aae1eea4a44d2022fe7ca752db56060 Mon Sep 17 00:00:00 2001 From: richardb Date: Mon, 18 Feb 2008 13:33:15 +1100 Subject: [PATCH 028/165] ENH: Completed signed distnace transform timing darcs-hash:20080218023315-fafb9-5905d42ee6dfe0d77e3253408d57187c32bff033.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index ea0efb31cea..38ef6e53eca 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -59,7 +59,8 @@ FOREACH(CurrentExe "check" "testOpen" "testSpacing" "testSharpen" - "testDT") + "testDT" + "perfDT") ADD_EXECUTABLE(${ CurrentExe } ${ CurrentExe }.cxx) TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) ENDFOREACH(CurrentExe) From 6aed59682a05d887489e482ed1f159c8d8deb23e Mon Sep 17 00:00:00 2001 From: richardb Date: Mon, 18 Feb 2008 16:26:34 +1100 Subject: [PATCH 029/165] BUG: Fixed voxel dimension weighting problems in DT darcs-hash:20080218052634-fafb9-831283dc79fe86a5384589dce479c608d155d76c.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 38ef6e53eca..62ee10e5d30 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -60,7 +60,8 @@ FOREACH(CurrentExe "check" "testSpacing" "testSharpen" "testDT" - "perfDT") + "perfDT" + "mkSpot") ADD_EXECUTABLE(${ CurrentExe } ${ CurrentExe }.cxx) TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) ENDFOREACH(CurrentExe) @@ -93,3 +94,7 @@ ADD_TEST(Sharpen100 ${ TEST_COMMAND } testSharpen 100 sharp100.mha sharp100.txt) ADD_TEST(Dist1 ${ TEST_COMMAND } testDT $ { INPUT_IMAGE } 100 0 mask.png dist1.mha) ADD_TEST(Dist2 ${ TEST_COMMAND } testDT $ { INPUT_IMAGE } 100 255 mask.png dist2.mha) + +ADD_TEST(Perf ${ TEST_COMMAND } perfDT $ { + INPUT_IMAGE +} 100 255 mask.png dist3.mha dist4.mha-- compare dist3.mha dist4.mha) From 41d20a8d958bc182fdc78258621c6e258f2cec0f Mon Sep 17 00:00:00 2001 From: richardb Date: Sun, 7 Sep 2008 09:02:17 +1000 Subject: [PATCH 030/165] PERF: Added 3D performance figures darcs-hash:20080906230217-fafb9-e43a83bcd898a382866783bb189664a36b1f035d.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 62ee10e5d30..d32998b5b73 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -61,6 +61,7 @@ FOREACH(CurrentExe "check" "testSharpen" "testDT" "perfDT" + "perfDT3D" "mkSpot") ADD_EXECUTABLE(${ CurrentExe } ${ CurrentExe }.cxx) TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) From 45eb705865edf7f234c5a39dad54e60ff817c016 Mon Sep 17 00:00:00 2001 From: richardb Date: Tue, 9 Sep 2008 20:08:16 +1000 Subject: [PATCH 031/165] ENH: added test 3d image darcs-hash:20080909100816-fafb9-e4531c9c765650085e2fb8381943fcb8f133a90c.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index d32998b5b73..4a3bd1722f7 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -3,6 +3,7 @@ PROJECT(parabolicMorpholgy) #set the name of the input image used to run the test SET(INPUT_IMAGE ${ CMAKE_CURRENT_SOURCE_DIR } / images / cthead1.png) +SET(INPUT_IMAGE3D ${ CMAKE_CURRENT_SOURCE_DIR } / images / bunnyPadded.nrrd) #include some macros from another file... INCLUDE(IJMacros.txt) @@ -99,3 +100,5 @@ ADD_TEST(Dist2 ${ TEST_COMMAND } testDT $ { INPUT_IMAGE } 100 255 mask.png dist2 ADD_TEST(Perf ${ TEST_COMMAND } perfDT $ { INPUT_IMAGE } 100 255 mask.png dist3.mha dist4.mha-- compare dist3.mha dist4.mha) + +ADD_TEST(Perf3D ${ TEST_COMMAND } perfDT3D $ { INPUT_IMAGE3D } 100 255 bmask.nii.gz distA.nii.gz distB.nii.gz) From 9558f86d4939ba288fdf1b7b4b2b98f37bd079ca Mon Sep 17 00:00:00 2001 From: richardb Date: Mon, 15 Dec 2008 21:56:39 +1100 Subject: [PATCH 032/165] ENH: Changed iterator to be without index darcs-hash:20081215105639-fafb9-a0f40e747b5569ef4b36ffbeb2d2dc7cf85b0d4b.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 4a3bd1722f7..84773a3fbc0 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -8,6 +8,8 @@ SET(INPUT_IMAGE3D ${ CMAKE_CURRENT_SOURCE_DIR } / images / bunnyPadded.nrrd) #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) @@ -99,6 +101,8 @@ ADD_TEST(Dist2 ${ TEST_COMMAND } testDT $ { INPUT_IMAGE } 100 255 mask.png dist2 ADD_TEST(Perf ${ TEST_COMMAND } perfDT $ { INPUT_IMAGE -} 100 255 mask.png dist3.mha dist4.mha-- compare dist3.mha dist4.mha) +} 100 255 mask.png dist3.mha dist4.mha dist5.mha-- compare dist3.mha dist4.mha) -ADD_TEST(Perf3D ${ TEST_COMMAND } perfDT3D $ { INPUT_IMAGE3D } 100 255 bmask.nii.gz distA.nii.gz distB.nii.gz) +ADD_TEST(Perf3D ${ TEST_COMMAND } perfDT3D $ { + INPUT_IMAGE3D +} 100 255 bmask.nii.gz distA.nii.gz distB.nii.gz distC.nii.gz) From e9885f08365975f271f9ff0416f6ea58cd37c704 Mon Sep 17 00:00:00 2001 From: richardb Date: Fri, 17 Jul 2009 16:09:55 +1000 Subject: [PATCH 033/165] ENH: started binary erode filter darcs-hash:20090717060955-fafb9-12837b4eaeca891fb35170a26280529927aa7f06.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 84773a3fbc0..4446515385b 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -65,7 +65,8 @@ FOREACH(CurrentExe "check" "testDT" "perfDT" "perfDT3D" - "mkSpot") + "mkSpot" + "erodeBinary2D") ADD_EXECUTABLE(${ CurrentExe } ${ CurrentExe }.cxx) TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) ENDFOREACH(CurrentExe) From c435e27342b4a3e33255893b56205e97674a45fb Mon Sep 17 00:00:00 2001 From: richardb Date: Fri, 24 Jul 2009 14:22:18 +1000 Subject: [PATCH 034/165] ENH: working on binary erosion darcs-hash:20090724042218-fafb9-e7449a7a829803be8f4cf0da4613a6f76766df22.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 4446515385b..2b75349c405 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -66,7 +66,8 @@ FOREACH(CurrentExe "check" "perfDT" "perfDT3D" "mkSpot" - "erodeBinary2D") + "erodeBinary2D" + "testErodeBinary") ADD_EXECUTABLE(${ CurrentExe } ${ CurrentExe }.cxx) TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) ENDFOREACH(CurrentExe) From d5d799b6f680d93b9837b07c83c53d0e510dc764 Mon Sep 17 00:00:00 2001 From: richardb Date: Wed, 12 Aug 2009 20:03:51 +1000 Subject: [PATCH 035/165] ENH: added binary dilate Ignore-this: 174c4e99fc359fa8957b5168410412fe darcs-hash:20090812100351-fafb9-07236b1319536a5576125195f02cae812d216153.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 2b75349c405..0a4a1e19c10 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -67,7 +67,8 @@ FOREACH(CurrentExe "check" "perfDT3D" "mkSpot" "erodeBinary2D" - "testErodeBinary") + "testErodeBinary" + "testDilateBinary") ADD_EXECUTABLE(${ CurrentExe } ${ CurrentExe }.cxx) TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) ENDFOREACH(CurrentExe) From fe47c3e3a7245dd5545e5c85cefab64c64f907f0 Mon Sep 17 00:00:00 2001 From: richardb Date: Tue, 6 Apr 2010 13:22:09 +1000 Subject: [PATCH 036/165] ENH: added binary opening and closing darcs-hash:20100406032209-fafb9-de51f40e99ba4fa517102ebdbd5e73cf71253336.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 0a4a1e19c10..13da00151ef 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -68,7 +68,10 @@ FOREACH(CurrentExe "check" "mkSpot" "erodeBinary2D" "testErodeBinary" - "testDilateBinary") + "testDilateBinary" + "dilateBinary" + "testOpenBinary" + "testCloseBinary") ADD_EXECUTABLE(${ CurrentExe } ${ CurrentExe }.cxx) TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) ENDFOREACH(CurrentExe) From 3f78d0a2bff91e9852d65f20d45cffdacc5a18ed Mon Sep 17 00:00:00 2001 From: richardb Date: Fri, 9 Apr 2010 16:00:29 +1000 Subject: [PATCH 037/165] ENH: rle testing darcs-hash:20100409060029-fafb9-40d58b8901094acf5f31fd337ecf9b2d75e743e6.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 13da00151ef..6908ab4dbdc 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -69,9 +69,9 @@ FOREACH(CurrentExe "check" "erodeBinary2D" "testErodeBinary" "testDilateBinary" - "dilateBinary" "testOpenBinary" - "testCloseBinary") + "testCloseBinary" + "rleTests") ADD_EXECUTABLE(${ CurrentExe } ${ CurrentExe }.cxx) TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) ENDFOREACH(CurrentExe) From 5252718bee1716ab270f88fbad5b28127321bd60 Mon Sep 17 00:00:00 2001 From: richardb Date: Thu, 16 Sep 2010 08:54:19 +1000 Subject: [PATCH 038/165] COMP: added closing test and removed rle from cmake Ignore-this: 568f1685ada5a790aefb4c6542bf4c4c darcs-hash:20100915225419-fafb9-f3ee6370d546091baf32e932fd013d748e26d8b0.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 6908ab4dbdc..f011ab2a05c 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -60,6 +60,7 @@ IF(BUILD_TESTING) FOREACH(CurrentExe "check" "testOpen" + "testClose" "testSpacing" "testSharpen" "testDT" @@ -71,7 +72,7 @@ FOREACH(CurrentExe "check" "testDilateBinary" "testOpenBinary" "testCloseBinary" - "rleTests") + "dilateBinary") ADD_EXECUTABLE(${ CurrentExe } ${ CurrentExe }.cxx) TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) ENDFOREACH(CurrentExe) From 5dfe453d037fa74d881612bb0cdaecb110c552e3 Mon Sep 17 00:00:00 2001 From: richardb Date: Fri, 17 Sep 2010 08:39:29 +1000 Subject: [PATCH 039/165] ENH: consolidation Ignore-this: 33c5a3e292ce444571b35254b84ed2eb darcs-hash:20100916223929-fafb9-a3b3c879c5e31c9147b9b28c6d7724807a1bc287.gz --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index f011ab2a05c..697c135f61a 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -72,7 +72,7 @@ FOREACH(CurrentExe "check" "testDilateBinary" "testOpenBinary" "testCloseBinary" - "dilateBinary") + "dilateBinary3D") ADD_EXECUTABLE(${ CurrentExe } ${ CurrentExe }.cxx) TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) ENDFOREACH(CurrentExe) From 79a931365ddbf9f27c65c0f3ba0ec96973c41959 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 19 Jan 2012 13:04:16 +1100 Subject: [PATCH 040/165] ENH: Ensuring tests run prior to change of core algorithms --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 697c135f61a..4d109a4c7ff 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -30,8 +30,15 @@ ENDFOREACH(Package) #Set any libraries that your project depends on. #examples : ITKCommon, VTKRendering, etc -SET(Libraries ITKCommon ITKBasicFilters ITKIO ITKAlgorithms) - +#SET(Libraries +#ITKCommon +#ITKBasicFilters +#ITKIO +#ITKAlgorithms +#) + +#ITK4 version +SET(Libraries ${ ITK_LIBRARIES }) #install devel files OPTION(INSTALL_DEVEL_FILES "Install C++ headers" ON) From 5f61892202ad14d2ed625da1cc98afc3b6684717 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 29 Feb 2012 21:17:30 +1100 Subject: [PATCH 041/165] ENH: almost working version of intersection algorithm - still an edge effect difference --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 4d109a4c7ff..2136f55e99f 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -79,7 +79,9 @@ FOREACH(CurrentExe "check" "testDilateBinary" "testOpenBinary" "testCloseBinary" - "dilateBinary3D") + "dilateBinary3D" + "testErode" + "testDilate") ADD_EXECUTABLE(${ CurrentExe } ${ CurrentExe }.cxx) TARGET_LINK_LIBRARIES(${ CurrentExe } ${ Libraries }) ENDFOREACH(CurrentExe) @@ -97,8 +99,9 @@ ENDIF(BUILD_TESTING) ADD_TEST(Test ${ TEST_COMMAND } check ${ INPUT_IMAGE } out.png-- compare out.png ${ CMAKE_CURRENT_SOURCE_DIR } / images / test.png) -ADD_TEST(Open ${ TEST_COMMAND } testOpen ${ INPUT_IMAGE } open.png-- compare open.png ${ CMAKE_CURRENT_SOURCE_DIR } / - images / open.png) +ADD_TEST(Open ${ TEST_COMMAND } testOpen ${ INPUT_IMAGE } openCP.png openInt.png-- compare openCP.png ${ + CMAKE_CURRENT_SOURCE_DIR } / + images / open.png-- compare openCP.png openInt.png) ADD_TEST(Spacing ${ TEST_COMMAND } testSpacing ${ INPUT_IMAGE } o1.png o2.png-- compare o1.png o2.png) ADD_TEST(Sharpen1 ${ TEST_COMMAND } testSharpen 1 sharp1.mha sharp1.txt) From 5f22ff892920c2a901a0317776b31bfff83b47d8 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Fri, 2 Mar 2012 17:58:31 +1100 Subject: [PATCH 042/165] PERF: Intersection method passing tests - seems faster for DT --- .../ParabolicMorphology/CMakeLists.txt | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 2136f55e99f..078c07b9741 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -99,6 +99,29 @@ ENDIF(BUILD_TESTING) ADD_TEST(Test ${ TEST_COMMAND } check ${ INPUT_IMAGE } out.png-- compare out.png ${ CMAKE_CURRENT_SOURCE_DIR } / images / test.png) +#default scale - 1 +ADD_TEST(Erode2Da ${ TEST_COMMAND } testErode ${ + INPUT_IMAGE } outEInta.png outECPa.png-- compare outEInta.png outECPa.png) + +ADD_TEST(Dilate2Da ${ TEST_COMMAND } testDilate ${ + INPUT_IMAGE } outDInta.png outDCPa.png-- compare outDInta.png outDCPa.png) + +#small scale +ADD_TEST(Erode2Db ${ TEST_COMMAND } testErode ${ + INPUT_IMAGE } outEIntb.png outECPb.png 0.2 --compare outEIntb.png outECPb.png) + + +ADD_TEST(Dilate2Db ${ TEST_COMMAND } testDilate ${ + INPUT_IMAGE } outDIntb.png outDCPb.png 0.2 --compare outDIntb.png outDCPb.png) + + +#large scale +ADD_TEST(Erode2Dc ${ TEST_COMMAND } testErode ${ + INPUT_IMAGE } outEIntc.png outECPc.png 5.0 --compare outEIntc.png outECPc.png) + +ADD_TEST(Dilate2Dc ${ TEST_COMMAND } testDilate ${ + INPUT_IMAGE } outDIntc.png outDCPc.png 5.0 --compare outDIntc.png outDCPc.png) + ADD_TEST(Open ${ TEST_COMMAND } testOpen ${ INPUT_IMAGE } openCP.png openInt.png-- compare openCP.png ${ CMAKE_CURRENT_SOURCE_DIR } / images / open.png-- compare openCP.png openInt.png) From 86e94cb92fe57e47b7c121cd26b405e208cf5345 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Sun, 5 Apr 2015 21:07:55 +1000 Subject: [PATCH 043/165] ENH: Moved to subfolders --- .../ParabolicMorphology/test/check.cxx | 56 +++++++ .../test/dilateBinary3D.cxx | 56 +++++++ .../test/erodeBinary2D.cxx | 56 +++++++ .../ParabolicMorphology/test/mkSpot.cxx | 32 ++++ .../ParabolicMorphology/test/perfDT.cxx | 126 ++++++++++++++++ .../ParabolicMorphology/test/perfDT3D.cxx | 142 ++++++++++++++++++ .../ParabolicMorphology/test/rleTests.cxx | 135 +++++++++++++++++ .../ParabolicMorphology/test/testClose.cxx | 57 +++++++ .../test/testCloseBinary.cxx | 59 ++++++++ .../ParabolicMorphology/test/testDT.cxx | 59 ++++++++ .../ParabolicMorphology/test/testDilate.cxx | 62 ++++++++ .../test/testDilateBinary.cxx | 81 ++++++++++ .../test/testDistTrans.cxx | 67 +++++++++ .../ParabolicMorphology/test/testErode.cxx | 61 ++++++++ .../test/testErodeBinary.cxx | 81 ++++++++++ .../ParabolicMorphology/test/testOpen.cxx | 66 ++++++++ .../test/testOpenBinary.cxx | 59 ++++++++ .../ParabolicMorphology/test/testSharpen.cxx | 123 +++++++++++++++ .../ParabolicMorphology/test/testSpacing.cxx | 71 +++++++++ 19 files changed, 1449 insertions(+) create mode 100644 Modules/Filtering/ParabolicMorphology/test/check.cxx create mode 100644 Modules/Filtering/ParabolicMorphology/test/dilateBinary3D.cxx create mode 100644 Modules/Filtering/ParabolicMorphology/test/erodeBinary2D.cxx create mode 100644 Modules/Filtering/ParabolicMorphology/test/mkSpot.cxx create mode 100644 Modules/Filtering/ParabolicMorphology/test/perfDT.cxx create mode 100644 Modules/Filtering/ParabolicMorphology/test/perfDT3D.cxx create mode 100644 Modules/Filtering/ParabolicMorphology/test/rleTests.cxx create mode 100644 Modules/Filtering/ParabolicMorphology/test/testClose.cxx create mode 100644 Modules/Filtering/ParabolicMorphology/test/testCloseBinary.cxx create mode 100644 Modules/Filtering/ParabolicMorphology/test/testDT.cxx create mode 100644 Modules/Filtering/ParabolicMorphology/test/testDilate.cxx create mode 100644 Modules/Filtering/ParabolicMorphology/test/testDilateBinary.cxx create mode 100644 Modules/Filtering/ParabolicMorphology/test/testDistTrans.cxx create mode 100644 Modules/Filtering/ParabolicMorphology/test/testErode.cxx create mode 100644 Modules/Filtering/ParabolicMorphology/test/testErodeBinary.cxx create mode 100644 Modules/Filtering/ParabolicMorphology/test/testOpen.cxx create mode 100644 Modules/Filtering/ParabolicMorphology/test/testOpenBinary.cxx create mode 100644 Modules/Filtering/ParabolicMorphology/test/testSharpen.cxx create mode 100644 Modules/Filtering/ParabolicMorphology/test/testSpacing.cxx diff --git a/Modules/Filtering/ParabolicMorphology/test/check.cxx b/Modules/Filtering/ParabolicMorphology/test/check.cxx new file mode 100644 index 00000000000..f84b60fc7ae --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/check.cxx @@ -0,0 +1,56 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" + +#include "itkParabolicDilateImageFilter.h" +#include "itkParabolicErodeImageFilter.h" +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + + +int +main(int, char * argv[]) +{ + // itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + + typedef itk::ImageFileReader ReaderType; + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(argv[1]); + + typedef itk::ParabolicErodeImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + filter->SetInput(reader->GetOutput()); + + FilterType::RadiusType scale; + scale[0] = 1; + scale[1] = 0.5; + + // filter->SetParabolicAlgorithm(FilterType::CONTACTPOINT); + filter->SetScale(scale); + itk::TimeProbe NewTime; + filter->SetUseImageSpacing(true); + for (unsigned i = 0; i < 100; i++) + { + filter->Modified(); + NewTime.Start(); + filter->Update(); + NewTime.Stop(); + } + + typedef itk::ImageFileWriter WriterType; + WriterType::Pointer writer = WriterType::New(); + writer->SetInput(filter->GetOutput()); + writer->SetFileName(argv[2]); + writer->Update(); + std::cout << std::setprecision(3) << NewTime.GetMean() << std::endl; + + return 0; +} diff --git a/Modules/Filtering/ParabolicMorphology/test/dilateBinary3D.cxx b/Modules/Filtering/ParabolicMorphology/test/dilateBinary3D.cxx new file mode 100644 index 00000000000..5ad5365c7d7 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/dilateBinary3D.cxx @@ -0,0 +1,56 @@ +#include +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" +#include "itkChangeInformationImageFilter.h" +#include "ioutils.h" +#include +#include "itkBinaryDilateParaImageFilter.h" + +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + + +int +main(int argc, char * argv[]) +{ + + + if (argc != 6) + { + std::cerr << "Usage: " << argv[0] << " inputimage threshold size outim outim2" << std::endl; + return (EXIT_FAILURE); + } + + + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 3; + + typedef unsigned char PType; + typedef itk::Image IType; + typedef itk::Image FType; + + IType::Pointer inputOrig = readIm(argv[1]); + + + // threshold the input to create a mask + typedef itk::BinaryThresholdImageFilter ThreshType; + ThreshType::Pointer thresh = ThreshType::New(); + thresh->SetInput(inputOrig); + + thresh->SetUpperThreshold(atoi(argv[2])); + thresh->SetInsideValue(0); + thresh->SetOutsideValue(1); + writeIm(thresh->GetOutput(), argv[5]); + // now to apply the erosion + typedef itk::BinaryDilateParaImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + filter->SetInput(thresh->GetOutput()); + filter->SetUseImageSpacing(true); + filter->SetRadius(atof(argv[3])); + + writeIm(filter->GetOutput(), argv[4]); + + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/ParabolicMorphology/test/erodeBinary2D.cxx b/Modules/Filtering/ParabolicMorphology/test/erodeBinary2D.cxx new file mode 100644 index 00000000000..6992e7de1f9 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/erodeBinary2D.cxx @@ -0,0 +1,56 @@ +#include +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" +#include "itkChangeInformationImageFilter.h" +#include "ioutils.h" +#include +#include "itkBinaryErodeParaImageFilter.h" + +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + + +int +main(int argc, char * argv[]) +{ + + + if (argc != 5) + { + std::cerr << "Usage: " << argv[0] << " inputimage threshold outim outim2" << std::endl; + return (EXIT_FAILURE); + } + + + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + typedef itk::Image FType; + + IType::Pointer inputOrig = readIm(argv[1]); + + + // threshold the input to create a mask + typedef itk::BinaryThresholdImageFilter ThreshType; + ThreshType::Pointer thresh = ThreshType::New(); + thresh->SetInput(inputOrig); + + thresh->SetUpperThreshold(atoi(argv[2])); + thresh->SetInsideValue(0); + thresh->SetOutsideValue(1); + writeIm(thresh->GetOutput(), argv[4]); + // now to apply the erosion + typedef itk::BinaryErodeParaImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + filter->SetInput(thresh->GetOutput()); + filter->SetUseImageSpacing(false); + filter->SetRadius(11); + + writeIm(filter->GetOutput(), argv[3]); + + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/ParabolicMorphology/test/mkSpot.cxx b/Modules/Filtering/ParabolicMorphology/test/mkSpot.cxx new file mode 100644 index 00000000000..be1d64844ce --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/mkSpot.cxx @@ -0,0 +1,32 @@ +#include "ioutils.h" + +int +main(int argc, char * argv[]) +{ + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + + // create the input image - we will blur a dot, threshold then blur again + IType::Pointer input = IType::New(); + IType::SizeType size; + IType::IndexType index; + IType::RegionType region; + IType::SpacingType spacing; + + size.Fill(100); + spacing.Fill(1); + region.SetSize(size); + + index.Fill(50); + + input->SetRegions(region); + input->SetSpacing(spacing); + input->Allocate(); + + input->FillBuffer(255); + input->SetPixel(index, 0); + writeIm(input, argv[1]); + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/ParabolicMorphology/test/perfDT.cxx b/Modules/Filtering/ParabolicMorphology/test/perfDT.cxx new file mode 100644 index 00000000000..ee6e44397d5 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/perfDT.cxx @@ -0,0 +1,126 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" +#include "itkChangeInformationImageFilter.h" +#include "itkSignedMaurerDistanceMapImageFilter.h" + +// #include "plotutils.h" +#include "ioutils.h" + +#include "itkBinaryThresholdImageFilter.h" +#include "itkMorphologicalSignedDistanceTransformImageFilter.h" + +#include "itkSignedDanielssonDistanceMapImageFilter.h" + +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + + +int +main(int argc, char * argv[]) +{ + + int iterations = 1; + + if (argc != 8) + { + std::cerr << "Usage: " << argv[0] << " inputimage threshold outsideval outim1 outim2 outim3" << std::endl; + return (EXIT_FAILURE); + } + + iterations = atoi(argv[1]); + + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + typedef itk::Image FType; + + IType::Pointer inputOrig = readIm(argv[1]); + + typedef itk::ChangeInformationImageFilter ChangeType; + ChangeType::Pointer changer = ChangeType::New(); + changer->SetInput(inputOrig); + ChangeType::SpacingType newspacing; + + newspacing[0] = 0.5; + newspacing[1] = 0.25; + + + changer->SetOutputSpacing(newspacing); + changer->ChangeSpacingOn(); + + IType::Pointer input = changer->GetOutput(); + + // threshold the input to create a mask + typedef itk::BinaryThresholdImageFilter ThreshType; + ThreshType::Pointer thresh = ThreshType::New(); + thresh->SetInput(input); + + thresh->SetUpperThreshold(atoi(argv[2])); + thresh->SetInsideValue(0); + thresh->SetOutsideValue(255); + writeIm(thresh->GetOutput(), argv[4]); + // now to apply the signed distance transform + typedef itk::MorphologicalSignedDistanceTransformImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + filter->SetInput(thresh->GetOutput()); + // filter->SetOutsideValue(atoi(argv[3])); + filter->SetUseImageSpacing(true); + + itk::TimeProbe ParabolicT, MaurerT, DanielssonT; + + std::cout << "Parabolic Maurer Danielsson" << std::endl; + const unsigned TESTS = 10; +#if 1 + for (unsigned repeats = 0; repeats < TESTS; repeats++) + { + ParabolicT.Start(); + filter->Modified(); + filter->Update(); + ParabolicT.Stop(); + } + + writeIm(filter->GetOutput(), argv[5]); +#endif + typedef itk::SignedMaurerDistanceMapImageFilter MaurerType; + MaurerType::Pointer maurer = MaurerType::New(); + maurer->SetInput(thresh->GetOutput()); + maurer->SetUseImageSpacing(true); + maurer->SetSquaredDistance(false); + + for (unsigned repeats = 0; repeats < TESTS; repeats++) + { + MaurerT.Start(); + maurer->Modified(); + maurer->Update(); + MaurerT.Stop(); + } + writeIm(maurer->GetOutput(), argv[6]); + + typedef itk::SignedDanielssonDistanceMapImageFilter DanielssonType; + DanielssonType::Pointer daniel = DanielssonType::New(); + daniel->SetInput(thresh->GetOutput()); + daniel->SetUseImageSpacing(true); + + for (unsigned repeats = 0; repeats < TESTS; repeats++) + { + DanielssonT.Start(); + daniel->Modified(); + daniel->Update(); + DanielssonT.Stop(); + } + writeIm(daniel->GetDistanceMap(), argv[7]); + + + std::cout << std::setprecision(3) << ParabolicT.GetMean() << "\t" << MaurerT.GetMean() << "\t" + << DanielssonT.GetMean() << std::endl; + + + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/ParabolicMorphology/test/perfDT3D.cxx b/Modules/Filtering/ParabolicMorphology/test/perfDT3D.cxx new file mode 100644 index 00000000000..67f71b70ed1 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/perfDT3D.cxx @@ -0,0 +1,142 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" +#include "itkChangeInformationImageFilter.h" + +// #include "plotutils.h" +#include "ioutils.h" + +#include "itkBinaryThresholdImageFilter.h" +#include "itkMorphologicalSignedDistanceTransformImageFilter.h" +// #include "itkMorphologicalDistanceTransformImageFilter.h" +#include "itkSignedMaurerDistanceMapImageFilter.h" + +#include "itkDanielssonDistanceMapImageFilter.h" + +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + + +int +main(int argc, char * argv[]) +{ + + int iterations = 1; + + if (argc != 8) + { + std::cerr << "Usage: " << argv[0] << " inputimage threshold outsideval outim1 outim2 outim3" << std::endl; + return (EXIT_FAILURE); + } + + iterations = atoi(argv[1]); + + // itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 3; + + typedef unsigned char PType; + typedef itk::Image IType; + typedef itk::Image FType; + + IType::Pointer inputOrig = readIm(argv[1]); + + typedef itk::ChangeInformationImageFilter ChangeType; + ChangeType::Pointer changer = ChangeType::New(); + changer->SetInput(inputOrig); + ChangeType::SpacingType newspacing; + + newspacing[0] = 0.5; + newspacing[1] = 0.25; + newspacing[2] = 0.75; + newspacing.Fill(1); + + changer->SetOutputSpacing(newspacing); + changer->ChangeSpacingOn(); + + IType::Pointer input = changer->GetOutput(); + + // threshold the input to create a mask + typedef itk::BinaryThresholdImageFilter ThreshType; + ThreshType::Pointer thresh = ThreshType::New(); + thresh->SetInput(input); + + thresh->SetUpperThreshold(atoi(argv[2])); + thresh->SetInsideValue(0); + thresh->SetOutsideValue(255); + writeIm(thresh->GetOutput(), argv[4]); + // now to apply the signed distance transform + std::cout << "Finished loading etc" << std::endl; + + + typedef itk::MorphologicalSignedDistanceTransformImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + filter->SetInput(thresh->GetOutput()); + filter->SetOutsideValue(atoi(argv[3])); + filter->SetUseImageSpacing(true); + filter->SetParabolicAlgorithm(FilterType::CONTACTPOINT); + // filter->UseContactPointOn(); + itk::TimeProbe ParabolicCP, ParabolicInt, MaurerT, DanielssonT; + + std::cout << "ParabolicCP ParabolicIntersection Maurer Danielsson" << std::endl; + + const unsigned pTESTS = 10; + for (unsigned repeats = 0; repeats < pTESTS; repeats++) + { + ParabolicCP.Start(); + filter->Modified(); + filter->Update(); + ParabolicCP.Stop(); + } + + filter->SetParabolicAlgorithm(FilterType::INTERSECTION); + for (unsigned repeats = 0; repeats < pTESTS; repeats++) + { + ParabolicInt.Start(); + filter->Modified(); + filter->Update(); + ParabolicInt.Stop(); + } + + writeIm(filter->GetOutput(), argv[5]); + + typedef itk::SignedMaurerDistanceMapImageFilter MaurerType; + MaurerType::Pointer maurer = MaurerType::New(); + maurer->SetInput(thresh->GetOutput()); + maurer->SetUseImageSpacing(true); + maurer->SetSquaredDistance(false); + for (unsigned repeats = 0; repeats < pTESTS; repeats++) + { + MaurerT.Start(); + maurer->Modified(); + maurer->Update(); + MaurerT.Stop(); + } + writeIm(maurer->GetOutput(), argv[6]); + + + const unsigned TESTS = 10; + + typedef itk::DanielssonDistanceMapImageFilter DanielssonType; + DanielssonType::Pointer daniel = DanielssonType::New(); + daniel->SetInput(thresh->GetOutput()); + daniel->SetUseImageSpacing(true); + for (unsigned repeats = 0; repeats < 2; repeats++) + { + DanielssonT.Start(); + daniel->Modified(); + daniel->Update(); + DanielssonT.Stop(); + } + writeIm(daniel->GetDistanceMap(), argv[7]); + + + std::cout << std::setprecision(3) << ParabolicCP.GetMean() << "\t" << ParabolicInt.GetMean() << "\t" + << MaurerT.GetMean() << "\t" << DanielssonT.GetMean() << std::endl; + + + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/ParabolicMorphology/test/rleTests.cxx b/Modules/Filtering/ParabolicMorphology/test/rleTests.cxx new file mode 100644 index 00000000000..472ece4f19e --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/rleTests.cxx @@ -0,0 +1,135 @@ +// testing ideas for rotation of rle direction + +#include +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" +#include "itkChangeInformationImageFilter.h" +#include "ioutils.h" + +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + +#include +#include +#include "itkConstantBoundaryCondition.h" +#include "itkConnectedComponentAlgorithm.h" + +#include +#include + +template +void +genRLE(std::vector fgSet, std::vector bgSet, int axis) +{ + // fgSet must be sorted correctly + + typedef typename std::vector IndVecType; + typedef typename IndVecType::const_iterator ItType; + + IndVecType startpoints, endpoints; + + // fgSet contains surface points. We therefore may have either a + // series of consecutive points, or two some distance apart. The + // first situation occurs at a straight edge parallel to image + // axes. The second occurs across the inside of an object. + // Actually we can have both, because a run may start as an edge and + // then go inside the object. + + for (ItType it = fgSet.begin(); it != fgSet.end(); it++) + { + } +} + +template +void +doAllRLE(std::string input, std::string output) +{ + typedef typename itk::Image ImType; + typedef typename ImType::Pointer PImType; + typedef typename ImType::IndexType IndexType; + + // probably a long int + typedef typename ImType::OffsetValueType SingleIndexType; + + + PImType inIm = readIm(input); + + typedef typename std::vector IndexSetType; + + typedef typename std::set SISetType; + + // fgSet could be a vector because we definitely only insert once + // bgSet needs to be a set + IndexSetType fgSet; + IndexSetType bgSet; + + SISetType bgSISet; + + typedef typename itk::ImageRegionConstIterator itRegType; + typedef typename itk::ConstShapedNeighborhoodIterator itShapedType; + + itk::Size radius; + radius.Fill(1); + + itRegType itReg(inIm, inIm->GetLargestPossibleRegion()); + itShapedType itShaped(radius, inIm, inIm->GetLargestPossibleRegion()); + + // set up the neighborhood + setConnectivity(&itShaped, true); + // set up boundary condition + itk::ConstantBoundaryCondition lcbc; + lcbc.SetConstant(0); + itShaped.OverrideBoundaryCondition(&lcbc); + + for (itReg.GoToBegin(); !itReg.IsAtEnd(); ++itReg) + { + if (itReg.Get()) + { + // found an on pixel, so check the neighborhood. + IndexType here = itReg.GetIndex(); + itShaped += here - itShaped.GetIndex(); + // iterate over the neighborhood + bool surface = false; + for (typename itShapedType::ConstIterator nIt = itShaped.Begin(); nIt != itShaped.End(); nIt++) + { + if (!nIt.Get()) + { + // this is a surface pixel + surface = true; + IndexType N = here + nIt.GetNeighborhoodOffset(); + SingleIndexType I = inIm->ComputeOffset(N); + typename SISetType::const_iterator loc = bgSISet.find(I); + if (loc != bgSISet.end()) + { + bgSISet.insert(I); + bgSet.push_back(N); + } + } + } + if (surface) + { + fgSet.push_back(here); + } + } + } + + genRLE(fgSet, bgSet, 0); +} + + +int +main(int argc, char * argv[]) +{ + + + if (argc != 3) + { + std::cerr << "Usage: " << argv[0] << " inputim outputim " << std::endl; + return (EXIT_FAILURE); + } + + + doAllRLE(std::string(argv[1]), std::string(argv[2])); + + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/ParabolicMorphology/test/testClose.cxx b/Modules/Filtering/ParabolicMorphology/test/testClose.cxx new file mode 100644 index 00000000000..101f58e3ed8 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/testClose.cxx @@ -0,0 +1,57 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" + +#include "itkParabolicCloseImageFilter.h" +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + + +int +main(int, char * argv[]) +{ + // itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + // typedef unsigned char PType; + typedef float PType; + typedef itk::Image IType; + + + typedef itk::ImageFileReader ReaderType; + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(argv[1]); + + typedef itk::ParabolicCloseImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + filter->SetInput(reader->GetOutput()); + filter->SetSafeBorder(true); + FilterType::RadiusType scale; + // scale[0]=1; + // scale[1]=0.5; + scale.Fill(atof(argv[3])); + filter->SetScale(scale); + // itk::SimpleFilterWatcher watcher(filter, "filter"); + itk::TimeProbe NewTime; + + for (unsigned i = 0; i < 1; i++) + { + filter->Modified(); + NewTime.Start(); + filter->Update(); + NewTime.Stop(); + } + + typedef itk::ImageFileWriter WriterType; + WriterType::Pointer writer = WriterType::New(); + writer->SetInput(filter->GetOutput()); + writer->SetFileName(argv[2]); + writer->Update(); + std::cout << std::setprecision(3) << NewTime.GetMean() << std::endl; + + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/ParabolicMorphology/test/testCloseBinary.cxx b/Modules/Filtering/ParabolicMorphology/test/testCloseBinary.cxx new file mode 100644 index 00000000000..f911612e43b --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/testCloseBinary.cxx @@ -0,0 +1,59 @@ +#include +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" +#include "ioutils.h" + +#include + +#include "itkBinaryCloseParaImageFilter.h" + +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + + +int +main(int argc, char * argv[]) +{ + + + if (argc != 5) + { + std::cerr << "Usage: " << argv[0] << " inputim radius outimpref thresh" << std::endl; + return (EXIT_FAILURE); + } + + + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + typedef itk::Image FType; + + + IType::Pointer input = readIm(argv[1]); + + typedef itk::BinaryThresholdImageFilter ThreshType; + ThreshType::Pointer thresh = ThreshType::New(); + thresh->SetInput(input); + thresh->SetInsideValue(0); + thresh->SetOutsideValue(1); + thresh->SetUpperThreshold(atoi(argv[4])); + + typedef itk::BinaryCloseParaImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + int testrad = atoi(argv[2]); + filter->SetInput(thresh->GetOutput()); + filter->SetUseImageSpacing(true); + filter->SetCircular(true); + filter->SetRadius(testrad); + + writeIm(filter->GetOutput(), std::string(argv[3]) + "_" + argv[2] + ".png"); + writeIm(thresh->GetOutput(), std::string(argv[3]) + "_thresh.png"); + + + filter->Print(std::cout, itk::Indent(0)); + + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/ParabolicMorphology/test/testDT.cxx b/Modules/Filtering/ParabolicMorphology/test/testDT.cxx new file mode 100644 index 00000000000..816c925e533 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/testDT.cxx @@ -0,0 +1,59 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" + +#include "plotutils.h" +#include "ioutils.h" + +#include "itkBinaryThresholdImageFilter.h" +#include "itkMorphologicalDistanceTransformImageFilter.h" +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + + +int +main(int argc, char * argv[]) +{ + + int iterations = 1; + + if (argc != 6) + { + std::cerr << "Usage: " << argv[0] << " inputimage threshold outsideval outim1 outim2" << std::endl; + return (EXIT_FAILURE); + } + + iterations = atoi(argv[1]); + + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + typedef itk::Image FType; + + IType::Pointer input = readIm(argv[1]); + + // threshold the input to create a mask + typedef itk::BinaryThresholdImageFilter ThreshType; + ThreshType::Pointer thresh = ThreshType::New(); + thresh->SetInput(input); + + thresh->SetUpperThreshold(atoi(argv[2])); + thresh->SetInsideValue(0); + thresh->SetOutsideValue(255); + writeIm(thresh->GetOutput(), argv[4]); + // now to apply the distance transform + typedef itk::MorphologicalDistanceTransformImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + filter->SetInput(thresh->GetOutput()); + filter->SetOutsideValue(atoi(argv[3])); + filter->Update(); + + writeIm(filter->GetOutput(), argv[5]); + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/ParabolicMorphology/test/testDilate.cxx b/Modules/Filtering/ParabolicMorphology/test/testDilate.cxx new file mode 100644 index 00000000000..dae9faaea5c --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/testDilate.cxx @@ -0,0 +1,62 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkChangeInformationImageFilter.h" +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" + +#include "itkParabolicDilateImageFilter.h" +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + +// sanity check of the image spacing option + +int +main(int argc, char * argv[]) +{ + // itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + + float scale(1.0); + if (argc > 4) + { + scale = atof(argv[4]); + } + + typedef itk::ImageFileReader ReaderType; + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(argv[1]); + reader->Update(); + + typedef itk::ParabolicDilateImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + + filter->SetInput(reader->GetOutput()); + + filter->SetScale(scale); + filter->SetUseImageSpacing(true); + filter->SetParabolicAlgorithm(FilterType::INTERSECTION); + filter->Update(); + + typedef itk::ImageFileWriter WriterType; + WriterType::Pointer writer = WriterType::New(); + writer->SetInput(filter->GetOutput()); + writer->SetFileName(argv[2]); + writer->Update(); + + filter->SetScale(scale); + filter->SetUseImageSpacing(true); + filter->SetParabolicAlgorithm(FilterType::CONTACTPOINT); + filter->Update(); + + writer->SetInput(filter->GetOutput()); + writer->SetFileName(argv[3]); + writer->Update(); + + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/ParabolicMorphology/test/testDilateBinary.cxx b/Modules/Filtering/ParabolicMorphology/test/testDilateBinary.cxx new file mode 100644 index 00000000000..3b6152deb51 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/testDilateBinary.cxx @@ -0,0 +1,81 @@ +#include +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" +#include "itkChangeInformationImageFilter.h" +#include "ioutils.h" +#include +#include +#include + +#include "itkBinaryDilateParaImageFilter.h" + +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + + +int +main(int argc, char * argv[]) +{ + + + if (argc != 3) + { + std::cerr << "Usage: " << argv[0] << " radius outimpref " << std::endl; + return (EXIT_FAILURE); + } + + + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + typedef itk::Image FType; + + // create an image to test the erosion shape: + + IType::Pointer image = IType::New(); + IType::SizeType size; + IType::RegionType region; + IType::IndexType ind; + size.Fill(256); + ind.Fill(256 / 2); + + region.SetSize(size); + image->SetRegions(region); + image->Allocate(); + image->FillBuffer(0); + image->SetPixel(ind, 1); + + + typedef itk::BinaryDilateParaImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + int testrad = atoi(argv[1]); + filter->SetInput(image); + filter->SetUseImageSpacing(false); + filter->SetRadius(testrad); + // filter->SetCircular(false); + + writeIm(filter->GetOutput(), std::string(argv[2]) + "_" + argv[1] + ".png"); + + // traditional erosion for comparison + typedef itk::BinaryBallStructuringElement SEType; + SEType SE; + SEType::RadiusType SErad; + SErad.Fill(testrad); + + SE.SetRadius(SErad); + SE.CreateStructuringElement(); + + typedef itk::BinaryDilateImageFilter OldBinDilateType; + OldBinDilateType::Pointer olddilate = OldBinDilateType::New(); + olddilate->SetInput(image); + olddilate->SetKernel(SE); + olddilate->SetDilateValue(1); + + writeIm(olddilate->GetOutput(), std::string(argv[2]) + "_" + argv[1] + "_old.png"); + + + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/ParabolicMorphology/test/testDistTrans.cxx b/Modules/Filtering/ParabolicMorphology/test/testDistTrans.cxx new file mode 100644 index 00000000000..aa3df88ba52 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/testDistTrans.cxx @@ -0,0 +1,67 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkChangeInformationImageFilter.h" +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" + +#include "itkMorphologicalSignedDistanceTransformImageFilter.h" +// #include "itkMorphologicalDistanceTransformImageFilter.h" +#include "itkSignedMaurerDistanceMapImageFilter.h" +#include "itkSubtractImageFilter.h" + +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + +// sanity check of the image spacing option + +int +main(int argc, char * argv[]) +{ + // itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 3; + + typedef unsigned char PType; + typedef itk::Image IType; + + typedef itk::Image FType; + + typedef itk::ImageFileReader ReaderType; + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(argv[1]); + reader->Update(); + + typedef itk::MorphologicalSignedDistanceTransformImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + filter->SetInput(reader->GetOutput()); + filter->SetOutsideValue(atoi(argv[3])); + filter->SetUseImageSpacing(true); + + typedef itk::ImageFileWriter WriterType; + WriterType::Pointer writer = WriterType::New(); + writer->SetInput(filter->GetOutput()); + writer->SetFileName(argv[2]); + writer->Update(); + + typedef itk::SignedMaurerDistanceMapImageFilter MaurerType; + MaurerType::Pointer maurer = MaurerType::New(); + maurer->SetInput(reader->GetOutput()); + maurer->SetUseImageSpacing(true); + maurer->SetSquaredDistance(false); + + writer->SetInput(maurer->GetOutput()); + writer->SetFileName(argv[3]); + writer->Update(); + + typedef itk::SubtractImageFilter SubType; + SubType::Pointer sub = SubType::New(); + sub->SetInput(filter->GetOutput()); + sub->SetInput2(maurer->GetOutput()); + + writer->SetInput(sub->GetOutput()); + writer->SetFileName(argv[4]); + writer->Update(); + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/ParabolicMorphology/test/testErode.cxx b/Modules/Filtering/ParabolicMorphology/test/testErode.cxx new file mode 100644 index 00000000000..ab86c24097c --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/testErode.cxx @@ -0,0 +1,61 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkChangeInformationImageFilter.h" +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" + +#include "itkParabolicErodeImageFilter.h" +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + +// sanity check of the image spacing option + +int +main(int argc, char * argv[]) +{ + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + + float scale(1.0); + if (argc > 4) + { + scale = atof(argv[4]); + } + + typedef itk::ImageFileReader ReaderType; + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(argv[1]); + reader->Update(); + + typedef itk::ParabolicErodeImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + filter->SetInput(reader->GetOutput()); + + filter->SetScale(scale); + filter->SetUseImageSpacing(true); + filter->SetParabolicAlgorithm(FilterType::INTERSECTION); + filter->Update(); + + typedef itk::ImageFileWriter WriterType; + WriterType::Pointer writer = WriterType::New(); + writer->SetInput(filter->GetOutput()); + writer->SetFileName(argv[2]); + writer->Update(); + + filter->SetScale(scale); + filter->SetUseImageSpacing(true); + filter->SetParabolicAlgorithm(FilterType::CONTACTPOINT); + filter->Update(); + + writer->SetInput(filter->GetOutput()); + writer->SetFileName(argv[3]); + writer->Update(); + + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/ParabolicMorphology/test/testErodeBinary.cxx b/Modules/Filtering/ParabolicMorphology/test/testErodeBinary.cxx new file mode 100644 index 00000000000..5e92c887f4c --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/testErodeBinary.cxx @@ -0,0 +1,81 @@ +#include +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" +#include "itkChangeInformationImageFilter.h" +#include "ioutils.h" +#include +#include +#include + +#include "itkBinaryErodeParaImageFilter.h" + +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + + +int +main(int argc, char * argv[]) +{ + + + if (argc != 3) + { + std::cerr << "Usage: " << argv[0] << " radius outimpref " << std::endl; + return (EXIT_FAILURE); + } + + + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + typedef itk::Image FType; + + // create an image to test the erosion shape: + + IType::Pointer image = IType::New(); + IType::SizeType size; + IType::RegionType region; + IType::IndexType ind; + size.Fill(256); + ind.Fill(256 / 2); + + region.SetSize(size); + image->SetRegions(region); + image->Allocate(); + image->FillBuffer(1); + image->SetPixel(ind, 0); + + + typedef itk::BinaryErodeParaImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + int testrad = atoi(argv[1]); + filter->SetInput(image); + filter->SetUseImageSpacing(false); + filter->SetRadius(testrad); + // filter->SetCircular(false); + + writeIm(filter->GetOutput(), std::string(argv[2]) + "_" + argv[1] + ".png"); + + // traditional erosion for comparison + typedef itk::BinaryBallStructuringElement SEType; + SEType SE; + SEType::RadiusType SErad; + SErad.Fill(testrad); + + SE.SetRadius(SErad); + SE.CreateStructuringElement(); + + typedef itk::BinaryErodeImageFilter OldBinErodeType; + OldBinErodeType::Pointer olderode = OldBinErodeType::New(); + olderode->SetInput(image); + olderode->SetKernel(SE); + olderode->SetErodeValue(1); + + writeIm(olderode->GetOutput(), std::string(argv[2]) + "_" + argv[1] + "_old.png"); + + + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/ParabolicMorphology/test/testOpen.cxx b/Modules/Filtering/ParabolicMorphology/test/testOpen.cxx new file mode 100644 index 00000000000..231cfb773af --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/testOpen.cxx @@ -0,0 +1,66 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" + +#include "itkParabolicOpenImageFilter.h" +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + + +int +main(int argc, char * argv[]) +{ + // itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + + + typedef itk::ImageFileReader ReaderType; + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(argv[1]); + + typedef itk::ParabolicOpenImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + filter->SetInput(reader->GetOutput()); + filter->SetSafeBorder(true); + FilterType::RadiusType scale; + scale[0] = 1; + scale[1] = 0.5; + filter->SetScale(scale); + + filter->SetParabolicAlgorithm(FilterType::INTERSECTION); + + // itk::SimpleFilterWatcher watcher(filter, "filter"); + itk::TimeProbe NewTime; + + for (unsigned i = 0; i < 1; i++) + { + filter->Modified(); + NewTime.Start(); + filter->Update(); + NewTime.Stop(); + } + + typedef itk::ImageFileWriter WriterType; + WriterType::Pointer writer = WriterType::New(); + writer->SetInput(filter->GetOutput()); + writer->SetFileName(argv[2]); + writer->Update(); + std::cout << std::setprecision(3) << NewTime.GetMean() << std::endl; + + if (argc > 3) + { + // testing equivalence + filter->SetParabolicAlgorithm(FilterType::CONTACTPOINT); + writer->SetFileName(argv[3]); + writer->Update(); + } + + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/ParabolicMorphology/test/testOpenBinary.cxx b/Modules/Filtering/ParabolicMorphology/test/testOpenBinary.cxx new file mode 100644 index 00000000000..3ee1e3efd48 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/testOpenBinary.cxx @@ -0,0 +1,59 @@ +#include +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" +#include "ioutils.h" + +#include + +#include "itkBinaryOpenParaImageFilter.h" + +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + + +int +main(int argc, char * argv[]) +{ + + + if (argc != 5) + { + std::cerr << "Usage: " << argv[0] << " inputim radius outimpref thresh" << std::endl; + return (EXIT_FAILURE); + } + + + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + typedef itk::Image FType; + + + IType::Pointer input = readIm(argv[1]); + + typedef itk::BinaryThresholdImageFilter ThreshType; + ThreshType::Pointer thresh = ThreshType::New(); + thresh->SetInput(input); + thresh->SetInsideValue(0); + thresh->SetOutsideValue(1); + thresh->SetUpperThreshold(atoi(argv[4])); + + typedef itk::BinaryOpenParaImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + int testrad = atoi(argv[2]); + filter->SetInput(thresh->GetOutput()); + filter->SetUseImageSpacing(true); + filter->SetCircular(true); + filter->SetRadius(testrad); + + writeIm(filter->GetOutput(), std::string(argv[3]) + "_" + argv[2] + ".png"); + writeIm(thresh->GetOutput(), std::string(argv[3]) + "_thresh.png"); + + + filter->Print(std::cout, itk::Indent(0)); + + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/ParabolicMorphology/test/testSharpen.cxx b/Modules/Filtering/ParabolicMorphology/test/testSharpen.cxx new file mode 100644 index 00000000000..ef57fc226c9 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/testSharpen.cxx @@ -0,0 +1,123 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" + +#include "plotutils.h" + +#include "itkGrayscaleDilateImageFilter.h" +#include "itkBinaryBallStructuringElement.h" + + +#include "itkSmoothingRecursiveGaussianImageFilter.h" +#include "itkBinaryThresholdImageFilter.h" +#include "itkMorphologicalSharpeningImageFilter.h" +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + + +int +main(int argc, char * argv[]) +{ + + int iterations = 1; + + if (argc != 4) + { + std::cerr << "Usage: " << argv[0] << " iterations outputimage outputprofile" << std::endl; + return (EXIT_FAILURE); + } + + iterations = atoi(argv[1]); + + // itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + typedef itk::Image FType; + + typedef itk::ImageFileWriter WriterType; + WriterType::Pointer writer = WriterType::New(); + + // create the input image - we will blur a dot, threshold then blur again + IType::Pointer input = IType::New(); + IType::SizeType size; + IType::IndexType index; + IType::RegionType region; + IType::SpacingType spacing; + + size.Fill(100); + spacing.Fill(1); + region.SetSize(size); + + index.Fill(50); + + input->SetRegions(region); + input->SetSpacing(spacing); + input->Allocate(); + + input->FillBuffer(0); + input->SetPixel(index, 255); + + typedef itk::BinaryBallStructuringElement SRType; + typedef itk::GrayscaleDilateImageFilter DilateType; + DilateType::Pointer smallDilate = DilateType::New(); + SRType smallkernel; + SRType::RadiusType smallrad = smallkernel.GetRadius(); + smallrad.Fill(7); + smallkernel.SetRadius(smallrad); + smallkernel.CreateStructuringElement(); + smallDilate->SetKernel(smallkernel); + + typedef itk::SmoothingRecursiveGaussianImageFilter SmootherType; + + SmootherType::Pointer smoother = SmootherType::New(); + + smallDilate->SetInput(input); + + smoother->SetInput(smallDilate->GetOutput()); + smoother->SetSigma(3); + + writer->SetInput(smallDilate->GetOutput()); + writer->SetFileName("input.tif"); + writer->Update(); + + writer->SetInput(smoother->GetOutput()); + writer->SetFileName("blurrredinput.tif"); + writer->Update(); + + + // now to apply the sharpening + + typedef itk::MorphologicalSharpeningImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + filter->SetInput(smoother->GetOutput()); + filter->SetScale(1); + filter->SetIterations(iterations); + filter->Update(); + + typedef itk::ImageFileWriter FlWriterType; + FlWriterType::Pointer flwriter = FlWriterType::New(); + + flwriter->SetInput(filter->GetOutput()); + flwriter->SetFileName(argv[2]); + flwriter->Update(); + + // write out profiles + // input + IType::IndexType first, last; + first[0] = 50; + first[1] = 0; + last[0] = 50; + last[1] = 99; + + extractProfile(smallDilate->GetOutput(), first, last, "inputprof.txt"); + extractProfile(smoother->GetOutput(), first, last, "blurredprof.txt"); + extractProfile(filter->GetOutput(), first, last, argv[3]); + + return EXIT_SUCCESS; +} diff --git a/Modules/Filtering/ParabolicMorphology/test/testSpacing.cxx b/Modules/Filtering/ParabolicMorphology/test/testSpacing.cxx new file mode 100644 index 00000000000..cfd3594953b --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/testSpacing.cxx @@ -0,0 +1,71 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkChangeInformationImageFilter.h" +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" + +#include "itkParabolicOpenImageFilter.h" +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + +// sanity check of the image spacing option + +int +main(int, char * argv[]) +{ + // itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + + + typedef itk::ImageFileReader ReaderType; + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(argv[1]); + + typedef itk::ParabolicOpenImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + filter->SetInput(reader->GetOutput()); + filter->SetSafeBorder(true); + FilterType::RadiusType scale; + scale[0] = 1; + scale[1] = 0.5; + + filter->SetScale(scale); + filter->SetUseImageSpacing(false); + filter->Update(); + + typedef itk::ImageFileWriter WriterType; + WriterType::Pointer writer = WriterType::New(); + writer->SetInput(filter->GetOutput()); + writer->SetFileName(argv[2]); + writer->Update(); + + // now we'll change the image spacing and see if we can reproduce + // the result + typedef itk::ChangeInformationImageFilter ChangeType; + ChangeType::Pointer changer = ChangeType::New(); + changer->SetInput(reader->GetOutput()); + ChangeType::SpacingType newspacing; + + newspacing[0] = 1 / sqrt((float)1); + newspacing[1] = 1 / sqrt((float)0.5); + + + changer->SetOutputSpacing(newspacing); + changer->ChangeSpacingOn(); + // set scales to deliver the same result + scale[0] = 1; + scale[1] = 1; + filter->SetInput(changer->GetOutput()); + filter->SetScale(scale); + filter->SetUseImageSpacing(true); + filter->Update(); + writer->SetFileName(argv[3]); + writer->Update(); + return EXIT_SUCCESS; +} From 892157f30634b94ce43ac4d9e9a5d5c0b07c4a3b Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Mon, 6 Apr 2015 20:15:30 +1000 Subject: [PATCH 044/165] ENH: more moving files --- .../{ => test}/CMakeLists.txt | 0 .../ParabolicMorphology/test/IJMacros.txt | 72 +++++++++++++++++++ 2 files changed, 72 insertions(+) rename Modules/Filtering/ParabolicMorphology/{ => test}/CMakeLists.txt (100%) create mode 100644 Modules/Filtering/ParabolicMorphology/test/IJMacros.txt diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt similarity index 100% rename from Modules/Filtering/ParabolicMorphology/CMakeLists.txt rename to Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt diff --git a/Modules/Filtering/ParabolicMorphology/test/IJMacros.txt b/Modules/Filtering/ParabolicMorphology/test/IJMacros.txt new file mode 100644 index 00000000000..902199a4213 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/IJMacros.txt @@ -0,0 +1,72 @@ +#Macro to find a package and load it +#(you shouldn't need to modify this code) +MACRO(LOADPACKAGE Package) + SET(Included FALSE) + IF(EXISTS "/home/tester/XMLTestParser.py") + #If we're in the test environment, check and see if we're being asked for + #a specific version of some package. If so, we'll provide a direct path + #instead of counting on CMake to choose the right version. + IF(${Package} MATCHES "^ITK.*2[.]2[.]1$") + SET(ITK_DIR "/home/tester/ITK2.2.1/bin") + INCLUDE("/usr/local/share/CMake/Modules/FindITK.cmake") + INCLUDE(${ITK_USE_FILE}) + SET(Included TRUE) + ENDIF(${Package} MATCHES "^ITK.*2[.]2[.]1$") + IF(NOT Included AND ${Package} MATCHES "^ITK.*1[.]8[.]1$") + SET(ITK_DIR "/home/tester/ITK1.8.1/bin") + INCLUDE("/usr/local/share/CMake/Modules/FindITK.cmake") + INCLUDE(${ITK_USE_FILE}) + SET(Included TRUE) + ENDIF(NOT Included AND ${Package} MATCHES "^ITK.*1[.]8[.]1$") + IF(NOT Included AND ${Package} MATCHES "^VTK.*4[.]4$") + SET(VTK_DIR "/home/tester/VTK4.4/bin") + INCLUDE("/usr/local/share/CMake/Modules/FindVTK.cmake") + INCLUDE(${VTK_USE_FILE}) + SET(Included TRUE) + ENDIF(NOT Included AND ${Package} MATCHES "^VTK.*4[.]4$") + IF(NOT Included AND ${Package} MATCHES "^VTK.*5[.]0$") + SET(VTK_DIR "/home/tester/VTK5.0/bin") + INCLUDE("/usr/local/share/CMake/Modules/FindVTK.cmake") + INCLUDE(${VTK_USE_FILE}) + SET(Included TRUE) + ENDIF(NOT Included AND ${Package} MATCHES "^VTK.*5[.]0$") + #If we get this far and we still haven't found a match, set it up so the + #next block of code has a chance at finding the package. + IF(NOT Included AND ${Package} MATCHES "^VTK") + SET(Package "VTK") + ENDIF(NOT Included AND ${Package} MATCHES "^VTK") + IF(NOT Included AND ${Package} MATCHES "^ITK") + SET(Package "ITK") + ENDIF(NOT Included AND ${Package} MATCHES "^ITK") + ENDIF(EXISTS "/home/tester/XMLTestParser.py") + + #no point in executing the code below if we already found the package we're + #looking for. + IF(NOT Included) + FIND_PACKAGE(${Package}) + IF(${Package}_FOUND) + #most packages define a Package_INCLUDE_DIR variable, so we'll check for + #that first + IF(${Package}_INCLUDE_DIR) + INCLUDE(${${Package}_INCLUDE_DIR}) + SET(Included TRUE) + ELSE(${Package}_INCLUDE_DIR) + #VTK and ITK prefer to define a Package_USE_FILE, so we need to look for + #that too + IF(${Package}_USE_FILE) + INCLUDE(${${Package}_USE_FILE}) + SET(Included TRUE) + ENDIF(${Package}_USE_FILE) + ENDIF(${Package}_INCLUDE_DIR) + #then there's some other pesky packages that don't like to define standard + #variables at all. If you're trying to include one of those you might have + #to do a little bit of investigating on your own. + IF(NOT Included) + MESSAGE(FATAL_ERROR "${Package} was found, but couldn't be included.\n + Try including it manually out of the FOREACH in the CMakeLists file.\n + Look at Find${Package}.cmake in the CMake module directory for clues + on what you're supposed to include. Good luck.") + ENDIF(NOT Included) + ENDIF(${Package}_FOUND) + ENDIF(NOT Included) +ENDMACRO(LOADPACKAGE) From 097e0a8dce2e35a94acd82780bd00e3438d368dc Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Mon, 6 Apr 2015 20:23:45 +1000 Subject: [PATCH 045/165] COMP: cmake stuff in top level --- .../Filtering/ParabolicMorphology/CMakeLists.txt | 2 ++ .../ParabolicMorphology/itk-module.cmake | 15 +++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 Modules/Filtering/ParabolicMorphology/CMakeLists.txt create mode 100644 Modules/Filtering/ParabolicMorphology/itk-module.cmake diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt new file mode 100644 index 00000000000..0859b488847 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -0,0 +1,2 @@ +project(ParabolicMorphology) +itk_module_impl() diff --git a/Modules/Filtering/ParabolicMorphology/itk-module.cmake b/Modules/Filtering/ParabolicMorphology/itk-module.cmake new file mode 100644 index 00000000000..a3fe700e660 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/itk-module.cmake @@ -0,0 +1,15 @@ +set( + DOCUMENTATION + "This module contains classes for mathematical morphology using parabolic functions. +Parabolic functions can be used to build fast distance transforms, and +binary morphology using spheres." +) +itk_module( + ParabolicMorphology + DEPENDS + ITKIOImageBase + TEST_DEPENDS + ITKTestKernel + EXCLUDE_FROM_DEFAULT + DESCRIPTION "${DOCUMENTATION}" +) From 28b354b919e22b4b1929e56d94b729bf6a1c2374 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Mon, 6 Apr 2015 20:25:08 +1000 Subject: [PATCH 046/165] ENH: moved images --- .../test/images/blurredprof.txt | 100 ++++++++++++++++++ .../test/images/bunnyPadded.nrrd | Bin 0 -> 69872 bytes .../test/images/cthead1.png | Bin 0 -> 197266 bytes .../test/images/dilate_parabolic.fig | 74 +++++++++++++ .../test/images/inputprof.txt | 100 ++++++++++++++++++ .../ParabolicMorphology/test/images/open.png | Bin 0 -> 17687 bytes .../test/images/sharp.gnuplot | 10 ++ .../test/images/sharp1.txt | 100 ++++++++++++++++++ .../test/images/sharp10.txt | 100 ++++++++++++++++++ .../test/images/sharp100.txt | 100 ++++++++++++++++++ .../test/images/sharp2.txt | 100 ++++++++++++++++++ .../test/images/sharp3.txt | 100 ++++++++++++++++++ .../ParabolicMorphology/test/images/test.png | Bin 0 -> 18072 bytes 13 files changed, 784 insertions(+) create mode 100644 Modules/Filtering/ParabolicMorphology/test/images/blurredprof.txt create mode 100644 Modules/Filtering/ParabolicMorphology/test/images/bunnyPadded.nrrd create mode 100644 Modules/Filtering/ParabolicMorphology/test/images/cthead1.png create mode 100644 Modules/Filtering/ParabolicMorphology/test/images/dilate_parabolic.fig create mode 100644 Modules/Filtering/ParabolicMorphology/test/images/inputprof.txt create mode 100644 Modules/Filtering/ParabolicMorphology/test/images/open.png create mode 100644 Modules/Filtering/ParabolicMorphology/test/images/sharp.gnuplot create mode 100644 Modules/Filtering/ParabolicMorphology/test/images/sharp1.txt create mode 100644 Modules/Filtering/ParabolicMorphology/test/images/sharp10.txt create mode 100644 Modules/Filtering/ParabolicMorphology/test/images/sharp100.txt create mode 100644 Modules/Filtering/ParabolicMorphology/test/images/sharp2.txt create mode 100644 Modules/Filtering/ParabolicMorphology/test/images/sharp3.txt create mode 100644 Modules/Filtering/ParabolicMorphology/test/images/test.png diff --git a/Modules/Filtering/ParabolicMorphology/test/images/blurredprof.txt b/Modules/Filtering/ParabolicMorphology/test/images/blurredprof.txt new file mode 100644 index 00000000000..2872700d239 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/images/blurredprof.txt @@ -0,0 +1,100 @@ +0 0 +1 0 +2 0 +3 0 +4 0 +5 0 +6 0 +7 0 +8 0 +9 0 +10 0 +11 0 +12 0 +13 0 +14 0 +15 0 +16 0 +17 0 +18 0 +19 0 +20 0 +21 0 +22 0 +23 0 +24 0 +25 0 +26 0 +27 0 +28 0 +29 0 +30 0 +31 0 +32 0 +33 0 +34 0 +35 0 +36 2 +37 5 +38 12 +39 23 +40 40 +41 63 +42 92 +43 124 +44 156 +45 184 +46 208 +47 225 +48 237 +49 243 +50 245 +51 243 +52 237 +53 225 +54 208 +55 184 +56 156 +57 124 +58 92 +59 63 +60 40 +61 23 +62 12 +63 5 +64 2 +65 0 +66 0 +67 0 +68 0 +69 0 +70 0 +71 0 +72 0 +73 0 +74 0 +75 0 +76 0 +77 0 +78 0 +79 0 +80 0 +81 0 +82 0 +83 0 +84 0 +85 0 +86 0 +87 0 +88 0 +89 0 +90 0 +91 0 +92 0 +93 0 +94 0 +95 0 +96 0 +97 0 +98 0 +99 0 diff --git a/Modules/Filtering/ParabolicMorphology/test/images/bunnyPadded.nrrd b/Modules/Filtering/ParabolicMorphology/test/images/bunnyPadded.nrrd new file mode 100644 index 0000000000000000000000000000000000000000..03e2ad5638fd96a84868c301dbdbfa3ff488faac GIT binary patch literal 69872 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%0D!0%c-GzMCSs`P7Rao41g{t8rcwavT<9yRj0oelM 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

hWGB>vsvm4#?TZ)At2S(sURaM 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Ð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 M07*qoM6N<$f>UJrGynhq literal 0 HcmV?d00001 From c8b8fb5f8b5d96ecccadb185316ea40e53f61249 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Mon, 6 Apr 2015 20:50:12 +1000 Subject: [PATCH 047/165] ENH: moved first test file --- .../test/{testErode.cxx => itkParaErodeTest.cxx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Modules/Filtering/ParabolicMorphology/test/{testErode.cxx => itkParaErodeTest.cxx} (100%) diff --git a/Modules/Filtering/ParabolicMorphology/test/testErode.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx similarity index 100% rename from Modules/Filtering/ParabolicMorphology/test/testErode.cxx rename to Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx From 2392d8f25d173684456aae2a999512c6af33f543 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Mon, 6 Apr 2015 20:53:50 +1000 Subject: [PATCH 048/165] ENH: erode test --- .../test/itkParaErodeTest.cxx | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx index ab86c24097c..fe51522c6b2 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx @@ -12,7 +12,7 @@ // sanity check of the image spacing option int -main(int argc, char * argv[]) +itkParaErodeTest(int argc, char * argv[]) { itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); const int dim = 2; @@ -29,7 +29,15 @@ main(int argc, char * argv[]) typedef itk::ImageFileReader ReaderType; ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(argv[1]); - reader->Update(); + try + { + reader->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } typedef itk::ParabolicErodeImageFilter FilterType; @@ -40,7 +48,15 @@ main(int argc, char * argv[]) filter->SetScale(scale); filter->SetUseImageSpacing(true); filter->SetParabolicAlgorithm(FilterType::INTERSECTION); - filter->Update(); + try + { + filter->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } typedef itk::ImageFileWriter WriterType; WriterType::Pointer writer = WriterType::New(); @@ -55,7 +71,15 @@ main(int argc, char * argv[]) writer->SetInput(filter->GetOutput()); writer->SetFileName(argv[3]); - writer->Update(); + try + { + writer->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } return EXIT_SUCCESS; } From f1ba2124529507c46aeceac2897c4e3951c83962 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Mon, 6 Apr 2015 20:56:35 +1000 Subject: [PATCH 049/165] ENH: dilate test --- .../test/itkParaDilateTest.cxx | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx new file mode 100644 index 00000000000..85c3ddc50ba --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx @@ -0,0 +1,86 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkChangeInformationImageFilter.h" +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" + +#include "itkParabolicDilateImageFilter.h" +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + +// sanity check of the image spacing option + +int +itkParaDilateTest(int argc, char * argv[]) +{ + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + + float scale(1.0); + if (argc > 4) + { + scale = atof(argv[4]); + } + + typedef itk::ImageFileReader ReaderType; + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(argv[1]); + try + { + reader->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + typedef itk::ParabolicDilateImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + + filter->SetInput(reader->GetOutput()); + + filter->SetScale(scale); + filter->SetUseImageSpacing(true); + filter->SetParabolicAlgorithm(FilterType::INTERSECTION); + try + { + filter->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + typedef itk::ImageFileWriter WriterType; + WriterType::Pointer writer = WriterType::New(); + writer->SetInput(filter->GetOutput()); + writer->SetFileName(argv[2]); + writer->Update(); + + filter->SetScale(scale); + filter->SetUseImageSpacing(true); + filter->SetParabolicAlgorithm(FilterType::CONTACTPOINT); + filter->Update(); + + writer->SetInput(filter->GetOutput()); + writer->SetFileName(argv[3]); + try + { + writer->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} From 976a5cbd71cce0fa52dc3f61acdf0c20b3de7003 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Mon, 6 Apr 2015 21:12:11 +1000 Subject: [PATCH 050/165] ENH: first atttempt at a test --- .../ParabolicMorphology/test/CMakeLists.txt | 179 +++--------------- .../test/itkParaErodeTest.cxx | 10 +- .../ParabolicMorphology/test/testDilate.cxx | 62 ------ 3 files changed, 40 insertions(+), 211 deletions(-) delete mode 100644 Modules/Filtering/ParabolicMorphology/test/testDilate.cxx diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index 078c07b9741..c0f89840691 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -1,148 +1,31 @@ -#Change PROJECT_NAME to the name of your project -PROJECT(parabolicMorpholgy) - -#set the name of the input image used to run the test -SET(INPUT_IMAGE ${ CMAKE_CURRENT_SOURCE_DIR } / images / cthead1.png) -SET(INPUT_IMAGE3D ${ CMAKE_CURRENT_SOURCE_DIR } / images / bunnyPadded.nrrd) - -#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) - -#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 -#ITKCommon -#ITKBasicFilters -#ITKIO -#ITKAlgorithms -#) - -#ITK4 version -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 "check" - "testOpen" - "testClose" - "testSpacing" - "testSharpen" - "testDT" - "perfDT" - "perfDT3D" - "mkSpot" - "erodeBinary2D" - "testErodeBinary" - "testDilateBinary" - "testOpenBinary" - "testCloseBinary" - "dilateBinary3D" - "testErode" - "testDilate") -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(Test ${ TEST_COMMAND } check ${ INPUT_IMAGE } out.png-- compare out.png ${ CMAKE_CURRENT_SOURCE_DIR } / - images / test.png) - -#default scale - 1 -ADD_TEST(Erode2Da ${ TEST_COMMAND } testErode ${ - INPUT_IMAGE } outEInta.png outECPa.png-- compare outEInta.png outECPa.png) - -ADD_TEST(Dilate2Da ${ TEST_COMMAND } testDilate ${ - INPUT_IMAGE } outDInta.png outDCPa.png-- compare outDInta.png outDCPa.png) - -#small scale -ADD_TEST(Erode2Db ${ TEST_COMMAND } testErode ${ - INPUT_IMAGE } outEIntb.png outECPb.png 0.2 --compare outEIntb.png outECPb.png) - - -ADD_TEST(Dilate2Db ${ TEST_COMMAND } testDilate ${ - INPUT_IMAGE } outDIntb.png outDCPb.png 0.2 --compare outDIntb.png outDCPb.png) - - -#large scale -ADD_TEST(Erode2Dc ${ TEST_COMMAND } testErode ${ - INPUT_IMAGE } outEIntc.png outECPc.png 5.0 --compare outEIntc.png outECPc.png) - -ADD_TEST(Dilate2Dc ${ TEST_COMMAND } testDilate ${ - INPUT_IMAGE } outDIntc.png outDCPc.png 5.0 --compare outDIntc.png outDCPc.png) - -ADD_TEST(Open ${ TEST_COMMAND } testOpen ${ INPUT_IMAGE } openCP.png openInt.png-- compare openCP.png ${ - CMAKE_CURRENT_SOURCE_DIR } / - images / open.png-- compare openCP.png openInt.png) -ADD_TEST(Spacing ${ TEST_COMMAND } testSpacing ${ INPUT_IMAGE } o1.png o2.png-- compare o1.png o2.png) - -ADD_TEST(Sharpen1 ${ TEST_COMMAND } testSharpen 1 sharp1.mha sharp1.txt) - -ADD_TEST(Sharpen2 ${ TEST_COMMAND } testSharpen 2 sharp2.mha sharp2.txt) - -ADD_TEST(Sharpen3 ${ TEST_COMMAND } testSharpen 3 sharp3.mha sharp3.txt) -ADD_TEST(Sharpen10 ${ TEST_COMMAND } testSharpen 10 sharp10.mha sharp10.txt) -ADD_TEST(Sharpen100 ${ TEST_COMMAND } testSharpen 100 sharp100.mha sharp100.txt) - -ADD_TEST(Dist1 ${ TEST_COMMAND } testDT $ { INPUT_IMAGE } 100 0 mask.png dist1.mha) - -ADD_TEST(Dist2 ${ TEST_COMMAND } testDT $ { INPUT_IMAGE } 100 255 mask.png dist2.mha) - -ADD_TEST(Perf ${ TEST_COMMAND } perfDT $ { - INPUT_IMAGE -} 100 255 mask.png dist3.mha dist4.mha dist5.mha-- compare dist3.mha dist4.mha) - -ADD_TEST(Perf3D ${ TEST_COMMAND } perfDT3D $ { - INPUT_IMAGE3D -} 100 255 bmask.nii.gz distA.nii.gz distB.nii.gz distC.nii.gz) +itk_module_test() +set( + ParabolicMorphologyTests + itkParaErodeTest.cxx + #itkParaDilateTest.cxx + #itkParaOpenTest.cxx + #itkParaSpacingTest.cxx + #itkParaSharpenTest.cxx + #itkParaDTTest.cxx +) + +set(INPUT_IMAGE ${CMAKE_CURRENT_SOURCE_DIR}/images/cthead1.png) + +set(ITK_TEST_DRIVER itkTestDriver) + +createtestdriver(ParabolicMorphology "${ParabolicMorphology-Test_LIBRARIES}" "${ParabolicMorphologyTests}") + +## both intersection and contact point erosion +itk_add_test( + NAME itkParaErodeTest1 + COMMAND + ParabolicMorphologyTestDriver + --compare + outEInta.png + outECPa.png + # --compare outEInta.png baseline/outEInta.png + itkParaErodeTest + ${INPUT_IMAGE} + outEInta.png + outECPa.png +) diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx index fe51522c6b2..d7c9105e853 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx @@ -62,7 +62,15 @@ itkParaErodeTest(int argc, char * argv[]) WriterType::Pointer writer = WriterType::New(); writer->SetInput(filter->GetOutput()); writer->SetFileName(argv[2]); - writer->Update(); + try + { + writer->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } filter->SetScale(scale); filter->SetUseImageSpacing(true); diff --git a/Modules/Filtering/ParabolicMorphology/test/testDilate.cxx b/Modules/Filtering/ParabolicMorphology/test/testDilate.cxx deleted file mode 100644 index dae9faaea5c..00000000000 --- a/Modules/Filtering/ParabolicMorphology/test/testDilate.cxx +++ /dev/null @@ -1,62 +0,0 @@ -#include -#include "itkImageFileReader.h" -#include "itkImageFileWriter.h" -#include "itkChangeInformationImageFilter.h" -#include "itkCommand.h" -#include "itkSimpleFilterWatcher.h" - -#include "itkParabolicDilateImageFilter.h" -#include "itkTimeProbe.h" -#include "itkMultiThreader.h" - -// sanity check of the image spacing option - -int -main(int argc, char * argv[]) -{ - // itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; - - typedef unsigned char PType; - typedef itk::Image IType; - - float scale(1.0); - if (argc > 4) - { - scale = atof(argv[4]); - } - - typedef itk::ImageFileReader ReaderType; - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName(argv[1]); - reader->Update(); - - typedef itk::ParabolicDilateImageFilter FilterType; - - FilterType::Pointer filter = FilterType::New(); - - - filter->SetInput(reader->GetOutput()); - - filter->SetScale(scale); - filter->SetUseImageSpacing(true); - filter->SetParabolicAlgorithm(FilterType::INTERSECTION); - filter->Update(); - - typedef itk::ImageFileWriter WriterType; - WriterType::Pointer writer = WriterType::New(); - writer->SetInput(filter->GetOutput()); - writer->SetFileName(argv[2]); - writer->Update(); - - filter->SetScale(scale); - filter->SetUseImageSpacing(true); - filter->SetParabolicAlgorithm(FilterType::CONTACTPOINT); - filter->Update(); - - writer->SetInput(filter->GetOutput()); - writer->SetFileName(argv[3]); - writer->Update(); - - return EXIT_SUCCESS; -} From e10a0d3a50a58a0bf8155057a632669b7ce480a1 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Tue, 7 Apr 2015 16:09:18 +1000 Subject: [PATCH 051/165] ENH: started adding test dependencies --- Modules/Filtering/ParabolicMorphology/itk-module.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Filtering/ParabolicMorphology/itk-module.cmake b/Modules/Filtering/ParabolicMorphology/itk-module.cmake index a3fe700e660..923b23c953f 100644 --- a/Modules/Filtering/ParabolicMorphology/itk-module.cmake +++ b/Modules/Filtering/ParabolicMorphology/itk-module.cmake @@ -9,6 +9,7 @@ itk_module( DEPENDS ITKIOImageBase TEST_DEPENDS + ITKFiltering ITKTestKernel EXCLUDE_FROM_DEFAULT DESCRIPTION "${DOCUMENTATION}" From ed48a307d38fd3d78890e8bc18d6cc45dd2f087d Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Tue, 7 Apr 2015 16:10:35 +1000 Subject: [PATCH 052/165] ENH: started adding test dependencies --- Modules/Filtering/ParabolicMorphology/itk-module.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/itk-module.cmake b/Modules/Filtering/ParabolicMorphology/itk-module.cmake index 923b23c953f..a41a26450da 100644 --- a/Modules/Filtering/ParabolicMorphology/itk-module.cmake +++ b/Modules/Filtering/ParabolicMorphology/itk-module.cmake @@ -9,7 +9,7 @@ itk_module( DEPENDS ITKIOImageBase TEST_DEPENDS - ITKFiltering + ITKGroupFiltering ITKTestKernel EXCLUDE_FROM_DEFAULT DESCRIPTION "${DOCUMENTATION}" From 831a09c80ea2b908f843037f0dfb5457ebf23ca7 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Tue, 7 Apr 2015 16:11:48 +1000 Subject: [PATCH 053/165] ENH: started adding test dependencies --- Modules/Filtering/ParabolicMorphology/itk-module.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/itk-module.cmake b/Modules/Filtering/ParabolicMorphology/itk-module.cmake index a41a26450da..a1e3f4add4d 100644 --- a/Modules/Filtering/ParabolicMorphology/itk-module.cmake +++ b/Modules/Filtering/ParabolicMorphology/itk-module.cmake @@ -9,7 +9,7 @@ itk_module( DEPENDS ITKIOImageBase TEST_DEPENDS - ITKGroupFiltering + ITKImageGrid ITKTestKernel EXCLUDE_FROM_DEFAULT DESCRIPTION "${DOCUMENTATION}" From c09da0e91df8c7bf385ace68920878e4ff3062a1 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Tue, 7 Apr 2015 16:32:52 +1000 Subject: [PATCH 054/165] STYLE: renamed src to include --- .../include/itkBinaryCloseParaImageFilter.h | 164 +++++++ .../include/itkBinaryCloseParaImageFilter.hxx | 227 ++++++++++ .../include/itkBinaryDilateParaImageFilter.h | 144 ++++++ .../itkBinaryDilateParaImageFilter.hxx | 144 ++++++ .../include/itkBinaryErodeParaImageFilter.h | 143 ++++++ .../include/itkBinaryErodeParaImageFilter.hxx | 143 ++++++ .../include/itkBinaryOpenParaImageFilter.h | 164 +++++++ .../include/itkBinaryOpenParaImageFilter.hxx | 245 +++++++++++ .../include/itkGreaterEqualValImageFilter.h | 96 ++++ .../include/itkMorphSDTHelperImageFilter.h | 128 ++++++ ...orphologicalDistanceTransformImageFilter.h | 145 +++++++ ...phologicalDistanceTransformImageFilter.hxx | 120 +++++ .../itkMorphologicalSharpeningImageFilter.h | 166 +++++++ .../itkMorphologicalSharpeningImageFilter.hxx | 86 ++++ ...ogicalSignedDistanceTransformImageFilter.h | 189 ++++++++ ...icalSignedDistanceTransformImageFilter.hxx | 121 ++++++ .../include/itkParabolicCloseImageFilter.h | 78 ++++ .../include/itkParabolicDilateImageFilter.h | 72 +++ .../itkParabolicErodeDilateImageFilter.h | 191 ++++++++ .../itkParabolicErodeDilateImageFilter.hxx | 318 ++++++++++++++ .../include/itkParabolicErodeImageFilter.h | 77 ++++ .../include/itkParabolicMorphUtils.h | 299 +++++++++++++ .../itkParabolicOpenCloseImageFilter.h | 160 +++++++ .../itkParabolicOpenCloseImageFilter.hxx | 409 ++++++++++++++++++ ...kParabolicOpenCloseSafeBorderImageFilter.h | 167 +++++++ ...arabolicOpenCloseSafeBorderImageFilter.hxx | 124 ++++++ .../include/itkParabolicOpenImageFilter.h | 75 ++++ .../include/itkSharpenOpImageFilter.h | 106 +++++ 28 files changed, 4501 insertions(+) create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h create mode 100644 Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h new file mode 100644 index 00000000000..cdf48911c90 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h @@ -0,0 +1,164 @@ +#ifndef __itkBinaryCloseParaImageFilter_h +#define __itkBinaryCloseParaImageFilter_h + +#include "itkParabolicErodeImageFilter.h" +#include "itkParabolicDilateImageFilter.h" +#include "itkGreaterEqualValImageFilter.h" +#include "itkBinaryThresholdImageFilter.h" + +namespace itk +{ + +/** + * \class BinaryCloseParaImageFilter + * \brief Class for binary morphological opening operation. + * + * This class uses the parabolic morphology operations to do very + * efficient erosions by circles/spheres. The operations are efficient + * because the underlying parabolic operations are separable and + * the operations are implicitly short circuited in comparison to a + * full distance transform approach. + * + * The basic idea is that a binary erosion or dilation by a circle/sphere + * can be carried out by thresholding a distance transform. By using + * the parabolic filters we can avoid computing the entire distance + * transform and instead only compute the subset we are interested + * in. + * + * Note that the circles and spheres may not be quite what you + * expect, because this class doesn't explicitly use Bresenham circles + * as most of the others do. A voxel's centre needs to be less than or + * equal to the circle radius, rather than any part of the voxel + * inside the circle. + * + * This filter was developed as a result of discussions with + * M.Starring on the ITK mailing list. + * + * \sa itkParabolicErodeImageFilter + * + * \author Richard Beare, Department of Medicine, Monash University, + * Australia. + **/ + + +template +class ITK_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter + +{ + +public: + /** Standard class typedefs. */ + typedef BinaryCloseParaImageFilter Self; + typedef ImageToImageFilter Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Runtime information support. */ + itkTypeMacro(BinaryCloseParaImageFilter, ImageToImageFilter); + + + /** Pixel Type of the input image */ + typedef TInputImage InputImageType; + typedef TOutputImage OutputImageType; + typedef typename TInputImage::PixelType PixelType; + typedef typename NumericTraits::RealType RealType; + typedef typename NumericTraits::ScalarRealType ScalarRealType; + typedef typename TOutputImage::PixelType OutputPixelType; + + /** Smart pointer typedef support. */ + typedef typename TInputImage::Pointer InputImagePointer; + typedef typename TInputImage::ConstPointer InputImageConstPointer; + + typedef typename NumericTraits::FloatType InternalRealType; + // perhaps a bit dodgy, change to int if you want to do enormous + // binary operations + typedef short InternalIntType; + + /** Image dimension. */ + itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); + + typedef typename itk::FixedArray RadiusType; + + void + SetRadius(ScalarRealType radius); + itkSetMacro(Radius, RadiusType); + itkGetConstReferenceMacro(Radius, RadiusType); + + void + SetUseImageSpacing(bool g) + { + m_RectErode->SetUseImageSpacing(g); + m_RectDilate->SetUseImageSpacing(g); + m_CircErode->SetUseImageSpacing(g); + m_CircDilate->SetUseImageSpacing(g); + } + /** + * Set/Get whether the erosion is circular/rectangular - + * default is true (circular) + */ + itkSetMacro(Circular, bool); + itkGetConstReferenceMacro(Circular, bool); + itkBooleanMacro(Circular); + + /** A safe border is added to input image to avoid borders effects + * and remove it once the closing is done */ + itkSetMacro(SafeBorder, bool); + itkGetConstReferenceMacro(SafeBorder, bool); + itkBooleanMacro(SafeBorder); + + /** Image related typedefs. */ + + /* add in the traits here */ + +protected: + void + GenerateData(void); + + BinaryCloseParaImageFilter(); + virtual ~BinaryCloseParaImageFilter() {}; + void + PrintSelf(std::ostream & os, Indent indent) const; + + typedef typename itk::Image InternalRealImageType; + typedef typename itk::Image InternalIntImageType; + typedef typename itk::ParabolicErodeImageFilter CircErodeType; + typedef typename itk::ParabolicErodeImageFilter RectErodeType; + typedef typename itk::ParabolicDilateImageFilter CircDilateType; + typedef typename itk::ParabolicDilateImageFilter RectDilateType; + + typedef typename itk::GreaterEqualValImageFilter CCastTypeA; + typedef typename itk::BinaryThresholdImageFilter CCastTypeB; + + typedef typename itk::GreaterEqualValImageFilter RCastTypeA; + typedef typename itk::BinaryThresholdImageFilter RCastTypeB; + +private: + BinaryCloseParaImageFilter(const Self &); // purposely not implemented + void + operator=(const Self &); // purposely not implemented + RadiusType m_Radius; + bool m_Circular; + bool m_SafeBorder; + + typename CircErodeType::Pointer m_CircErode; + typename CircDilateType::Pointer m_CircDilate; + typename CCastTypeA::Pointer m_CircCastA; + typename CCastTypeB::Pointer m_CircCastB; + + typename RectErodeType::Pointer m_RectErode; + typename RectDilateType::Pointer m_RectDilate; + typename RCastTypeA::Pointer m_RectCastA; + typename RCastTypeB::Pointer m_RectCastB; +}; + +} // end namespace itk + +#ifndef ITK_MANUAL_INSTANTIATION +# include "itkBinaryCloseParaImageFilter.hxx" +#endif + + +#endif //__itkBinaryCloseParaImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx new file mode 100644 index 00000000000..c88aafd7d82 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx @@ -0,0 +1,227 @@ +#ifndef __itkBinaryCloseParabolicImageFilter_txx +#define __itkBinaryCloseParabolicImageFilter_txx + +#include "itkProgressAccumulator.h" +#include "itkBinaryCloseParaImageFilter.h" +#include "itkParabolicErodeImageFilter.h" +#include "itkProgressAccumulator.h" +#include "itkCropImageFilter.h" +#include "itkConstantPadImageFilter.h" +#include "vnl/vnl_math.h" + +namespace itk +{ + +template +BinaryCloseParaImageFilter::BinaryCloseParaImageFilter() +{ + this->SetNumberOfRequiredOutputs(1); + this->SetNumberOfRequiredInputs(1); + this->m_CircErode = CircErodeType::New(); + this->m_CircDilate = CircDilateType::New(); + this->m_CircCastA = CCastTypeA::New(); + this->m_CircCastB = CCastTypeB::New(); + + this->m_RectErode = RectErodeType::New(); + this->m_RectDilate = RectDilateType::New(); + this->m_RectCastA = RCastTypeA::New(); + this->m_RectCastB = RCastTypeB::New(); + this->m_Circular = true; + // Need to call this after filters are created + this->SetUseImageSpacing(false); + this->SetSafeBorder(true); +} + + +template +void +BinaryCloseParaImageFilter::SetRadius(ScalarRealType radius) +{ + RadiusType s; + s.Fill(radius); + this->SetRadius(s); +} + +template +void +BinaryCloseParaImageFilter::GenerateData(void) +{ + // Allocate the output + this->AllocateOutputs(); + // set up the scaling before we pass control over to superclass + typename TInputImage::SizeType Pad; + // ScalarRealType margin = 0.0; + + // ScalarRealType mxRad = (ScalarRealType)(*std::max_element(m_Radius.Begin(), m_Radius.End())); + // this needs to be examined more closely + // margin = 1.0/(pow(mxRad, TInputImage::ImageDimension) * 10); + // margin = std::min(margin, 0.00001); + // std::cout << "Margin = " << margin << std::endl; + + if (this->m_RectErode->GetUseImageSpacing()) + { + // radius is in mm + RadiusType R; + for (unsigned P = 0; P < InputImageType::ImageDimension; P++) + { + typename TInputImage::SpacingValueType tsp = this->GetInput()->GetSpacing()[P]; + R[P] = 0.5 * (m_Radius[P] * m_Radius[P]) + tsp * tsp; + Pad[P] = (typename TInputImage::SizeType::SizeValueType)(vnl_math_rnd_halfinttoeven(m_Radius[P] / tsp + 1) + 1); + } + m_RectErode->SetScale(R); + m_CircErode->SetScale(R); + m_RectDilate->SetScale(R); + m_CircDilate->SetScale(R); + } + else + { + // radius is in pixels + RadiusType R; + // this gives us a little bit of a margin + for (unsigned P = 0; P < InputImageType::ImageDimension; P++) + { + R[P] = (0.5 * m_Radius[P] * m_Radius[P] + 1); + Pad[P] = (typename TInputImage::SizeType::SizeValueType)(m_Radius[P] + 1); + } + // std::cout << "no image spacing " << m_Radius << R << std::endl; + m_RectErode->SetScale(R); + m_CircErode->SetScale(R); + m_RectDilate->SetScale(R); + m_CircDilate->SetScale(R); + } + + + // std::cout << "Padding " << Pad << std::endl; + + if (m_Circular) + { + ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); + progress->SetMiniPipelineFilter(this); + InputImageConstPointer inputImage; + inputImage = this->GetInput(); + + progress->RegisterInternalFilter(m_CircErode, 0.4f); + progress->RegisterInternalFilter(m_CircCastA, 0.1f); + progress->RegisterInternalFilter(m_CircDilate, 0.4f); + progress->RegisterInternalFilter(m_CircCastB, 0.1f); + + m_CircCastB->SetInput(m_CircDilate->GetOutput()); + // m_CircCastB->SetUpperThreshold(margin); + m_CircCastB->SetUpperThreshold(0); + m_CircCastB->SetOutsideValue(1); + m_CircCastB->SetInsideValue(0); + + + m_CircErode->SetInput(m_CircCastB->GetOutput()); + m_CircCastA->SetInput(m_CircErode->GetOutput()); + // m_CircCastA->SetVal(1.0-margin); + m_CircCastA->SetVal(1.0); + + if (m_SafeBorder) + { + typedef typename itk::ConstantPadImageFilter PadType; + typename PadType::Pointer pad = PadType::New(); + pad->SetPadLowerBound(Pad); + pad->SetPadUpperBound(Pad); + pad->SetConstant(0); + pad->SetInput(inputImage); + + m_CircDilate->SetInput(pad->GetOutput()); + + // writeIm(m_CircCastB->GetOutput(), "dil.nii.gz"); + // writeIm(m_CircCastA->GetOutput(), "ero.nii.gz"); + // m_CircCastA->UpdateOutputInformation(); + typedef typename itk::CropImageFilter CropType; + typename CropType::Pointer crop = CropType::New(); + crop->SetInput(m_CircCastA->GetOutput()); + crop->SetUpperBoundaryCropSize(Pad); + crop->SetLowerBoundaryCropSize(Pad); + + crop->GraftOutput(this->GetOutput()); + crop->Update(); + + this->GraftOutput(crop->GetOutput()); + } + else + { + + + m_CircDilate->SetInput(inputImage); + m_CircCastA->GraftOutput(this->GetOutput()); + m_CircCastA->Update(); + + this->GraftOutput(m_CircCastA->GetOutput()); + } + } + else + { + ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); + progress->SetMiniPipelineFilter(this); + InputImageConstPointer inputImage; + inputImage = this->GetInput(); + + progress->RegisterInternalFilter(m_RectErode, 0.4f); + progress->RegisterInternalFilter(m_RectCastA, 0.1f); + progress->RegisterInternalFilter(m_RectDilate, 0.4f); + progress->RegisterInternalFilter(m_RectCastB, 0.1f); + + m_RectCastB->SetInput(m_RectDilate->GetOutput()); + m_RectCastB->SetUpperThreshold(0); + m_RectCastB->SetOutsideValue(1); + m_RectCastB->SetInsideValue(0); + + m_RectErode->SetInput(m_RectCastB->GetOutput()); + m_RectCastA->SetInput(m_RectErode->GetOutput()); + m_RectCastA->SetVal(1); + + if (m_SafeBorder) + { + typedef typename itk::ConstantPadImageFilter PadType; + typename PadType::Pointer pad = PadType::New(); + pad->SetPadLowerBound(Pad); + pad->SetPadUpperBound(Pad); + pad->SetConstant(0); + pad->SetInput(inputImage); + + m_RectDilate->SetInput(pad->GetOutput()); + + typedef typename itk::CropImageFilter CropType; + typename CropType::Pointer crop = CropType::New(); + crop->SetInput(m_RectCastA->GetOutput()); + crop->SetUpperBoundaryCropSize(Pad); + crop->SetLowerBoundaryCropSize(Pad); + + crop->GraftOutput(this->GetOutput()); + crop->Update(); + this->GraftOutput(crop->GetOutput()); + } + else + { + m_RectDilate->SetInput(inputImage); + m_RectCastA->GraftOutput(this->GetOutput()); + m_RectCastA->Update(); + this->GraftOutput(m_RectCastA->GetOutput()); + } + } +} + + +template +void +BinaryCloseParaImageFilter::PrintSelf(std::ostream & os, Indent indent) const +{ + Superclass::PrintSelf(os, indent); + if (this->m_CircErode->GetUseImageSpacing()) + { + os << "Radius in world units: " << this->GetRadius() << std::endl; + } + else + { + os << "Radius in voxels: " << this->GetRadius() << std::endl; + } + os << "Safe border: " << this->GetSafeBorder() << std::endl; +} + + +} // namespace itk +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h new file mode 100644 index 00000000000..cc4696a0c6a --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h @@ -0,0 +1,144 @@ +#ifndef __itkBinaryDilateParaImageFilter_h +#define __itkBinaryDilateParaImageFilter_h + +#include "itkParabolicDilateImageFilter.h" +#include "itkBinaryThresholdImageFilter.h" + +namespace itk +{ + +/** + * \class BinaryDilateParaImageFilter + * \brief Class for binary morphological erosion operation. + * + * This class uses the parabolic morphology operations to do very + * efficient erosions by circles/spheres. The operations are efficient + * because the underlying parabolic operations are separable and + * the operations are implicitly short circuited in comparison to a + * full distance transform approach. + * + * The basic idea is that a binary erosion or dilation by a circle/sphere + * can be carried out by thresholding a distance transform. By using + * the parabolic filters we can avoid computing the entire distance + * transform and instead only compute the subset we are interested + * in. + * + * Note that the circles and spheres may not be quite what you + * expect, because this class doesn't explicitly use Bresenham circles + * as most of the others do. A voxel's centre needs to be less than or + * equal to the circle radius, rather than any part of the voxel + * inside the circle. + * + * This filter was developed as a result of discussions with + * M.Starring on the ITK mailing list. + * + * \sa itkParabolicDilateImageFilter + * + * \author Richard Beare, Department of Medicine, Monash University, + * Australia. + **/ + + +template +class ITK_EXPORT BinaryDilateParaImageFilter : public ImageToImageFilter + +{ + +public: + /** Standard class typedefs. */ + typedef BinaryDilateParaImageFilter Self; + typedef ImageToImageFilter Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Runtime information support. */ + itkTypeMacro(BinaryDilateParaImageFilter, ImageToImageFilter); + + + /** Pixel Type of the input image */ + typedef TInputImage InputImageType; + typedef TOutputImage OutputImageType; + typedef typename TInputImage::PixelType PixelType; + typedef typename NumericTraits::RealType RealType; + typedef typename NumericTraits::ScalarRealType ScalarRealType; + typedef typename TOutputImage::PixelType OutputPixelType; + + /** Smart pointer typedef support. */ + typedef typename TInputImage::Pointer InputImagePointer; + typedef typename TInputImage::ConstPointer InputImageConstPointer; + + typedef typename NumericTraits::FloatType InternalRealType; + // perhaps a bit dodgy, change to int if you want to do enormous + // binary operations + typedef short InternalIntType; + + /** Image dimension. */ + itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); + + typedef typename itk::FixedArray RadiusType; + + void + SetRadius(ScalarRealType radius); + itkSetMacro(Radius, RadiusType); + itkGetConstReferenceMacro(Radius, RadiusType); + + virtual void + Modified() const; + + void + SetUseImageSpacing(bool g) + { + m_RectPara->SetUseImageSpacing(g); + m_CircPara->SetUseImageSpacing(g); + } + /** + * Set/Get whether the erosion is circular/rectangular - + * default is true (circular) + */ + itkSetMacro(Circular, bool); + itkGetConstReferenceMacro(Circular, bool); + itkBooleanMacro(Circular); + /** Image related typedefs. */ + + /* add in the traits here */ + +protected: + void + GenerateData(void); + + BinaryDilateParaImageFilter(); + virtual ~BinaryDilateParaImageFilter() {}; + void + PrintSelf(std::ostream & os, Indent indent) const; + + typedef typename itk::Image InternalRealImageType; + typedef typename itk::Image InternalIntImageType; + typedef typename itk::ParabolicDilateImageFilter CircParabolicType; + typedef typename itk::ParabolicDilateImageFilter RectParabolicType; + typedef typename itk::BinaryThresholdImageFilter CCastType; + typedef typename itk::BinaryThresholdImageFilter RCastType; + +private: + BinaryDilateParaImageFilter(const Self &); // purposely not implemented + void + operator=(const Self &); // purposely not implemented + RadiusType m_Radius; + bool m_Circular; + typename CircParabolicType::Pointer m_CircPara; + typename CCastType::Pointer m_CircCast; + + typename RectParabolicType::Pointer m_RectPara; + typename RCastType::Pointer m_RectCast; +}; + +} // end namespace itk + +#ifndef ITK_MANUAL_INSTANTIATION +# include "itkBinaryDilateParaImageFilter.hxx" +#endif + + +#endif //__itkBinaryDilateParaImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx new file mode 100644 index 00000000000..27be9e7e141 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx @@ -0,0 +1,144 @@ +#ifndef __itkBinaryDilateParabolicImageFilter_txx +#define __itkBinaryDilateParabolicImageFilter_txx + +#include "itkProgressAccumulator.h" +#include "itkBinaryDilateParaImageFilter.h" +#include "itkParabolicDilateImageFilter.h" +#include "itkProgressAccumulator.h" + +namespace itk +{ + +template +BinaryDilateParaImageFilter::BinaryDilateParaImageFilter() +{ + this->SetNumberOfRequiredOutputs(1); + this->SetNumberOfRequiredInputs(1); + this->m_CircPara = CircParabolicType::New(); + this->m_CircCast = CCastType::New(); + + this->m_RectPara = RectParabolicType::New(); + this->m_RectCast = RCastType::New(); + this->m_Circular = true; + // Need to call this after filters are created + this->SetUseImageSpacing(false); +} + + +template +void +BinaryDilateParaImageFilter::SetRadius(ScalarRealType radius) +{ + RadiusType s; + s.Fill(radius); + this->SetRadius(s); +} + +template +void +BinaryDilateParaImageFilter::GenerateData(void) +{ + // Allocate the output + this->AllocateOutputs(); + // set up the scaling before we pass control over to superclass + if (this->m_RectPara->GetUseImageSpacing()) + { + // radius is in mm + RadiusType R; + for (unsigned P = 0; P < InputImageType::ImageDimension; P++) + { + R[P] = 0.5 * m_Radius[P] * m_Radius[P]; + // this->SetScale(0.5*m_Radius[P] * m_Radius[P]); + } + m_RectPara->SetScale(R); + m_CircPara->SetScale(R); + } + else + { + // radius is in pixels + RadiusType R; + // this gives us a little bit of a margin + for (unsigned P = 0; P < InputImageType::ImageDimension; P++) + { + R[P] = (0.5 * m_Radius[P] * m_Radius[P] + 1); + } + // std::cout << "no image spacing " << m_Radius << R << std::endl; + m_RectPara->SetScale(R); + m_CircPara->SetScale(R); + } + + + if (m_Circular) + { + ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); + progress->SetMiniPipelineFilter(this); + InputImageConstPointer inputImage; + inputImage = this->GetInput(); + + progress->RegisterInternalFilter(m_CircPara, 0.8f); + progress->RegisterInternalFilter(m_CircCast, 0.2f); + + m_CircPara->SetInput(inputImage); + m_CircCast->SetInput(m_CircPara->GetOutput()); + // m_CircCast->SetInsideValue(0); + // m_CircCast->SetOutsideValue(1); + // setting the correct threshold value is a little tricky - needs would + // to produce a result matching a bresenham circle, but these + // circles are such that the voxel centres need to be less than radius + m_CircCast->SetUpperThreshold(0); + m_CircCast->SetOutsideValue(1); + m_CircCast->SetInsideValue(0); + m_CircCast->GraftOutput(this->GetOutput()); + m_CircCast->Update(); + this->GraftOutput(m_CircCast->GetOutput()); + } + else + { + ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); + progress->SetMiniPipelineFilter(this); + InputImageConstPointer inputImage; + inputImage = this->GetInput(); + + progress->RegisterInternalFilter(m_RectPara, 0.8f); + progress->RegisterInternalFilter(m_RectCast, 0.2f); + + m_RectPara->SetInput(inputImage); + m_RectCast->SetInput(m_RectPara->GetOutput()); + m_RectCast->SetUpperThreshold(0); + m_RectCast->SetOutsideValue(1); + m_RectCast->SetInsideValue(0); + m_RectCast->GraftOutput(this->GetOutput()); + m_RectCast->Update(); + this->GraftOutput(m_RectCast->GetOutput()); + } +} + +template +void +BinaryDilateParaImageFilter::Modified() const +{ + Superclass::Modified(); + m_CircPara->Modified(); + m_CircCast->Modified(); + m_RectPara->Modified(); + m_RectCast->Modified(); +} + +template +void +BinaryDilateParaImageFilter::PrintSelf(std::ostream & os, Indent indent) const +{ + Superclass::PrintSelf(os, indent); + if (this->m_CircPara->GetUseImageSpacing()) + { + os << "Radius in world units: " << this->GetRadius() << std::endl; + } + else + { + os << "Radius in voxels: " << this->GetRadius() << std::endl; + } +} + + +} // namespace itk +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h new file mode 100644 index 00000000000..62f7dfe26ac --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h @@ -0,0 +1,143 @@ +#ifndef __itkBinaryErodeParaImageFilter_h +#define __itkBinaryErodeParaImageFilter_h + +#include "itkParabolicErodeImageFilter.h" +#include "itkGreaterEqualValImageFilter.h" + +namespace itk +{ + +/** + * \class BinaryErodeParaImageFilter + * \brief Class for binary morphological erosion operation. + * + * This class uses the parabolic morphology operations to do very + * efficient erosions by circles/spheres. The operations are efficient + * because the underlying parabolic operations are separable and + * the operations are implicitly short circuited in comparison to a + * full distance transform approach. + * + * The basic idea is that a binary erosion or dilation by a circle/sphere + * can be carried out by thresholding a distance transform. By using + * the parabolic filters we can avoid computing the entire distance + * transform and instead only compute the subset we are interested + * in. + * + * Note that the circles and spheres may not be quite what you + * expect, because this class doesn't explicitly use Bresenham circles + * as most of the others do. A voxel's centre needs to be less than or + * equal to the circle radius, rather than any part of the voxel + * inside the circle. + * + * This filter was developed as a result of discussions with + * M.Starring on the ITK mailing list. + * + * \sa itkParabolicErodeImageFilter + * + * \author Richard Beare, Department of Medicine, Monash University, + * Australia. + **/ + + +template +class ITK_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilter + +{ + +public: + /** Standard class typedefs. */ + typedef BinaryErodeParaImageFilter Self; + typedef ImageToImageFilter Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Runtime information support. */ + itkTypeMacro(BinaryErodeParaImageFilter, ImageToImageFilter); + + + /** Pixel Type of the input image */ + typedef TInputImage InputImageType; + typedef TOutputImage OutputImageType; + typedef typename TInputImage::PixelType PixelType; + typedef typename NumericTraits::RealType RealType; + typedef typename NumericTraits::ScalarRealType ScalarRealType; + typedef typename TOutputImage::PixelType OutputPixelType; + + /** Smart pointer typedef support. */ + typedef typename TInputImage::Pointer InputImagePointer; + typedef typename TInputImage::ConstPointer InputImageConstPointer; + + typedef typename NumericTraits::FloatType InternalRealType; + // perhaps a bit dodgy, change to int if you want to do enormous + // binary operations + typedef short InternalIntType; + + /** Image dimension. */ + itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); + + typedef typename itk::FixedArray RadiusType; + + void + SetRadius(ScalarRealType radius); + itkSetMacro(Radius, RadiusType); + itkGetConstReferenceMacro(Radius, RadiusType); + + void + SetUseImageSpacing(bool g) + { + m_RectPara->SetUseImageSpacing(g); + m_CircPara->SetUseImageSpacing(g); + } + /** + * Set/Get whether the erosion is circular/rectangular - + * default is true (circular) + */ + itkSetMacro(Circular, bool); + itkGetConstReferenceMacro(Circular, bool); + itkBooleanMacro(Circular); + /** Image related typedefs. */ + + /* add in the traits here */ + virtual void + Modified() const; + +protected: + void + GenerateData(void); + + BinaryErodeParaImageFilter(); + virtual ~BinaryErodeParaImageFilter() {}; + void + PrintSelf(std::ostream & os, Indent indent) const; + + typedef typename itk::Image InternalRealImageType; + typedef typename itk::Image InternalIntImageType; + typedef typename itk::ParabolicErodeImageFilter CircParabolicType; + typedef typename itk::ParabolicErodeImageFilter RectParabolicType; + typedef typename itk::GreaterEqualValImageFilter CCastType; + typedef typename itk::GreaterEqualValImageFilter RCastType; + +private: + BinaryErodeParaImageFilter(const Self &); // purposely not implemented + void + operator=(const Self &); // purposely not implemented + RadiusType m_Radius; + bool m_Circular; + typename CircParabolicType::Pointer m_CircPara; + typename CCastType::Pointer m_CircCast; + + typename RectParabolicType::Pointer m_RectPara; + typename RCastType::Pointer m_RectCast; +}; + +} // end namespace itk + +#ifndef ITK_MANUAL_INSTANTIATION +# include "itkBinaryErodeParaImageFilter.txx" +#endif + + +#endif //__itkBinaryErodeParaImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx new file mode 100644 index 00000000000..90715356e70 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx @@ -0,0 +1,143 @@ +#ifndef __itkBinaryErodeParabolicImageFilter_txx +#define __itkBinaryErodeParabolicImageFilter_txx + +#include "itkProgressAccumulator.h" +#include "itkBinaryErodeParaImageFilter.h" +#include "itkParabolicErodeImageFilter.h" +#include "itkProgressAccumulator.h" + +namespace itk +{ + +template +BinaryErodeParaImageFilter::BinaryErodeParaImageFilter() +{ + this->SetNumberOfRequiredOutputs(1); + this->SetNumberOfRequiredInputs(1); + this->m_CircPara = CircParabolicType::New(); + this->m_CircCast = CCastType::New(); + + this->m_RectPara = RectParabolicType::New(); + this->m_RectCast = RCastType::New(); + this->m_Circular = true; + // Need to call this after filters are created + this->SetUseImageSpacing(false); +} + + +template +void +BinaryErodeParaImageFilter::SetRadius(ScalarRealType radius) +{ + RadiusType s; + s.Fill(radius); + this->SetRadius(s); +} + +template +void +BinaryErodeParaImageFilter::GenerateData(void) +{ + // Allocate the output + this->AllocateOutputs(); + // set up the scaling before we pass control over to superclass + if (this->m_RectPara->GetUseImageSpacing()) + { + // radius is in mm + RadiusType R; + for (unsigned P = 0; P < InputImageType::ImageDimension; P++) + { + R[P] = 0.5 * m_Radius[P] * m_Radius[P]; + // this->SetScale(0.5*m_Radius[P] * m_Radius[P]); + } + m_RectPara->SetScale(R); + m_CircPara->SetScale(R); + } + else + { + // radius is in pixels + RadiusType R; + // this gives us a little bit of a margin + for (unsigned P = 0; P < InputImageType::ImageDimension; P++) + { + R[P] = (0.5 * m_Radius[P] * m_Radius[P] + 1); + } + // std::cout << "no image spacing " << m_Radius << R << std::endl; + m_RectPara->SetScale(R); + m_CircPara->SetScale(R); + } + + + if (m_Circular) + { + ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); + progress->SetMiniPipelineFilter(this); + InputImageConstPointer inputImage; + inputImage = this->GetInput(); + + progress->RegisterInternalFilter(m_CircPara, 0.8f); + progress->RegisterInternalFilter(m_CircCast, 0.2f); + + m_CircPara->SetInput(inputImage); + m_CircCast->SetInput(m_CircPara->GetOutput()); + m_CircCast->SetVal(1.0); + // m_CircCast->SetInsideValue(0); + // m_CircCast->SetOutsideValue(1); + // setting the correct threshold value is a little tricky - needs would + // to produce a result matching a bresenham circle, but these + // circles are such that the voxel centres need to be less than radius + // m_CircCast->SetUpperThreshold(1 - itk::NumericTraits::min()); + // m_CircCast->SetUpperThreshold(0.99); + + m_CircCast->GraftOutput(this->GetOutput()); + m_CircCast->Update(); + this->GraftOutput(m_CircCast->GetOutput()); + } + else + { + ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); + progress->SetMiniPipelineFilter(this); + InputImageConstPointer inputImage; + inputImage = this->GetInput(); + + progress->RegisterInternalFilter(m_RectPara, 0.8f); + progress->RegisterInternalFilter(m_RectCast, 0.2f); + + m_RectPara->SetInput(inputImage); + m_RectCast->SetInput(m_RectPara->GetOutput()); + m_RectCast->SetVal(1); + m_RectCast->GraftOutput(this->GetOutput()); + m_RectCast->Update(); + this->GraftOutput(m_RectCast->GetOutput()); + } +} + + +template +void +BinaryErodeParaImageFilter::PrintSelf(std::ostream & os, Indent indent) const +{ + Superclass::PrintSelf(os, indent); + if (this->m_CircPara->GetUseImageSpacing()) + { + os << "Radius in world units: " << this->GetRadius() << std::endl; + } + else + { + os << "Radius in voxels: " << this->GetRadius() << std::endl; + } +} + +template +void +BinaryErodeParaImageFilter::Modified() const +{ + Superclass::Modified(); + m_CircPara->Modified(); + m_CircCast->Modified(); + m_RectPara->Modified(); + m_RectCast->Modified(); +} + +} // namespace itk +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h new file mode 100644 index 00000000000..551df5a296e --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h @@ -0,0 +1,164 @@ +#ifndef __itkBinaryOpenParaImageFilter_h +#define __itkBinaryOpenParaImageFilter_h + +#include "itkParabolicErodeImageFilter.h" +#include "itkParabolicDilateImageFilter.h" +#include "itkGreaterEqualValImageFilter.h" +#include "itkBinaryThresholdImageFilter.h" + +namespace itk +{ + +/** + * \class BinaryOpenParaImageFilter + * \brief Class for binary morphological opening operation. + * + * This class uses the parabolic morphology operations to do very + * efficient erosions by circles/spheres. The operations are efficient + * because the underlying parabolic operations are separable and + * the operations are implicitly short circuited in comparison to a + * full distance transform approach. + * + * The basic idea is that a binary erosion or dilation by a circle/sphere + * can be carried out by thresholding a distance transform. By using + * the parabolic filters we can avoid computing the entire distance + * transform and instead only compute the subset we are interested + * in. + * + * Note that the circles and spheres may not be quite what you + * expect, because this class doesn't explicitly use Bresenham circles + * as most of the others do. A voxel's centre needs to be less than or + * equal to the circle radius, rather than any part of the voxel + * inside the circle. + * + * This filter was developed as a result of discussions with + * M.Starring on the ITK mailing list. + * + * \sa itkParabolicErodeImageFilter + * + * \author Richard Beare, Department of Medicine, Monash University, + * Australia. + **/ + + +template +class ITK_EXPORT BinaryOpenParaImageFilter : public ImageToImageFilter + +{ + +public: + /** Standard class typedefs. */ + typedef BinaryOpenParaImageFilter Self; + typedef ImageToImageFilter Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Runtime information support. */ + itkTypeMacro(BinaryOpenParaImageFilter, ImageToImageFilter); + + + /** Pixel Type of the input image */ + typedef TInputImage InputImageType; + typedef TOutputImage OutputImageType; + typedef typename TInputImage::PixelType PixelType; + typedef typename NumericTraits::RealType RealType; + typedef typename NumericTraits::ScalarRealType ScalarRealType; + typedef typename TOutputImage::PixelType OutputPixelType; + + /** Smart pointer typedef support. */ + typedef typename TInputImage::Pointer InputImagePointer; + typedef typename TInputImage::ConstPointer InputImageConstPointer; + + typedef typename NumericTraits::FloatType InternalRealType; + // perhaps a bit dodgy, change to int if you want to do enormous + // binary operations + typedef short InternalIntType; + + /** Image dimension. */ + itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); + + typedef typename itk::FixedArray RadiusType; + + void + SetRadius(ScalarRealType radius); + itkSetMacro(Radius, RadiusType); + itkGetConstReferenceMacro(Radius, RadiusType); + + void + SetUseImageSpacing(bool g) + { + m_RectErode->SetUseImageSpacing(g); + m_RectDilate->SetUseImageSpacing(g); + m_CircErode->SetUseImageSpacing(g); + m_CircDilate->SetUseImageSpacing(g); + } + /** + * Set/Get whether the erosion is circular/rectangular - + * default is true (circular) + */ + itkSetMacro(Circular, bool); + itkGetConstReferenceMacro(Circular, bool); + itkBooleanMacro(Circular); + + /** A safe border is added to input image to avoid borders effects + * and remove it once the closing is done */ + itkSetMacro(SafeBorder, bool); + itkGetConstReferenceMacro(SafeBorder, bool); + itkBooleanMacro(SafeBorder); + + /** Image related typedefs. */ + + /* add in the traits here */ + +protected: + void + GenerateData(void); + + BinaryOpenParaImageFilter(); + virtual ~BinaryOpenParaImageFilter() {}; + void + PrintSelf(std::ostream & os, Indent indent) const; + + typedef typename itk::Image InternalRealImageType; + typedef typename itk::Image InternalIntImageType; + typedef typename itk::ParabolicErodeImageFilter CircErodeType; + typedef typename itk::ParabolicErodeImageFilter RectErodeType; + typedef typename itk::ParabolicDilateImageFilter CircDilateType; + typedef typename itk::ParabolicDilateImageFilter RectDilateType; + + typedef typename itk::GreaterEqualValImageFilter CCastTypeA; + typedef typename itk::BinaryThresholdImageFilter CCastTypeB; + + typedef typename itk::GreaterEqualValImageFilter RCastTypeA; + typedef typename itk::BinaryThresholdImageFilter RCastTypeB; + +private: + BinaryOpenParaImageFilter(const Self &); // purposely not implemented + void + operator=(const Self &); // purposely not implemented + RadiusType m_Radius; + bool m_Circular; + bool m_SafeBorder; + + typename CircErodeType::Pointer m_CircErode; + typename CircDilateType::Pointer m_CircDilate; + typename CCastTypeA::Pointer m_CircCastA; + typename CCastTypeB::Pointer m_CircCastB; + + typename RectErodeType::Pointer m_RectErode; + typename RectDilateType::Pointer m_RectDilate; + typename RCastTypeA::Pointer m_RectCastA; + typename RCastTypeB::Pointer m_RectCastB; +}; + +} // end namespace itk + +#ifndef ITK_MANUAL_INSTANTIATION +# include "itkBinaryOpenParaImageFilter.hxx" +#endif + + +#endif //__itkBinaryOpenParaImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx new file mode 100644 index 00000000000..352970df95b --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx @@ -0,0 +1,245 @@ +#ifndef __itkBinaryOpenParabolicImageFilter_txx +#define __itkBinaryOpenParabolicImageFilter_txx + +#include "itkProgressAccumulator.h" +#include "itkBinaryOpenParaImageFilter.h" +#include "itkParabolicErodeImageFilter.h" +#include "itkProgressAccumulator.h" +#include "itkCropImageFilter.h" +#include "itkConstantPadImageFilter.h" +#include "vnl/vnl_math.h" + +namespace itk +{ + +template +BinaryOpenParaImageFilter::BinaryOpenParaImageFilter() +{ + this->SetNumberOfRequiredOutputs(1); + this->SetNumberOfRequiredInputs(1); + this->m_CircErode = CircErodeType::New(); + this->m_CircDilate = CircDilateType::New(); + this->m_CircCastA = CCastTypeA::New(); + this->m_CircCastB = CCastTypeB::New(); + + this->m_RectErode = RectErodeType::New(); + this->m_RectDilate = RectDilateType::New(); + this->m_RectCastA = RCastTypeA::New(); + this->m_RectCastB = RCastTypeB::New(); + this->m_Circular = true; + // Need to call this after filters are created + this->SetUseImageSpacing(false); + this->SetSafeBorder(true); +} + + +template +void +BinaryOpenParaImageFilter::SetRadius(ScalarRealType radius) +{ + RadiusType s; + s.Fill(radius); + this->SetRadius(s); +} + +template +void +BinaryOpenParaImageFilter::GenerateData(void) +{ + // Allocate the output + this->AllocateOutputs(); + typename TInputImage::SizeType Pad; + + // numerical errors do seem to build up, so we need a margin on the + // thresholding steps. + // ScalarRealType margin = 0.0; + + // ScalarRealType mxRad = (ScalarRealType)(*std::max_element(m_Radius.Begin(), m_Radius.End())); + // // this needs to be examined more closely + // margin = 1.0/(pow(mxRad, TInputImage::ImageDimension) * 10); + // margin = std::min(margin, 0.00001); + // set up the scaling before we pass control over to superclass + if (this->m_RectErode->GetUseImageSpacing()) + { + // radius is in mm - need to do an adjustment to make sure that we + // end up with an odd number of voxels for the radius + RadiusType R; + for (unsigned P = 0; P < InputImageType::ImageDimension; P++) + { + typename TInputImage::SpacingValueType tsp = this->GetInput()->GetSpacing()[P]; + + // int thisvox=(int)round(m_Radius[P]/this->GetInput()->GetSpacing()[P]); + // if (thisvox % 2 == 0) ++thisvox; + // std::cout << thisvox << std::endl; + // float thisRad = thisvox * this->GetInput()->GetSpacing()[P]; + // R[P] = 0.5 * thisRad * thisRad + + // this->GetInput()->GetSpacing()[P]; + R[P] = 0.5 * (m_Radius[P] * m_Radius[P]) + tsp * tsp; + Pad[P] = (typename TInputImage::SizeType::SizeValueType)(vnl_math_rnd_halfinttoeven(m_Radius[P] / tsp) + 2); + } + m_RectErode->SetScale(R); + m_CircErode->SetScale(R); + m_RectDilate->SetScale(R); + m_CircDilate->SetScale(R); + } + else + { + // radius is in pixels + RadiusType R; + // this gives us a little bit of a margin + for (unsigned P = 0; P < InputImageType::ImageDimension; P++) + { + R[P] = (0.5 * m_Radius[P] * m_Radius[P] + 1); + Pad[P] = (typename TInputImage::SizeType::SizeValueType)m_Radius[P] + 1; + } + // std::cout << "no image spacing " << m_Radius << R << std::endl; + std::cout << Pad << R << std::endl; + m_RectErode->SetScale(R); + m_CircErode->SetScale(R); + m_RectDilate->SetScale(R); + m_CircDilate->SetScale(R); + } + + + if (m_Circular) + { + ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); + progress->SetMiniPipelineFilter(this); + InputImageConstPointer inputImage; + inputImage = this->GetInput(); + + progress->RegisterInternalFilter(m_CircErode, 0.4f); + progress->RegisterInternalFilter(m_CircCastA, 0.1f); + progress->RegisterInternalFilter(m_CircDilate, 0.4f); + progress->RegisterInternalFilter(m_CircCastB, 0.1f); + + m_CircCastA->SetInput(m_CircErode->GetOutput()); + // m_CircCastA->SetVal(1.0 - margin); + m_CircCastA->SetVal(1.0); + + m_CircDilate->SetInput(m_CircCastA->GetOutput()); + + m_CircCastB->SetInput(m_CircDilate->GetOutput()); + m_CircCastB->SetUpperThreshold(0.0); + m_CircCastB->SetOutsideValue(1); + m_CircCastB->SetInsideValue(0); + + if (m_SafeBorder) + { + typedef typename itk::ConstantPadImageFilter PadType; + typename PadType::Pointer pad = PadType::New(); + pad->SetPadLowerBound(Pad); + pad->SetPadUpperBound(Pad); + pad->SetConstant(1); + pad->SetInput(inputImage); + m_CircErode->SetInput(pad->GetOutput()); + typedef typename itk::CropImageFilter CropType; + typename CropType::Pointer crop = CropType::New(); + crop->SetInput(m_CircCastB->GetOutput()); + crop->SetUpperBoundaryCropSize(Pad); + crop->SetLowerBoundaryCropSize(Pad); + + crop->GraftOutput(this->GetOutput()); + crop->Update(); + this->GraftOutput(crop->GetOutput()); + } + else + { + m_CircErode->SetInput(inputImage); + + m_CircCastB->GraftOutput(this->GetOutput()); + m_CircCastB->Update(); + this->GraftOutput(m_CircCastB->GetOutput()); + } + } + else + { + ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); + progress->SetMiniPipelineFilter(this); + InputImageConstPointer inputImage; + inputImage = this->GetInput(); + + progress->RegisterInternalFilter(m_RectErode, 0.4f); + progress->RegisterInternalFilter(m_RectCastA, 0.1f); + progress->RegisterInternalFilter(m_RectDilate, 0.4f); + progress->RegisterInternalFilter(m_RectCastB, 0.1f); + + m_RectCastA->SetInput(m_RectErode->GetOutput()); + m_RectCastA->SetVal(1); + + m_RectDilate->SetInput(m_RectCastA->GetOutput()); + + m_RectCastB->SetInput(m_RectDilate->GetOutput()); + m_RectCastB->SetUpperThreshold(0); + m_RectCastB->SetOutsideValue(1); + m_RectCastB->SetInsideValue(0); + + if (m_SafeBorder) + { + typedef typename itk::ConstantPadImageFilter PadType; + typename PadType::Pointer pad = PadType::New(); + pad->SetPadLowerBound(Pad); + pad->SetPadUpperBound(Pad); + pad->SetConstant(1); + pad->SetInput(inputImage); + m_RectErode->SetInput(pad->GetOutput()); + + typedef typename itk::CropImageFilter CropType; + typename CropType::Pointer crop = CropType::New(); + crop->SetInput(m_RectCastB->GetOutput()); + crop->SetUpperBoundaryCropSize(Pad); + crop->SetLowerBoundaryCropSize(Pad); + + crop->GraftOutput(this->GetOutput()); + crop->Update(); + this->GraftOutput(crop->GetOutput()); + } + else + { + m_RectErode->SetInput(inputImage); + m_RectCastB->GraftOutput(this->GetOutput()); + m_RectCastB->Update(); + + this->GraftOutput(m_RectCastB->GetOutput()); + } + } +} + + +template +void +BinaryOpenParaImageFilter::PrintSelf(std::ostream & os, Indent indent) const +{ + Superclass::PrintSelf(os, indent); + if (this->m_Circular) + { + os << "Circular opening, "; + } + else + { + os << "Rectangular opening, "; + } + + if (this->m_SafeBorder) + { + + os << "safe border" << std::endl; + } + else + { + os << "unsafe border" << std::endl; + } + + if (this->m_CircErode->GetUseImageSpacing()) + { + os << "Radius in world units: " << this->GetRadius() << std::endl; + } + else + { + os << "Radius in voxels: " << this->GetRadius() << std::endl; + } +} + + +} // namespace itk +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h new file mode 100644 index 00000000000..6fd8fa263e2 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h @@ -0,0 +1,96 @@ +#ifndef __itkGreaterEqualValImageFilter_h +#define __itkGreaterEqualValImageFilter_h + +namespace itk +{ + +/** \class GreaterEqualValImageFilter + * \brief Computes the absolute difference between an image and a + * constant. Can be done with ShiftScale and AbsIamgeFilters. + */ + + +namespace Function +{ + +template +class GEConst +{ +public: + GEConst() { m_Val = (TInput)0.0; } + void + SetVal(const TInput i) + { + m_Val = i; + } + + ~GEConst() {} + bool + operator!=(const GEConst &) const + { + return false; + } + bool + operator==(const GEConst & other) const + { + return !(*this != other); + } + inline TOutput + operator()(const TInput & A) + { + return static_cast(A >= m_Val); + } + +private: + TInput m_Val; +}; +} // namespace Function + +template +class ITK_EXPORT GreaterEqualValImageFilter + : public UnaryFunctorImageFilter> +{ +public: + /** Standard class typedefs. */ + typedef GreaterEqualValImageFilter Self; + typedef UnaryFunctorImageFilter> + Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + void + SetVal(typename TInputImage::PixelType val) + { + this->GetFunctor().SetVal(val); + this->Modified(); + } + + +#ifdef ITK_USE_CONCEPT_CHECKING + /** Begin concept checking */ + itkConceptMacro(InputConvertibleToDoubleCheck, (Concept::Convertible)); + itkConceptMacro(DoubleConvertibleToOutputCheck, (Concept::Convertible)); + /** End concept checking */ +#endif + +protected: + GreaterEqualValImageFilter() {} + virtual ~GreaterEqualValImageFilter() {} + +private: + GreaterEqualValImageFilter(const Self &); // purposely not implemented + void + operator=(const Self &); // purposely not implemented +}; + +} // end namespace itk + + +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h new file mode 100644 index 00000000000..8b368872619 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h @@ -0,0 +1,128 @@ +#ifndef __itkMorphSDTHelperImageFilter_h +#define __itkMorphSDTHelperImageFilter_h + +#include "itkTernaryFunctorImageFilter.h" +#include "vnl/vnl_math.h" + +namespace itk +{ + +/** \class MorphSDTHelperImageFilter + * \brief Implements a pixel-wise operator to form a signed distance transform. + * + * Numeric conversions (castings) are done by the C++ defaults. + * + * \ingroup IntensityImageFilters Multithreaded + */ +namespace Function +{ + +template +class MorphSDTHelper +{ +public: + MorphSDTHelper() {} + ~MorphSDTHelper() {} + void + SetVal(double i) + { + m_Val = i; + } + bool + operator!=(const MorphSDTHelper &) const + { + return false; + } + bool + operator==(const MorphSDTHelper & other) const + { + return !(*this != other); + } + inline TOutput + operator()(const TInput1 & A, const TInput2 & B, const TInput3 & C) + { + // A should be the output of the erosion, B the dilation, C the mask + if (C > 0) + { + // inside the mask + return static_cast(vcl_sqrt((double)A + m_Val)); + } + else + { + // outside the mask + return static_cast(-vcl_sqrt(m_Val - (double)B)); + } + } + +private: + double m_Val; +}; +} // namespace Function + +template +class ITK_EXPORT MorphSDTHelperImageFilter + : public TernaryFunctorImageFilter> +{ +public: + /** Standard class typedefs. */ + typedef MorphSDTHelperImageFilter Self; + typedef TernaryFunctorImageFilter> + Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Runtime information support. */ + itkTypeMacro(MorphSDTHelperImageFilter, TernaryFunctorImageFilter); + + void + SetVal(double val) + { + this->GetFunctor().SetVal(val); + this->Modified(); + } + +#ifdef ITK_USE_CONCEPT_CHECKING + /** Begin concept checking */ + itkConceptMacro(Input1ConvertibleToOutputCheck, + (Concept::Convertible)); + itkConceptMacro(Input2ConvertibleToOutputCheck, + (Concept::Convertible)); + itkConceptMacro(GreaterThanComparable, + (Concept::GreaterThanComparable)); + /** End concept checking */ +#endif + +protected: + MorphSDTHelperImageFilter() {} + virtual ~MorphSDTHelperImageFilter() {} + +private: + MorphSDTHelperImageFilter(const Self &); // purposely not implemented + void + operator=(const Self &); // purposely not implemented +}; + +} // end namespace itk + + +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h new file mode 100644 index 00000000000..04ae26ea6c5 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h @@ -0,0 +1,145 @@ +#ifndef __itkMorphologicalDistanceTransformImageFilter_h +#define __itkMorphologicalDistanceTransformImageFilter_h + +#include "itkImageToImageFilter.h" +#include "itkProgressReporter.h" + +#include "itkBinaryThresholdImageFilter.h" +#include "itkParabolicErodeImageFilter.h" +#include "itkSqrtImageFilter.h" + +namespace itk +{ +/** + * \class MorphologicalDistanceTransformImageFilter + * \brief Distance transform of a mask using parabolic morphological + * methods + * + * Morphological erosions using a parabolic structuring element can be + * used to compute a distance transform of a mask by setting the + * "Outside" value to 0 and the "inside" value to +infinity. The + * output of the parabolic erosion are the square of the distance to + * the nearest zero valued voxel. Thus we can compute the distance + * transform by taking the sqrt of the erosion. + * + * The output pixel type needs to support values as large as the + * square of the largest value of the distance - just use float to be + * safe. + * + * \author Richard Beare, Monash University, Department of Medicine, + * Melbourne, Australia. + * + **/ + + +template +class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImageFilter +{ +public: + /** Standard class typedefs. */ + typedef MorphologicalDistanceTransformImageFilter Self; + typedef ImageToImageFilter Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Runtime information support. */ + itkTypeMacro(MorphologicalDistanceTransformImageFilter, ImageToImageFilter); + + + /** Pixel Type of the input image */ + typedef TInputImage InputImageType; + typedef TOutputImage OutputImageType; + typedef typename TInputImage::PixelType InputPixelType; + typedef typename NumericTraits::RealType RealType; + typedef typename NumericTraits::ScalarRealType ScalarRealType; + typedef typename TOutputImage::PixelType OutputPixelType; + + /** Smart pointer typedef support. */ + typedef typename TInputImage::Pointer InputImagePointer; + typedef typename TInputImage::ConstPointer InputImageConstPointer; + + /** Image related typedefs. */ + itkStaticConstMacro(OutputImageDimension, unsigned int, TOutputImage::ImageDimension); + itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension); + itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); + + /** a type to represent the "kernel radius" */ + typedef typename itk::FixedArray RadiusType; + virtual void + Modified() const; + + /** this describes the input mask - default value 0 - we compute the + distance from all voxels with value not equal to "OutsideValue" to + the nearest voxel with value "OutsideValue" */ + itkSetMacro(OutsideValue, InputPixelType); + itkGetConstReferenceMacro(OutsideValue, InputPixelType); + + + /** Is the transform in world or voxel units - default is world */ + void + SetUseImageSpacing(bool uis) + { + m_Erode->SetUseImageSpacing(uis); + } + + + const bool + GetUseImageSpacing() + { + return m_Erode->GetUseImageSpacing(); + } + + itkSetMacro(SqrDist, bool); + itkGetConstReferenceMacro(SqrDist, bool); + itkBooleanMacro(SqrDist); + + +#ifdef ITK_USE_CONCEPT_CHECKING + /** Begin concept checking */ + itkConceptMacro(SameDimension, + (Concept::SameDimension)); + + itkConceptMacro(Comparable, (Concept::Comparable)); + + /** End concept checking */ +#endif + + +protected: + MorphologicalDistanceTransformImageFilter(); + virtual ~MorphologicalDistanceTransformImageFilter() {}; + void + PrintSelf(std::ostream & os, Indent indent) const; + + /** Generate Data */ + void + GenerateData(void); + + // do everything in the output image type, which should have high precision + typedef typename itk::BinaryThresholdImageFilter ThreshType; + typedef typename itk::ParabolicErodeImageFilter ErodeType; + typedef typename itk::SqrtImageFilter SqrtType; + +private: + MorphologicalDistanceTransformImageFilter(const Self &); // purposely not implemented + void + operator=(const Self &); // purposely not implemented + + InputPixelType m_OutsideValue; + typename ErodeType::Pointer m_Erode; + typename ThreshType::Pointer m_Thresh; + typename SqrtType::Pointer m_Sqrt; + bool m_SqrDist; +}; + +} // namespace itk +#ifndef ITK_MANUAL_INSTANTIATION +# include "itkMorphologicalDistanceTransformImageFilter.hxx" +#endif + + +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx new file mode 100644 index 00000000000..8102d894a28 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx @@ -0,0 +1,120 @@ +#ifndef __itkMorphologicalDistanceTransformImageFilter_txx +#define __itkMorphologicalDistanceTransformImageFilter_txx + +#include "itkMorphologicalDistanceTransformImageFilter.h" +#include "itkProgressAccumulator.h" + +namespace itk +{ +template +MorphologicalDistanceTransformImageFilter::MorphologicalDistanceTransformImageFilter() +{ + this->SetNumberOfRequiredOutputs(1); + this->SetNumberOfRequiredInputs(1); + + m_Erode = ErodeType::New(); + m_Thresh = ThreshType::New(); + m_Sqrt = SqrtType::New(); + m_OutsideValue = 0; + m_Erode->SetScale(0.5); + this->SetUseImageSpacing(true); + m_SqrDist = false; +} + +template +void +MorphologicalDistanceTransformImageFilter::Modified() const +{ + Superclass::Modified(); + m_Erode->Modified(); + m_Thresh->Modified(); + m_Sqrt->Modified(); +} + +template +void +MorphologicalDistanceTransformImageFilter::GenerateData(void) +{ + + ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); + progress->SetMiniPipelineFilter(this); + // these values are guesses at present - need to profile to get a + // real idea + progress->RegisterInternalFilter(m_Thresh, 0.1f); + progress->RegisterInternalFilter(m_Erode, 0.8f); + progress->RegisterInternalFilter(m_Sqrt, 0.1f); + + // std::cout << "DT" << std::endl; + + double MaxDist = 0.0; + typename TOutputImage::SpacingType sp = this->GetOutput()->GetSpacing(); + typename TOutputImage::SizeType sz = this->GetOutput()->GetLargestPossibleRegion().GetSize(); + if (this->GetUseImageSpacing()) + { + for (unsigned k = 0; k < TOutputImage::ImageDimension; k++) + { + double thisdim = (sz[k] * sp[k]); + MaxDist += thisdim * thisdim; + } + } + else + { + for (unsigned k = 0; k < TOutputImage::ImageDimension; k++) + { + double thisdim = sz[k]; + MaxDist += thisdim * thisdim; + } + } + + // double Wt = 0.0; + // if (this->GetUseImageSpacing()) + // { + // for (unsigned k = 0; k < TOutputImage::ImageDimension; k++) + // { + // Wt += sp[k] * sp[k]; + // } + // } + // else + // { + // for (unsigned k = 0; k < TOutputImage::ImageDimension; k++) + // { + // Wt += 1.0; + // } + // } + // Wt = sqrt(Wt); + this->AllocateOutputs(); + + m_Thresh->SetLowerThreshold(m_OutsideValue); + m_Thresh->SetUpperThreshold(m_OutsideValue); + m_Thresh->SetOutsideValue(MaxDist); + m_Thresh->SetInsideValue(0); + + m_Thresh->SetInput(this->GetInput()); + m_Erode->SetInput(m_Thresh->GetOutput()); + + if (m_SqrDist) + { + m_Erode->GraftOutput(this->GetOutput()); + m_Erode->Update(); + this->GraftOutput(m_Erode->GetOutput()); + } + else + { + m_Sqrt->SetInput(m_Erode->GetOutput()); + m_Sqrt->GraftOutput(this->GetOutput()); + m_Sqrt->Update(); + this->GraftOutput(m_Sqrt->GetOutput()); + } +} +template +void +MorphologicalDistanceTransformImageFilter::PrintSelf(std::ostream & os, Indent indent) const +{ + Superclass::PrintSelf(os, indent); + os << "Outside Value = " << (OutputPixelType)m_OutsideValue << std::endl; + os << "ImageScale = " << m_Erode->GetUseImageSpacing() << std::endl; +} + +} // namespace itk + +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h new file mode 100644 index 00000000000..09ef90f884c --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h @@ -0,0 +1,166 @@ +#ifndef __itkMorphologicalSharpeningImageFilter_h +#define __itkMorphologicalSharpeningImageFilter_h + +#include "itkImageToImageFilter.h" +// #include "itkProgressReporter.h" +#include "itkWatershedMiniPipelineProgressCommand.h" +#include "itkCastImageFilter.h" +#include "itkParabolicErodeImageFilter.h" +#include "itkParabolicDilateImageFilter.h" +#include "itkSharpenOpImageFilter.h" + +namespace itk +{ +/** + * \class MorphologicalSharpeningImageFilter + * \brief Image sharpening using methods based on parabolic + * structuring elements. + * + * This is an implemtentation of the method of Schavemaker for testing + * the parabolic morphology routines. No particular efforts have been + * made to minimize memory consumption. + * + * + * @article{Schavemaker2000, + * author = {Schavemaker, J. and Reinders, M. and Gerbrands, J. and Backer, E. +}, + * title = {Image sharpening by morphological filtering}, + * journal = {Pattern Recognition}, + * volume = {33}, + * number = {6}, + * year = {2000}, + * pages = {997-1012}, + * ee = {http://dx.doi.org/10.1016/S0031-3203(99)00160-0}, + * bibsource = {DBLP, http://dblp.uni-trier.de} +} + + * \author Richard Beare, Monash University, Department of Medicine, + * Melbourne, Australia. + * +**/ + + +template +class ITK_EXPORT MorphologicalSharpeningImageFilter : public ImageToImageFilter +{ +public: + /** Standard class typedefs. */ + typedef MorphologicalSharpeningImageFilter Self; + typedef ImageToImageFilter Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Runtime information support. */ + itkTypeMacro(MorphologicalSharpeningImageFilter, ImageToImageFilter); + + + /** Pixel Type of the input image */ + typedef TInputImage InputImageType; + typedef TOutputImage OutputImageType; + typedef typename TInputImage::PixelType InputPixelType; + typedef typename NumericTraits::RealType RealType; + typedef typename NumericTraits::ScalarRealType ScalarRealType; + typedef typename TOutputImage::PixelType OutputPixelType; + + /** Smart pointer typedef support. */ + typedef typename TInputImage::Pointer InputImagePointer; + typedef typename TInputImage::ConstPointer InputImageConstPointer; + + /** Image related typedefs. */ + itkStaticConstMacro(OutputImageDimension, unsigned int, TOutputImage::ImageDimension); + itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension); + itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); + + /** a type to represent the "kernel radius" */ + typedef typename itk::FixedArray RadiusType; + + itkSetMacro(Iterations, int); + itkGetConstReferenceMacro(Iterations, int); + + void + SetScale(ScalarRealType scale) + { + m_Erode->SetScale(scale); + m_Dilate->SetScale(scale); + } + + void + SetScale(RadiusType scale) + { + m_Erode->SetScale(scale); + m_Dilate->SetScale(scale); + } + + void + SetUseImageSpacing(bool uis) + { + m_Erode->SetUseImageSpacing(uis); + m_Dilate->SetUseImageSpacing(uis); + } + + // need to include the Get methods + const RadiusType & + GetScale() + { + return m_Erode->GetScale(); + } + + const bool + GetUseImageSpacing() + { + return m_Erode->GetUseImageSpacing(); + } + + +#ifdef ITK_USE_CONCEPT_CHECKING + /** Begin concept checking */ + itkConceptMacro(SameDimension, + (Concept::SameDimension)); + + itkConceptMacro(Comparable, (Concept::Comparable)); + + /** End concept checking */ +#endif + + +protected: + MorphologicalSharpeningImageFilter(); + virtual ~MorphologicalSharpeningImageFilter() {}; + void + PrintSelf(std::ostream & os, Indent indent) const; + + /** Generate Data */ + void + GenerateData(void); + + // do everything in the output image type, which should have high precision + typedef typename itk::ParabolicErodeImageFilter ErodeType; + typedef typename itk::ParabolicDilateImageFilter DilateType; + typedef typename itk::CastImageFilter CastType; + + typedef typename itk::SharpenOpImageFilter + SharpenOpType; + +private: + MorphologicalSharpeningImageFilter(const Self &); // purposely not implemented + void + operator=(const Self &); // purposely not implemented + + int m_Iterations; + typename ErodeType::Pointer m_Erode; + typename DilateType::Pointer m_Dilate; + typename CastType::Pointer m_Cast; + typename SharpenOpType::Pointer m_SharpenOp; +}; + +} // namespace itk +#ifndef ITK_MANUAL_INSTANTIATION +# include "itkMorphologicalSharpeningImageFilter.hxx" +#endif + + +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx new file mode 100644 index 00000000000..82c66a05337 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx @@ -0,0 +1,86 @@ +#ifndef __itkMorphologicalSharpeningImageFilter_txx +#define __itkMorphologicalSharpeningImageFilter_txx + +#include "itkMorphologicalSharpeningImageFilter.h" +// #include "itkProgressAccumulator.h" + +namespace itk + +{ +template +MorphologicalSharpeningImageFilter::MorphologicalSharpeningImageFilter() +{ + this->SetNumberOfRequiredOutputs(1); + this->SetNumberOfRequiredInputs(1); + + m_Erode = ErodeType::New(); + m_Dilate = DilateType::New(); + m_Cast = CastType::New(); + m_SharpenOp = SharpenOpType::New(); + m_Iterations = 1; + this->SetScale(1); + this->SetUseImageSpacing(false); +} + + +template +void +MorphologicalSharpeningImageFilter::GenerateData(void) +{ + + // ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); + // progress->SetMiniPipelineFilter(this); + + // Allocate the output + this->AllocateOutputs(); + + InputImageConstPointer inputImage = this->GetInput(); + m_Cast->SetInput(inputImage); + + // set the input to the morph operations + m_Erode->SetInput(m_Cast->GetOutput()); + m_Dilate->SetInput(m_Cast->GetOutput()); + m_SharpenOp->SetInput(m_Dilate->GetOutput()); + m_SharpenOp->SetInput2(m_Cast->GetOutput()); + m_SharpenOp->SetInput3(m_Erode->GetOutput()); + + // set up the progrss monitor + WatershedMiniPipelineProgressCommand::Pointer c = WatershedMiniPipelineProgressCommand::New(); + c->SetFilter(this); + c->SetNumberOfFilters(3 * m_Iterations); + + m_Erode->AddObserver(ProgressEvent(), c); + m_Dilate->AddObserver(ProgressEvent(), c); + m_SharpenOp->AddObserver(ProgressEvent(), c); + + + for (int i = 0; i < m_Iterations; i++) + { + if (i != 0) + { + m_Erode->SetInput(this->GetOutput()); + m_Dilate->SetInput(this->GetOutput()); + m_SharpenOp->SetInput2(this->GetOutput()); + m_Erode->Modified(); + m_Dilate->Modified(); + } + + m_SharpenOp->GraftOutput(this->GetOutput()); + m_SharpenOp->Update(); + this->GraftOutput(m_SharpenOp->GetOutput()); + } +} + +template +void +MorphologicalSharpeningImageFilter::PrintSelf(std::ostream & os, Indent indent) const +{ + Superclass::PrintSelf(os, indent); + os << "Iterations = " << m_Iterations << std::endl; +} + + +} // end namespace itk + + +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h new file mode 100644 index 00000000000..2ef23438f3c --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h @@ -0,0 +1,189 @@ +#ifndef __itkMorphologicalSignedDistanceTransformImageFilter_h +#define __itkMorphologicalSignedDistanceTransformImageFilter_h + +#include "itkImageToImageFilter.h" +#include "itkProgressReporter.h" + +#include "itkBinaryThresholdImageFilter.h" +#include "itkParabolicErodeImageFilter.h" +#include "itkParabolicDilateImageFilter.h" +#include "itkMorphSDTHelperImageFilter.h" + +namespace itk +{ +/** + * \class MorphologicalSignedDistanceTransformImageFilter + * \brief Signed distance transform of a mask using parabolic morphological + * methods + * + * Morphological erosions using a parabolic structuring element can be + * used to compute a distance transform of a mask by setting the + * "Outside" value to 0 and the "inside" value to +infinity (or beyond + * the maximum possible value). The + * output of the parabolic erosion are the square of the distance to + * the nearest zero valued voxel. Thus we can compute the distance + * transform by taking the sqrt of the erosion. + * + * The output pixel type needs to support values as large as the + * square of the largest value of the distance - just use float to be + * safe. + * + * The inside is considered to have negative distances. Use + * InsideIsPositive(bool) to change. + * + * There are also OutsideValue methods which can be used in similar + * ways. + * + * Otherwise it is meant to have an interface to the other + * DistanceTransforms filters. + * + * \author Richard Beare, Monash University, Department of Medicine, + * Melbourne, Australia. + * + **/ + + +template +class ITK_EXPORT MorphologicalSignedDistanceTransformImageFilter : public ImageToImageFilter +{ +public: + /** Standard class typedefs. */ + typedef MorphologicalSignedDistanceTransformImageFilter Self; + typedef ImageToImageFilter Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Runtime information support. */ + itkTypeMacro(MorphologicalSignedDistanceTransformImageFilter, ImageToImageFilter); + + + /** Pixel Type of the input image */ + typedef TInputImage InputImageType; + typedef TOutputImage OutputImageType; + typedef typename TInputImage::PixelType InputPixelType; + typedef typename NumericTraits::RealType RealType; + typedef typename NumericTraits::ScalarRealType ScalarRealType; + typedef typename TOutputImage::PixelType OutputPixelType; + + /** Smart pointer typedef support. */ + typedef typename TInputImage::Pointer InputImagePointer; + typedef typename TInputImage::ConstPointer InputImageConstPointer; + + /** Image related typedefs. */ + itkStaticConstMacro(OutputImageDimension, unsigned int, TOutputImage::ImageDimension); + itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension); + itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); + + /** a type to represent the "kernel radius" */ + typedef typename itk::FixedArray RadiusType; + + virtual void + Modified() const; + + /** this describes the input mask - default value 0 - we compute the + distance from all voxels with value not equal to "OutsideValue" to + the nearest voxel with value "OutsideValue" */ + itkSetMacro(OutsideValue, InputPixelType); + itkGetConstReferenceMacro(OutsideValue, InputPixelType); + + /** Set On/Off whether spacing is used. */ + itkBooleanMacro(UseImageSpacing); + + /** Set if the inside represents positive values in the signed distance + * map. By convention ON pixels are treated as inside pixels. */ + itkSetMacro(InsideIsPositive, bool); + + /** Get if the inside represents positive values in the signed distance map. + * See GetInsideIsPositive() */ + itkGetConstReferenceMacro(InsideIsPositive, bool); + + /** Set if the inside represents positive values in the signed distance + * map. By convention ON pixels are treated as inside pixels. Default is + * true. */ + itkBooleanMacro(InsideIsPositive); + /** Is the transform in world or voxel units - default is world */ + void + SetUseImageSpacing(bool uis) + { + m_Erode->SetUseImageSpacing(uis); + m_Dilate->SetUseImageSpacing(uis); + this->Modified(); + } + + enum ParabolicAlgorithm + { + NOCHOICE = 0, // decices based on scale - experimental + CONTACTPOINT = 1, // sometimes faster at low scale + INTERSECTION = 2 // default + }; + + /** + * Set/Get the method used. Choices are contact point or + * intersection. Intersection is the default. Contact point can be + * faster at small scales. This is very unlikely to be the case for + * a distance transform. + */ + + itkSetMacro(ParabolicAlgorithm, int); + itkGetConstReferenceMacro(ParabolicAlgorithm, int); + + + const bool + GetUseImageSpacing() + { + return m_Erode->GetUseImageSpacing(); + } + + +#ifdef ITK_USE_CONCEPT_CHECKING + /** Begin concept checking */ + itkConceptMacro(SameDimension, + (Concept::SameDimension)); + + itkConceptMacro(Comparable, (Concept::Comparable)); + + /** End concept checking */ +#endif + + +protected: + MorphologicalSignedDistanceTransformImageFilter(); + virtual ~MorphologicalSignedDistanceTransformImageFilter() {}; + void + PrintSelf(std::ostream & os, Indent indent) const; + + /** Generate Data */ + void + GenerateData(void); + int m_ParabolicAlgorithm; + + // do everything in the output image type, which should have high precision + typedef typename itk::BinaryThresholdImageFilter ThreshType; + typedef typename itk::ParabolicErodeImageFilter ErodeType; + typedef typename itk::ParabolicDilateImageFilter DilateType; + typedef typename itk::MorphSDTHelperImageFilter HelperType; + +private: + MorphologicalSignedDistanceTransformImageFilter(const Self &); // purposely not implemented + void + operator=(const Self &); // purposely not implemented + + InputPixelType m_OutsideValue; + bool m_InsideIsPositive; + typename ErodeType::Pointer m_Erode; + typename DilateType::Pointer m_Dilate; + typename ThreshType::Pointer m_Thresh; + typename HelperType::Pointer m_Helper; +}; + +} // namespace itk +#ifndef ITK_MANUAL_INSTANTIATION +# include "itkMorphologicalSignedDistanceTransformImageFilter.hxx" +#endif + + +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx new file mode 100644 index 00000000000..114e9e14d38 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx @@ -0,0 +1,121 @@ +#ifndef __itkMorphologicalSignedDistanceTransformImageFilter_txx +#define __itkMorphologicalSignedDistanceTransformImageFilter_txx + +#include "itkMorphologicalSignedDistanceTransformImageFilter.h" +#include "itkProgressAccumulator.h" + +namespace itk +{ +template +MorphologicalSignedDistanceTransformImageFilter::MorphologicalSignedDistanceTransformImageFilter() +{ + this->SetNumberOfRequiredOutputs(1); + this->SetNumberOfRequiredInputs(1); + + m_Erode = ErodeType::New(); + m_Dilate = DilateType::New(); + m_Thresh = ThreshType::New(); + m_Helper = HelperType::New(); + m_Erode->SetScale(0.5); + m_Dilate->SetScale(0.5); + this->SetUseImageSpacing(true); + this->SetInsideIsPositive(false); + m_OutsideValue = 0; + m_ParabolicAlgorithm = INTERSECTION; +} +template +void +MorphologicalSignedDistanceTransformImageFilter::Modified() const +{ + Superclass::Modified(); + m_Erode->Modified(); + m_Dilate->Modified(); + m_Thresh->Modified(); + m_Helper->Modified(); +} + +template +void +MorphologicalSignedDistanceTransformImageFilter::GenerateData(void) +{ + + ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); + progress->SetMiniPipelineFilter(this); + // these values are guesses at present - need to profile to get a + // real idea + progress->RegisterInternalFilter(m_Thresh, 0.1f); + progress->RegisterInternalFilter(m_Erode, 0.4f); + progress->RegisterInternalFilter(m_Dilate, 0.4f); + progress->RegisterInternalFilter(m_Helper, 0.1f); + + m_Erode->SetParabolicAlgorithm(m_ParabolicAlgorithm); + m_Dilate->SetParabolicAlgorithm(m_ParabolicAlgorithm); + + this->AllocateOutputs(); + // figure out the maximum value of distance transform using the + // image dimensions + typename TOutputImage::SizeType sz = this->GetOutput()->GetRequestedRegion().GetSize(); + typename TOutputImage::SpacingType sp = this->GetOutput()->GetSpacing(); + + double MaxDist = 0.0; + if (this->GetUseImageSpacing()) + { + for (unsigned k = 0; k < TOutputImage::ImageDimension; k++) + { + double thisdim = (sz[k] * sp[k]); + MaxDist += thisdim * thisdim; + } + } + else + { + for (unsigned k = 0; k < TOutputImage::ImageDimension; k++) + { + double thisdim = sz[k]; + MaxDist += thisdim * thisdim; + } + } + + m_Thresh->SetLowerThreshold(m_OutsideValue); + m_Thresh->SetUpperThreshold(m_OutsideValue); + if (this->GetInsideIsPositive()) + { + m_Thresh->SetOutsideValue(MaxDist); + m_Thresh->SetInsideValue(-MaxDist); + } + else + { + m_Thresh->SetOutsideValue(-MaxDist); + m_Thresh->SetInsideValue(MaxDist); + } + + m_Thresh->SetInput(this->GetInput()); + m_Erode->SetInput(m_Thresh->GetOutput()); + m_Dilate->SetInput(m_Thresh->GetOutput()); +#if 1 + m_Helper->SetInput(m_Erode->GetOutput()); + m_Helper->SetInput2(m_Dilate->GetOutput()); + m_Helper->SetInput3(m_Thresh->GetOutput()); + m_Helper->SetVal(MaxDist); + m_Helper->GraftOutput(this->GetOutput()); + m_Helper->Update(); + this->GraftOutput(m_Helper->GetOutput()); +#else + m_Dilate->GraftOutput(this->GetOutput()); + m_Dilate->Update(); + this->GraftOutput(m_Dilate->GetOutput()); +#endif +} +template +void +MorphologicalSignedDistanceTransformImageFilter::PrintSelf(std::ostream & os, + Indent indent) const +{ + Superclass::PrintSelf(os, indent); + os << "Outside Value = " << (OutputPixelType)m_OutsideValue << std::endl; + os << "ImageScale = " << m_Erode->GetUseImageSpacing() << std::endl; +} + +} // namespace itk + +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h new file mode 100644 index 00000000000..f65eae322cf --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h @@ -0,0 +1,78 @@ +#ifndef __itkParabolicCloseImageFilter_h +#define __itkParabolicCloseImageFilter_h + +#include "itkParabolicOpenCloseSafeBorderImageFilter.h" +#include "itkNumericTraits.h" + +namespace itk +{ +/** + * \class ParabolicCloseImageFilter + * \brief Class for morphological closing + * operations with parabolic structuring elements. + * + * This filter provides options for padded borders + * + * This filter is threaded. + * + * \sa itkParabolicOpenCloseImageFilter + * + * \author Richard Beare, Department of Medicine, Monash University, + * Australia. + **/ + +template +class ITK_EXPORT ParabolicCloseImageFilter + : public ParabolicOpenCloseSafeBorderImageFilter +{ + +public: + /** Standard class typedefs. */ + typedef ParabolicCloseImageFilter Self; + typedef ParabolicOpenCloseSafeBorderImageFilter Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Runtime information support. */ + itkTypeMacro(ParabolicCloseImageFilter, ParabolicOpenCloseSafeBorderImageFilter); + + + /** Pixel Type of the input image */ + typedef TInputImage InputImageType; + typedef TOutputImage OutputImageType; + typedef typename TInputImage::PixelType PixelType; + typedef typename NumericTraits::RealType RealType; + typedef typename NumericTraits::ScalarRealType ScalarRealType; + typedef typename TOutputImage::PixelType OutputPixelType; + + /** Smart pointer typedef support. */ + typedef typename TInputImage::Pointer InputImagePointer; + typedef typename TInputImage::ConstPointer InputImageConstPointer; + + /** a type to represent the "kernel radius" */ + typedef typename itk::FixedArray RadiusType; + + /** Image dimension. */ + itkStaticConstMacro(ImageDimension, 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. */ + + +protected: + ParabolicCloseImageFilter() {}; + virtual ~ParabolicCloseImageFilter() {}; + // void PrintSelf(std::ostream& os, Indent indent) const; + +private: + ParabolicCloseImageFilter(const Self &); // purposely not implemented + void + operator=(const Self &); // purposely not implemented +}; + +} // end namespace itk + +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h new file mode 100644 index 00000000000..d784d7f471e --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h @@ -0,0 +1,72 @@ +#ifndef __itkParabolicDilateImageFilter_h +#define __itkParabolicDilateImageFilter_h + +#include "itkParabolicErodeDilateImageFilter.h" +#include "itkNumericTraits.h" + +namespace itk +{ +/** + * \class ParabolicDilateImageFilter + * \brief Class for morphological dilation + * operations with parabolic structuring elements. + * + * This filter is threaded. + * + * \sa itkParabolicOpenCloseImageFilter + * + * \author Richard Beare, Department of Medicine, Monash University, + * Australia. + * + **/ + +template +class ITK_EXPORT ParabolicDilateImageFilter : public ParabolicErodeDilateImageFilter +{ + +public: + /** Standard class typedefs. */ + typedef ParabolicDilateImageFilter Self; + typedef ParabolicErodeDilateImageFilter Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Runtime information support. */ + itkTypeMacro(ParabolicDilateImageFilter, ParabolicErodeDilateImageFilter); + + + /** Pixel Type of the input image */ + typedef TInputImage InputImageType; + typedef TOutputImage OutputImageType; + typedef typename TInputImage::PixelType PixelType; + typedef typename NumericTraits::RealType RealType; + typedef typename NumericTraits::ScalarRealType ScalarRealType; + typedef typename TOutputImage::PixelType OutputPixelType; + + /** Smart pointer typedef support. */ + typedef typename TInputImage::Pointer InputImagePointer; + typedef typename TInputImage::ConstPointer InputImageConstPointer; + + /** a type to represent the "kernel radius" */ + typedef typename itk::FixedArray RadiusType; + + /** Image dimension. */ + itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); + +protected: + ParabolicDilateImageFilter() {}; + virtual ~ParabolicDilateImageFilter() {}; + // void PrintSelf(std::ostream& os, Indent indent) const; + +private: + ParabolicDilateImageFilter(const Self &); // purposely not implemented + void + operator=(const Self &); // purposely not implemented +}; + +} // end namespace itk + +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h new file mode 100644 index 00000000000..f9c55b279d9 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h @@ -0,0 +1,191 @@ +#ifndef __itkParabolicErodeDilateImageFilter_h +#define __itkParabolicErodeDilateImageFilter_h + +#include "itkImageToImageFilter.h" +#include "itkNumericTraits.h" +#include "itkProgressReporter.h" + +namespace itk +{ +/** + * \class ParabolicErodeDilateImageFilter + * \brief Parent class for morphological operations with parabolic + * structuring elements. + * + * Parabolic structuring elements are the morphological counterpart of + * the gaussian function in linear processing. Parabolic structuring + * elements are dimensionally decomposable and fast algorithms are + * available for computing erosions and dilations along lines. + * This class implements the "point of contact" algorithm and the + * "intersection" algorithm. The contact point algorithm is faster at + * small scales. The intersection algorithm was rediscovered by + * Felzenszwalb & Huttenlocher, but was actually described and tested + * by van den Boomgaard many years earlier. The intersection algorithm + * is faster for scales > 1, and independent of scale. It also seems + * to perform significantly better in the distance transform + * application. The intersection algorithm is also used in the IJ + * article on generalised distance transforms. + * + * Parabolic structuring functions can be used as a fast alternative + * to the "rolling ball" structuring element classically used in + * background estimation, for example in ImageJ, have applications in + * image sharpening and distance transform computation. + * + * This class uses an internal buffer of RealType pixels for each + * line. This line is cast to the output pixel type when written back + * to the output image. Since the filter uses dimensional + * decomposition this approach could result in inaccuracy as pixels + * are cast back and forth between low and high precision types. Use a + * high precision output type and cast manually if this is a problem. + * + * Boomgaard, R. van den and Dorst, L. and Makram-Ebeid, L.S. and + * Schavemaker, J. Quadratic structuring functions in mathematical + * morphology. Mathematical Morphology and its Applications to Image + * and Signal Processing. + * + * Felzenszwalb, P.F. & Huttenlocher, D.P. Distance Transforms of Sampled Functions. + * Techreport: Cornell Computing and Information Science, 2004. + * + * This filter is threaded. Threading mechanism derived from + * SignedMaurerDistanceMap extensions by Gaetan Lehman + * + * \author Richard Beare, Department of Medicine, Monash University, + * Australia. + * + **/ + + +template +class ITK_EXPORT ParabolicErodeDilateImageFilter : public ImageToImageFilter +{ + +public: + /** Standard class typedefs. */ + typedef ParabolicErodeDilateImageFilter Self; + typedef ImageToImageFilter Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Runtime information support. */ + itkTypeMacro(ParabolicErodeDilateImageFilter, ImageToImageFilter); + + /** Pixel Type of the input image */ + typedef TInputImage InputImageType; + typedef TOutputImage OutputImageType; + typedef typename TInputImage::PixelType PixelType; + typedef typename NumericTraits::RealType RealType; + typedef typename NumericTraits::ScalarRealType ScalarRealType; + typedef typename TOutputImage::PixelType OutputPixelType; + + /** 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::IndexType OutputIndexType; + + /** a type to represent the "kernel radius" */ + typedef typename itk::FixedArray RadiusType; + + /** Image dimension. */ + itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); + itkStaticConstMacro(OutputImageDimension, unsigned int, TOutputImage::ImageDimension); + itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension); + + + typedef typename OutputImageType::RegionType OutputImageRegionType; + /** Define the image type for internal computations + RealType is usually 'double' in NumericTraits. + Here we prefer float in order to save memory. */ + + typedef typename NumericTraits::FloatType InternalRealType; + // typedef typename Image RealImageType; + + // set all of the scales the same + void + SetScale(ScalarRealType scale); + itkSetMacro(Scale, RadiusType); + itkGetConstReferenceMacro(Scale, RadiusType); + + enum ParabolicAlgorithm + { + NOCHOICE = 0, // decices based on scale - experimental + CONTACTPOINT = 1, // sometimes faster at low scale + INTERSECTION = 2 // default + }; + /** + * Set/Get the method used. Choices are contact point or + * intersection. Intersection is the default. Contact point can be + * faster at small scales. + */ + + itkSetMacro(ParabolicAlgorithm, int); + itkGetConstReferenceMacro(ParabolicAlgorithm, int); + + /** + * Set/Get whether the scale refers to pixels or world units - + * default is false + */ + itkSetMacro(UseImageSpacing, bool); + itkGetConstReferenceMacro(UseImageSpacing, bool); + itkBooleanMacro(UseImageSpacing); + /** Image related typedefs. */ + +#ifdef ITK_USE_CONCEPT_CHECKING + /** Begin concept checking */ + itkConceptMacro(SameDimension, + (Concept::SameDimension)); + + itkConceptMacro(Comparable, (Concept::Comparable)); + + /** End concept checking */ +#endif + +protected: + ParabolicErodeDilateImageFilter(); + virtual ~ParabolicErodeDilateImageFilter() {}; + void + PrintSelf(std::ostream & os, Indent indent) const; + + /** Generate Data */ + void + GenerateData(void); + unsigned int + SplitRequestedRegion(unsigned int i, unsigned int num, OutputImageRegionType & splitRegion); + + void + ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId); + + void + GenerateInputRequestedRegion() throw(InvalidRequestedRegionError); + // Override since the filter produces the entire dataset. + void + EnlargeOutputRequestedRegion(DataObject * output); + + bool m_UseImageSpacing; + int m_ParabolicAlgorithm; + +private: + ParabolicErodeDilateImageFilter(const Self &); // purposely not implemented + void + operator=(const Self &); // purposely not implemented + RadiusType m_Scale; + typename TInputImage::PixelType m_Extreme; + + int m_MagnitudeSign; + int m_CurrentDimension; +}; + +} // end namespace itk + +#ifndef ITK_MANUAL_INSTANTIATION +# include "itkParabolicErodeDilateImageFilter.hxx" +#endif + + +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx new file mode 100644 index 00000000000..ac71b5bb455 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx @@ -0,0 +1,318 @@ +#ifndef __itkParabolicErodeDilateImageFilter_txx +#define __itkParabolicErodeDilateImageFilter_txx + +#include "itkParabolicErodeDilateImageFilter.h" +#include "itkImageRegionConstIterator.h" +#include "itkImageRegionIterator.h" + +// #define NOINDEX +#ifndef NOINDEX +# include "itkImageLinearIteratorWithIndex.h" +# include "itkImageLinearConstIteratorWithIndex.h" +#else +# include "itkImageLinearIterator.h" +# include "itkImageLinearConstIterator.h" +#endif +#include "itkParabolicMorphUtils.h" + +namespace itk +{ + +template +ParabolicErodeDilateImageFilter::ParabolicErodeDilateImageFilter() +{ + this->SetNumberOfRequiredOutputs(1); + this->SetNumberOfRequiredInputs(1); + // needs to be selected according to erosion/dilation + + if (doDilate) + { + // m_Extreme = NumericTraits::min(); + m_Extreme = NumericTraits::NonpositiveMin(); + m_MagnitudeSign = 1; + } + else + { + m_Extreme = NumericTraits::max(); + m_MagnitudeSign = -1; + } + m_UseImageSpacing = false; + m_ParabolicAlgorithm = INTERSECTION; +} + +template +unsigned int +ParabolicErodeDilateImageFilter::SplitRequestedRegion( + unsigned int i, + unsigned int 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(outputPtr->GetImageDimension()) - 1; + while ((requestedRegionSize[splitAxis] == 1) || (splitAxis == static_cast(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(requestedRegionSize[splitAxis]); + + unsigned int valuesPerThread = static_cast(vcl_ceil(range / static_cast(num))); + unsigned int maxThreadIdUsed = static_cast(vcl_ceil(range / static_cast(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 +ParabolicErodeDilateImageFilter::SetScale(ScalarRealType scale) +{ + RadiusType s; + s.Fill(scale); + this->SetScale(s); +} + +#if 1 +template +void +ParabolicErodeDilateImageFilter::GenerateInputRequestedRegion() throw( + InvalidRequestedRegionError) +{ + // call the superclass' implementation of this method. this should + // copy the output requested region to the input requested region + Superclass::GenerateInputRequestedRegion(); + + // This filter needs all of the input + InputImagePointer image = const_cast(this->GetInput()); + if (image) + { + image->SetRequestedRegion(this->GetInput()->GetLargestPossibleRegion()); + } +} +#endif +#if 1 +template +void +ParabolicErodeDilateImageFilter::EnlargeOutputRequestedRegion(DataObject * output) +{ + TOutputImage * out = dynamic_cast(output); + + if (out) + { + out->SetRequestedRegion(out->GetLargestPossibleRegion()); + } +} +#endif + +template +void +ParabolicErodeDilateImageFilter::GenerateData(void) +{ + ThreadIdType nbthreads = this->GetNumberOfThreads(); + + typename TInputImage::ConstPointer inputImage(this->GetInput()); + typename TOutputImage::Pointer outputImage(this->GetOutput()); + + // const unsigned int imageDimension = inputImage->GetImageDimension(); + outputImage->SetBufferedRegion(outputImage->GetRequestedRegion()); + outputImage->Allocate(); + + // Set up the multithreaded processing + typename ImageSource::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; d < ImageDimension; d++) + { + m_CurrentDimension = d; + multithreader->SingleMethodExecute(); + } +} + +template +void +ParabolicErodeDilateImageFilter::ThreadedGenerateData( + const OutputImageRegionType & outputRegionForThread, + ThreadIdType threadId) +{ + // 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++) + { + 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[m_CurrentDimension], + 30, + m_CurrentDimension * progressPerDimension, + progressPerDimension); + + + typedef ImageLinearConstIteratorWithIndex InputConstIteratorType; + typedef ImageLinearIteratorWithIndex OutputIteratorType; + + // for stages after the first + typedef ImageLinearConstIteratorWithIndex OutputConstIteratorType; + + + typedef ImageRegion 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); + + // setup the progress reporting + // unsigned int numberOfLinesToProcess = 0; + // for (unsigned dd = 0; dd < imageDimension; dd++) + // { + // numberOfLinesToProcess += region.GetSize()[dd]; + // } + + // ProgressReporter progress(this,0, numberOfLinesToProcess); + + // deal with the first dimension - this should be copied to the + // output if the scale is 0 + if (m_CurrentDimension == 0) + { + if (m_Scale[0] > 0) + { + // Perform as normal + // RealType magnitude = 1.0/(2.0 * m_Scale[0]); + unsigned long LineLength = region.GetSize()[0]; + RealType image_scale = this->GetInput()->GetSpacing()[0]; + + doOneDimension( + inputIterator, + outputIterator, + *progress, + LineLength, + 0, + this->m_MagnitudeSign, + this->m_UseImageSpacing, + this->m_Extreme, + image_scale, + this->m_Scale[0], + m_ParabolicAlgorithm); + } + else + { + // copy to output + typedef ImageRegionConstIterator InItType; + typedef ImageRegionIterator OutItType; + + InItType InIt(inputImage, region); + OutItType OutIt(outputImage, region); + while (!InIt.IsAtEnd()) + { + OutIt.Set(static_cast(InIt.Get())); + ++InIt; + ++OutIt; + } + } + } + else + { + // other dimensions + if (m_Scale[m_CurrentDimension] > 0) + { + // create a vector to buffer lines + unsigned long LineLength = region.GetSize()[m_CurrentDimension]; + // RealType magnitude = 1.0/(2.0 * m_Scale[dd]); + RealType image_scale = this->GetInput()->GetSpacing()[m_CurrentDimension]; + + doOneDimension( + inputIteratorStage2, + outputIterator, + *progress, + LineLength, + m_CurrentDimension, + this->m_MagnitudeSign, + this->m_UseImageSpacing, + this->m_Extreme, + image_scale, + this->m_Scale[m_CurrentDimension], + m_ParabolicAlgorithm); + } + } +} + + +template +void +ParabolicErodeDilateImageFilter::PrintSelf(std::ostream & os, Indent indent) const +{ + Superclass::PrintSelf(os, indent); + if (m_UseImageSpacing) + { + os << "Scale in world units: " << m_Scale << std::endl; + } + else + { + os << "Scale in voxels: " << m_Scale << std::endl; + } +} + + +} // namespace itk +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h new file mode 100644 index 00000000000..97942ffd82b --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h @@ -0,0 +1,77 @@ +#ifndef __itkParabolicErodeImageFilter_h +#define __itkParabolicErodeImageFilter_h + +#include "itkParabolicErodeDilateImageFilter.h" +#include "itkNumericTraits.h" + +namespace itk +{ +/** + * \class ParabolicErodeImageFilter + * \brief Class for morphological erosion + * operations with parabolic structuring elements. + * + * This filter doesn't use the erode/dilate classes directly so + * that multiple image copies aren't necessary. + * + * This filter is threaded. + * + * \sa itkParabolicErodeDilateImageFilter + * + * \author Richard Beare, Department of Medicine, Monash University, + * Australia. + **/ +template +class ITK_EXPORT ParabolicErodeImageFilter : public ParabolicErodeDilateImageFilter +{ + +public: + /** Standard class typedefs. */ + typedef ParabolicErodeImageFilter Self; + typedef ParabolicErodeDilateImageFilter Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Runtime information support. */ + itkTypeMacro(ParabolicErodeImageFilter, ParabolicErodeDilateImageFilter); + + + /** Pixel Type of the input image */ + typedef TInputImage InputImageType; + typedef TOutputImage OutputImageType; + typedef typename TInputImage::PixelType PixelType; + typedef typename NumericTraits::RealType RealType; + typedef typename NumericTraits::ScalarRealType ScalarRealType; + typedef typename TOutputImage::PixelType OutputPixelType; + + /** Smart pointer typedef support. */ + typedef typename TInputImage::Pointer InputImagePointer; + typedef typename TInputImage::ConstPointer InputImageConstPointer; + + /** a type to represent the "kernel radius" */ + typedef typename itk::FixedArray RadiusType; + + /** Image dimension. */ + itkStaticConstMacro(ImageDimension, 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. */ + + +protected: + ParabolicErodeImageFilter() {}; + virtual ~ParabolicErodeImageFilter() {}; + // void PrintSelf(std::ostream& os, Indent indent) const; + +private: + ParabolicErodeImageFilter(const Self &); // purposely not implemented + void + operator=(const Self &); // purposely not implemented +}; + +} // end namespace itk + +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h new file mode 100644 index 00000000000..db29779b973 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h @@ -0,0 +1,299 @@ +#ifndef __itkParabolicUtils_h +#define __itkParabolicUtils_h + +#include + +#include "itkProgressReporter.h" +namespace itk +{ + +// contact point algorithm +template +void +DoLineCP(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; + } +} + +// intersection algorithm +// This algorithm has been described a couple of times. First by van +// den Boomgaard and more recently by Felzenszwalb and Huttenlocher, +// in the context of generalized distance transform +template +void +DoLineIntAlg(LineBufferType & LineBuf, + EnvBufferType & F, + IndexBufferType & v, + EnvBufferType & z, + const RealType magnitude) +{ + int k; /* Index of rightmost parabola in lower envelope */ + /* Locations of parabolas in lower envelope */ + /* these need to be int, rather than unsigned, to make boundary + conditions easy to test */ + + // v stores locations of parabolas in the lower envelope + // z stores thr location of boundaries between parabolas + + // I've gone nuts with the static casts etc, because I seemed to + // have strange behaviour when I didn't do this. Also managed to get + // rid of all the warnings by sticking to size_t and equivalents. + RealType s; + /* holds precomputed scale*f(q) + q^2 for speedup */ + // LineBufferType F(LineBuf.size()); + + // initialize + k = 0; + v[0] = 0; + z[0] = NumericTraits::NonpositiveMin(); + z[1] = NumericTraits::max(); + F[0] = LineBuf[0] / magnitude; + const size_t N(LineBuf.size()); + + for (size_t q = 1; q < N; q++) /* main loop */ + { + if (doDilate) + { + /* precompute f(q) + q^2 for speedup */ + F[q] = (LineBuf[q] / magnitude) - (static_cast(q) * static_cast(q)); + k++; + do + { + /* remove last parabola from surface */ + k--; + /* compute intersection */ + s = (F[q] - F[v[k]]) / (2.0 * (v[k] - static_cast(q))); + } while (s <= z[k]); + /* bump k to add new parabola */ + k++; + } + else + { + /* precompute f(q) + q^2 for speedup */ + F[q] = (LineBuf[q] / magnitude) + (static_cast(q) * static_cast(q)); + k++; + do + { + /* remove last parabola from surface */ + k--; + /* compute intersection */ + s = (F[q] - F[v[k]]) / (2.0 * (static_cast(q) - v[k])); + } while (s <= z[k]); + /* bump k to add new parabola */ + k++; + } + v[k] = q; + z[k] = s; + itkAssertInDebugAndIgnoreInReleaseMacro((size_t)(k + 1) <= N); + z[k + 1] = NumericTraits::max(); + + } /* for q */ + /* now reconstruct output */ + if (doDilate) + { + k = 0; + for (size_t q = 0; q < N; q++) + { + while (z[k + 1] < static_cast(q)) + k++; + itkAssertInDebugAndIgnoreInReleaseMacro(static_cast(v[k]) < N); + itkAssertInDebugAndIgnoreInReleaseMacro(static_cast(v[k]) >= 0); + LineBuf[q] = static_cast( + (F[v[k]] - (static_cast(q) * (static_cast(q) - 2 * v[k]))) * magnitude); + } + } + else + { + k = 0; + for (size_t q = 0; q < N; q++) + { + while (z[k + 1] < static_cast(q)) + k++; + itkAssertInDebugAndIgnoreInReleaseMacro(static_cast(v[k]) < N); + itkAssertInDebugAndIgnoreInReleaseMacro(static_cast(v[k]) >= 0); + LineBuf[q] = ((static_cast(q) * (static_cast(q) - 2 * v[k]) + F[v[k]]) * magnitude); + } + } +} + +template +void +doOneDimension(TInIter & inputIterator, + TOutIter & outputIterator, + ProgressReporter & progress, + const long LineLength, + const unsigned direction, + const int m_MagnitudeSign, + const bool m_UseImageSpacing, + const RealType m_Extreme, + const RealType image_scale, + const RealType Sigma, + int ParabolicAlgorithmChoice) +{ + enum ParabolicAlgorithm + { + NOCHOICE = 0, // decices based on scale - experimental + CONTACTPOINT = 1, // sometimes faster at low scale + INTERSECTION = 2 // default + }; + + // typedef typename std::vector LineBufferType; + + // message from M.Starring suggested performance gain using Array + // instead of std::vector. + typedef typename itk::Array LineBufferType; + RealType iscale = 1.0; + if (m_UseImageSpacing) + { + iscale = image_scale; + } + if (ParabolicAlgorithmChoice == NOCHOICE) + { + // both set to true or false - use scale to figure it out + if ((2.0 * Sigma) < 0.2) + { + ParabolicAlgorithmChoice = CONTACTPOINT; + } + else + { + ParabolicAlgorithmChoice = INTERSECTION; + } + } + + + if (ParabolicAlgorithmChoice == CONTACTPOINT) + { + // using the contact point algorithm + + // const RealType magnitude = m_MagnitudeSign * 1.0/(2.0 * + // Sigma/(iscale*iscale)); + // restructure equation to reduce numerical error + const RealType magnitudeCP = (m_MagnitudeSign * iscale * iscale) / (2.0 * Sigma); + + LineBufferType LineBuf(LineLength); + LineBufferType tmpLineBuf(LineLength); + inputIterator.SetDirection(direction); + outputIterator.SetDirection(direction); + inputIterator.GoToBegin(); + outputIterator.GoToBegin(); + + unsigned count = 0; + 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; + while (!inputIterator.IsAtEndOfLine()) + { + LineBuf[i++] = static_cast(inputIterator.Get()); + ++inputIterator; + } + + DoLineCP(LineBuf, tmpLineBuf, magnitudeCP, m_Extreme); + // copy the line back + unsigned int j = 0; + while (!outputIterator.IsAtEndOfLine()) + { + outputIterator.Set(static_cast(LineBuf[j++])); + ++outputIterator; + } + + ++count; + // now onto the next line + inputIterator.NextLine(); + outputIterator.NextLine(); + progress.CompletedPixel(); + } + } + else + { + // using the Intersection algorithm + typedef typename itk::Array IndexBufferType; + + const RealType magnitudeInt = (iscale * iscale) / (2.0 * Sigma); + LineBufferType LineBuf(LineLength); + LineBufferType Fbuf(LineLength); + IndexBufferType Vbuf(LineLength); + LineBufferType Zbuf(LineLength + 1); + + inputIterator.SetDirection(direction); + outputIterator.SetDirection(direction); + inputIterator.GoToBegin(); + outputIterator.GoToBegin(); + + unsigned count = 0; + 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; + while (!inputIterator.IsAtEndOfLine()) + { + LineBuf[i++] = static_cast(inputIterator.Get()); + ++inputIterator; + } + DoLineIntAlg( + LineBuf, Fbuf, Vbuf, Zbuf, magnitudeInt); + // copy the line back + unsigned int j = 0; + while (!outputIterator.IsAtEndOfLine()) + { + outputIterator.Set(static_cast(LineBuf[j++])); + ++outputIterator; + } + + ++count; + // now onto the next line + inputIterator.NextLine(); + outputIterator.NextLine(); + progress.CompletedPixel(); + } + } +} + + +} // namespace itk +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h new file mode 100644 index 00000000000..47ff7a8ae60 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h @@ -0,0 +1,160 @@ +#ifndef __itkParabolicOpenCloseImageFilter_h +#define __itkParabolicOpenCloseImageFilter_h + +#include "itkImageToImageFilter.h" +#include "itkNumericTraits.h" +#include "itkProgressReporter.h" + +namespace itk +{ +/** + * \class ParabolicOpenCloseImageFilter + * \brief Parent class for morphological opening and closing + * operations with parabolic structuring elements. + * + * This filter doesn't use the erode/dilate classes directly so + * that multiple image copies aren't necessary. + * + * This filter is threaded. Threading mechanism derived from + * SignedMaurerDistanceMap extensions by Gaetan Lehman + * + * \sa itkParabolicErodeDilateImageFilter + * + * \author Richard Beare, Department of Medicine, Monash University, + * Australia. + * + **/ +template +class ITK_EXPORT ParabolicOpenCloseImageFilter : public ImageToImageFilter +{ + +public: + /** Standard class typedefs. */ + typedef ParabolicOpenCloseImageFilter Self; + typedef ImageToImageFilter Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Runtime information support. */ + itkTypeMacro(ParabolicOpenCloseImageFilter, ImageToImageFilter); + + + /** Pixel Type of the input image */ + typedef TInputImage InputImageType; + typedef TOutputImage OutputImageType; + typedef typename TInputImage::PixelType PixelType; + typedef typename NumericTraits::RealType RealType; + typedef typename NumericTraits::ScalarRealType ScalarRealType; + typedef typename TOutputImage::PixelType OutputPixelType; + typedef typename OutputImageType::RegionType OutputImageRegionType; + typedef typename TInputImage::SizeType InputSizeType; + typedef typename TOutputImage::SizeType OutputSizeType; + + /** Smart pointer typedef support. */ + typedef typename TInputImage::Pointer InputImagePointer; + typedef typename TInputImage::ConstPointer InputImageConstPointer; + + typedef typename OutputImageType::IndexType OutputIndexType; + + /** Image related typedefs. */ + itkStaticConstMacro(OutputImageDimension, unsigned int, TOutputImage::ImageDimension); + itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension); + itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); + + + /** a type to represent the "kernel radius" */ + typedef typename itk::FixedArray RadiusType; + + + /** Define the image type for internal computations + RealType is usually 'double' in NumericTraits. + Here we prefer float in order to save memory. */ + + typedef typename NumericTraits::FloatType InternalRealType; + // typedef typename Image RealImageType; + + // set all of the scales the same + void + SetScale(ScalarRealType scale); + itkSetMacro(Scale, RadiusType); + itkGetConstReferenceMacro(Scale, RadiusType); + /** + * Set/Get whether the scale refers to pixels or world units - + * default is false + */ + itkSetMacro(UseImageSpacing, bool); + itkGetConstReferenceMacro(UseImageSpacing, bool); + itkBooleanMacro(UseImageSpacing); + + enum ParabolicAlgorithm + { + NOCHOICE = 0, // decices based on scale - experimental + CONTACTPOINT = 1, // sometimes faster at low scale + INTERSECTION = 2 // default + }; + /** + * Set/Get the method used. Choices are contact point or + * intersection. Intersection is the default. Contact point can be + * faster at small scales. + */ + + itkSetMacro(ParabolicAlgorithm, int); + itkGetConstReferenceMacro(ParabolicAlgorithm, int); + +#ifdef ITK_USE_CONCEPT_CHECKING + /** Begin concept checking */ + itkConceptMacro(SameDimension, + (Concept::SameDimension)); + + itkConceptMacro(Comparable, (Concept::Comparable)); + + /** End concept checking */ +#endif + +protected: + ParabolicOpenCloseImageFilter(); + virtual ~ParabolicOpenCloseImageFilter() {}; + void + PrintSelf(std::ostream & os, Indent indent) const; + + /** Generate Data */ + void + GenerateData(void); + unsigned int + SplitRequestedRegion(unsigned int i, unsigned int num, OutputImageRegionType & splitRegion); + + void + ThreadedGenerateData(const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId); + virtual void + GenerateInputRequestedRegion() throw(InvalidRequestedRegionError); + // Override since the filter produces the entire dataset. + void + EnlargeOutputRequestedRegion(DataObject * output); + + int m_ParabolicAlgorithm; + +private: + ParabolicOpenCloseImageFilter(const Self &); // purposely not implemented + void + operator=(const Self &); // purposely not implemented + RadiusType m_Scale; + typename TInputImage::PixelType m_Extreme, m_Extreme1, m_Extreme2; + + int m_MagnitudeSign, m_MagnitudeSign1, m_MagnitudeSign2; + int m_CurrentDimension; + int m_Stage; + bool m_UseImageSpacing; +}; + +} // end namespace itk + +#ifndef ITK_MANUAL_INSTANTIATION +# include "itkParabolicOpenCloseImageFilter.hxx" +#endif + + +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx new file mode 100644 index 00000000000..433a9ccf41d --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx @@ -0,0 +1,409 @@ +#ifndef __itkParabolicOpenCloseImageFilter_txx +#define __itkParabolicOpenCloseImageFilter_txx + +#include "itkImageRegionConstIterator.h" +#include "itkImageRegionIterator.h" + +#include "itkParabolicOpenCloseImageFilter.h" +// #define NOINDEX +#ifndef NOINDEX +# include "itkImageLinearIteratorWithIndex.h" +# include "itkImageLinearConstIteratorWithIndex.h" +#else +# include "itkImageLinearIterator.h" +# include "itkImageLinearConstIterator.h" +#endif +#include "itkStatisticsImageFilter.h" +#include "itkParabolicMorphUtils.h" + +namespace itk +{ + +template +ParabolicOpenCloseImageFilter::ParabolicOpenCloseImageFilter() +{ + this->SetNumberOfRequiredOutputs(1); + this->SetNumberOfRequiredInputs(1); + // needs to be selected according to erosion/dilation + if (doOpen) + { + // erosion then dilation + m_Extreme1 = NumericTraits::max(); + m_Extreme2 = NumericTraits::NonpositiveMin(); + m_MagnitudeSign1 = -1; + m_MagnitudeSign2 = 1; + } + else + { + // dilation then erosion + m_Extreme1 = NumericTraits::NonpositiveMin(); + m_Extreme2 = NumericTraits::max(); + m_MagnitudeSign1 = 1; + m_MagnitudeSign2 = -1; + } + m_Extreme = m_Extreme1; + m_MagnitudeSign = m_MagnitudeSign1; + m_UseImageSpacing = false; + m_ParabolicAlgorithm = INTERSECTION; + m_Stage = 1; // indicate whether we are on the first pass or the + // second +} + +template +unsigned int +ParabolicOpenCloseImageFilter::SplitRequestedRegion( + unsigned int i, + unsigned int 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(outputPtr->GetImageDimension()) - 1; + while ((requestedRegionSize[splitAxis] == 1) || (splitAxis == static_cast(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(requestedRegionSize[splitAxis]); + + unsigned int valuesPerThread = static_cast(vcl_ceil(range / static_cast(num))); + unsigned int maxThreadIdUsed = static_cast(vcl_ceil(range / static_cast(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 +ParabolicOpenCloseImageFilter::SetScale(ScalarRealType scale) +{ + RadiusType s; + s.Fill(scale); + this->SetScale(s); +} + +#if 1 +template +void +ParabolicOpenCloseImageFilter::GenerateInputRequestedRegion() throw( + InvalidRequestedRegionError) +{ + // call the superclass' implementation of this method. this should + // copy the output requested region to the input requested region + Superclass::GenerateInputRequestedRegion(); + + // This filter needs all of the input + InputImagePointer image = const_cast(this->GetInput()); + if (image) + { + image->SetRequestedRegion(this->GetInput()->GetLargestPossibleRegion()); + } +} +#endif + +#if 1 +template +void +ParabolicOpenCloseImageFilter::EnlargeOutputRequestedRegion(DataObject * output) +{ + TOutputImage * out = dynamic_cast(output); + + if (out) + { + out->SetRequestedRegion(out->GetLargestPossibleRegion()); + } +} +#endif + +template +void +ParabolicOpenCloseImageFilter::GenerateData(void) +{ + ThreadIdType nbthreads = this->GetNumberOfThreads(); + + typedef ImageLinearConstIteratorWithIndex InputConstIteratorType; + typedef ImageLinearIteratorWithIndex OutputIteratorType; + + // for stages after the first + typedef ImageLinearConstIteratorWithIndex OutputConstIteratorType; + + + typedef ImageRegion RegionType; + + typename TInputImage::ConstPointer inputImage(this->GetInput()); + typename TOutputImage::Pointer outputImage(this->GetOutput()); + + + // const unsigned int imageDimension = inputImage->GetImageDimension(); + + outputImage->SetBufferedRegion(outputImage->GetRequestedRegion()); + outputImage->Allocate(); + + typename ImageSource::ThreadStruct str; + str.Filter = this; + + MultiThreader * multithreader = this->GetMultiThreader(); + multithreader->SetNumberOfThreads(nbthreads); + multithreader->SetSingleMethod(this->ThreaderCallback, &str); + + // multithread the execution + + // multithread the execution - stage 1 + m_Stage = 1; + + for (unsigned int d = 0; d < ImageDimension; d++) + { + m_CurrentDimension = d; + multithreader->SingleMethodExecute(); + } + // swap over the parameters controlling erosion/dilation + m_Extreme = m_Extreme2; + m_MagnitudeSign = m_MagnitudeSign2; + + // multithread the execution - stage 2 + m_Stage = 2; + for (unsigned int d = 0; d < ImageDimension; d++) + { + m_CurrentDimension = d; + multithreader->SingleMethodExecute(); + } + + // swap them back + m_Extreme = m_Extreme1; + m_MagnitudeSign = m_MagnitudeSign1; + m_Stage = 1; + +#if 0 + // Set up the multithreaded processing + typename ImageSource< TOutputImage >::ThreadStruct str; + str.Filter = this; + this->GetMultiThreader()->SetNumberOfThreads(this->GetNumberOfThreads()); + this->GetMultiThreader()->SetSingleMethod(this->ThreaderCallback, &str); + + // multithread the execution - stage 1 + m_Stage=1; + for( unsigned int d=0; dGetMultiThreader()->SingleMethodExecute(); + } + // swap over the parameters controlling erosion/dilation + m_Extreme = m_Extreme2; + m_MagnitudeSign = m_MagnitudeSign2; + + // multithread the execution - stage 2 + m_Stage=2; + for( unsigned int d=0; dGetMultiThreader()->SingleMethodExecute(); + } + // swap them back + m_Extreme = m_Extreme1; + m_MagnitudeSign = m_MagnitudeSign1; + m_Stage=1; +#endif +} + +//////////////////////////////////////////////////////////// + +template +void +ParabolicOpenCloseImageFilter::ThreadedGenerateData( + const OutputImageRegionType & outputRegionForThread, + ThreadIdType threadId) +{ + // 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++) + { + 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[m_CurrentDimension], + 30, + m_CurrentDimension * progressPerDimension, + progressPerDimension); + + + typedef ImageLinearConstIteratorWithIndex InputConstIteratorType; + typedef ImageLinearIteratorWithIndex OutputIteratorType; + + // for stages after the first + typedef ImageLinearConstIteratorWithIndex OutputConstIteratorType; + + + typedef ImageRegion RegionType; + + typename TInputImage::ConstPointer inputImage(this->GetInput()); + typename TOutputImage::Pointer outputImage(this->GetOutput()); + + + // const unsigned int imageDimension = inputImage->GetImageDimension(); + + // outputImage->SetBufferedRegion( outputImage->GetRequestedRegion() ); + // outputImage->Allocate(); + RegionType region = outputRegionForThread; + + + InputConstIteratorType inputIterator(inputImage, region); + OutputIteratorType outputIterator(outputImage, region); + OutputConstIteratorType inputIteratorStage2(outputImage, region); + + if (m_Stage == 1) + { + // deal with the first dimension - this should be copied to the + // output if the scale is 0 + if (m_CurrentDimension == 0) + { + if (m_Scale[0] > 0) + { + // Perform as normal + // RealType magnitude = 1.0/(2.0 * m_Scale[0]); + unsigned long LineLength = region.GetSize()[0]; + RealType image_scale = this->GetInput()->GetSpacing()[0]; + + doOneDimension( + inputIterator, + outputIterator, + *progress, + LineLength, + 0, + this->m_MagnitudeSign, + this->m_UseImageSpacing, + this->m_Extreme, + image_scale, + this->m_Scale[0], + m_ParabolicAlgorithm); + } + else + { + // copy to output + typedef ImageRegionConstIterator InItType; + typedef ImageRegionIterator OutItType; + + InItType InIt(inputImage, region); + OutItType OutIt(outputImage, region); + while (!InIt.IsAtEnd()) + { + OutIt.Set(static_cast(InIt.Get())); + ++InIt; + ++OutIt; + } + } + } + else + { + if (m_Scale[m_CurrentDimension] > 0) + { + // now deal with the other dimensions for first stage + unsigned long LineLength = region.GetSize()[m_CurrentDimension]; + RealType image_scale = this->GetInput()->GetSpacing()[m_CurrentDimension]; + + doOneDimension( + inputIteratorStage2, + outputIterator, + *progress, + LineLength, + m_CurrentDimension, + this->m_MagnitudeSign, + this->m_UseImageSpacing, + this->m_Extreme, + image_scale, + this->m_Scale[m_CurrentDimension], + m_ParabolicAlgorithm); + } + } + } + else + { + // deal with the other dimensions for second stage + if (m_Scale[m_CurrentDimension] > 0) + { + // RealType magnitude = 1.0/(2.0 * m_Scale[dd]); + unsigned long LineLength = region.GetSize()[m_CurrentDimension]; + RealType image_scale = this->GetInput()->GetSpacing()[m_CurrentDimension]; + + doOneDimension( + inputIteratorStage2, + outputIterator, + *progress, + LineLength, + m_CurrentDimension, + this->m_MagnitudeSign, + this->m_UseImageSpacing, + this->m_Extreme, + image_scale, + this->m_Scale[m_CurrentDimension], + m_ParabolicAlgorithm); + } + } +} + + +template +void +ParabolicOpenCloseImageFilter::PrintSelf(std::ostream & os, Indent indent) const +{ + Superclass::PrintSelf(os, indent); + if (m_UseImageSpacing) + { + os << "Scale in world units: " << m_Scale << std::endl; + } + else + { + os << "Scale in voxels: " << m_Scale << std::endl; + } +} + + +} // namespace itk +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h new file mode 100644 index 00000000000..5d0b467be03 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h @@ -0,0 +1,167 @@ +#ifndef __itkParabolicOpenCloseSafeBorderImageFilter_h +#define __itkParabolicOpenCloseSafeBorderImageFilter_h + +#include "itkParabolicOpenCloseImageFilter.h" +#include "itkCropImageFilter.h" +#include "itkConstantPadImageFilter.h" +#include "itkCastImageFilter.h" +#include "itkStatisticsImageFilter.h" + +/* this class implements padding and cropping, so we don't just + * inherit from the OpenCloseImageFitler */ + +namespace itk +{ +template +class ITK_EXPORT ParabolicOpenCloseSafeBorderImageFilter : public ImageToImageFilter +{ + +public: + /** Standard class typedefs. */ + typedef ParabolicOpenCloseSafeBorderImageFilter Self; + typedef ImageToImageFilter Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Runtime information support. */ + itkTypeMacro(ParabolicOpenCloseSafeBorderImageFilter, ImageToImageFilter); + + + /** Pixel Type of the input image */ + typedef TInputImage InputImageType; + typedef TOutputImage OutputImageType; + typedef typename TInputImage::PixelType InputPixelType; + typedef typename NumericTraits::RealType RealType; + typedef typename NumericTraits::ScalarRealType ScalarRealType; + typedef typename TOutputImage::PixelType OutputPixelType; + + /** Smart pointer typedef support. */ + typedef typename TInputImage::Pointer InputImagePointer; + typedef typename TInputImage::ConstPointer InputImageConstPointer; + + /** a type to represent the "kernel radius" */ + typedef typename itk::FixedArray RadiusType; + + /** Image dimension. */ + itkStaticConstMacro(ImageDimension, 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. */ + + // set all of the scales the same + void + SetScale(ScalarRealType scale) + { + RadiusType s = this->GetScale(); + this->m_MorphFilt->SetScale(scale); + if (s != this->GetScale()) + { + this->Modified(); + } + } + // different scale for each direction + void + SetScale(RadiusType scale) + { + if (scale != this->GetScale()) + { + this->m_MorphFilt->SetScale(scale); + this->Modified(); + } + } + // + const RadiusType & + GetScale() const + { + return (this->m_MorphFilt->GetScale()); + } + + + void + SetUseImageSpacing(bool B) + { + if (B != this->GetUseImageSpacing()) + { + this->m_MorphFilt->SetUseImageSpacing(B); + this->Modified(); + } + } + bool + GetUseImageSpacing() const + { + return (this->m_MorphFilt->GetUseImageSpacing()); + } + itkBooleanMacro(UseImageSpacing); + + + itkSetMacro(SafeBorder, bool); + itkGetConstReferenceMacro(SafeBorder, bool); + itkBooleanMacro(SafeBorder); + // should add the Get methods + + enum ParabolicAlgorithm + { + NOCHOICE = 0, // decices based on scale - experimental + CONTACTPOINT = 1, // sometimes faster at low scale + INTERSECTION = 2 // default + }; + /** + * Set/Get the method used. Choices are contact point or + * intersection. Intersection is the default. Contact point can be + * faster at small scales. + */ + + itkSetMacro(ParabolicAlgorithm, int); + itkGetConstReferenceMacro(ParabolicAlgorithm, int); + + /** ParabolicOpenCloseImageFilter must forward the Modified() call to its internal filters */ + virtual void + Modified() const; + +protected: + void + GenerateData(); + void + PrintSelf(std::ostream & os, Indent indent) const; + + typedef ParabolicOpenCloseImageFilter MorphFilterType; + typedef ConstantPadImageFilter PadFilterType; + typedef CropImageFilter CropFilterType; + typedef StatisticsImageFilter StatsFilterType; + + ParabolicOpenCloseSafeBorderImageFilter() + { + m_MorphFilt = MorphFilterType::New(); + m_PadFilt = PadFilterType::New(); + m_CropFilt = CropFilterType::New(); + m_StatsFilt = StatsFilterType::New(); + m_SafeBorder = true; + m_ParabolicAlgorithm = INTERSECTION; + } + virtual ~ParabolicOpenCloseSafeBorderImageFilter() {}; + int m_ParabolicAlgorithm; + + +private: + ParabolicOpenCloseSafeBorderImageFilter(const Self &); // purposely not implemented + void + operator=(const Self &); // purposely not implemented + + typename MorphFilterType::Pointer m_MorphFilt; + typename PadFilterType::Pointer m_PadFilt; + typename CropFilterType::Pointer m_CropFilt; + typename StatsFilterType::Pointer m_StatsFilt; + bool m_SafeBorder; + bool m_UseContactPoint; + bool m_UseIntersection; +}; + +} // end namespace itk +#ifndef ITK_MANUAL_INSTANTIATION +# include "itkParabolicOpenCloseSafeBorderImageFilter.hxx" +#endif + +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx new file mode 100644 index 00000000000..6e4f2da11b1 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx @@ -0,0 +1,124 @@ +#ifndef __itkParabolicOpenCloseSafeBorderImageFilter_txx +#define __itkParabolicOpenCloseSafeBorderImageFilter_txx + +#include "itkProgressAccumulator.h" + +namespace itk +{ + +template +void +ParabolicOpenCloseSafeBorderImageFilter::GenerateData(void) +{ + + ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); + progress->SetMiniPipelineFilter(this); + + // Allocate the output + this->AllocateOutputs(); + InputImageConstPointer inputImage; + unsigned long Bounds[ImageDimension]; + typename TInputImage::SizeType BoundsSize; + if (this->m_SafeBorder) + { + // need to compute some image statistics and determine the padding + // extent. This will almost certainly be an over estimate + m_StatsFilt->SetInput(this->GetInput()); + m_StatsFilt->Update(); + InputPixelType range = m_StatsFilt->GetMaximum() - m_StatsFilt->GetMinimum(); + typename MorphFilterType::RadiusType Sigma = m_MorphFilt->GetScale(); + typename TInputImage::SpacingType spcing = m_StatsFilt->GetOutput()->GetSpacing(); + for (unsigned s = 0; s < ImageDimension; s++) + { + if (m_MorphFilt->GetUseImageSpacing()) + { + RealType image_scale = spcing[s]; + Bounds[s] = (unsigned long)ceil(sqrt(2 * (Sigma[s] / (image_scale * image_scale)) * range)); + BoundsSize[s] = Bounds[s]; + } + else + { + Bounds[s] = (unsigned long)ceil(sqrt(2 * Sigma[s] * range)); + BoundsSize[s] = Bounds[s]; + } + } + m_PadFilt->SetPadLowerBound(Bounds); + m_PadFilt->SetPadUpperBound(Bounds); + + // need to select between opening and closing here + if (doOpen) + { + // m_PadFilt->SetConstant(NumericTraits::max()); + m_PadFilt->SetConstant(m_StatsFilt->GetMaximum()); + } + else + { + // m_PadFilt->SetConstant(NumericTraits::NonpositiveMin()); + m_PadFilt->SetConstant(m_StatsFilt->GetMinimum()); + } + m_PadFilt->SetInput(m_StatsFilt->GetOutput()); + progress->RegisterInternalFilter(m_PadFilt, 0.1f); + inputImage = m_PadFilt->GetOutput(); + } + else + { + inputImage = this->GetInput(); + } + + m_MorphFilt->SetInput(inputImage); + m_MorphFilt->SetParabolicAlgorithm(m_ParabolicAlgorithm); + + progress->RegisterInternalFilter(m_MorphFilt, 0.8f); + + if (this->m_SafeBorder) + { + // crop + m_CropFilt->SetInput(m_MorphFilt->GetOutput()); + m_CropFilt->SetUpperBoundaryCropSize(BoundsSize); + m_CropFilt->SetLowerBoundaryCropSize(BoundsSize); + progress->RegisterInternalFilter(m_CropFilt, 0.1f); + m_CropFilt->GraftOutput(this->GetOutput()); + m_CropFilt->Update(); + this->GraftOutput(m_CropFilt->GetOutput()); + } + else + { + m_MorphFilt->GraftOutput(this->GetOutput()); + m_MorphFilt->Update(); + this->GraftOutput(m_MorphFilt->GetOutput()); + // std::cout << "Finished grafting" << std::endl; + } +} + + +template +void +ParabolicOpenCloseSafeBorderImageFilter::Modified() const +{ + Superclass::Modified(); + m_MorphFilt->Modified(); + m_PadFilt->Modified(); + m_CropFilt->Modified(); + m_StatsFilt->Modified(); +} + + +/////////////////////////////////// +template +void +ParabolicOpenCloseSafeBorderImageFilter::PrintSelf(std::ostream & os, + Indent indent) const +{ + os << indent << "SafeBorder: " << m_SafeBorder << std::endl; + if (this->GetUseImageSpacing()) + { + os << "Scale in world units: " << this->GetScale() << std::endl; + } + else + { + os << "Scale in voxels: " << this->GetScale() << std::endl; + } +} +} // namespace itk + +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h new file mode 100644 index 00000000000..9b3afd01fc4 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h @@ -0,0 +1,75 @@ +#ifndef __itkParabolicOpenImageFilter_h +#define __itkParabolicOpenImageFilter_h + +#include "itkParabolicOpenCloseSafeBorderImageFilter.h" +#include "itkNumericTraits.h" + +namespace itk +{ +/** + * \class ParabolicOpenImageFilter + * \brief Class for morphological opening + * operations with parabolic structuring elements. + * + * This filter provides options for padded borders + * + * This filter is threaded. + * + * \sa itkParabolicOpenCloseImageFilter + * + * \author Richard Beare, Department of Medicine, Monash University, + * Australia. + **/ + +template +class ITK_EXPORT ParabolicOpenImageFilter + : public ParabolicOpenCloseSafeBorderImageFilter +{ + +public: + /** Standard class typedefs. */ + typedef ParabolicOpenImageFilter Self; + typedef ParabolicOpenCloseSafeBorderImageFilter Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + + /** Pixel Type of the input image */ + typedef TInputImage InputImageType; + typedef TOutputImage OutputImageType; + typedef typename TInputImage::PixelType PixelType; + typedef typename NumericTraits::RealType RealType; + typedef typename NumericTraits::ScalarRealType ScalarRealType; + typedef typename TOutputImage::PixelType OutputPixelType; + + /** Smart pointer typedef support. */ + typedef typename TInputImage::Pointer InputImagePointer; + typedef typename TInputImage::ConstPointer InputImageConstPointer; + + /** a type to represent the "kernel radius" */ + typedef typename itk::FixedArray RadiusType; + + /** Image dimension. */ + itkStaticConstMacro(ImageDimension, 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. */ + + +protected: + ParabolicOpenImageFilter() {}; + virtual ~ParabolicOpenImageFilter() {}; + // void PrintSelf(std::ostream& os, Indent indent) const; + +private: + ParabolicOpenImageFilter(const Self &); // purposely not implemented + void + operator=(const Self &); // purposely not implemented +}; + +} // end namespace itk + +#endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h new file mode 100644 index 00000000000..e468840cbeb --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h @@ -0,0 +1,106 @@ + +#ifndef __itkSharpenOpImageFilter_h +#define __itkSharpenOpImageFilter_h + +#include "itkTernaryFunctorImageFilter.h" + +namespace itk +{ + +/** \class SharpenOpImageFilter + * \brief Implements the sharpening operation. The inputs are the + * dilated, eroded and original images. + * + * This class is parametrized over the types of the three + * input images and the type of the output image. + * Numeric conversions (castings) are done by the C++ defaults. + * + * In reality the input and output types of this filter are expected + * to be the same. + * + * \author Richard Beare, Department of Medicine, Monash University, + * Australia. + * + */ +namespace Function +{ + +template +class SharpM +{ +public: + SharpM() {} + ~SharpM() {} + bool + operator!=(const SharpM &) const + { + return false; + } + bool + operator==(const SharpM & other) const + { + return !(*this != other); + } + inline TOutput + operator()(const TInput1 & A, const TInput2 & B, const TInput3 & C) + { + // the sharpening operator. A is the dilation, B the original, C + // the erosion + TInput2 diff1 = A - B; + TInput2 diff2 = B - C; + + if (diff1 < diff2) + return (TOutput)A; + if (diff2 < diff1) + return (TOutput)C; + return ((TOutput)B); + } +}; +} // namespace Function + +template +class ITK_EXPORT SharpenOpImageFilter + : public TernaryFunctorImageFilter> +{ +public: + /** Standard class typedefs. */ + typedef SharpenOpImageFilter Self; + typedef TernaryFunctorImageFilter> + Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Runtime information support. */ + itkTypeMacro(SharpenOpImageFilter, TernaryFunctorImageFilter); + +protected: + SharpenOpImageFilter() {} + virtual ~SharpenOpImageFilter() {} + +private: + SharpenOpImageFilter(const Self &); // purposely not implemented + void + operator=(const Self &); // purposely not implemented +}; + +} // end namespace itk + + +#endif From 6048596639c5e55d1404955a7de14df43476787c Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Tue, 7 Apr 2015 17:14:39 +1000 Subject: [PATCH 055/165] ENH: thresholding dependency --- Modules/Filtering/ParabolicMorphology/itk-module.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Filtering/ParabolicMorphology/itk-module.cmake b/Modules/Filtering/ParabolicMorphology/itk-module.cmake index a1e3f4add4d..79a8fb5ea80 100644 --- a/Modules/Filtering/ParabolicMorphology/itk-module.cmake +++ b/Modules/Filtering/ParabolicMorphology/itk-module.cmake @@ -8,6 +8,7 @@ itk_module( ParabolicMorphology DEPENDS ITKIOImageBase + ITKThresholding TEST_DEPENDS ITKImageGrid ITKTestKernel From cc6e8ad81d6aedb579479d2feaec5d6469b1f2e4 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Tue, 7 Apr 2015 18:52:47 +1000 Subject: [PATCH 056/165] ENH: Removing watershed progress meter --- .../include/itkMorphologicalSharpeningImageFilter.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h index 09ef90f884c..01cd71e4491 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h @@ -3,7 +3,6 @@ #include "itkImageToImageFilter.h" // #include "itkProgressReporter.h" -#include "itkWatershedMiniPipelineProgressCommand.h" #include "itkCastImageFilter.h" #include "itkParabolicErodeImageFilter.h" #include "itkParabolicDilateImageFilter.h" From 7187607accb83f9a64699b99c1591abfa469a382 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Tue, 7 Apr 2015 19:02:04 +1000 Subject: [PATCH 057/165] ENH: removed .txx --- .../include/itkBinaryCloseParaImageFilter.hxx | 4 +-- .../itkBinaryDilateParaImageFilter.hxx | 4 +-- .../include/itkBinaryErodeParaImageFilter.h | 2 +- .../include/itkBinaryErodeParaImageFilter.hxx | 4 +-- .../include/itkBinaryOpenParaImageFilter.hxx | 4 +-- ...phologicalDistanceTransformImageFilter.hxx | 4 +-- .../itkMorphologicalSharpeningImageFilter.hxx | 32 +++++++++++-------- ...icalSignedDistanceTransformImageFilter.hxx | 4 +-- .../itkParabolicErodeDilateImageFilter.hxx | 4 +-- .../itkParabolicOpenCloseImageFilter.hxx | 4 +-- ...arabolicOpenCloseSafeBorderImageFilter.hxx | 4 +-- 11 files changed, 38 insertions(+), 32 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx index c88aafd7d82..8a7177abac3 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx @@ -1,5 +1,5 @@ -#ifndef __itkBinaryCloseParabolicImageFilter_txx -#define __itkBinaryCloseParabolicImageFilter_txx +#ifndef __itkBinaryCloseParabolicImageFilter_hxx +#define __itkBinaryCloseParabolicImageFilter_hxx #include "itkProgressAccumulator.h" #include "itkBinaryCloseParaImageFilter.h" diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx index 27be9e7e141..b79a95cbc58 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx @@ -1,5 +1,5 @@ -#ifndef __itkBinaryDilateParabolicImageFilter_txx -#define __itkBinaryDilateParabolicImageFilter_txx +#ifndef __itkBinaryDilateParabolicImageFilter_hxx +#define __itkBinaryDilateParabolicImageFilter_hxx #include "itkProgressAccumulator.h" #include "itkBinaryDilateParaImageFilter.h" diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h index 62f7dfe26ac..297ecce1693 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h @@ -136,7 +136,7 @@ class ITK_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilter::GenerateData(void) { - // ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); - // progress->SetMiniPipelineFilter(this); + ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); + progress->SetMiniPipelineFilter(this); // Allocate the output this->AllocateOutputs(); @@ -44,14 +44,20 @@ MorphologicalSharpeningImageFilter::GenerateData(void m_SharpenOp->SetInput2(m_Cast->GetOutput()); m_SharpenOp->SetInput3(m_Erode->GetOutput()); - // set up the progrss monitor - WatershedMiniPipelineProgressCommand::Pointer c = WatershedMiniPipelineProgressCommand::New(); - c->SetFilter(this); - c->SetNumberOfFilters(3 * m_Iterations); + progress->RegisterInternalFilter(m_Erode, 1.0f); + progress->RegisterInternalFilter(m_Dilate, 1.0f); + progress->RegisterInternalFilter(m_SharpenOp, 1.0f); + - m_Erode->AddObserver(ProgressEvent(), c); - m_Dilate->AddObserver(ProgressEvent(), c); - m_SharpenOp->AddObserver(ProgressEvent(), c); + // set up the progrss monitor + // WatershedMiniPipelineProgressCommand::Pointer c = + // WatershedMiniPipelineProgressCommand::New(); + // c->SetFilter(this); + // c->SetNumberOfFilters(3 * m_Iterations); + + // m_Erode->AddObserver(ProgressEvent(), c); + // m_Dilate->AddObserver(ProgressEvent(), c); + // m_SharpenOp->AddObserver(ProgressEvent(), c); for (int i = 0; i < m_Iterations; i++) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx index 114e9e14d38..23b0d0d751f 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx @@ -1,5 +1,5 @@ -#ifndef __itkMorphologicalSignedDistanceTransformImageFilter_txx -#define __itkMorphologicalSignedDistanceTransformImageFilter_txx +#ifndef __itkMorphologicalSignedDistanceTransformImageFilter_hxx +#define __itkMorphologicalSignedDistanceTransformImageFilter_hxx #include "itkMorphologicalSignedDistanceTransformImageFilter.h" #include "itkProgressAccumulator.h" diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx index ac71b5bb455..f360a6fb945 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx @@ -1,5 +1,5 @@ -#ifndef __itkParabolicErodeDilateImageFilter_txx -#define __itkParabolicErodeDilateImageFilter_txx +#ifndef __itkParabolicErodeDilateImageFilter_hxx +#define __itkParabolicErodeDilateImageFilter_hxx #include "itkParabolicErodeDilateImageFilter.h" #include "itkImageRegionConstIterator.h" diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx index 433a9ccf41d..65afa5fb2ab 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx @@ -1,5 +1,5 @@ -#ifndef __itkParabolicOpenCloseImageFilter_txx -#define __itkParabolicOpenCloseImageFilter_txx +#ifndef __itkParabolicOpenCloseImageFilter_hxx +#define __itkParabolicOpenCloseImageFilter_hxx #include "itkImageRegionConstIterator.h" #include "itkImageRegionIterator.h" diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx index 6e4f2da11b1..8a8bbddf98e 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx @@ -1,5 +1,5 @@ -#ifndef __itkParabolicOpenCloseSafeBorderImageFilter_txx -#define __itkParabolicOpenCloseSafeBorderImageFilter_txx +#ifndef __itkParabolicOpenCloseSafeBorderImageFilter_hxx +#define __itkParabolicOpenCloseSafeBorderImageFilter_hxx #include "itkProgressAccumulator.h" From 3c2b6fea6aa8c88e1d2919960f47d83f617f6f54 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Tue, 7 Apr 2015 19:09:57 +1000 Subject: [PATCH 058/165] ENH: missing include --- .../include/itkGreaterEqualValImageFilter.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h index 6fd8fa263e2..780fbd70741 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h @@ -1,6 +1,6 @@ #ifndef __itkGreaterEqualValImageFilter_h #define __itkGreaterEqualValImageFilter_h - +#include namespace itk { @@ -48,9 +48,10 @@ class GEConst template class ITK_EXPORT GreaterEqualValImageFilter - : public UnaryFunctorImageFilter> + : public itk::UnaryFunctorImageFilter< + TInputImage, + TOutputImage, + Function::GEConst> { public: /** Standard class typedefs. */ From 19fc83e82e55dfb8a0a805064b749dca2b5fee48 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Tue, 7 Apr 2015 19:13:58 +1000 Subject: [PATCH 059/165] ENH: changed function namespace to functor --- .../include/itkGreaterEqualValImageFilter.h | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h index 780fbd70741..8dc403d226c 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h @@ -10,7 +10,7 @@ namespace itk */ -namespace Function +namespace Functor { template @@ -44,14 +44,13 @@ class GEConst private: TInput m_Val; }; -} // namespace Function +} // namespace Functor template class ITK_EXPORT GreaterEqualValImageFilter - : public itk::UnaryFunctorImageFilter< - TInputImage, - TOutputImage, - Function::GEConst> + : public UnaryFunctorImageFilter> { public: /** Standard class typedefs. */ From a455e1f3540883118ddae9615eada86b4b16c1b6 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Tue, 7 Apr 2015 19:14:48 +1000 Subject: [PATCH 060/165] ENH: Missing include --- .../include/itkMorphologicalSharpeningImageFilter.hxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx index d8c93764dbe..72f0378a743 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx @@ -1,7 +1,7 @@ #ifndef __itkMorphologicalSharpeningImageFilter_hxx #define __itkMorphologicalSharpeningImageFilter_hxx -// #include "itkMorphologicalSharpeningImageFilter.h" +#include "itkMorphologicalSharpeningImageFilter.h" #include "itkProgressAccumulator.h" namespace itk From 18d6ae854321caf129565edcd9d66db68dcde6db Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Tue, 7 Apr 2015 19:18:23 +1000 Subject: [PATCH 061/165] ENH: forgot one reference to function --- .../ParabolicMorphology/include/itkGreaterEqualValImageFilter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h index 8dc403d226c..07012856099 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h @@ -50,7 +50,7 @@ template class ITK_EXPORT GreaterEqualValImageFilter : public UnaryFunctorImageFilter> + Functor::GEConst> { public: /** Standard class typedefs. */ From 6e7d0ffe2f7a43f2911758262bb109ffe164517f Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Tue, 7 Apr 2015 19:23:51 +1000 Subject: [PATCH 062/165] ENH: forgot another reference to function --- .../ParabolicMorphology/include/itkGreaterEqualValImageFilter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h index 07012856099..691ce3d2f41 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h @@ -57,7 +57,7 @@ class ITK_EXPORT GreaterEqualValImageFilter typedef GreaterEqualValImageFilter Self; typedef UnaryFunctorImageFilter> + Functor::GEConst> Superclass; typedef SmartPointer Pointer; typedef SmartPointer ConstPointer; From 5c4a46e21996873933a3b3af790ea8a1e72c0ff6 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Tue, 7 Apr 2015 19:32:21 +1000 Subject: [PATCH 063/165] COMP: removing warnings and a missing include --- .../include/itkMorphologicalSharpeningImageFilter.h | 2 +- .../itkMorphologicalSignedDistanceTransformImageFilter.h | 2 +- .../include/itkParabolicOpenCloseImageFilter.hxx | 8 ++++---- .../itkParabolicOpenCloseSafeBorderImageFilter.hxx | 1 + 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h index 01cd71e4491..db3ffe1a4d3 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h @@ -107,7 +107,7 @@ class ITK_EXPORT MorphologicalSharpeningImageFilter : public ImageToImageFilter< return m_Erode->GetScale(); } - const bool + const bool & GetUseImageSpacing() { return m_Erode->GetUseImageSpacing(); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h index 2ef23438f3c..d4b48cff8c0 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h @@ -131,7 +131,7 @@ class ITK_EXPORT MorphologicalSignedDistanceTransformImageFilter : public ImageT itkGetConstReferenceMacro(ParabolicAlgorithm, int); - const bool + const bool & GetUseImageSpacing() { return m_Erode->GetUseImageSpacing(); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx index 65afa5fb2ab..c9fceef5061 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx @@ -157,14 +157,14 @@ ParabolicOpenCloseImageFilter::GenerateData(v { ThreadIdType nbthreads = this->GetNumberOfThreads(); - typedef ImageLinearConstIteratorWithIndex InputConstIteratorType; - typedef ImageLinearIteratorWithIndex OutputIteratorType; + // typedef ImageLinearConstIteratorWithIndex< TInputImage > InputConstIteratorType; + // typedef ImageLinearIteratorWithIndex< TOutputImage > OutputIteratorType; // for stages after the first - typedef ImageLinearConstIteratorWithIndex OutputConstIteratorType; + // typedef ImageLinearConstIteratorWithIndex< TOutputImage > OutputConstIteratorType; - typedef ImageRegion RegionType; + // typedef ImageRegion< TInputImage::ImageDimension > RegionType; typename TInputImage::ConstPointer inputImage(this->GetInput()); typename TOutputImage::Pointer outputImage(this->GetOutput()); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx index 8a8bbddf98e..a160da1a061 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx @@ -2,6 +2,7 @@ #define __itkParabolicOpenCloseSafeBorderImageFilter_hxx #include "itkProgressAccumulator.h" +#include "itkParabolicOpenCloseSafeBorderImageFilter.h" namespace itk { From 39ccebcd74bedccfa2c9b284b4ede665735ea022 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Tue, 7 Apr 2015 20:32:22 +1000 Subject: [PATCH 064/165] ENH: Baseline image for erosion test. --- .../test/baseline/outECPa.png | Bin 0 -> 15514 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/outECPa.png diff --git a/Modules/Filtering/ParabolicMorphology/test/baseline/outECPa.png b/Modules/Filtering/ParabolicMorphology/test/baseline/outECPa.png new file mode 100644 index 0000000000000000000000000000000000000000..3f2b8e5395ee6f903a78efc131031d3bd3ab6bf3 GIT binary patch literal 15514 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 Date: Tue, 7 Apr 2015 20:33:32 +1000 Subject: [PATCH 065/165] ENH: added second compare --- Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index c0f89840691..e643b01606c 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -23,7 +23,9 @@ itk_add_test( --compare outEInta.png outECPa.png - # --compare outEInta.png baseline/outEInta.png + --compare + outEInta.png + baseline/outECPa.png itkParaErodeTest ${INPUT_IMAGE} outEInta.png From 10ddc517165be76fb270a0b6e710d2bffd5b7cfc Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Tue, 7 Apr 2015 20:36:26 +1000 Subject: [PATCH 066/165] ENH: corrected method return type --- .../include/itkMorphologicalDistanceTransformImageFilter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h index 04ae26ea6c5..ad100fb93b8 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h @@ -86,7 +86,7 @@ class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImage } - const bool + const bool & GetUseImageSpacing() { return m_Erode->GetUseImageSpacing(); From c4bb56c082e45357243f169738fbc8b8ef01af42 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Tue, 7 Apr 2015 20:37:46 +1000 Subject: [PATCH 067/165] ENH: corrected path for baseline image --- Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index e643b01606c..f903417f602 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -25,7 +25,7 @@ itk_add_test( outECPa.png --compare outEInta.png - baseline/outECPa.png + ${CMAKGE_CURRENT_SOURCE_DIR}/baseline/outECPa.png itkParaErodeTest ${INPUT_IMAGE} outEInta.png From bfdbf2d354799bee7cd9ac255de25c5752c3ac65 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Tue, 7 Apr 2015 20:41:53 +1000 Subject: [PATCH 068/165] ENH: corrected path for baseline image - typo --- Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index f903417f602..74eed37dc93 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -25,7 +25,7 @@ itk_add_test( outECPa.png --compare outEInta.png - ${CMAKGE_CURRENT_SOURCE_DIR}/baseline/outECPa.png + ${CMAKE_CURRENT_SOURCE_DIR}/baseline/outECPa.png itkParaErodeTest ${INPUT_IMAGE} outEInta.png From a54b25f3ccb565cf738dc193df2291f78cd8923e Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 8 Apr 2015 09:15:50 +1000 Subject: [PATCH 069/165] ENH: more erode and dilate tests --- .../ParabolicMorphology/test/CMakeLists.txt | 94 ++++++++++++++++++- 1 file changed, 92 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index 74eed37dc93..a10417b3cc5 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -2,7 +2,7 @@ itk_module_test() set( ParabolicMorphologyTests itkParaErodeTest.cxx - #itkParaDilateTest.cxx + itkParaDilateTest.cxx #itkParaOpenTest.cxx #itkParaSpacingTest.cxx #itkParaSharpenTest.cxx @@ -16,8 +16,9 @@ set(ITK_TEST_DRIVER itkTestDriver) createtestdriver(ParabolicMorphology "${ParabolicMorphology-Test_LIBRARIES}" "${ParabolicMorphologyTests}") ## both intersection and contact point erosion +## default scale itk_add_test( - NAME itkParaErodeTest1 + NAME itkParaErodeTest2D_1 COMMAND ParabolicMorphologyTestDriver --compare @@ -31,3 +32,92 @@ itk_add_test( outEInta.png outECPa.png ) + +## small scale +itk_add_test( + NAME itkParaErodeTest2D_2 + COMMAND + ParabolicMorphologyTestDriver + --compare + outEIntb.png + outECPb.png + --compare + outEIntb.png + ${CMAKE_CURRENT_SOURCE_DIR}/baseline/outECPb.png + itkParaErodeTest + ${INPUT_IMAGE} + outEIntb.png + outECPb.png + 0.2 +) + +## large scale +itk_add_test( + NAME itkParaErodeTest2D_3 + COMMAND + ParabolicMorphologyTestDriver + --compare + outEIntc.png + outECPc.png + --compare + outEIntc.png + ${CMAKE_CURRENT_SOURCE_DIR}/baseline/outECPc.png + itkParaErodeTest + ${INPUT_IMAGE} + outEIntc.png + outECPc.png + 5 +) + +## default scale +itk_add_test( + NAME itkParaDilateTest2D_1 + COMMAND + ParabolicMorphologyTestDriver + --compare + outDInta.png + outDCPa.png + --compare + outDInta.png + ${CMAKE_CURRENT_SOURCE_DIR}/baseline/outDCPa.png + itkParaDilateTest + ${INPUT_IMAGE} + outDInta.png + outDCPa.png +) + +## small scale +itk_add_test( + NAME itkParaErodeTest2D_2 + COMMAND + ParabolicMorphologyTestDriver + --compare + outDIntb.png + outDCPb.png + --compare + outDIntb.png + ${CMAKE_CURRENT_SOURCE_DIR}/baseline/outDCPb.png + itkParaDilateTest + ${INPUT_IMAGE} + outDIntb.png + outDCPb.png + 0.2 +) + +## large scale +itk_add_test( + NAME itkParaErodeTest2D_3 + COMMAND + ParabolicMorphologyTestDriver + --compare + outDIntc.png + outDCPc.png + --compare + outDIntc.png + ${CMAKE_CURRENT_SOURCE_DIR}/baseline/outDCPc.png + itkParaDilateTest + ${INPUT_IMAGE} + outDIntc.png + outDCPc.png + 5 +) From a76fb56e882650587a28a3dc33ca8186208b7e76 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 8 Apr 2015 09:21:13 +1000 Subject: [PATCH 070/165] ENH: typo in test names --- Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index a10417b3cc5..2283767d8cd 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -88,7 +88,7 @@ itk_add_test( ## small scale itk_add_test( - NAME itkParaErodeTest2D_2 + NAME itkParaDilateTest2D_2 COMMAND ParabolicMorphologyTestDriver --compare @@ -106,7 +106,7 @@ itk_add_test( ## large scale itk_add_test( - NAME itkParaErodeTest2D_3 + NAME itkParaDilateTest2D_3 COMMAND ParabolicMorphologyTestDriver --compare From bdeed76ef466b0608165e183e56916daa37335d6 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 8 Apr 2015 09:26:57 +1000 Subject: [PATCH 071/165] ENH: added baseline images --- .../test/baseline/outDCPa.png | Bin 0 -> 17284 bytes .../test/baseline/outDCPb.png | Bin 0 -> 25268 bytes .../test/baseline/outDCPc.png | Bin 0 -> 10976 bytes .../test/baseline/outDInta.png | Bin 0 -> 17284 bytes .../test/baseline/outDIntb.png | Bin 0 -> 25268 bytes .../test/baseline/outDIntc.png | Bin 0 -> 10976 bytes .../test/baseline/outECPb.png | Bin 0 -> 24276 bytes .../test/baseline/outECPc.png | Bin 0 -> 8217 bytes .../test/baseline/outEInta.png | Bin 0 -> 15514 bytes .../test/baseline/outEIntb.png | Bin 0 -> 24276 bytes .../test/baseline/outEIntc.png | Bin 0 -> 8217 bytes 11 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/outDCPa.png create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/outDCPb.png create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/outDCPc.png create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/outDInta.png create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/outDIntb.png create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/outDIntc.png create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/outECPb.png create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/outECPc.png create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/outEInta.png create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/outEIntb.png create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/outEIntc.png diff --git a/Modules/Filtering/ParabolicMorphology/test/baseline/outDCPa.png b/Modules/Filtering/ParabolicMorphology/test/baseline/outDCPa.png new file mode 100644 index 0000000000000000000000000000000000000000..e8fbad578a06ed4da99795d774f52124aebab445 GIT binary patch literal 17284 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 literal 0 HcmV?d00001 diff --git a/Modules/Filtering/ParabolicMorphology/test/baseline/outDCPb.png b/Modules/Filtering/ParabolicMorphology/test/baseline/outDCPb.png new file mode 100644 index 0000000000000000000000000000000000000000..3be55bf5ed3c255605c3e8802d35df82091bea23 GIT binary patch literal 25268 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

~@!?r2pIx8v! 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 literal 0 HcmV?d00001 diff --git a/Modules/Filtering/ParabolicMorphology/test/baseline/outDIntb.png b/Modules/Filtering/ParabolicMorphology/test/baseline/outDIntb.png new file mode 100644 index 0000000000000000000000000000000000000000..3be55bf5ed3c255605c3e8802d35df82091bea23 GIT binary patch literal 25268 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

~@!?r2pIx8v! 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 boMTo6)N1ar@p@c*ngMNfeSD>=?c@IgfJ2|j literal 0 HcmV?d00001 diff --git a/Modules/Filtering/ParabolicMorphology/test/baseline/outEInta.png b/Modules/Filtering/ParabolicMorphology/test/baseline/outEInta.png new file mode 100644 index 0000000000000000000000000000000000000000..3f2b8e5395ee6f903a78efc131031d3bd3ab6bf3 GIT binary patch literal 15514 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 boMTo6)N1ar@p@c*ngMNfeSD>=?c@IgfJ2|j literal 0 HcmV?d00001 From fa5e7e28fc96bcf0aaa7111e3dc65609f003c06c Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 8 Apr 2015 09:42:56 +1000 Subject: [PATCH 072/165] ENH: opening test --- .../ParabolicMorphology/test/CMakeLists.txt | 19 +++- .../test/itkParaDilateTest.cxx | 10 +- .../test/itkParaOpenTest.cxx | 97 +++++++++++++++++++ 3 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index 2283767d8cd..c7631e709b9 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -3,7 +3,7 @@ set( ParabolicMorphologyTests itkParaErodeTest.cxx itkParaDilateTest.cxx - #itkParaOpenTest.cxx + itkParaOpenTest.cxx #itkParaSpacingTest.cxx #itkParaSharpenTest.cxx #itkParaDTTest.cxx @@ -121,3 +121,20 @@ itk_add_test( outDCPc.png 5 ) + +## Opening +itk_add_test( + NAME itkParaOpenTest2D_1 + COMMAND + ParabolicMorphologyTestDriver + --compare + openCP.png + openInt.png + --compare + openInt.png + ${CMAKE_CURRENT_SOURCE_DIR}/baseline/openInt.png + itkParaDOpenTest + ${INPUT_IMAGE} + openInt.png + openCP.png +) diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx index 85c3ddc50ba..4cf8de54909 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx @@ -63,7 +63,15 @@ itkParaDilateTest(int argc, char * argv[]) WriterType::Pointer writer = WriterType::New(); writer->SetInput(filter->GetOutput()); writer->SetFileName(argv[2]); - writer->Update(); + try + { + writer->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } filter->SetScale(scale); filter->SetUseImageSpacing(true); diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx new file mode 100644 index 00000000000..d400243aab2 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx @@ -0,0 +1,97 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" + +#include "itkParabolicOpenImageFilter.h" +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + + +int +itkParaOpenTest(int argc, char * argv[]) +{ + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + + + typedef itk::ImageFileReader ReaderType; + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(argv[1]); + try + { + reader->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + typedef itk::ParabolicOpenImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + filter->SetInput(reader->GetOutput()); + filter->SetSafeBorder(true); + FilterType::RadiusType scale; + scale[0] = 1; + scale[1] = 0.5; + filter->SetScale(scale); + + filter->SetParabolicAlgorithm(FilterType::INTERSECTION); + try + { + filter->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + typedef itk::ImageFileWriter WriterType; + WriterType::Pointer writer = WriterType::New(); + writer->SetInput(filter->GetOutput()); + writer->SetFileName(argv[2]); + try + { + writer->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + if (argc > 3) + { + // testing equivalence + filter->SetParabolicAlgorithm(FilterType::CONTACTPOINT); + try + { + filter->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + writer->SetFileName(argv[3]); + try + { + writer->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + } + + return EXIT_SUCCESS; +} From 24725fb15f8f2ca9e42b6477326e187f0cc1ccde Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 8 Apr 2015 09:48:01 +1000 Subject: [PATCH 073/165] COMP: typo in cmake --- Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index c7631e709b9..2f049e67e66 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -133,7 +133,7 @@ itk_add_test( --compare openInt.png ${CMAKE_CURRENT_SOURCE_DIR}/baseline/openInt.png - itkParaDOpenTest + itkParaOpenTest ${INPUT_IMAGE} openInt.png openCP.png From eb2b13ddb3d444dc4914c374a5a4a850caeac37e Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 8 Apr 2015 09:51:09 +1000 Subject: [PATCH 074/165] ENH: added opening test image --- .../test/baseline/openInt.png | Bin 0 -> 17687 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/openInt.png diff --git a/Modules/Filtering/ParabolicMorphology/test/baseline/openInt.png b/Modules/Filtering/ParabolicMorphology/test/baseline/openInt.png new file mode 100644 index 0000000000000000000000000000000000000000..3c4d3e8765daac54a867b2c102ecbc25eb5a6f7b GIT binary patch literal 17687 zcmZU5Wl$Vl6Yef7?iSn@w*bLif@^TM;I6?Pg1fuBySuvv2of9?LU8xX`&HelTXp-# z%+yRx*O@*&ZRhC|{!Kv=1(5&|005v!ONl810Kkt+AOQa32=Kta@Ax=TJAW0C1G0W* z`G3fifrSO||KBpYpg#lv$Nb=tpMcB5`>i_(T-Urehw`?h6a2!c~pbXE7*sd+&*;{x=>caAs3U9;SWQ{2o?o+ z69fRrdB@7b^xSmWdL{v7LbZ{J|wF@PB4CQL8X2mlvTGV&2LqQiF? zXjN4)lW7o#)y~uPv?lGq3lBMz(>MjC_)Kh4-@63#FZ13^ziCZxj^h^Kr2#xNUON*) zKMEffWByfu;X^OFKcU~7tkb2IsMIi-b;l0u2DTJN%H0aefUg+c0}H|n8tB`IV#jlZ zTC#Z%dSDG8z@wPC=2>uOS|lk6{*l)HVh2iUPjZGXwfzmgd#exiw^=Ujc0*7Y{6HjQ zZvFt8av&P4NUmUx&mThcDeJ`()lXxGbf3IrxH5LhrPfBj1;*m|w+Q=c9imch=?Dr4 z*YOv86>RC{M*BV&0tV4ZCy<>&Z}dxM^p(6?TeU|$_6mD`e&k;IL5MC)IiFk1adp`1 z$k6|CBI1_?P=2O!A=cD*=zP&a9MtGkcf;_1Xm-ftB_`aEyTXm=T@HxF>|?t#S^8}qRvBc^(j`rr`AqWp6A32Mpow2h!w>`w>@;pC`RlM4i= zaYz6Yy-k5=82(tj3-g+<)6dTNx(f1N3}5Mm86pl_-zx2x4A&!w%xqG z5hgjtHI1e*EQ-D_80PA9Qac~)dJlkWoNJ`KOya)KIBd`LP25@h!I|1L@Ey9|J-+v< z$))Tfc*xRwxssB8r9ez01AM>yWQP7HHKtQ%f97Y%36@J9O&%d|z!iFViyZwi^61DO zl!t#aW_A-f&a9f6RUy{YdN~y3#&!?)Jw#kd+-g2mQFGI&zkFAb>H-4wZQi81yiN7q zITHv;({R7pe?|heHI9fT?T^yQ(utybbF)a$`q2jnee&mYdy$I}6~@XK3OzJ7bIgx$ zWE+!*^ilF%Cc}rS@U<`u9!*<51vM4j^qio<#33+?NafT!#E(loo4wVKO=pDBaLHVA zeTw6XKXt9)xxs#Xi+Tv1AT5@CmjmQn?JTYhRZwS)XV}g#7?J{1a5)1Q1IczP>40_d zY+wIMh^b072a-*|`;i3*VG4Wt(#2|kBJP|*n^z!!=9;9vUm6* zPt0q%lu_$mz2C6LoThh$MYP$4>d;ULOAZVg750S+Da0wU`LW_GP2=?nG$-QU#hhx~ zkhZ%C$aHpj!=ylc%7Xy;JuKbEbz0JEa|Se$&mbHnTWp>^5mk}$9A<<9a!MaJ!wW%R z8O_l@1jp(WTVS7r+l$cg1KVtMb@|q0REnBVO|48B!l1Ze{Z}oMFljV!G3{x$`o(8p z)1mPv0!myhf-$E2(V_~5=F?^7ORm$=`Da4llw;1Klkyn|3k6Zk^;HW~VHDs#^5PTF z&j-p|$bh#5i$XWs@@neOzBjVszAFM-^=nu5EII+gxP5!x{IElN>rA+9R9IB|4RFxP zxk_=~<~291Fm(ljKh)Tbt}@wg)F2l>n7^o^ZXb9G)O@@uFAI|MxZ3CaMphgvmPTF`MaJhg*C)<7TLVBz(HC#Pph*tpDv8+D82IJ|b#X93Cj!Qx0#{Dt2FFm!2T>M{?Q?rtzdCj6 z$L?{*d|IMdpaijOAfDZ?pPc*=({qr!Pe7$c8XFI8#kR!UcPsBZhZkns(cvsTLl}Vd zW@WVAUhuM)S1lkG1r*$GY70HxdJ;{;#9ccAr+7wrX0CmE^*~2|1$NEf#69`|P&1ruA>ZJeq)v2B6^`y!$ z4W4WAZ__}*D958zWzScbx37SmM@{V>VXZ*>DX3@HN0%SKCQ>ASdDTo#jN}_S7#jMb zz$}&L1Aedb)IIK}%hN-wT2>sy!>Ya62wFf`-cIY|_AJac9jW43uq<^GQDcMroEQ-P zbFPq2hko{cGbxg=SaZ0c!&mEb0x68pS>=g{_j*5G9WUN`^2BV$F7J;* zvsRy4Wle*O^jZLk*+C=-Znz;TyVtG15}9pvOYp zcXPaegSx02g;sXltzY*0Nh{NWQ0Mcg3}w-O@i!uW*eyXEr^fUg4dExZTLHZxw&m-; zZiA---}X&Aof^YPQKAfbTr9hc2OpdV1;Em-L_f8WR$)vi4{3;R#3T$E_|4?7EujX2 zsOAejeEJ8c!SWguuT?5_uIKeJ={z+nC#S5Fr?x%g=Y&K%2*iFWFq``zHHLpU$pDpb z#@wXaLRG@t|Ag~+Jvljf>)HM>E!`YH!|W)+5JMvTQ$k?QIMf1~4jb;#wN%Ab#WPx# zJ?+165hU#<&C+JbHvqFep#2W`zuTycOV&x`){{Q)Z(c zxfCXcmQ}TJ<~e){6IpNqDmYK8%UzL8<{Ar5*(t`|jf~-YDg6I{ax{A>2PZGp(FwR{ z#MggxLP1GEh0rM@7>fowo-cTyt000!6gdzqC1hk@=axN%yjFaPMs00g6Ng_CQLB*i zzdqRih-Cyyjd=47dLlM2!j6>mR4;H+hIn(W2sNxu?_IN z$N{z|&u0dI7P=K_5kqZ?_-))@nfS&&fC|U|CD&o zLN}H0Cd+x|na6Umc>T#JdxYAuA$?s@zuQl!yD)+2OJ4Q#rdly^_r3k+?y0O&YFjL3 zjMp`sJNCETC+mdBn$jrZ`j-}Z%STQ~*7%n96T~B@7Ol||;CZsbgGK_?Q~-nNQR$>Y_0=N zQ2uAuHE2o~@WJ!``Srwd5!vY`_1H7|suM{Hz?)3^d7Y+%svt?i=yw1;;Akb>+^>Od zpakI|x~%T&m)9fXRiep53`_@EcCb^sz7W;3rF<|JwF_|L{QmjmWQEnXfjIY27bQF1 zXk(WUy(k}naiM4!KQOUfixWay5n*rsvl~duVA@CrB4F{A1kn8e8(Hcl#MnOq0o#+4 zrL!2I){<^Ggf!Ool@F?YSIE4+@|gLnM@ANDU1|}np41oj_$4+M8#Ygb{}x^MeBHL% zQ9U@q7^)aFaknKgXMKpH%iYC4E%b}go0)w3^5egX2oTE>lN=Ab_TI4D>Ul+ipLy3H zB%v$V#ACIaI)Y`V9B5Y*0k5JB1A)TLYw;W799i)iTEmBE{ zWXK7Ti9_hh_O|YzZMa3kvG9rCqS7Dzq{J9G8=9%JU+UN6{rK|u;W!u&m2b7TvJT%R z8>Qi+OUpdt^6;@VjzniHvExgt)!k8hzUakONQoY9sB2XN5g=(N3TK{VfF<^4{qZjLkOZQ97>n=Kcus^wUI zyoQEV+_j=8U8a^5+x4JAdut4; z`+*Q9f6L^(Npe?Z@$hmm37O5+ugQPsaGK-@v&67)@-*QzCJ`)@>hd>}P}bf8^>O$n zU%iT3rZ7by>vRNv>xZF~Me_X|pn#n@fi^M0U_+UgmgoC+b^P(eGmm}(g@9iDracY4 zdUa!J7vZm(iAPOmcru$!SjZWKIfA62@XDzYNXAJ8QIz2@A3FT9MU)56O*ZSsyunY3 z9NVaCb`ve1a9LUNw64Bgc6!7Z2a{PL z*a3D&QL8k&V5#bCZ;5ST!Gc-?h_7_CWw$T+utgbCPQu@(xmH1 zMtWFksWir{3H${!aGM{(&equd>)^75UR__eykapb1(<AF6_l zF?mAg5`)>;k`xfD7G31w%M(hAg07eagOlORyFy!Ym?QKkTE{&x`!z6U!0DlqQQZ_s z$v94NBWu!EyK*w`75NV?ujhadFqdtrB2Q@F3cO?wfSYMwD~7$C{dF;N2t`Xk;g5@6 z@31@t|LED#YrZ7mGxZY=;G08m9A?PygEqK7>%IhiLD1*v=6|ykJLyOy&!KK0)^)yK zr5Fj)QOI5B5Ts_ExsJ*k7s^KG*7;753X(=7^ogvRg#%|GsP{FFf*(9Ft)YG%|F(h= zQbcQ^V6}Ut5&I0Jv{ZZg@QEMl_z{GZo*XzGhmQ8y?z!6`D&kPOzaT+qz!2(2hOO`}YX)c)shK zJPH01nW`uI=BBI)WSeuapEmY{8B3A!`Z(5iw*GLeR&LWD% zYd8%fvXoOiR}9980jhyd>AO!O0H@ye$yuSWSg9&EhLr?@mqqo5!$;~~m(-Rw0?(X# zN>^}IeaRW-`G!1@=dUlr{^4DIZkg~b6jK5g4QA3;bWuT`*LJhq+VeCp9U1B3m|PgD zleRmv5@+LB)?fC49wq`L&jd}%RuVQe)H(-*X(-O0-~#8sIR~bNiQOz47DykNuriR9 zT<99~r?+?eGiYQgFp#Xr8{ysW5=t{C5recoboz)gH!;g3<=b-c8Y$F_-z1_cK9Lp$ zOxqnfi1>irR>WFd)r72!nihTxMaH&vm7jdCS} zk;P6BL71LXOHlOLQ7-UKjsFQv5L+24>&Z+oSSzmKi#R!%M1ZVeT0(V+JtwI(CM5t# zG0tT>bhSPw@_cO9)*+Ip1KQgod{q)F3i~pOk>v6sIA>Z~xh}b5dJ1{X)1F=Q-?G;| ztq5p0Ur7R{9fY%`QXoepMcWhyFfxMakt>oPAk%gv{GyWe+AQSovwOx|SeR7l&7ceS z_~4+}?EHlE@f!JUN=iWlUYPRAScx(dR>`(n9&^ZJ@>o_UTp?}>1)_kajLDX~dCge^ znvlS9=jEkjc{hmRA4gG!|4Yc{mj@+ajR52Ec#2(k19|G*Q(3MRh35Y<-UhLdFIG#o zXuByCO50mj6>lcaY#j@uH__(%3D^PfulD!3LyG~^DYNw|;3N&|BXkdFD0^OwiT)`^ z(+nX(C6Hi(QzuPN02fW&dqN3knU6WCJP;E;32sE(zKfz*lUMOWjnhAg6crd1)P(ZT zy7CSn1++%0v21vO%3sm!%rY6%JfmIC&D3gw5OV6OfKY@CL|%z53JV6@wHeH?o#t6sz&azdqCf7jQpx;=QvO9jRUF?^A{4SJ zZ5=K&B{u*4=T@a~GE7Ut#wS1(frH&u*`Kb4FAkT^GmgHmo<6}{VjC3d*fuGDe+YdR zAYh21SXG4Sfbw}zdfv5={|ZlzKHXh#>X zI(t)+OLwqFDIaZd{Y{#0_(#)n*2wywsdOrM8ZmdhZRr1R&mUsQGzU_pDc1kiR2xIbDT4rqR% z^x*%LoV7GDko^F=aO>E1Rtz@t+g9TPJT{}08;%_w(hxOhXA=C=^&5B(PK_6yc} zeA!hF8;G^~Nj1j3v_fN?XiCv^dFuV>(mhkCYKTV;i?D*YQ5$R*lBX`*TKb+lHcvQ?*BYenhwW` z^~3J1=pEmP%4VpzCVAMZG@cuVg^ypRg(tdzjk*}T&8-N5s)$IY64N$LAJR^`QYzWu z#Q`67a{k@TVo2;s{DkW-(3szYBt%LfPFCk8Vn_Ck_6T!~D9mf$(!wXJ!v7$|nc@r1 zKiJ93Hn^@bE9Ls^@L~%03C(}nu)?Z<_0%B!L8Zf^c*rYvjB!vufs2c=gfX=ib*qgh7?n*p zzQDg=nP6IoG-@t$)@`{3H{$8fM-|MNgp19mM%t#vHPW)P2B=qI z75tpe%BUbGj&yjc>OOjy)Cq&mi(FQ17vj{4PL->O;!4D3 z(^JFQBs?r*WOtK`k6`;7SorN>&P+x#x{67yd9TtU*J@$%$lm&8L_~eP}rs4P?qu zjY&I{tefJA#shYRY>7uElWG_xDq;V!i| z&f0T?E2Sm6Qm(o=1(5+DqodrPs5_~>I{I;`!acGX|K*9d5txHLV+@z6qZhb;5QsAC z26;<yu<#c;e1 zq&`{DLRQ@4@=D=)QM!6|Ha14Fglp*B7`wY(aQW75yV3aOC|A=Y417T4JD#z-%wPVG zTrVh?9g`(!nl%uJlOfAHdl=P*h0lfi7Lr5Z-j|3_oRy8L|bv@5+s zc6I|>ZbN~NzLrB?V#At3Ml7FAn7G$Sz-W_m&j;S^+OnsqrpMebn)5F!p$tHzn8OAr z)5*>cWISfW1aq+MA))bIISX$5-gMR{g|N>=EsbS$mW=z@8z78|kHqO|r%O8+JJW3U zC^r95oR!`@M>~67Dv69rx9sAFiLCl^~V+5-`@`A#I@ZRi>rc zHEPmBKPI%)YApH~GDsie?HVL4N`rqGceU;_2fAvaYV z(l8|b@|Qzmo+{UL;R=ZQCn~HD`caF?+F}0lUs&G_cSy3ZPYQ{$R^00}3a{gjyi`?j zt{axnq(Rt)%!k8M*IuEJ2(b&+>68*+7TW{fKwRdYVQneQNuD_5{>nw9K0#;3rB09| z(%~2Jm^!LJj4N`aS4rs2810SE1J2Hz(-%Q!N^EHkEOI2L19hPPN39@sWyQXt{@q2T zva42Vf^pIY9M;h{kOVcju}8e}86e@h=mRq>W0W$a&G%6jCHR3KO<7eo$XDzxoWNbP zTHU>))?swZP-R!3>i^+pRx%^Ru6wW|sAw)zNyHU3cml&e*WZm>unV4tq$JlwV?cAl z6}GFth{H*MX9l5FpR-2WVjOeWWkODRf)5}(r)A3`jiLc8B}}Zi@kUvuxO^ta4W=7| zJCj!2+5IYC(!vIj7_rs2<@uMbU%4iZ15;5AS{7di#3)`(_67tYJ5S5!RVn4vz8@#`5~ zUvF?F|1q?y6lpUo4He1+*u_4-lI!Jt_Xk2eQDqWr$-8Vyi%y>! zzz^@@Ql~&9e{9Pr^;NKzDatYX6sG~xXB|&6thA#sT*|=**C%6svrr3Bd@yr)W;Hn< zZTpNwIE>?%tbbXVIX{9hC=Ql=wSMi1e?-eWC2#enz*V!b;Wp}TOP_iF&O{s6ZFD{+ z#8>)L$iUBLbbp9s%drp%m#OL1AX-_ilF+8Aeto}V!nPihl+#nouVW}YNSeiA?pESG zMp6^p@+_bQM$~R6yP?|WZAmiYuV?~0VHV~L(R4rFjRn~j6D&Ldh~xERt>G*ChW+Ii z3?=xQ6?)88+Ai527-Nl+4y_hh&QCpZ;Wp0H=mXb~wioiX*mx|Y>HAI?+Hx1>{3P56 zH0Gi;CJuW_@Vec5Iuqe(wB})A$(DFFde%rvAN~99oezj9@%=#mSy6wF|GIbQZ z&yrCYJ3nQ8G@+0&t+Ow}4S`Bb6Ph0+Oj^_VJ`4tT;`} z$=>g!SYXY$iP;lp-uyw7X{rlTXX{3re8pxeWsh*h*tfFmRj`m%s>K*ZD!s1-()jx4 z#_NxO3qPpu00FFwCDsE$LDIyiAT6sR&#=__8|%-`S3oAU@Wz3m-Nho>N!sJut{+=S z+74-e8r6)oA;G|qhU5$%7W&28XtERTMRA&(S~q~fYp9t@;j~s5WOxLQ3>?fF z#l{>FV!uaQu<;Rr$Ca-&#XsV>IGeCa+7sobXt+mANgGKaMx*&(c{BL~Ii6_cmM5=^ zM36^!IV^#ik4oO%=K4`rA~s;?SwMWP5l}IeLtH{Ookge3Zmv6RBZj@-MA5nt%adK9 z(P53!UR%u>8P==y_RkF^j`ase!p+yo!7sfqs(T?#o6k$n@aM5WpGRz;d*3&cV7lEO zstdgH3Fak$81W0^r>5toCKrtOuTwT_gHzg^O@*SulgsP-Jec~m8Z{=)-beM75v77VtxwK7P^(I_3bL6mh*-IH~9!!)KxmckXjd}?& zn08B=dgL9Mj~y)k78pmx7iW5g`a=MbMiXJR7^H@G+3Ef$qg^bU(7m5Q!7ma=}S?+=f`Kh%zatTvjIhU#bwqJ5`oC&o$T3f6yvjQ_b>v-^3=Es zP0m8vj_a`Sie2ZT+-#chM8s~pkU=DXno1o&ryQM~ksuzYF}c<#?9T*Q%UI)wWO3@X zawt4gOVoa6rH@yA$o;(ezR9*N1*55;DFk)w$52M$Mah@^CqrPDpx}F^Im|^9JsSoyW!&d4x7nk7(BVKq? z!R@d)eBMXQf!RI=h?8`T76W>S*S-S7^Mn!^q1btwRd{Na}56^-V1)^2GeLmNl~WdHEBoP z06#6IFr}+1I%Sf}H^;}AfgN)wCBVcD9r=e6g2dv`jw{2UbK0k}Eqb`O* zD%EtpSSyVn5RNIe%v6EwiG=s@fsOLQAfg4ftvq;`y3S7(B2y}JR*R7G)cUSG-d3HR04 zgx%X=f-;x7Ilh)kCumbeev{VH+AbEA8gGE%Z;uS?4=S9K$Py+=%*L*-v$)RK(puSb zBz-ND8RMVX^9{jW#xbbwx3~SY8HH3QTa{i_3=b9)Wgu=7xO&W)A zjjecm;A{KK!nsmW>05w7lKUeiU>P?kbSQAh*FAij=PFt>1EI84_pp=O`*w8bAo4Di zWWMSB(CPTe%A3SQSPgSq7pzDurHIxkcAZ49h1dp08GDG$bWZ?PKT-^*3Q@uMA1Ua?Eyu5gZ7sPiZKvw?aS#ydUP6)dOO z(b2h?7SS+}lKw~^kK7fA%ywK*&`r9?uK&A{Ms{RBY>uN_IOC=uXq8~Kc!Dl6#F5t0?ws9vn=A=MaQQHb=rsY z8vdYszxO4~r6PjWP-cPm1~oJsYPz@H>ORHM39FY`^C+vd{Wexch{u-RD6$=p-QK3J zvv0)-XB#7pd@H(zUHF#>*C$x~fOsv@Ns|N7B7A8O>RkXLd`9==^8~6{Xt!`Np5bZc zEQOlvOe!ASP#t;JNW0vD?A>>d5}+)q?|na#$I-9L5;VB}zZ9@#NkH&VbJ%s((z}Lw z_M8u^EtitJ@FL%t{)SlGnk)Foip51ykPIx@vmR@&U`Eza;{F?({Wb=K4%>fV9Wk9U z4wQKaA|Ik*vXw z4+R-Li5;^%O&-%}k)rc$)`Ru$?G2|s#(gYjR&0vBepMUIKiRkU7;L}>nhjYU3jAsm z4c#)HQ+4saxtp*IeMumsfSA+&&!#}#F&3tcQ!=JA-s3=!aOadXT2>S%u(9L>h3fYi z;{t@&jfTsT8%_Eh+Fo?hhZqLRn#!aaX`$9MvoH+4V44%h?A9b0E$ZI>c_B%97!Doi zMIW5E5JSt1MLP#CB~+R#elV&r1#Dcl;hn9j{fX~Vm9^b6-M|n1-B|L}mj15Mtu}ca zgsB=KC8nx9Sv4)kFT+5VZqL3R_Tx^b^fOaeBxxzjUtDZ=e5t0{$XOxYFon60q7w|^ zR7~K%XQq}uZnuB_agH%Y?abc>q9J=6t`r9uXTP@Y`@|X)ZX&ujCZsapxzC!Od(0|K@|KgjsD(u+fn-Iw=wh43`EU3QXj#Y$?%)CCbBK!K06}PT4mNN*YRygNid1 zNK&8qZ4EWl9&syXZ)_058CNou2k1~n=jmDKhev8i?@RR~(o?HSQv>KmwNWV9vc-4k z!JB&Oc<~0#bsY0FG;0E@|4VFI+|(A@k5yMImt)Rk8I2C5ElcM!CQUUv}G;B;2NJ2M_CfqT~-JBW1Xy zpmUnw(x6894r{DN`i+kUedOF?X86E5$n^SSCK3VnXEdEyhN zX&NPx)2Vc%q7h_5UBCD$5!6s^6njr!#I|z4iM>#`wY) zK+}(Z@+O(iY;y&!ir*0PMlXX1e%lTF9!2wKzx~=U_>fR88&R*mrekVV(GZ{-POLev zQ!%1~&vfI;y!F@}gfK(76%K=dcwBO}GTI*VE@Oseg4&Jx9(D4{PH(B`*~G3}{GDnM7H>G6Fhoe8#B2p0El{{ilf7wfVh! z&#C&p)*&!C9T+vQn^P!l(^4b_6)~ivt{H!&5bz!P@vswf@cQU!NT}Apxm>>OH`yYc ze_ubO&MsWd;S=tKOy}Gd^51Bm&wPwjza|eF$Q))8eJgSpjI@2{I$=UKU^AM<%N@xL zySyc2?8X&X_{JME5aZG@_nvqM?ftsAzSZ>knjGXY57E5#W>h^cqAG5Y{ayy{DmTYh0--GRj zm4y>l?~#dOU?ornF;1loK;}!P+oi@n7rB@Tk;^P$8brA}HIucT$Ep-}kAFDDq7Bqp zTrbHOSabOR_Q)p2-9DaPxv^wH?uMBb{&WEleXb1zr3xC1XJEcRISOM#ibS;SZ5%Jk z-2|GlLz#pz)#J@eYx|wSkBLF+Qx5qWKBb45D19dq_7>>d_RXR{=^mxw+q+$w6O0|r zAu2z=dJoZs$pV~Xcu=ZI+Y$bBDog*H^@E}mu~m>8?dO&5coRcqrOwK6(8+-+L+n=h zZeN4qI+3zlm`NC=DAPgRO5H$<1-j>Wt=6<(i}k4fgqjJ+cczi|=&La6NsQ>i@YiDfd((BG=L)o;IkovwWU9ND1M^Vde6SI__mdp! zLHhfzlxf5h;wa-Oo>0@9)QS|lR1A2Nj(m4pr2})?ZL8-E)9q<%d;Y$HiVe`gfS2bj zXKT@hCoN*?tJr=qFv~gN{T%CMpWps9E%D!Jbww1nI{QpwN^#}nkraT*mWTE`Y7gou zEv!=SpTPk+p;Z;y?c=ltB56VhAux^fK8DJ@*V#Azp8Mh_9L0pj=?Gt{^6#v~m6l4x zuI^d*>eu-C{SCF>J3G?cod@PxUw%>iq~YtGru@`h%u5l#{`3cKXf)TL$8LiApAF77 z=S;}+^`(87vvbBDNP0G}F=~{R`q7UZ5;9*BD=0Fo`c(B1tVDtd%)Y~eU95&-dj_7r z+2rFJUqNh%a9iX(b3<_(}r6mW`O&dYgRZ2b0l@LjYJ~zlOgF zh=#h>vWF%oQb_s~9nt)|(C`I5xdMCl^8(0v+ZLI+c)hG4RY1pwEp zz^5>}M~%L6wwn&7Ip7a?G5F&XMhEIXAfYZB9y+U2W{eedPGX^d1U{m-J=ehqtIc)@ zXT=B&?1G)Cm_4l~gWA`-@T~7qJ-IO}EK8CZSw` zzgnP5N~D2$+x-&*w)u~Xj)cSLEr&G^ArgK>bry3TpX*C$WY0s+zXy1dDeY;W!N!$9 ztvzC+WJ6vzucs-t49qANfSYFc?yiwTzze`#q3yI~fCBB?eAgm8q4bt`}l-&~)OCqPk zyE4ab$u|1A2H2~R8}pOgcZx?T#WiMA)RzwBsO9A(ykB97AUOOcL75K!nt!{C5=-i% zkqOnjA?Vp{U*P66<1ixadMD4hpX8#2^j>N0H(lyvG8D{!CI*)3*S|*qfz{~88Diy$MN`w1jRlrHu9m@Z9 zFYS2(p~git0Y~I)7z41Obx~%PeFcNS?|4m$=&uvfWJtDoxFajj#JrhL50P6WG`_J` zB#JqW)V7Fyk`0{KHpq455VIRJk%m8pWOJyBu)FOfuxHAG*!bK=c<=FnhDwzkUDckH zk>^RixI8KP)x7LwN*-kraA`H27?ErB+Dh&3(-Xp%lZwSRY)Ov)F0X~Dg`R!UYzE*NxUiq9*Uy(wECGIRD!i97~07{H@63LMw8(AO7lGi8E_|a9%t;MvigupQwyaTy@8T zkn@P}e5w7D38b;7(DlTcNV~DgeD~KA#RztV`+c4f2M`YV7k^sTf8pnOyPdxw0+-)u ziZg)VzWvDa6YX0+?P0O5j6SPD-zpwj7Qcp`P2mMQFzfgsfe?5CIhf6x9P@t;!Ia{^ z*dn&C9GE%-l?OL1zaa>FHre3cGmgF9-g0bC>W4H(c7UE$fU2`%)Qs@bVzqzSJ@-K6@1^if*Mqn6PwQj?(*=BOo@qp)aScn}o!x_lsy7osP-vi@=|q($@R4 ztbpO)6=qnWB%qSS+Zb9DjkwaR*-hq_iA9c$xd4>FG+64{NR#r5^%N`b^wn{R~27i&R`kr&mx%l@37!l@PeTD9^bqau~XaR)he(>9L(&WNT@PPnxboIs@ zTaO8|5+Y;d{ic&OF@4zFv8*!9+i3dO6gR^gM2T!N`_pU5yx#TqS645e59-zt2t@E4 z?n#^G5|RsJ!~v`od_SI(!g{jqnR*gu+eFx_yG|-a;(-*gP=&iNH1n>q4qse83e>RU zwPFUH_)QD3k=?J@Z}oHwz5pq?5PLKwlIh=M0h91`GYYKdPX~C$s9%xDes`_zT{S*q zV3?g#8(3z`g|qy&+b*udHddiP-0flqxp$)unE1Ph%$O8*nG#+iFhl|wL9u*^K1H`P?6bf$Q+)G~Fn1$lq^ zpfQxK0D$+C>q|({svi=W7d5EZhV8Bf@w8-=F|-$fEGE0$fTdkSj!g%;0hxOCS&p*= zdoSrwNc)wrqT+}8Mbi*MuX1SuHoaXc<49FnA82vjGrg9h3QSa-ZR_~o)CtgG+gb$X`R3 zfFY1?K9J={j!uyVhmTwN<~k?3AVOi9;;^yNANMyYD~y)%mAI;=38W zKM$&(KgNEOWiK|Mt)EB$2TUfuBAtlOnLIahO=LVOQp%nFsm7x^91^>WCZ8RU)Qg+Y z^Hrn_Jms3iO3j7);3+#^BSjHl8ot{48PB&LS`_Bf)an$c`6#KEwwWJci^!o4_DwXa z;*59WRWYF@dc$u%vT6c_>oPU7XvJI_3H5tCt+o}C$m*lKll`~--*YqN?E+LL!UGWc(>)Qzf zE%yKd4`)yBKn*aazPEz>+d+mb-`Jn@)PCzu@BY%kz*xcs-mNs*(e;TR(+^0kRyBQ; zO~9h6+Qmzq(9}ki2;iXY5A62I$&{BWIyNt1IdHUAOa5~&4M0o@(8pdZmSa%QH#7D4d85CRpq)BtP7D#w>sAFWH>D-4RRSO$AK?P!d?O|*n{t~vF0 zNw;(U8ig2)fb+$`xAw{63N*kD99<`XB$h`2?aG~>B=-6A&I$oQSk@uw z`0v^7(N71^4`i#y)uOJatM0VDrLY=(y9&#JNQ~C-sPUL}z1vOZV)Om(v+=u2~d_< zi)eY(jPHohiGWgQXYExTp+JxaCAay0&nV9b-ctIL`-g8{@rq(dpxFr9ij8{rf$B^8 z=Tb6SDt$2O5yQh2vppwKGZj|khHhKrDrw}mG(Hll0uVvdjZpCSaxrK}%Dld541o|C zuQft*@4-yyOhMoK3vs@=A^N}FsgjN_m%;USMOzl7PG$a0w0C$B!BQ50O?T|u8A0KM zFr$+b%jiU=GE?4&uPyGn*OCQbz(fmFh`F{tjFjXuz4L+UJgIe2OhmYOdhn-1;tS$9 z)x=+^)@QU|m}NK@R6EIIDD)o_md@eT=0BRa5{od>A9zS1#&Vg9jHp$l2mlJZCbB;K zAo=I|%U%t@MI23LH#EuytC4TEv92v9%Xmut(Fzt9NrYI9j0erdsGI{Qb1aP8 z!7bBxdBs?xn?I5%-`sn*3=Br)W>ULpUyAQ~RRH-=3Qfv@af{13o{=z>l<6qW^(^NW zYI(5kojs?07CUJ^BXB=|6#J4fuIQRV;M^@I)=~|Gf6ad$`|Q!Xbsp;sd+j(Wv-4K^ zA2$qn>2j+Pwi>*_5#!%@DIN){GbGFlUxZ4KVQdDm$43feEoa1(bU!1B zW{_qpVuPi=Malz2;2Rta)9+$BX7Shx+WTHdKL(|5Z_*hN|_PieGcGwVhuimeYQ=UKYKM#}zx)rF*@E4K#ySVJ1y4ai+ViQz5wiM^q@ za+r1?$DsDj3kIDV&k2>8Of=0S5CGvB#fxPfaiom2bhfacW}B?HRQT=x1B`)gBw@n% z@=GZ$z9Vb#p6Kc3nrU4h#>=9lQXuMP^%^n-u?Ml>Dnr8$P;bH=i}&6z2SG+`j0ddGr^g?{ zK1RfN`BDFS`wMvBnV<9xv-tzNZiKL^UJ@^ANxf@7vdT*4T>gnKF^fKJngDVb84@6>;v^%)n6I^9*X&WuI}2kT{ouE92B#e(PGC*6=+Js3--OZ zc7tNMK3c`%zSK63WD4JeaS}YcUsB<>!9>Kc+6#fyp_xmJe$;_d&>*N8G;jE zSbmc2k~ul5{^(D|UOZz|EbKagLht_!h@_^dZAice#X4s}{>;DIwby_7LTdDKuJv}0 z1bF+)79WjS_k>Fs=}TWxZBR3M;6&7I?oyQ_s2ZOT=sqg`!Ufu9k(zOzMUQ4n-`eZ? z(7)$DL|?D_pl01)BJO>I0bm|dxBt;RF$1Sq&0GBc*lm{op8!V$xclvS+B|w^ za=y>_<9fda0P7`LE5V6Oa78+xU_teGdAVLMkstHErqF;Cz$%a~0nB_!Dl-G_%CEiS#atSv49OtVS=%sLG_ z-J*NU6o5Oy---GECjx-xdp*}dZ-_}ItVwmptW6+7aC<|2Tc?VUHs^r2`}0=}TiQHg zO#hEf0DxI{Gswo5YC!OwgiW?p?yzW-u}}?-U{cZp>{hW%X$3g_2&WrCh|OsXhEv9jBX7vd*FmPkRf&3N=Vtt;u-x2kt^fqlaH1{|IOq_ zOg|4({lm+5rdPfbQQ2Jy-pnFa`c$@^FX7F+i8lpQw&XX}U=@;i;|zajHX{@Kch}!& zfSZA&-Df}qAT=SiAQ(|nqivRwNxb+}wADskOLE`9W=0kC{-yE9^>+e@lPGgh6X+sI z6IZH9@FE0aBypli&J%O`X^iODo6dKU^YWM!kPM=I#0`FA!HA zQQ6F=g)|%ulQXjT6qV*<>atQU< z#i86GN*GJ{4k;d#$s)cd-Tm7m|CrkpdMzKHiz?g7`oyGkf#oe&zpsipD&YiVg=Bny z=YPIFNC2Q=1wEOrUYQ;+5w50=&A=DXBbib_)heIC@Ejk)dw+0! zoCd_JLsO!`f+`4ttjviN@y#PjSoxFaiNNM1e% zp13wRFYo3>9q)@#$y^BHBVJW-M`8av?FRt-e@0;>Z{2cNaR2}S07*qoM6N<$f;C{w AlK=n! literal 0 HcmV?d00001 From 109ce1960f018f6aab7cdba50265688eab0ea352 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 8 Apr 2015 10:01:43 +1000 Subject: [PATCH 075/165] ENH: spacing test --- .../ParabolicMorphology/test/CMakeLists.txt | 15 ++- .../test/itkParaSpacingTest.cxx | 112 ++++++++++++++++++ 2 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index 2f049e67e66..f6435bd45bb 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -4,7 +4,7 @@ set( itkParaErodeTest.cxx itkParaDilateTest.cxx itkParaOpenTest.cxx - #itkParaSpacingTest.cxx + itkParaSpacingTest.cxx #itkParaSharpenTest.cxx #itkParaDTTest.cxx ) @@ -138,3 +138,16 @@ itk_add_test( openInt.png openCP.png ) + +itk_add_test( + NAME itkParaSpacingTest2D_1 + COMMAND + ParabolicMorphologyTestDriver + --compare + osp1.png + osp2.png + itkParaOpenTest + ${INPUT_IMAGE} + osp1.png + osp2.png +) diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx new file mode 100644 index 00000000000..2c308694987 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx @@ -0,0 +1,112 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkChangeInformationImageFilter.h" +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" + +#include "itkParabolicOpenImageFilter.h" +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + +// sanity check of the image spacing option + +int +itkParaSpacingTest(int, char * argv[]) +{ + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + + + typedef itk::ImageFileReader ReaderType; + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(argv[1]); + try + { + reader->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + typedef itk::ParabolicOpenImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + filter->SetInput(reader->GetOutput()); + filter->SetSafeBorder(true); + FilterType::RadiusType scale; + scale[0] = 1; + scale[1] = 0.5; + + filter->SetScale(scale); + filter->SetUseImageSpacing(false); + try + { + filter->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + typedef itk::ImageFileWriter WriterType; + WriterType::Pointer writer = WriterType::New(); + writer->SetInput(filter->GetOutput()); + writer->SetFileName(argv[2]); + try + { + writer->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + // now we'll change the image spacing and see if we can reproduce + // the result + typedef itk::ChangeInformationImageFilter ChangeType; + ChangeType::Pointer changer = ChangeType::New(); + changer->SetInput(reader->GetOutput()); + ChangeType::SpacingType newspacing; + + newspacing[0] = 1 / sqrt((float)1); + newspacing[1] = 1 / sqrt((float)0.5); + + + changer->SetOutputSpacing(newspacing); + changer->ChangeSpacingOn(); + // set scales to deliver the same result + scale[0] = 1; + scale[1] = 1; + filter->SetInput(changer->GetOutput()); + filter->SetScale(scale); + filter->SetUseImageSpacing(true); + try + { + filter->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + writer->SetFileName(argv[3]); + try + { + writer->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + return EXIT_SUCCESS; +} From 685b194f474850d1c2795867987f982a8624aee0 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 8 Apr 2015 10:30:40 +1000 Subject: [PATCH 076/165] ENH: sharpen test --- .../ParabolicMorphology/test/CMakeLists.txt | 52 +++++- .../test/itkParaSharpenTest.cxx | 158 ++++++++++++++++++ 2 files changed, 208 insertions(+), 2 deletions(-) create mode 100644 Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index f6435bd45bb..4d0faee5f7f 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -5,7 +5,7 @@ set( itkParaDilateTest.cxx itkParaOpenTest.cxx itkParaSpacingTest.cxx - #itkParaSharpenTest.cxx + itkParaSharpenTest.cxx #itkParaDTTest.cxx ) @@ -146,8 +146,56 @@ itk_add_test( --compare osp1.png osp2.png - itkParaOpenTest + itkParaSpacingTest ${INPUT_IMAGE} osp1.png osp2.png ) + +itk_add_test( + NAME itkParaSharpenTest2D_1 + COMMAND + ParabolicMorphologyTestDriver + --compare + sharp1.mha + ${CMAKE_CURRENT_SOURCE_DIR}/baseline/sharp1.mha + itkParaSharpenTest + 1 + sharp1.mha +) + +itk_add_test( + NAME itkParaSharpenTest2D_3 + COMMAND + ParabolicMorphologyTestDriver + --compare + sharp3.mha + ${CMAKE_CURRENT_SOURCE_DIR}/baseline/sharp3.mha + itkParaSharpenTest + 3 + sharp3.mha +) + +itk_add_test( + NAME itkParaSharpenTest2D_10 + COMMAND + ParabolicMorphologyTestDriver + --compare + sharp10.mha + ${CMAKE_CURRENT_SOURCE_DIR}/baseline/sharp10.mha + itkParaSharpenTest + 10 + sharp10.mha +) + +itk_add_test( + NAME itkParaSharpenTest2D_100 + COMMAND + ParabolicMorphologyTestDriver + --compare + sharp100.mha + ${CMAKE_CURRENT_SOURCE_DIR}/baseline/sharp100.mha + itkParaSharpenTest + 100 + sharp100.mha +) diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx new file mode 100644 index 00000000000..6fc2d7e972e --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx @@ -0,0 +1,158 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" + +#include "plotutils.h" + +#include "itkGrayscaleDilateImageFilter.h" +#include "itkBinaryBallStructuringElement.h" + + +#include "itkSmoothingRecursiveGaussianImageFilter.h" +#include "itkBinaryThresholdImageFilter.h" +#include "itkMorphologicalSharpeningImageFilter.h" +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + + +int +itkParaSharpenTest(int argc, char * argv[]) +{ + + int iterations = 1; + + if (argc != 3) + { + std::cerr << "Usage: " << argv[0] << " iterations outputimage " << std::endl; + return (EXIT_FAILURE); + } + + iterations = atoi(argv[1]); + + // itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + typedef itk::Image FType; + + typedef itk::ImageFileWriter WriterType; + WriterType::Pointer writer = WriterType::New(); + + // create the input image - we will blur a dot, threshold then blur again + IType::Pointer input = IType::New(); + IType::SizeType size; + IType::IndexType index; + IType::RegionType region; + IType::SpacingType spacing; + + size.Fill(100); + spacing.Fill(1); + region.SetSize(size); + + index.Fill(50); + + input->SetRegions(region); + input->SetSpacing(spacing); + input->Allocate(); + + input->FillBuffer(0); + input->SetPixel(index, 255); + + typedef itk::BinaryBallStructuringElement SRType; + typedef itk::GrayscaleDilateImageFilter DilateType; + DilateType::Pointer smallDilate = DilateType::New(); + SRType smallkernel; + SRType::RadiusType smallrad = smallkernel.GetRadius(); + smallrad.Fill(7); + smallkernel.SetRadius(smallrad); + smallkernel.CreateStructuringElement(); + smallDilate->SetKernel(smallkernel); + + typedef itk::SmoothingRecursiveGaussianImageFilter SmootherType; + + SmootherType::Pointer smoother = SmootherType::New(); + + smallDilate->SetInput(input); + + smoother->SetInput(smallDilate->GetOutput()); + smoother->SetSigma(3); + + writer->SetInput(smallDilate->GetOutput()); + writer->SetFileName("input.tif"); + try + { + writer->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + + writer->SetInput(smoother->GetOutput()); + writer->SetFileName("blurrredinput.tif"); + try + { + writer->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + + // now to apply the sharpening + + typedef itk::MorphologicalSharpeningImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + filter->SetInput(smoother->GetOutput()); + filter->SetScale(1); + filter->SetIterations(iterations); + try + { + filter->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + typedef itk::ImageFileWriter FlWriterType; + FlWriterType::Pointer flwriter = FlWriterType::New(); + + flwriter->SetInput(filter->GetOutput()); + flwriter->SetFileName(argv[2]); + try + { + flwriter->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + +#if 0 + // this stuff as for the article + // write out profiles + // input + IType::IndexType first, last; + first[0]=50; + first[1]=0; + last[0]=50; + last[1]=99; + + extractProfile(smallDilate->GetOutput(), first, last, "inputprof.txt"); + extractProfile(smoother->GetOutput(), first, last, "blurredprof.txt"); + extractProfile(filter->GetOutput(), first, last, argv[3]); +#endif + return EXIT_SUCCESS; +} From 24509011ace1b4ed7fccdd261da487014bd735b2 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 8 Apr 2015 10:47:37 +1000 Subject: [PATCH 077/165] ENH: removed plotutils.h --- .../Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx index 6fc2d7e972e..6a56b52a1f4 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx @@ -4,7 +4,7 @@ #include "itkCommand.h" #include "itkSimpleFilterWatcher.h" -#include "plotutils.h" +// #include "plotutils.h" #include "itkGrayscaleDilateImageFilter.h" #include "itkBinaryBallStructuringElement.h" From c097aee29f234624f411c27156491ca90f2ff383 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 8 Apr 2015 10:52:55 +1000 Subject: [PATCH 078/165] ENH: added mm dependency --- Modules/Filtering/ParabolicMorphology/itk-module.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Filtering/ParabolicMorphology/itk-module.cmake b/Modules/Filtering/ParabolicMorphology/itk-module.cmake index 79a8fb5ea80..addfc8e6657 100644 --- a/Modules/Filtering/ParabolicMorphology/itk-module.cmake +++ b/Modules/Filtering/ParabolicMorphology/itk-module.cmake @@ -12,6 +12,7 @@ itk_module( TEST_DEPENDS ITKImageGrid ITKTestKernel + ITKMathematicalMorphology EXCLUDE_FROM_DEFAULT DESCRIPTION "${DOCUMENTATION}" ) From 764dbf62aa34714fd9f175e7bcf0818636b7bda2 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 8 Apr 2015 11:30:10 +1000 Subject: [PATCH 079/165] ENH: added smoothing dependency --- Modules/Filtering/ParabolicMorphology/itk-module.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Filtering/ParabolicMorphology/itk-module.cmake b/Modules/Filtering/ParabolicMorphology/itk-module.cmake index addfc8e6657..b60e417e7b2 100644 --- a/Modules/Filtering/ParabolicMorphology/itk-module.cmake +++ b/Modules/Filtering/ParabolicMorphology/itk-module.cmake @@ -13,6 +13,7 @@ itk_module( ITKImageGrid ITKTestKernel ITKMathematicalMorphology + ITKSmoothing EXCLUDE_FROM_DEFAULT DESCRIPTION "${DOCUMENTATION}" ) From 27508a5738d4edbc0d9a943014c8e37b3382f6ab Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 8 Apr 2015 11:52:40 +1000 Subject: [PATCH 080/165] ENH: added baseline images for sharpening --- .../test/baseline/sharp1.mha | Bin 0 -> 40277 bytes .../test/baseline/sharp10.mha | Bin 0 -> 40277 bytes .../test/baseline/sharp100.mha | Bin 0 -> 40277 bytes .../test/baseline/sharp3.mha | Bin 0 -> 40277 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/sharp1.mha create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/sharp10.mha create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/sharp100.mha create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/sharp3.mha diff --git a/Modules/Filtering/ParabolicMorphology/test/baseline/sharp1.mha b/Modules/Filtering/ParabolicMorphology/test/baseline/sharp1.mha new file mode 100644 index 0000000000000000000000000000000000000000..61e40dca38712e945a298cb3c1c40f96cd5fec81 GIT binary patch literal 40277 zcmeI0y-p-Y6oorP6A==2xFI+qu_#~{VF^6Q5RiFhp~16ee%v!F8AlxwIB?+5kKllC z!+r!FVIISw&(~c8y{rJw!br$Eg^sFk)vY_jck5PnPy79c>|}CuIm*&+)9?D-^Q`s# z+g^Vx>zmeAZ_v#z-*zWmnMe7@tTD26Imz1jX_oIFZfSO>doj*h+r$1S&&K2IG%l)# zkMizdd^XJc``t<2`&I61>8k$LTJ5v5aW>I_%+_``m}GhT?1$l`JLwGvaroUu*4ND8 zsC&{IoL7t2TKbNMz2ErKYpV*hy4u>Upj1d5sb~nB@l;Br&vK(7w`UTF zd%W83;VuV%==xeJrJIJZ8E3vD1u2oL^|N}>klR-fh&2JvRO(1@E~TlIY$nOFw9*hZ z3M7qt3Ot(1+u%AP{$KiS{O{FFAPNj8eS2}12n{npx!=H7m4-)Yb;=0X8 zAl612?rMU4Pc6XvSQ<%J((esnGtNAID-!F<7>9VS5iyykHO{F{sP{Ka-$=U>yve~| z(%;f2>7T8-$7Y;){P1TT>!}msC6aR@4*#_&AEgvRT^m#N>~q)_(x0&1Op5p0NpZTJ zBxmZSs+Y|;^OYa|tYbZKX6F|16XfVoKkHae9O88(;yWK=@KjSS3MmbDwULVBvBVifT~HH0)%=SKT@Q3ERlV#g zKg{Dtov@De#F@sp#OHII6ES$KiBTzqAeK@hhU{(jxb6$pS;YRQCi>D)*CX}6#9lVz z)jWQjUEEJ*H9|b%5}(g;KE&X$2BUCyRxOJk=l_+Ydv&$vIisix*pr7`{W$irs~j

`IZaqp%!IHOb-RW2s#rG#F&sp^G! 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 PAOkWW12P~3|Am3?n!G|a literal 0 HcmV?d00001 From 55321068727ad22ebc6f211ed1dbc2b9becf5263 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 8 Apr 2015 21:43:17 +1000 Subject: [PATCH 081/165] ENH: basic DT test --- .../ParabolicMorphology/test/CMakeLists.txt | 29 +++++- .../test/itkParaDTTest.cxx | 88 +++++++++++++++++++ 2 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index 4d0faee5f7f..8a15998e5a8 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -6,7 +6,7 @@ set( itkParaOpenTest.cxx itkParaSpacingTest.cxx itkParaSharpenTest.cxx - #itkParaDTTest.cxx + itkParaDTTest.cxx ) set(INPUT_IMAGE ${CMAKE_CURRENT_SOURCE_DIR}/images/cthead1.png) @@ -199,3 +199,30 @@ itk_add_test( 100 sharp100.mha ) + +## distance transform +itk_add_test( + NAME itkParaDTTest2D_0 + COMMAND + ParabolicMorphologyTestDriver + --compare + dist1.mha + ${CMAKE_CURRENT_SOURCE_DIR}/baseline/dist1.mha + itkParaDTTest + ${INPUT_IMAGE} + 0 + dist1.mha +) + +itk_add_test( + NAME itkParaDTTest2D_255 + COMMAND + ParabolicMorphologyTestDriver + --compare + dist255.mha + ${CMAKE_CURRENT_SOURCE_DIR}/baseline/dist255.mha + itkParaDTTest + ${INPUT_IMAGE} + 255 + dist255.mha +) diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx new file mode 100644 index 00000000000..31b013fdb07 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx @@ -0,0 +1,88 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" + +#include "itkBinaryThresholdImageFilter.h" +#include "itkMorphologicalDistanceTransformImageFilter.h" +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" + + +int +itkParaDTTest(int argc, char * argv[]) +{ + + // int iterations = 1; + + if (argc != 5) + { + std::cerr << "Usage: " << argv[0] << " inputimage threshold outsideval outim1 outim2" << std::endl; + return (EXIT_FAILURE); + } + + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + typedef itk::Image FType; + + typedef itk::ImageFileReader ReaderType; + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(argv[1]); + try + { + reader->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + IType::Pointer input = reader->GetOutput(); + + // threshold the input to create a mask + typedef itk::BinaryThresholdImageFilter ThreshType; + ThreshType::Pointer thresh = ThreshType::New(); + thresh->SetInput(input); + + thresh->SetUpperThreshold(atoi(argv[2])); + thresh->SetInsideValue(0); + thresh->SetOutsideValue(255); + writeIm(thresh->GetOutput(), argv[3]); + // now to apply the distance transform + typedef itk::MorphologicalDistanceTransformImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + filter->SetInput(thresh->GetOutput()); + filter->SetOutsideValue(atoi(argv[3])); + try + { + filter->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + typedef itk::ImageFileWriter WriterType; + WriterType::Pointer writer = WriterType::New(); + writer->SetInput(filter->GetOutput()); + writer->SetFileName(argv[4]); + try + { + writer->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} From a16f6a264d2ae8716b310f7b44aeab5476f6edbe Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 8 Apr 2015 21:48:08 +1000 Subject: [PATCH 082/165] ENH: removed redundant image save --- Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx index 31b013fdb07..d43f185fe88 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx @@ -52,7 +52,7 @@ itkParaDTTest(int argc, char * argv[]) thresh->SetUpperThreshold(atoi(argv[2])); thresh->SetInsideValue(0); thresh->SetOutsideValue(255); - writeIm(thresh->GetOutput(), argv[3]); + // now to apply the distance transform typedef itk::MorphologicalDistanceTransformImageFilter FilterType; From 517f4cf799158038054be8cb07cbe7af95b323ef Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 8 Apr 2015 21:50:46 +1000 Subject: [PATCH 083/165] ENH: corrected arg count --- Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx index d43f185fe88..d792b4dce04 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx @@ -16,7 +16,7 @@ itkParaDTTest(int argc, char * argv[]) // int iterations = 1; - if (argc != 5) + if (argc != 4) { std::cerr << "Usage: " << argv[0] << " inputimage threshold outsideval outim1 outim2" << std::endl; return (EXIT_FAILURE); From 7bd8e662643ab6889859e13807ede95441006eca Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 8 Apr 2015 21:55:23 +1000 Subject: [PATCH 084/165] ENH: forgot outside value --- Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt | 2 ++ Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index 8a15998e5a8..8981d60e96e 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -210,6 +210,7 @@ itk_add_test( ${CMAKE_CURRENT_SOURCE_DIR}/baseline/dist1.mha itkParaDTTest ${INPUT_IMAGE} + 100 0 dist1.mha ) @@ -223,6 +224,7 @@ itk_add_test( ${CMAKE_CURRENT_SOURCE_DIR}/baseline/dist255.mha itkParaDTTest ${INPUT_IMAGE} + 100 255 dist255.mha ) diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx index d792b4dce04..caa6a2f17b1 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx @@ -18,7 +18,7 @@ itkParaDTTest(int argc, char * argv[]) if (argc != 4) { - std::cerr << "Usage: " << argv[0] << " inputimage threshold outsideval outim1 outim2" << std::endl; + std::cerr << "Usage: " << argv[0] << " inputimage threshold outsideval outim1" << std::endl; return (EXIT_FAILURE); } From 166ceea935c9620d8b80e369ecc6a7cd775b2464 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 8 Apr 2015 21:58:04 +1000 Subject: [PATCH 085/165] ENH: incorrect arg count check --- Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx index caa6a2f17b1..db1ee72c8c3 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx @@ -16,7 +16,7 @@ itkParaDTTest(int argc, char * argv[]) // int iterations = 1; - if (argc != 4) + if (argc != 5) { std::cerr << "Usage: " << argv[0] << " inputimage threshold outsideval outim1" << std::endl; return (EXIT_FAILURE); From f4ea6a0b8db071f25abfa4fecdd57b3d2aca6cf1 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 8 Apr 2015 22:03:59 +1000 Subject: [PATCH 086/165] ENH: baseline dt images --- .../test/baseline/dist1.mha | Bin 0 -> 262421 bytes .../test/baseline/dist255.mha | Bin 0 -> 262421 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/dist1.mha create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/dist255.mha diff --git a/Modules/Filtering/ParabolicMorphology/test/baseline/dist1.mha b/Modules/Filtering/ParabolicMorphology/test/baseline/dist1.mha new file mode 100644 index 0000000000000000000000000000000000000000..845174e7e7ae639d927c63bf252ae2ca72173db6 GIT binary patch literal 262421 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

_CIhALIU$>&xm5hQF`-2vL8CPKO6PZ{*dE`!y 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 R2oNAZfB*pk1PBng6bPs})A9fS literal 0 HcmV?d00001 diff --git a/Modules/Filtering/ParabolicMorphology/test/baseline/dist255.mha b/Modules/Filtering/ParabolicMorphology/test/baseline/dist255.mha new file mode 100644 index 0000000000000000000000000000000000000000..39f829ce09f97441a24cc83f2773788f7a12cfe8 GIT binary patch literal 262421 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 literal 0 HcmV?d00001 From b59eb953c4ca69fae71eb22de744ec610e50b7ca Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 7 May 2015 11:10:57 +1000 Subject: [PATCH 087/165] ENH: binary dilate test --- .../ParabolicMorphology/test/CMakeLists.txt | 16 ++++ .../test/itkBinaryDilateParaTest.cxx | 74 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index 8981d60e96e..c1e5d9aaada 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -152,6 +152,7 @@ itk_add_test( osp2.png ) +## sharpening itk_add_test( NAME itkParaSharpenTest2D_1 COMMAND @@ -228,3 +229,18 @@ itk_add_test( 255 dist255.mha ) + +## Binary morphology +itk_add_test( + NAME itkBinaryDilatePara2D_10 + COMMAND + ParabolicMorphologyTestDriver + --compare + dist255.mha + ${CMAKE_CURRENT_SOURCE_DIR}/baseline/dist255.mha + itkBinaryDilateParaTest + ${INPUT_IMAGE} + 100 + 10 + dilatebinary10.mha +) diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx new file mode 100644 index 00000000000..724a4c54f0e --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx @@ -0,0 +1,74 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" + +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" +#include +#include "itkBinaryDilateParaImageFilter.h" + +int +itkBinaryDilateParaTest(int argc, char * argv[]) +{ + + + if (argc != 5) + { + std::cerr << "Usage: " << argv[0] << " inputimage threshold size outim " << std::endl; + return (EXIT_FAILURE); + } + + + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + + typedef itk::ImageFileReader ReaderType; + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(argv[1]); + try + { + reader->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + // threshold the input to create a mask + typedef itk::BinaryThresholdImageFilter ThreshType; + ThreshType::Pointer thresh = ThreshType::New(); + thresh->SetInput(reader->GetOutput()); + + thresh->SetUpperThreshold(atoi(argv[2])); + thresh->SetInsideValue(0); + thresh->SetOutsideValue(1); + // now to apply the erosion + typedef itk::BinaryDilateParaImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + filter->SetInput(thresh->GetOutput()); + filter->SetUseImageSpacing(true); + filter->SetRadius(atof(argv[3])); + + typedef itk::ImageFileWriter WriterType; + WriterType::Pointer writer = WriterType::New(); + writer->SetInput(filter->GetOutput()); + writer->SetFileName(argv[4]); + try + { + writer->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} From c9720444c534dc3df17f38fb68c08e56da69b561 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 7 May 2015 11:17:21 +1000 Subject: [PATCH 088/165] ENH: binary dilate test --- Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index c1e5d9aaada..8b5d9081909 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -7,6 +7,7 @@ set( itkParaSpacingTest.cxx itkParaSharpenTest.cxx itkParaDTTest.cxx + itkBinaryDilateParaTest.cxx ) set(INPUT_IMAGE ${CMAKE_CURRENT_SOURCE_DIR}/images/cthead1.png) From 768f4763f0b652cf8641b8624ee6edb9dbc5fa0b Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 7 May 2015 11:19:59 +1000 Subject: [PATCH 089/165] ENH: binary dilate test --- Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index 8b5d9081909..77086a0673a 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -241,7 +241,7 @@ itk_add_test( ${CMAKE_CURRENT_SOURCE_DIR}/baseline/dist255.mha itkBinaryDilateParaTest ${INPUT_IMAGE} - 100 + 150 10 dilatebinary10.mha ) From 3c1cdd80b60528e94c594ac59b0a1275aa6bf9be Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 7 May 2015 11:22:50 +1000 Subject: [PATCH 090/165] ENH: binary dilate test --- Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index 77086a0673a..a496a64284d 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -238,7 +238,7 @@ itk_add_test( ParabolicMorphologyTestDriver --compare dist255.mha - ${CMAKE_CURRENT_SOURCE_DIR}/baseline/dist255.mha + ${CMAKE_CURRENT_SOURCE_DIR}/baseline/dilatebinary10.mha itkBinaryDilateParaTest ${INPUT_IMAGE} 150 From 29b3653a3acd7aabe2786af8372a5c3cd4af9b3f Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 7 May 2015 11:26:23 +1000 Subject: [PATCH 091/165] ENH: binary dilate test --- .../test/baseline/dilatebinary10.mha | Bin 0 -> 65813 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/dilatebinary10.mha diff --git a/Modules/Filtering/ParabolicMorphology/test/baseline/dilatebinary10.mha b/Modules/Filtering/ParabolicMorphology/test/baseline/dilatebinary10.mha new file mode 100644 index 0000000000000000000000000000000000000000..fceb59521dd6495dff670da49be4501a816309d9 GIT binary patch literal 65813 zcmeHL+m0MH5QW$IihKe=f;WV6Lm&}WO2RW5k_j4=-Hm1kiSYIG>`ZstuDk8F-Ma>% zb)7nO&Z(N+T)6u4@7??3yDy)2Pkwmv%k}oJ-R8HK`|G=*`gZetf3rP&dAU7qhw|Ow zpPhp||8m@29X{+1uiri&x<73{-R(9nZm&Ndc6WEX50{}c{O+*5x%+r~xPHAo9`^qZ z^ruh08UB5`x%&9=Zg(7jq1?RK-5hs^tB-GPkK5z^_T~b=`n0XVqWl-Axp&#Jk?2m3D{`QMbd7voK0>MiR3ML`o0)QEArUgQW z0GTu-A~iYNN(0FZASx>$LVy}=1&4`I1doeSeGngP2KB=-6`q(GxU}%OR!}+r%)m0w zUFwBRHG@&1aU6?{GaVEgY6Wv*s-8%0aSoYj1roCZ0!$7lApl33LBgnV4Wo-QaHJJP zjE)dMc7)?YV4@YkkEyIccySI)Gy;ghaRNw>(K)Iw~!9WFpK zPo0q6OwGsUy1@ztYA{)~Tc+>OU;8G48kl)}yg;s{U6xqq1{ZLCKzI^*28!m;yyVB6S)$K=j(q z;IN8Qsh>?;K%JH&#_iw49|pL!)V-*We^77WJ3zhTBE+)fMpi4s`dlayMXnxT8Q5dQ0)Q>eWGUBhjoC6 zzZN~D16+17eiPKXfH9^_pBIt2E@Pf6`*Jg6c)Q_ka_(fww=Jc__L56vzweEfEBp|t zm7m+D=Fb+ZY#{}9m|CC*?QptG9fU|KL1LpCm`?_r0F;(PNqk}sR!K}F9`oG^9iNm? z5&FjeQ%U$W2_-LuHYf;SJi0 zSqOb$f+$f9Vu~TA7CRBcVOuR*0X=zyVE{E0U<6sX}rkFJGvWzI- zinolNr1Qio4s*1q&`I!&9VHUQ%AMy3Q4vmajhe6$#k9!0Dc zrLMS_k|4xCs|chjZRLIvjn6($^Slb(Ia<<-Pwq?e+`?TyT6D#y_GNi);jSMox?)p@ zsw}y1Gt3rQv#Eh5%P!mm;i3R8G$zRL%l5Ezc8tl4i!lRbTX;Mx%4Ei+n1Qk_Jf0P$ zGZRYmz}Ptrj_(D(68VfU9S|3y`IpW-CQ{P~vr)>6&VZ`Y^h?K^64@yP&ndbf6QGJD z`_e#$q><=8;uQgr_J|hA9UI7u2aUWeUp?jMf{X$cN$S{uBLEqx8NLGTD1ZzC)JW#k z03!%6k&_>Ycmzbp2*qgT*a;`_dSs`5#nr7Sogz@8iBl(-pvsBwJqGq%yYCtGUzEHN z_eGt`*Kr!;)1P1}M}cBF6yixu8gW8>fIT6aHg~*%)MAz;Ua1C`c|v`FT?3lsblidD zx1)z;N8w#Lx0@m9cjg6V?8hJBDRS zbdkXvTr88DD;d0%LB^>}fkv58miRi-lD`uA1ALLD34SLzi7()bgUTl-R6uzG&Z1K( zJrXitqk_oZKL!o?7(}TuNpzD+;A*U3cMq7z4xQ#!Yl8mBHI-O?8 zCTJ*}EEJ$002VEt8wf|1yobFj#IOsJ6M~bnP0GhLB-c1qbV{;P^-<*nP%=%B4o4*` zRX-F>tp(Fmd3Rp0Qng*ZEN{Uzi^nJ;cxl?BRJN~zX*QohNU&11bLP3%5?pio30A6h z&OD0!v)ZW^6i8VE4Pqtj1TR&)@1OSq!qKyu30|sp)<9*y{iUC^3j0fzd9N+GY5G|c ziH2F-n*034^)vq6|8z;&PiEx&M9R7~w}0vNvm7Af=l{s}m)Fny_4zif=T%F$%zxWNgl;(iOuVm>0 zX&kUfTDZ8IgjyT~u4HxT3o6lVrM*v!b_0XHE?t4aTmWs!baI)ifBdo;0wHEgvIRt9 z0n#C8#Of>N0w+zWP}Na1W+#qLEsmwl;PB#%;FKfDKjCObgttbz@!p7-28uV-OllIi z9E~Q*aYZa|R4gB8iE`q`I$M24eypE*ZZy(;Rm=KBojAhsWtONAQwEAlzzFiKI6K=E zp8#}i;%7DxQ35eu<{4#{iDouX|1oc}xIFAmQ4^u9P}@BOL8@&xikqPPDctHp=?J*h zCY~<@0d1obnAZVDmlV1#(9AM<&10sQ$s>_$3U(%|9V4`d5w(0CVpK?#b(C`H^`rks zpm>6ntRMYbH2a+zw>&E;9z2#1oAo@0xW)@2Vg;c1yzXSeH_|9mU{};)^soCBjaCM% zyZFVu%&NFc0|&r^l|ri@pwyz2PwfLxxr*U+4^V7P+NkCM=u`ze^$t*QNzSU)0k}*> zdsPllbVJFk`~{>$h5LmMPH`T*)6 z)rd=8pxRO<P=(#0jb{WH!%z0ds)*0~t?Hf0?KRSuPOe+|W?`5gJ+|ElR`* z(hS?1Hl3io_*oL^Zji;QSrPIE%_i=_`UUz0`UUz0`UUz0`UUz0`UUz0`UUz0`UUz0 M`UUz0R(gT|0b514WdHyG literal 0 HcmV?d00001 From bc5b0fbea9c6c7aa2db09fd5ac50b911fa294eda Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 7 May 2015 11:28:40 +1000 Subject: [PATCH 092/165] ENH: binary dilate test --- Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index a496a64284d..0dea8235f75 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -237,7 +237,7 @@ itk_add_test( COMMAND ParabolicMorphologyTestDriver --compare - dist255.mha + dilatebinary10.mha ${CMAKE_CURRENT_SOURCE_DIR}/baseline/dilatebinary10.mha itkBinaryDilateParaTest ${INPUT_IMAGE} From e894b592de27b4c6afe1adcea715216b4f148888 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 7 May 2015 12:01:50 +1000 Subject: [PATCH 093/165] ENH: binary erode test --- .../ParabolicMorphology/test/CMakeLists.txt | 15 ++++ .../test/itkBinaryErodeParaTest.cxx | 74 +++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index 0dea8235f75..102ba4f1d8d 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -8,6 +8,7 @@ set( itkParaSharpenTest.cxx itkParaDTTest.cxx itkBinaryDilateParaTest.cxx + itkBinaryErodeParaTest.cxx ) set(INPUT_IMAGE ${CMAKE_CURRENT_SOURCE_DIR}/images/cthead1.png) @@ -245,3 +246,17 @@ itk_add_test( 10 dilatebinary10.mha ) + +itk_add_test( + NAME itkBinaryErodePara2D_10 + COMMAND + ParabolicMorphologyTestDriver + --compare + erodebinary10.mha + ${CMAKE_CURRENT_SOURCE_DIR}/baseline/erodebinary1010.mha + itkBinaryErodeParaTest + ${INPUT_IMAGE} + 100 + 10 + erodebinary10.mha +) diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx new file mode 100644 index 00000000000..a6c1100bcef --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx @@ -0,0 +1,74 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" + +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" +#include +#include "itkBinaryErodeParaImageFilter.h" + +int +itkBinaryDilateParaTest(int argc, char * argv[]) +{ + + + if (argc != 5) + { + std::cerr << "Usage: " << argv[0] << " inputimage threshold size outim " << std::endl; + return (EXIT_FAILURE); + } + + + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + + typedef itk::ImageFileReader ReaderType; + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(argv[1]); + try + { + reader->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + // threshold the input to create a mask + typedef itk::BinaryThresholdImageFilter ThreshType; + ThreshType::Pointer thresh = ThreshType::New(); + thresh->SetInput(reader->GetOutput()); + + thresh->SetUpperThreshold(atoi(argv[2])); + thresh->SetInsideValue(0); + thresh->SetOutsideValue(1); + // now to apply the erosion + typedef itk::BinaryErodeParaImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + filter->SetInput(thresh->GetOutput()); + filter->SetUseImageSpacing(true); + filter->SetRadius(atof(argv[3])); + + typedef itk::ImageFileWriter WriterType; + WriterType::Pointer writer = WriterType::New(); + writer->SetInput(filter->GetOutput()); + writer->SetFileName(argv[4]); + try + { + writer->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} From ee703aee271a6d961a9c9925ca3dc0c43d555062 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 7 May 2015 12:03:35 +1000 Subject: [PATCH 094/165] ENH: binary erode test --- .../ParabolicMorphology/test/itkBinaryErodeParaTest.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx index a6c1100bcef..d8ea04429b9 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx @@ -10,7 +10,7 @@ #include "itkBinaryErodeParaImageFilter.h" int -itkBinaryDilateParaTest(int argc, char * argv[]) +itkBinaryErodeParaTest(int argc, char * argv[]) { From e150c71500f82ff0c4ba4c0da417eef8574ce493 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 7 May 2015 12:05:15 +1000 Subject: [PATCH 095/165] ENH: binary erode test --- Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index 102ba4f1d8d..e6c4b59e63b 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -253,10 +253,10 @@ itk_add_test( ParabolicMorphologyTestDriver --compare erodebinary10.mha - ${CMAKE_CURRENT_SOURCE_DIR}/baseline/erodebinary1010.mha + ${CMAKE_CURRENT_SOURCE_DIR}/baseline/erodebinary10.mha itkBinaryErodeParaTest ${INPUT_IMAGE} - 100 + 120 10 erodebinary10.mha ) From a41a40b547c381ae3d750dfa54619c1145e5fc17 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 7 May 2015 12:06:55 +1000 Subject: [PATCH 096/165] ENH: binary erode test --- .../test/baseline/erodebinary10.mha | Bin 0 -> 65813 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/erodebinary10.mha diff --git a/Modules/Filtering/ParabolicMorphology/test/baseline/erodebinary10.mha b/Modules/Filtering/ParabolicMorphology/test/baseline/erodebinary10.mha new file mode 100644 index 0000000000000000000000000000000000000000..6781879d28b87b8a6252c4f110e34c050d9b291f GIT binary patch literal 65813 zcmeHP+l~`Q5KUhF6?{TKB5x6b1(ZmTm0fCH^A`)``*Was8+ly~sS5JO<^4s-F{BaC)|QwZ2(yzP(;rcz8^UZp|KTy1QvDh>0Q@($5@#i0BzrOtNFdx0X zU0;o4@6OL&zFYiYU)F#%U=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r& z4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r2Y2e4&L=v-$(V0$JCNABns1)oX&1<|?ZxB=-tK7) zhG3LoKCgd6?Vrkwi9gu)bF!0D3G4ghZvvJd_{iRWXM=tY zzuWq|MP7f&C!oKCK}WmSG>F(;LN7hY6<4c=xX%^Wd+hm-pMXPGOeKf=6L>g8K)iZy zmBaSz0io&ybM%cE8qp5!NHBSFFg+e8ZugIf%K_@Ze4cUQfciU9wh@0)) zIZcyXoi~uvGtJd?0gPpxXO2wAR^vm!I#yZE%T^&jZ&>w>J3v<7W#20{iBet zAl&ojX~_%lIQ@aA(rDm0BYcb)V$6;_&d`8msdC{tV^l>2c%;DrqgZ21_)3>0NTZ{4 zRSg4SOG7i?AxMGIoTJK#bd{t`GJ?Y-Va+n>OG7l-AvwX}gr>$L=_*y2Bt?g*;l!a!rr(`jj7M>>SqXdj2be+dB z#ORnO&U?f7Nf%*=(Q&!~jDhikEeBByGdd1(XS?LwWDww}qw@^fFa>J{W?+FVb>xC2 zEO9}5$)iMbN2YnCQ5M<^x*fsMfTu zZ2@dOx>vIJug;3wH>d z4}^gSfTkQI;A`@N-=h>Rg7o`K1#P|+#NY!)q57~I`c*-jZzW{Ry;G>V6x3Nkn}3Be z=FSwVE(LW~&=y#soH;YOszbmW<-A2U7nnf!ck4v?(fH!GmB@t%9JdV9#iUh$9>ol&oqu$H>_8iSMslR9{*>T9b+vj{LNGN$(mvs*_9)4J@^bC8zFu;K zBm&=0?MagT^yS)deZBMyNesTB+LI*v8J273b@ehtNTYBKRX(SgFS1>?fg%x-NbBa0 z{}y0U7|n9s0yGW_?^G?Ia25@{<*(R)<^?LfQ!##r-~WboD;7}twN&vx_WTv!0IJug z!cwKTK!qeqi7Evsz13SQ+(Nw|I;FDlb)IT&70q8Wh)%0${Nq3R9AtDZi)|fz6?)hk zpRgB;q9UFcEAqHA}MkW_`iIe>S%mt+L_uY^gN47 zYh((eprQTLpDL_pS*f3tR?HGcK|;G}FjaWZvC<$ZBbg(OoP#mbU@Z5ZVWUA#Rx(2z zF$HU;!G+j-`a*-0ykvSDF#~U=#f{j0@G7DFJV#$&J*0D!xg`kZ5Wk;eN%5EM0lHwVb#P)qV=$oHn*YxiQqN~BdUp+BC5^YDEw7C`~(1Y8A161{qB%6SdMi5B~Ew)iKNLHIkvIiMy1d`-XVjCsH zWR;l&YnYElC_xS_v{5olRvSvNhZ$*u62wqL+a!Zj)tMxVkdrnbNenf%O*BANok+F_ zIB5fs#ZaT$go~@H0|^)7PMRQuDb(;L;Q&!}AlV||qzyzCLyK;c4N=u5lICsFOEsL*kfPDv%7iZ@y9 Date: Thu, 7 May 2015 12:09:13 +1000 Subject: [PATCH 097/165] ENH: binary opening test --- .../ParabolicMorphology/test/CMakeLists.txt | 15 ++++ .../test/itkBinaryOpenParaTest.cxx | 74 +++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index e6c4b59e63b..607c727fafe 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -9,6 +9,7 @@ set( itkParaDTTest.cxx itkBinaryDilateParaTest.cxx itkBinaryErodeParaTest.cxx + itkBinaryOpenParaTest.cxx ) set(INPUT_IMAGE ${CMAKE_CURRENT_SOURCE_DIR}/images/cthead1.png) @@ -260,3 +261,17 @@ itk_add_test( 10 erodebinary10.mha ) + +itk_add_test( + NAME itkBinaryOpenPara2D_10 + COMMAND + ParabolicMorphologyTestDriver + --compare + openbinary10.mha + ${CMAKE_CURRENT_SOURCE_DIR}/baseline/openbinary10.mha + itkBinaryOpenParaTest + ${INPUT_IMAGE} + 150 + 10 + openbinary10.mha +) diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx new file mode 100644 index 00000000000..abd9617df27 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx @@ -0,0 +1,74 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" + +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" +#include +#include "itkBinaryOpenParaImageFilter.h" + +int +itkBinaryOpenParaTest(int argc, char * argv[]) +{ + + + if (argc != 5) + { + std::cerr << "Usage: " << argv[0] << " inputimage threshold size outim " << std::endl; + return (EXIT_FAILURE); + } + + + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + + typedef itk::ImageFileReader ReaderType; + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(argv[1]); + try + { + reader->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + // threshold the input to create a mask + typedef itk::BinaryThresholdImageFilter ThreshType; + ThreshType::Pointer thresh = ThreshType::New(); + thresh->SetInput(reader->GetOutput()); + + thresh->SetUpperThreshold(atoi(argv[2])); + thresh->SetInsideValue(0); + thresh->SetOutsideValue(1); + // now to apply the erosion + typedef itk::BinaryOpenParaImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + filter->SetInput(thresh->GetOutput()); + filter->SetUseImageSpacing(true); + filter->SetRadius(atof(argv[3])); + + typedef itk::ImageFileWriter WriterType; + WriterType::Pointer writer = WriterType::New(); + writer->SetInput(filter->GetOutput()); + writer->SetFileName(argv[4]); + try + { + writer->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} From 6a3b558b14f171b77aba14b68d35fce99638bca5 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 7 May 2015 12:11:06 +1000 Subject: [PATCH 098/165] ENH: binary opening test --- Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index 607c727fafe..d36781c0584 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -271,7 +271,7 @@ itk_add_test( ${CMAKE_CURRENT_SOURCE_DIR}/baseline/openbinary10.mha itkBinaryOpenParaTest ${INPUT_IMAGE} - 150 + 130 10 openbinary10.mha ) From 8fd518524e449ca9ef1a6de7f3e95ec83442dea7 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 7 May 2015 12:12:48 +1000 Subject: [PATCH 099/165] ENH: binary opening test --- .../test/baseline/openbinary10.mha | Bin 0 -> 65813 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/openbinary10.mha diff --git a/Modules/Filtering/ParabolicMorphology/test/baseline/openbinary10.mha b/Modules/Filtering/ParabolicMorphology/test/baseline/openbinary10.mha new file mode 100644 index 0000000000000000000000000000000000000000..48e3301cbb07bbff6a7abe8af9ba8871abc13f4c GIT binary patch literal 65813 zcmeHLZExH*3|_z9ujo%$3UuFwB1v0pK)V1<_IbFqPH{tCipvdH_v`0#&oXVxB1K80 zIVbXxj$eY4*_Jl#I-@853^``th7 z_}TLx+rMX6V2q%~C-`xE1`{gg^ANu>F*0;O6 zBiOsE%ky`eAMB4MUvZhKeNBG7r^|_5=i?N(7~la$ZgNOC#nZ{awhmp zKrSqqfDqzXGhyV`rh@x3M?t>}KRGypJ5VaD84}<+tQk;pD^Td9jubK3hQ~-G!EvZ^ zUdITTZ^N4yB*|H*(NoiPn`P$=O6RB$(diK3y9pfIY;eVTHFlm>E|La>C}MCoBwM3C<|fSms8`kesn z*#-U6Aiz`*O}Ytm19g;Q~;+tyo zodf&6ar`a-DBnWmh9sfO{(%sre9y1Z-G&6Yp~xbHsnH9`59tZ*A-xc+R?jCnsKvKH zzY9XEG(FmbIz01HS3z)%=1hH9#B4nFA`Gw4oftqAOr{w}gg~JUOrY#wmRX_{8Uvjd z3Nh0(T%*ubI|Gd{>uSAGgfTtCH406&GtdaPuGSnu7}qo0BhXYk0)24nYRwUZaXrI5 z0!_6e&u80EAcasna%RYI$%on8*trYx35T%4pyvAmV*AU!H}Kx;Taq655NS$~TP& ziy=aw0__-<%(DSiT`PhPgIerIaO56c)Z`j;Mz<1I&MVv|ag@#BnPu$(CUk3?hX~+*LbGxKz zbbpirF6PQWlTps`~UGv(18#CbUP9`OtPvGmh^$3*kixl zazY6R$cTfIFA!y2+wZ?^b#f^P*o?gIo)J@q^%t|j7DxSFjr`|GhX0Vqq941zl{bE3 z>;)))uHFCeUsK^El%Kn!7q;!_oB-v*2@)=pZ4dOqzI(bsfOgd@lKs?nJ>{2mKl>k> zsT_^7WCR-ia89`da4k6|;7^dGSFT%-NFj$i3dYe(J9n}~+3049M?hARVbGb0!E#Gw ziWn&wW;+vcIAwhIsBu~rrs0?O!ic*jefhiTW6?`3@;PE+9^x#;gw+Wu;=2cBS{|*n zSfg|9L$9^OXAZ63v;Q1V?)Y4CB}%lwC) zCiiE$Ql}^#Dum!@@)jXVS`X@>ZSbZbPsW-j25dns;5vT^i89uyLV=W2sPH}@%2|d< z@h;GU4<}6kri^8hq;?rdNrgi80aL~jA;sE22{xMA2UPjWjG|JZ(EWU_2PBjf85oet z{uF$a0l2c2h&`-5(t!=9_D5uy4vCt8ibN!Q9dP9!f%)`7iU@c4#R=k02@gQM*oY<|0bOcv#SVneTpS4^Y&8k?;Q9t2BP5 z5huBKzZI4Ft%q;vB_IkKP={0lu*1>KI|De{>*@(JtKYlIy!>^%cPek&<>?80A)2l!*6QUCw| literal 0 HcmV?d00001 From 64df77c17c4f6973ea2847089f3b7d71f919602a Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 7 May 2015 12:14:50 +1000 Subject: [PATCH 100/165] ENH: binary closing test --- .../ParabolicMorphology/test/CMakeLists.txt | 15 ++++ .../test/itkBinaryCloseParaTest.cxx | 74 +++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index d36781c0584..cf18f104a1e 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -10,6 +10,7 @@ set( itkBinaryDilateParaTest.cxx itkBinaryErodeParaTest.cxx itkBinaryOpenParaTest.cxx + itkBinaryCloseParaTest.cxx ) set(INPUT_IMAGE ${CMAKE_CURRENT_SOURCE_DIR}/images/cthead1.png) @@ -275,3 +276,17 @@ itk_add_test( 10 openbinary10.mha ) + +itk_add_test( + NAME itkBinaryClosePara2D_10 + COMMAND + ParabolicMorphologyTestDriver + --compare + closebinary10.mha + ${CMAKE_CURRENT_SOURCE_DIR}/baseline/closebinary10.mha + itkBinaryCloseParaTest + ${INPUT_IMAGE} + 150 + 10 + closebinary10.mha +) diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx new file mode 100644 index 00000000000..9f2b5286ef3 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx @@ -0,0 +1,74 @@ +#include +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkCommand.h" +#include "itkSimpleFilterWatcher.h" + +#include "itkTimeProbe.h" +#include "itkMultiThreader.h" +#include +#include "itkBinaryCloseParaImageFilter.h" + +int +itkBinaryCloseParaTest(int argc, char * argv[]) +{ + + + if (argc != 5) + { + std::cerr << "Usage: " << argv[0] << " inputimage threshold size outim " << std::endl; + return (EXIT_FAILURE); + } + + + itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + const int dim = 2; + + typedef unsigned char PType; + typedef itk::Image IType; + + typedef itk::ImageFileReader ReaderType; + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(argv[1]); + try + { + reader->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + // threshold the input to create a mask + typedef itk::BinaryThresholdImageFilter ThreshType; + ThreshType::Pointer thresh = ThreshType::New(); + thresh->SetInput(reader->GetOutput()); + + thresh->SetUpperThreshold(atoi(argv[2])); + thresh->SetInsideValue(0); + thresh->SetOutsideValue(1); + // now to apply the erosion + typedef itk::BinaryCloseParaImageFilter FilterType; + + FilterType::Pointer filter = FilterType::New(); + + filter->SetInput(thresh->GetOutput()); + filter->SetUseImageSpacing(true); + filter->SetRadius(atof(argv[3])); + + typedef itk::ImageFileWriter WriterType; + WriterType::Pointer writer = WriterType::New(); + writer->SetInput(filter->GetOutput()); + writer->SetFileName(argv[4]); + try + { + writer->Update(); + } + catch (itk::ExceptionObject & excp) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} From 554ff2645c2caea58a1ea748c434d1ef3383ffd5 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Thu, 7 May 2015 12:16:57 +1000 Subject: [PATCH 101/165] ENH: binary opening test --- .../test/baseline/closebinary10.mha | Bin 0 -> 65813 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Modules/Filtering/ParabolicMorphology/test/baseline/closebinary10.mha diff --git a/Modules/Filtering/ParabolicMorphology/test/baseline/closebinary10.mha b/Modules/Filtering/ParabolicMorphology/test/baseline/closebinary10.mha new file mode 100644 index 0000000000000000000000000000000000000000..9bbb6100512aa020b66fc768cbc745188f4d2b52 GIT binary patch literal 65813 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 Date: Tue, 12 May 2015 20:15:32 +1000 Subject: [PATCH 102/165] ENH: changed email contact --- .../include/itkBinaryCloseParaImageFilter.h | 4 +++- .../include/itkBinaryDilateParaImageFilter.h | 4 +++- .../include/itkBinaryErodeParaImageFilter.h | 4 +++- .../include/itkBinaryOpenParaImageFilter.h | 4 +++- .../include/itkMorphologicalDistanceTransformImageFilter.h | 2 +- .../include/itkMorphologicalSharpeningImageFilter.h | 2 +- .../itkMorphologicalSignedDistanceTransformImageFilter.h | 2 +- .../include/itkParabolicCloseImageFilter.h | 2 +- .../include/itkParabolicDilateImageFilter.h | 2 +- .../include/itkParabolicErodeDilateImageFilter.h | 2 +- .../include/itkParabolicErodeImageFilter.h | 2 +- .../ParabolicMorphology/include/itkParabolicOpenImageFilter.h | 2 +- .../ParabolicMorphology/include/itkSharpenOpImageFilter.h | 2 +- 13 files changed, 21 insertions(+), 13 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h index cdf48911c90..3ff6a9fb56e 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h @@ -31,13 +31,15 @@ namespace itk * equal to the circle radius, rather than any part of the voxel * inside the circle. * + * Also note that the inputs must be 0/1 not 0/max for pixel type. + * * This filter was developed as a result of discussions with * M.Starring on the ITK mailing list. * * \sa itkParabolicErodeImageFilter * * \author Richard Beare, Department of Medicine, Monash University, - * Australia. + * Australia. **/ diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h index cc4696a0c6a..7b9eac77ebb 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h @@ -32,10 +32,12 @@ namespace itk * This filter was developed as a result of discussions with * M.Starring on the ITK mailing list. * + * Also note that the inputs must be 0/1 not 0/max for pixel type. + * * \sa itkParabolicDilateImageFilter * * \author Richard Beare, Department of Medicine, Monash University, - * Australia. + * Australia. **/ diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h index 297ecce1693..a87c1034e6d 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h @@ -29,13 +29,15 @@ namespace itk * equal to the circle radius, rather than any part of the voxel * inside the circle. * + * Also note that the inputs must be 0/1 not 0/max for pixel type. + * * This filter was developed as a result of discussions with * M.Starring on the ITK mailing list. * * \sa itkParabolicErodeImageFilter * * \author Richard Beare, Department of Medicine, Monash University, - * Australia. + * Australia. **/ diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h index 551df5a296e..90d4f3c2e0d 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h @@ -34,10 +34,12 @@ namespace itk * This filter was developed as a result of discussions with * M.Starring on the ITK mailing list. * + * Also note that the inputs must be 0/1 not 0/max for pixel type. + * * \sa itkParabolicErodeImageFilter * * \author Richard Beare, Department of Medicine, Monash University, - * Australia. + * Australia. **/ diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h index ad100fb93b8..5f6a3b8c812 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h @@ -27,7 +27,7 @@ namespace itk * safe. * * \author Richard Beare, Monash University, Department of Medicine, - * Melbourne, Australia. + * Melbourne, Australia. * **/ diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h index db3ffe1a4d3..8353f6f1fff 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h @@ -34,7 +34,7 @@ namespace itk } * \author Richard Beare, Monash University, Department of Medicine, - * Melbourne, Australia. + * Melbourne, Australia. * **/ diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h index d4b48cff8c0..70d460d6d7a 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h @@ -38,7 +38,7 @@ namespace itk * DistanceTransforms filters. * * \author Richard Beare, Monash University, Department of Medicine, - * Melbourne, Australia. + * Melbourne, Australia. * **/ diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h index f65eae322cf..bb763c1869f 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h @@ -18,7 +18,7 @@ namespace itk * \sa itkParabolicOpenCloseImageFilter * * \author Richard Beare, Department of Medicine, Monash University, - * Australia. + * Australia. **/ template diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h index d784d7f471e..ffb313ea1c8 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h @@ -16,7 +16,7 @@ namespace itk * \sa itkParabolicOpenCloseImageFilter * * \author Richard Beare, Department of Medicine, Monash University, - * Australia. + * Australia. * **/ diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index f9c55b279d9..b1d03d96779 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h @@ -50,7 +50,7 @@ namespace itk * SignedMaurerDistanceMap extensions by Gaetan Lehman * * \author Richard Beare, Department of Medicine, Monash University, - * Australia. + * Australia. * **/ diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h index 97942ffd82b..834b3a3db47 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h @@ -19,7 +19,7 @@ namespace itk * \sa itkParabolicErodeDilateImageFilter * * \author Richard Beare, Department of Medicine, Monash University, - * Australia. + * Australia. **/ template class ITK_EXPORT ParabolicErodeImageFilter : public ParabolicErodeDilateImageFilter diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h index 9b3afd01fc4..3240ff1cd17 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h @@ -18,7 +18,7 @@ namespace itk * \sa itkParabolicOpenCloseImageFilter * * \author Richard Beare, Department of Medicine, Monash University, - * Australia. + * Australia. **/ template diff --git a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h index e468840cbeb..564617359cc 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h @@ -19,7 +19,7 @@ namespace itk * to be the same. * * \author Richard Beare, Department of Medicine, Monash University, - * Australia. + * Australia. * */ namespace Function From 31b91803c3ee04bad44115de56c0e39d05820085 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 13 May 2015 11:02:06 +1000 Subject: [PATCH 103/165] STYLE: renamed wrapping --- Modules/Filtering/ParabolicMorphology/wrapping/CMakeLists.txt | 3 +++ .../wrapping/itkMorphologicalDistanceTransformImageFilter.wrap | 3 +++ .../itkMorphologicalSignedDistanceTransformImageFilter.wrap | 3 +++ .../wrapping/itkParabolicCloseImageFilter.wrap | 3 +++ .../wrapping/itkParabolicDilateImageFilter.wrap | 3 +++ .../wrapping/itkParabolicErodeImageFilter.wrap | 3 +++ .../wrapping/itkParabolicOpenImageFilter.wrap | 3 +++ 7 files changed, 21 insertions(+) create mode 100644 Modules/Filtering/ParabolicMorphology/wrapping/CMakeLists.txt create mode 100644 Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalDistanceTransformImageFilter.wrap create mode 100644 Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalSignedDistanceTransformImageFilter.wrap create mode 100644 Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicCloseImageFilter.wrap create mode 100644 Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicDilateImageFilter.wrap create mode 100644 Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicErodeImageFilter.wrap create mode 100644 Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicOpenImageFilter.wrap diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/wrapping/CMakeLists.txt new file mode 100644 index 00000000000..c110d759119 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/wrapping/CMakeLists.txt @@ -0,0 +1,3 @@ +itk_wrap_module(ParabolicMorphology) +itk_auto_load_submodules() +itk_end_wrap_module() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalDistanceTransformImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalDistanceTransformImageFilter.wrap new file mode 100644 index 00000000000..3ee0eddd383 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalDistanceTransformImageFilter.wrap @@ -0,0 +1,3 @@ +WRAP_CLASS("itk::MorphologicalDistanceTransformImageFilter" POINTER) + WRAP_IMAGE_FILTER_COMBINATIONS("${WRAP_ITK_USIGN_INT}" "${WRAP_ITK_SCALAR}") +END_WRAP_CLASS() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalSignedDistanceTransformImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalSignedDistanceTransformImageFilter.wrap new file mode 100644 index 00000000000..dc031684394 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalSignedDistanceTransformImageFilter.wrap @@ -0,0 +1,3 @@ +WRAP_CLASS("itk::MorphologicalSignedDistanceTransformImageFilter" POINTER) + WRAP_IMAGE_FILTER_COMBINATIONS("${WRAP_ITK_USIGN_INT}" "${WRAP_ITK_SCALAR}") +END_WRAP_CLASS() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicCloseImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicCloseImageFilter.wrap new file mode 100644 index 00000000000..98d750ee5b0 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicCloseImageFilter.wrap @@ -0,0 +1,3 @@ +WRAP_CLASS("itk::ParabolicCloseImageFilter" POINTER_WITH_SUPERCLASS) + WRAP_IMAGE_FILTER_SCALAR(2) +END_WRAP_CLASS() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicDilateImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicDilateImageFilter.wrap new file mode 100644 index 00000000000..e5dbdc58b8f --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicDilateImageFilter.wrap @@ -0,0 +1,3 @@ +WRAP_CLASS("itk::ParabolicDilateImageFilter" POINTER_WITH_SUPERCLASS) + WRAP_IMAGE_FILTER_SCALAR(2) +END_WRAP_CLASS() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicErodeImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicErodeImageFilter.wrap new file mode 100644 index 00000000000..c6c2ffeb2dd --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicErodeImageFilter.wrap @@ -0,0 +1,3 @@ +WRAP_CLASS("itk::ParabolicErodeImageFilter" POINTER_WITH_SUPERCLASS) + WRAP_IMAGE_FILTER_SCALAR(2) +END_WRAP_CLASS() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicOpenImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicOpenImageFilter.wrap new file mode 100644 index 00000000000..b1e268ab3f8 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicOpenImageFilter.wrap @@ -0,0 +1,3 @@ +WRAP_CLASS("itk::ParabolicOpenImageFilter" POINTER_WITH_SUPERCLASS) + WRAP_IMAGE_FILTER_SCALAR(2) +END_WRAP_CLASS() From 404a5b86bd6c8f01ec1fce2a54f4762b70c20f50 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 13 May 2015 11:09:23 +1000 Subject: [PATCH 104/165] DOC: updated comments to include handle for IJ article --- .../include/itkBinaryCloseParaImageFilter.h | 5 +++++ .../include/itkBinaryDilateParaImageFilter.h | 5 +++++ .../include/itkBinaryErodeParaImageFilter.h | 5 +++++ .../include/itkBinaryOpenParaImageFilter.h | 4 ++++ .../include/itkMorphologicalDistanceTransformImageFilter.h | 4 ++++ .../include/itkMorphologicalSharpeningImageFilter.h | 5 +++++ .../itkMorphologicalSignedDistanceTransformImageFilter.h | 5 +++++ .../include/itkParabolicCloseImageFilter.h | 5 +++++ .../include/itkParabolicDilateImageFilter.h | 5 +++++ .../include/itkParabolicErodeDilateImageFilter.h | 5 +++++ .../include/itkParabolicErodeImageFilter.h | 4 ++++ .../include/itkParabolicOpenCloseImageFilter.h | 5 +++++ .../include/itkParabolicOpenImageFilter.h | 5 +++++ .../ParabolicMorphology/include/itkSharpenOpImageFilter.h | 5 +++++ 14 files changed, 67 insertions(+) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h index 3ff6a9fb56e..a294d5d4841 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h @@ -36,6 +36,11 @@ namespace itk * This filter was developed as a result of discussions with * M.Starring on the ITK mailing list. * + * Core methods described in the InsightJournal article: + * "Morphology with parabolic structuring elements" + * + * http://hdl.handle.net/1926/1370 + * * \sa itkParabolicErodeImageFilter * * \author Richard Beare, Department of Medicine, Monash University, diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h index 7b9eac77ebb..dc573222f8d 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h @@ -34,6 +34,11 @@ namespace itk * * Also note that the inputs must be 0/1 not 0/max for pixel type. * + * Core methods described in the InsightJournal article: + * "Morphology with parabolic structuring elements" + * + * http://hdl.handle.net/1926/1370 + * * \sa itkParabolicDilateImageFilter * * \author Richard Beare, Department of Medicine, Monash University, diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h index a87c1034e6d..b43646abb70 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h @@ -34,6 +34,11 @@ namespace itk * This filter was developed as a result of discussions with * M.Starring on the ITK mailing list. * + * Core methods described in the InsightJournal article: + * "Morphology with parabolic structuring elements" + * + * http://hdl.handle.net/1926/1370 + * * \sa itkParabolicErodeImageFilter * * \author Richard Beare, Department of Medicine, Monash University, diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h index 90d4f3c2e0d..c8c135f199e 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h @@ -36,6 +36,10 @@ namespace itk * * Also note that the inputs must be 0/1 not 0/max for pixel type. * + * Core methods described in the InsightJournal article: + * "Morphology with parabolic structuring elements" + * + * http://hdl.handle.net/1926/1370 * \sa itkParabolicErodeImageFilter * * \author Richard Beare, Department of Medicine, Monash University, diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h index 5f6a3b8c812..63312cd81c5 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h @@ -26,6 +26,10 @@ namespace itk * square of the largest value of the distance - just use float to be * safe. * + * Core methods described in the InsightJournal article: + * "Morphology with parabolic structuring elements" + * + * http://hdl.handle.net/1926/1370 * \author Richard Beare, Monash University, Department of Medicine, * Melbourne, Australia. * diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h index 8353f6f1fff..dd876a126b0 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h @@ -33,6 +33,11 @@ namespace itk * bibsource = {DBLP, http://dblp.uni-trier.de} } + * Core methods described in the InsightJournal article: + * "Morphology with parabolic structuring elements" + * + * http://hdl.handle.net/1926/1370 + * * \author Richard Beare, Monash University, Department of Medicine, * Melbourne, Australia. * diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h index 70d460d6d7a..1da50f5b7d3 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h @@ -37,6 +37,11 @@ namespace itk * Otherwise it is meant to have an interface to the other * DistanceTransforms filters. * + * Core methods described in the InsightJournal article: + * "Morphology with parabolic structuring elements" + * + * http://hdl.handle.net/1926/1370 + * * \author Richard Beare, Monash University, Department of Medicine, * Melbourne, Australia. * diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h index bb763c1869f..5935fd99801 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h @@ -15,6 +15,11 @@ namespace itk * * This filter is threaded. * + * Core methods described in the InsightJournal article: + * "Morphology with parabolic structuring elements" + * + * http://hdl.handle.net/1926/1370 + * * \sa itkParabolicOpenCloseImageFilter * * \author Richard Beare, Department of Medicine, Monash University, diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h index ffb313ea1c8..8138cb6eff3 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h @@ -13,6 +13,11 @@ namespace itk * * This filter is threaded. * + * Core methods described in the InsightJournal article: + * "Morphology with parabolic structuring elements" + * + * http://hdl.handle.net/1926/1370 + * * \sa itkParabolicOpenCloseImageFilter * * \author Richard Beare, Department of Medicine, Monash University, diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index b1d03d96779..6663ab73684 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h @@ -49,6 +49,11 @@ namespace itk * This filter is threaded. Threading mechanism derived from * SignedMaurerDistanceMap extensions by Gaetan Lehman * + * Core methods described in the InsightJournal article: + * "Morphology with parabolic structuring elements" + * + * http://hdl.handle.net/1926/1370 + * * \author Richard Beare, Department of Medicine, Monash University, * Australia. * diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h index 834b3a3db47..a02f916bb3f 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h @@ -15,6 +15,10 @@ namespace itk * that multiple image copies aren't necessary. * * This filter is threaded. + * Core methods described in the InsightJournal article: + * "Morphology with parabolic structuring elements" + * + * http://hdl.handle.net/1926/1370 * * \sa itkParabolicErodeDilateImageFilter * diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h index 47ff7a8ae60..69de31e446d 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h @@ -18,6 +18,11 @@ namespace itk * This filter is threaded. Threading mechanism derived from * SignedMaurerDistanceMap extensions by Gaetan Lehman * + * Core methods described in the InsightJournal article: + * "Morphology with parabolic structuring elements" + * + * http://hdl.handle.net/1926/1370 + * * \sa itkParabolicErodeDilateImageFilter * * \author Richard Beare, Department of Medicine, Monash University, diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h index 3240ff1cd17..81bdbe6e2f0 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h @@ -15,6 +15,11 @@ namespace itk * * This filter is threaded. * + * Core methods described in the InsightJournal article: + * "Morphology with parabolic structuring elements" + * + * http://hdl.handle.net/1926/1370 + * * \sa itkParabolicOpenCloseImageFilter * * \author Richard Beare, Department of Medicine, Monash University, diff --git a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h index 564617359cc..0d536230050 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h @@ -18,6 +18,11 @@ namespace itk * In reality the input and output types of this filter are expected * to be the same. * + * Core methods described in the InsightJournal article: + * "Morphology with parabolic structuring elements" + * + * http://hdl.handle.net/1926/1370 + * * \author Richard Beare, Department of Medicine, Monash University, * Australia. * From 479cec5f324537cdad80fe04e93cfcce79d94214 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 13 May 2015 13:10:11 +1000 Subject: [PATCH 105/165] DOC: Added ingroup option to doxygen comments --- .../include/itkBinaryCloseParaImageFilter.h | 1 + .../include/itkBinaryDilateParaImageFilter.h | 2 ++ .../include/itkBinaryErodeParaImageFilter.h | 3 +++ .../ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h | 3 +++ .../include/itkMorphologicalDistanceTransformImageFilter.h | 3 +++ .../include/itkMorphologicalSharpeningImageFilter.h | 3 +++ .../itkMorphologicalSignedDistanceTransformImageFilter.h | 3 +++ .../ParabolicMorphology/include/itkParabolicCloseImageFilter.h | 3 +++ .../include/itkParabolicDilateImageFilter.h | 3 +++ .../include/itkParabolicErodeDilateImageFilter.h | 3 +++ .../ParabolicMorphology/include/itkParabolicErodeImageFilter.h | 3 +++ .../include/itkParabolicOpenCloseImageFilter.h | 3 +++ .../ParabolicMorphology/include/itkParabolicOpenImageFilter.h | 2 ++ .../ParabolicMorphology/include/itkSharpenOpImageFilter.h | 1 + 14 files changed, 36 insertions(+) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h index a294d5d4841..7a17c6b7137 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h @@ -43,6 +43,7 @@ namespace itk * * \sa itkParabolicErodeImageFilter * + * * \author Richard Beare, Department of Medicine, Monash University, * Australia. **/ diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h index dc573222f8d..429d8d803ee 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h @@ -41,6 +41,8 @@ namespace itk * * \sa itkParabolicDilateImageFilter * + * \ingroup ParabolicMorphology + * * \author Richard Beare, Department of Medicine, Monash University, * Australia. **/ diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h index b43646abb70..2af288cd13b 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h @@ -41,6 +41,9 @@ namespace itk * * \sa itkParabolicErodeImageFilter * + * + * \ingroup ParabolicMorphology + * * \author Richard Beare, Department of Medicine, Monash University, * Australia. **/ diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h index c8c135f199e..fa5c91cc1f3 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h @@ -42,6 +42,9 @@ namespace itk * http://hdl.handle.net/1926/1370 * \sa itkParabolicErodeImageFilter * + * + * \ingroup ParabolicMorphology + * * \author Richard Beare, Department of Medicine, Monash University, * Australia. **/ diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h index 63312cd81c5..9cca85b44ca 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h @@ -30,6 +30,9 @@ namespace itk * "Morphology with parabolic structuring elements" * * http://hdl.handle.net/1926/1370 + * + * \ingroup ParabolicMorphology + * * \author Richard Beare, Monash University, Department of Medicine, * Melbourne, Australia. * diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h index dd876a126b0..9899e0e85ae 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h @@ -38,6 +38,9 @@ namespace itk * * http://hdl.handle.net/1926/1370 * + * + * \ingroup ParabolicMorphology + * * \author Richard Beare, Monash University, Department of Medicine, * Melbourne, Australia. * diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h index 1da50f5b7d3..949bbeff8e0 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h @@ -42,6 +42,9 @@ namespace itk * * http://hdl.handle.net/1926/1370 * + * + * \ingroup ParabolicMorphology + * * \author Richard Beare, Monash University, Department of Medicine, * Melbourne, Australia. * diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h index 5935fd99801..6945b9137e6 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h @@ -22,6 +22,9 @@ namespace itk * * \sa itkParabolicOpenCloseImageFilter * + * + * \ingroup ParabolicMorphology + * * \author Richard Beare, Department of Medicine, Monash University, * Australia. **/ diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h index 8138cb6eff3..224a4614951 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h @@ -20,6 +20,9 @@ namespace itk * * \sa itkParabolicOpenCloseImageFilter * + * + * \ingroup ParabolicMorphology + * * \author Richard Beare, Department of Medicine, Monash University, * Australia. * diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index 6663ab73684..3b6db2c42e7 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h @@ -54,6 +54,9 @@ namespace itk * * http://hdl.handle.net/1926/1370 * + * + * \ingroup ParabolicMorphology + * * \author Richard Beare, Department of Medicine, Monash University, * Australia. * diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h index a02f916bb3f..f245c4d1413 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h @@ -22,6 +22,9 @@ namespace itk * * \sa itkParabolicErodeDilateImageFilter * + * + * \ingroup ParabolicMorphology + * * \author Richard Beare, Department of Medicine, Monash University, * Australia. **/ diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h index 69de31e446d..29b5807dd21 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h @@ -25,6 +25,9 @@ namespace itk * * \sa itkParabolicErodeDilateImageFilter * + * + * \ingroup ParabolicMorphology + * * \author Richard Beare, Department of Medicine, Monash University, * Australia. * diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h index 81bdbe6e2f0..82a6e5b20de 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h @@ -22,6 +22,8 @@ namespace itk * * \sa itkParabolicOpenCloseImageFilter * + * \ingroup ParabolicMorphology + * * \author Richard Beare, Department of Medicine, Monash University, * Australia. **/ diff --git a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h index 0d536230050..7d1164144da 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h @@ -22,6 +22,7 @@ namespace itk * "Morphology with parabolic structuring elements" * * http://hdl.handle.net/1926/1370 + * \ingroup ParabolicMorphology * * \author Richard Beare, Department of Medicine, Monash University, * Australia. From c77038164b7c757eeed4f1af173e65c775765e3d Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 13 May 2015 13:17:42 +1000 Subject: [PATCH 106/165] ENH: more ingroups added --- .../include/itkBinaryCloseParaImageFilter.h | 1 + .../include/itkGreaterEqualValImageFilter.h | 3 +++ .../ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h | 2 ++ 3 files changed, 6 insertions(+) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h index 7a17c6b7137..ba0c6be8e69 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h @@ -43,6 +43,7 @@ namespace itk * * \sa itkParabolicErodeImageFilter * + * \ingroup ParabolicMorphology * * \author Richard Beare, Department of Medicine, Monash University, * Australia. diff --git a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h index 691ce3d2f41..bdd50c68676 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h @@ -7,6 +7,9 @@ namespace itk /** \class GreaterEqualValImageFilter * \brief Computes the absolute difference between an image and a * constant. Can be done with ShiftScale and AbsIamgeFilters. + * + * \ingroup ParabolicMorphology + * */ diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h index 8b368872619..ff981b48d5e 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h @@ -12,6 +12,8 @@ namespace itk * * Numeric conversions (castings) are done by the C++ defaults. * + * \ingroup ParabolicMorphology + * * \ingroup IntensityImageFilters Multithreaded */ namespace Function From b7f4b76b61352bdf979c9e22cfbc68a03bb92c35 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Wed, 13 May 2015 21:28:01 +1000 Subject: [PATCH 107/165] ENH: put the links in thr group documentation --- Modules/Filtering/ParabolicMorphology/itk-module.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/itk-module.cmake b/Modules/Filtering/ParabolicMorphology/itk-module.cmake index b60e417e7b2..7429811471e 100644 --- a/Modules/Filtering/ParabolicMorphology/itk-module.cmake +++ b/Modules/Filtering/ParabolicMorphology/itk-module.cmake @@ -2,7 +2,9 @@ set( DOCUMENTATION "This module contains classes for mathematical morphology using parabolic functions. Parabolic functions can be used to build fast distance transforms, and -binary morphology using spheres." +binary morphology using spheres. + http://www.insight-journal.org/browse/publication/228 + http://hdl.handle.net/1926/1370" ) itk_module( ParabolicMorphology From 2c9f754fff566ef4560d3ae9c4f3a32033af9aa0 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Mon, 18 May 2015 20:54:02 +1000 Subject: [PATCH 108/165] STYLE: KWStyle and uncrust --- .../include/itkBinaryCloseParaImageFilter.h | 28 +++++++------- .../include/itkBinaryCloseParaImageFilter.hxx | 17 +++------ .../include/itkBinaryDilateParaImageFilter.h | 23 +++++------ .../itkBinaryDilateParaImageFilter.hxx | 10 ++--- .../include/itkBinaryErodeParaImageFilter.h | 22 +++++------ .../include/itkBinaryErodeParaImageFilter.hxx | 13 +++---- .../include/itkBinaryOpenParaImageFilter.h | 28 +++++++------- .../include/itkBinaryOpenParaImageFilter.hxx | 15 +++----- .../include/itkGreaterEqualValImageFilter.h | 13 ++----- .../include/itkMorphSDTHelperImageFilter.h | 14 +++---- ...orphologicalDistanceTransformImageFilter.h | 21 ++++------ ...phologicalDistanceTransformImageFilter.hxx | 8 ++-- .../itkMorphologicalSharpeningImageFilter.h | 16 +++----- .../itkMorphologicalSharpeningImageFilter.hxx | 12 ++---- ...ogicalSignedDistanceTransformImageFilter.h | 23 +++++------ ...icalSignedDistanceTransformImageFilter.hxx | 9 +++-- .../include/itkParabolicCloseImageFilter.h | 14 ++----- .../include/itkParabolicDilateImageFilter.h | 12 ++---- .../itkParabolicErodeDilateImageFilter.h | 21 +++++----- .../itkParabolicErodeDilateImageFilter.hxx | 11 ++---- .../include/itkParabolicErodeImageFilter.h | 14 ++----- .../include/itkParabolicMorphUtils.h | 15 ++++---- .../itkParabolicOpenCloseImageFilter.h | 34 +++++++++-------- .../itkParabolicOpenCloseImageFilter.hxx | 38 ++++++++----------- ...kParabolicOpenCloseSafeBorderImageFilter.h | 35 +++++++++-------- ...arabolicOpenCloseSafeBorderImageFilter.hxx | 9 ++--- .../include/itkParabolicOpenImageFilter.h | 14 ++----- .../include/itkSharpenOpImageFilter.h | 15 ++++---- 28 files changed, 210 insertions(+), 294 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h index ba0c6be8e69..1e4324e644f 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h @@ -1,5 +1,5 @@ -#ifndef __itkBinaryCloseParaImageFilter_h -#define __itkBinaryCloseParaImageFilter_h +#ifndef itkBinaryCloseParaImageFilter_h +#define itkBinaryCloseParaImageFilter_h #include "itkParabolicErodeImageFilter.h" #include "itkParabolicDilateImageFilter.h" @@ -8,7 +8,6 @@ namespace itk { - /** * \class BinaryCloseParaImageFilter * \brief Class for binary morphological opening operation. @@ -49,12 +48,10 @@ namespace itk * Australia. **/ - template class ITK_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter { - public: /** Standard class typedefs. */ typedef BinaryCloseParaImageFilter Self; @@ -68,7 +65,6 @@ class ITK_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilterSetUseImageSpacing(g); m_CircDilate->SetUseImageSpacing(g); } + /** * Set/Get whether the erosion is circular/rectangular - * default is true (circular) @@ -121,13 +119,12 @@ class ITK_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter BinaryCloseParaImageFilter::BinaryCloseParaImageFilter() { @@ -32,12 +31,12 @@ BinaryCloseParaImageFilter::BinaryCloseParaImageFilte this->SetSafeBorder(true); } - template void BinaryCloseParaImageFilter::SetRadius(ScalarRealType radius) { RadiusType s; + s.Fill(radius); this->SetRadius(s); } @@ -52,7 +51,8 @@ BinaryCloseParaImageFilter::GenerateData(void) typename TInputImage::SizeType Pad; // ScalarRealType margin = 0.0; - // ScalarRealType mxRad = (ScalarRealType)(*std::max_element(m_Radius.Begin(), m_Radius.End())); + // ScalarRealType mxRad = (ScalarRealType)(*std::max_element(m_Radius.Begin(), + // m_Radius.End())); // this needs to be examined more closely // margin = 1.0/(pow(mxRad, TInputImage::ImageDimension) * 10); // margin = std::min(margin, 0.00001); @@ -90,7 +90,6 @@ BinaryCloseParaImageFilter::GenerateData(void) m_CircDilate->SetScale(R); } - // std::cout << "Padding " << Pad << std::endl; if (m_Circular) @@ -111,7 +110,6 @@ BinaryCloseParaImageFilter::GenerateData(void) m_CircCastB->SetOutsideValue(1); m_CircCastB->SetInsideValue(0); - m_CircErode->SetInput(m_CircCastB->GetOutput()); m_CircCastA->SetInput(m_CircErode->GetOutput()); // m_CircCastA->SetVal(1.0-margin); @@ -144,8 +142,6 @@ BinaryCloseParaImageFilter::GenerateData(void) } else { - - m_CircDilate->SetInput(inputImage); m_CircCastA->GraftOutput(this->GetOutput()); m_CircCastA->Update(); @@ -205,7 +201,6 @@ BinaryCloseParaImageFilter::GenerateData(void) } } - template void BinaryCloseParaImageFilter::PrintSelf(std::ostream & os, Indent indent) const @@ -221,7 +216,5 @@ BinaryCloseParaImageFilter::PrintSelf(std::ostream & } os << "Safe border: " << this->GetSafeBorder() << std::endl; } - - } // namespace itk #endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h index 429d8d803ee..cafd37ff793 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h @@ -1,12 +1,11 @@ -#ifndef __itkBinaryDilateParaImageFilter_h -#define __itkBinaryDilateParaImageFilter_h +#ifndef itkBinaryDilateParaImageFilter_h +#define itkBinaryDilateParaImageFilter_h #include "itkParabolicDilateImageFilter.h" #include "itkBinaryThresholdImageFilter.h" namespace itk { - /** * \class BinaryDilateParaImageFilter * \brief Class for binary morphological erosion operation. @@ -47,12 +46,10 @@ namespace itk * Australia. **/ - template class ITK_EXPORT BinaryDilateParaImageFilter : public ImageToImageFilter { - public: /** Standard class typedefs. */ typedef BinaryDilateParaImageFilter Self; @@ -66,7 +63,6 @@ class ITK_EXPORT BinaryDilateParaImageFilter : public ImageToImageFilterSetUseImageSpacing(g); m_CircPara->SetUseImageSpacing(g); } + /** * Set/Get whether the erosion is circular/rectangular - * default is true (circular) @@ -113,13 +111,12 @@ class ITK_EXPORT BinaryDilateParaImageFilter : public ImageToImageFilter BinaryDilateParaImageFilter::BinaryDilateParaImageFilter() { @@ -24,12 +23,12 @@ BinaryDilateParaImageFilter::BinaryDilateParaImageFil this->SetUseImageSpacing(false); } - template void BinaryDilateParaImageFilter::SetRadius(ScalarRealType radius) { RadiusType s; + s.Fill(radius); this->SetRadius(s); } @@ -67,7 +66,6 @@ BinaryDilateParaImageFilter::GenerateData(void) m_CircPara->SetScale(R); } - if (m_Circular) { ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); @@ -138,7 +136,5 @@ BinaryDilateParaImageFilter::PrintSelf(std::ostream & os << "Radius in voxels: " << this->GetRadius() << std::endl; } } - - } // namespace itk #endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h index 2af288cd13b..ff43a0cc568 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h @@ -1,12 +1,11 @@ -#ifndef __itkBinaryErodeParaImageFilter_h -#define __itkBinaryErodeParaImageFilter_h +#ifndef itkBinaryErodeParaImageFilter_h +#define itkBinaryErodeParaImageFilter_h #include "itkParabolicErodeImageFilter.h" #include "itkGreaterEqualValImageFilter.h" namespace itk { - /** * \class BinaryErodeParaImageFilter * \brief Class for binary morphological erosion operation. @@ -48,12 +47,10 @@ namespace itk * Australia. **/ - template class ITK_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilter { - public: /** Standard class typedefs. */ typedef BinaryErodeParaImageFilter Self; @@ -67,7 +64,6 @@ class ITK_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilterSetUseImageSpacing(g); m_CircPara->SetUseImageSpacing(g); } + /** * Set/Get whether the erosion is circular/rectangular - * default is true (circular) @@ -119,7 +117,7 @@ class ITK_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilter BinaryErodeParaImageFilter::BinaryErodeParaImageFilter() { @@ -24,12 +23,12 @@ BinaryErodeParaImageFilter::BinaryErodeParaImageFilte this->SetUseImageSpacing(false); } - template void BinaryErodeParaImageFilter::SetRadius(ScalarRealType radius) { RadiusType s; + s.Fill(radius); this->SetRadius(s); } @@ -67,7 +66,6 @@ BinaryErodeParaImageFilter::GenerateData(void) m_CircPara->SetScale(R); } - if (m_Circular) { ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); @@ -86,7 +84,8 @@ BinaryErodeParaImageFilter::GenerateData(void) // setting the correct threshold value is a little tricky - needs would // to produce a result matching a bresenham circle, but these // circles are such that the voxel centres need to be less than radius - // m_CircCast->SetUpperThreshold(1 - itk::NumericTraits::min()); + // m_CircCast->SetUpperThreshold(1 - + // itk::NumericTraits::min()); // m_CircCast->SetUpperThreshold(0.99); m_CircCast->GraftOutput(this->GetOutput()); @@ -112,7 +111,6 @@ BinaryErodeParaImageFilter::GenerateData(void) } } - template void BinaryErodeParaImageFilter::PrintSelf(std::ostream & os, Indent indent) const @@ -138,6 +136,5 @@ BinaryErodeParaImageFilter::Modified() const m_RectPara->Modified(); m_RectCast->Modified(); } - } // namespace itk #endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h index fa5c91cc1f3..33d317ba22f 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h @@ -1,5 +1,5 @@ -#ifndef __itkBinaryOpenParaImageFilter_h -#define __itkBinaryOpenParaImageFilter_h +#ifndef itkBinaryOpenParaImageFilter_h +#define itkBinaryOpenParaImageFilter_h #include "itkParabolicErodeImageFilter.h" #include "itkParabolicDilateImageFilter.h" @@ -8,7 +8,6 @@ namespace itk { - /** * \class BinaryOpenParaImageFilter * \brief Class for binary morphological opening operation. @@ -49,12 +48,10 @@ namespace itk * Australia. **/ - template class ITK_EXPORT BinaryOpenParaImageFilter : public ImageToImageFilter { - public: /** Standard class typedefs. */ typedef BinaryOpenParaImageFilter Self; @@ -68,7 +65,6 @@ class ITK_EXPORT BinaryOpenParaImageFilter : public ImageToImageFilterSetUseImageSpacing(g); m_CircDilate->SetUseImageSpacing(g); } + /** * Set/Get whether the erosion is circular/rectangular - * default is true (circular) @@ -121,13 +119,12 @@ class ITK_EXPORT BinaryOpenParaImageFilter : public ImageToImageFilter BinaryOpenParaImageFilter::BinaryOpenParaImageFilter() { @@ -32,12 +31,12 @@ BinaryOpenParaImageFilter::BinaryOpenParaImageFilter( this->SetSafeBorder(true); } - template void BinaryOpenParaImageFilter::SetRadius(ScalarRealType radius) { RadiusType s; + s.Fill(radius); this->SetRadius(s); } @@ -54,7 +53,8 @@ BinaryOpenParaImageFilter::GenerateData(void) // thresholding steps. // ScalarRealType margin = 0.0; - // ScalarRealType mxRad = (ScalarRealType)(*std::max_element(m_Radius.Begin(), m_Radius.End())); + // ScalarRealType mxRad = (ScalarRealType)(*std::max_element(m_Radius.Begin(), + // m_Radius.End())); // // this needs to be examined more closely // margin = 1.0/(pow(mxRad, TInputImage::ImageDimension) * 10); // margin = std::min(margin, 0.00001); @@ -100,7 +100,6 @@ BinaryOpenParaImageFilter::GenerateData(void) m_CircDilate->SetScale(R); } - if (m_Circular) { ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); @@ -205,7 +204,6 @@ BinaryOpenParaImageFilter::GenerateData(void) } } - template void BinaryOpenParaImageFilter::PrintSelf(std::ostream & os, Indent indent) const @@ -222,7 +220,6 @@ BinaryOpenParaImageFilter::PrintSelf(std::ostream & o if (this->m_SafeBorder) { - os << "safe border" << std::endl; } else @@ -239,7 +236,5 @@ BinaryOpenParaImageFilter::PrintSelf(std::ostream & o os << "Radius in voxels: " << this->GetRadius() << std::endl; } } - - } // namespace itk #endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h index bdd50c68676..e0194e4491d 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h @@ -1,9 +1,8 @@ -#ifndef __itkGreaterEqualValImageFilter_h -#define __itkGreaterEqualValImageFilter_h +#ifndef itkGreaterEqualValImageFilter_h +#define itkGreaterEqualValImageFilter_h #include namespace itk { - /** \class GreaterEqualValImageFilter * \brief Computes the absolute difference between an image and a * constant. Can be done with ShiftScale and AbsIamgeFilters. @@ -12,10 +11,8 @@ namespace itk * */ - namespace Functor { - template class GEConst { @@ -33,11 +30,13 @@ class GEConst { return false; } + bool operator==(const GEConst & other) const { return !(*this != other); } + inline TOutput operator()(const TInput & A) { @@ -75,14 +74,12 @@ class ITK_EXPORT GreaterEqualValImageFilter this->Modified(); } - #ifdef ITK_USE_CONCEPT_CHECKING /** Begin concept checking */ itkConceptMacro(InputConvertibleToDoubleCheck, (Concept::Convertible)); itkConceptMacro(DoubleConvertibleToOutputCheck, (Concept::Convertible)); /** End concept checking */ #endif - protected: GreaterEqualValImageFilter() {} virtual ~GreaterEqualValImageFilter() {} @@ -92,8 +89,6 @@ class ITK_EXPORT GreaterEqualValImageFilter void operator=(const Self &); // purposely not implemented }; - } // end namespace itk - #endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h index ff981b48d5e..50f949f8ad6 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h @@ -1,12 +1,11 @@ -#ifndef __itkMorphSDTHelperImageFilter_h -#define __itkMorphSDTHelperImageFilter_h +#ifndef itkMorphSDTHelperImageFilter_h +#define itkMorphSDTHelperImageFilter_h #include "itkTernaryFunctorImageFilter.h" #include "vnl/vnl_math.h" namespace itk { - /** \class MorphSDTHelperImageFilter * \brief Implements a pixel-wise operator to form a signed distance transform. * @@ -18,7 +17,6 @@ namespace itk */ namespace Function { - template class MorphSDTHelper { @@ -35,11 +33,13 @@ class MorphSDTHelper { return false; } + bool operator==(const MorphSDTHelper & other) const { return !(*this != other); } + inline TOutput operator()(const TInput1 & A, const TInput2 & B, const TInput3 & C) { @@ -86,7 +86,8 @@ class ITK_EXPORT MorphSDTHelperImageFilter typename TInputImage2::PixelType, typename TInputImage3::PixelType, typename TOutputImage::PixelType>> - Superclass; + Superclass; + typedef SmartPointer Pointer; typedef SmartPointer ConstPointer; @@ -113,7 +114,6 @@ class ITK_EXPORT MorphSDTHelperImageFilter (Concept::GreaterThanComparable)); /** End concept checking */ #endif - protected: MorphSDTHelperImageFilter() {} virtual ~MorphSDTHelperImageFilter() {} @@ -123,8 +123,6 @@ class ITK_EXPORT MorphSDTHelperImageFilter void operator=(const Self &); // purposely not implemented }; - } // end namespace itk - #endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h index 9cca85b44ca..7f829a08df7 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h @@ -1,5 +1,5 @@ -#ifndef __itkMorphologicalDistanceTransformImageFilter_h -#define __itkMorphologicalDistanceTransformImageFilter_h +#ifndef itkMorphologicalDistanceTransformImageFilter_h +#define itkMorphologicalDistanceTransformImageFilter_h #include "itkImageToImageFilter.h" #include "itkProgressReporter.h" @@ -38,7 +38,6 @@ namespace itk * **/ - template class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImageFilter { @@ -55,7 +54,6 @@ class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImage /** Runtime information support. */ itkTypeMacro(MorphologicalDistanceTransformImageFilter, ImageToImageFilter); - /** Pixel Type of the input image */ typedef TInputImage InputImageType; typedef TOutputImage OutputImageType; @@ -84,7 +82,6 @@ class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImage itkSetMacro(OutsideValue, InputPixelType); itkGetConstReferenceMacro(OutsideValue, InputPixelType); - /** Is the transform in world or voxel units - default is world */ void SetUseImageSpacing(bool uis) @@ -92,7 +89,6 @@ class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImage m_Erode->SetUseImageSpacing(uis); } - const bool & GetUseImageSpacing() { @@ -103,7 +99,6 @@ class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImage itkGetConstReferenceMacro(SqrDist, bool); itkBooleanMacro(SqrDist); - #ifdef ITK_USE_CONCEPT_CHECKING /** Begin concept checking */ itkConceptMacro(SameDimension, @@ -114,11 +109,9 @@ class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImage /** End concept checking */ #endif - - protected: MorphologicalDistanceTransformImageFilter(); - virtual ~MorphologicalDistanceTransformImageFilter() {}; + virtual ~MorphologicalDistanceTransformImageFilter() {} void PrintSelf(std::ostream & os, Indent indent) const; @@ -132,9 +125,11 @@ class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImage typedef typename itk::SqrtImageFilter SqrtType; private: - MorphologicalDistanceTransformImageFilter(const Self &); // purposely not implemented + MorphologicalDistanceTransformImageFilter(const Self &); // purposely not + // implemented void - operator=(const Self &); // purposely not implemented + operator=(const Self &); // purposely not + // implemented InputPixelType m_OutsideValue; typename ErodeType::Pointer m_Erode; @@ -142,11 +137,9 @@ class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImage typename SqrtType::Pointer m_Sqrt; bool m_SqrDist; }; - } // namespace itk #ifndef ITK_MANUAL_INSTANTIATION # include "itkMorphologicalDistanceTransformImageFilter.hxx" #endif - #endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx index 8f159b3c459..0c3687878a6 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx @@ -1,5 +1,5 @@ -#ifndef __itkMorphologicalDistanceTransformImageFilter_hxx -#define __itkMorphologicalDistanceTransformImageFilter_hxx +#ifndef itkMorphologicalDistanceTransformImageFilter_hxx +#define itkMorphologicalDistanceTransformImageFilter_hxx #include "itkMorphologicalDistanceTransformImageFilter.h" #include "itkProgressAccumulator.h" @@ -35,8 +35,8 @@ template void MorphologicalDistanceTransformImageFilter::GenerateData(void) { - ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); + progress->SetMiniPipelineFilter(this); // these values are guesses at present - need to profile to get a // real idea @@ -106,6 +106,7 @@ MorphologicalDistanceTransformImageFilter::GenerateDa this->GraftOutput(m_Sqrt->GetOutput()); } } + template void MorphologicalDistanceTransformImageFilter::PrintSelf(std::ostream & os, Indent indent) const @@ -114,7 +115,6 @@ MorphologicalDistanceTransformImageFilter::PrintSelf( os << "Outside Value = " << (OutputPixelType)m_OutsideValue << std::endl; os << "ImageScale = " << m_Erode->GetUseImageSpacing() << std::endl; } - } // namespace itk #endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h index 9899e0e85ae..511d7f23c74 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h @@ -1,5 +1,5 @@ -#ifndef __itkMorphologicalSharpeningImageFilter_h -#define __itkMorphologicalSharpeningImageFilter_h +#ifndef itkMorphologicalSharpeningImageFilter_h +#define itkMorphologicalSharpeningImageFilter_h #include "itkImageToImageFilter.h" // #include "itkProgressReporter.h" @@ -46,7 +46,6 @@ namespace itk * **/ - template class ITK_EXPORT MorphologicalSharpeningImageFilter : public ImageToImageFilter { @@ -63,7 +62,6 @@ class ITK_EXPORT MorphologicalSharpeningImageFilter : public ImageToImageFilter< /** Runtime information support. */ itkTypeMacro(MorphologicalSharpeningImageFilter, ImageToImageFilter); - /** Pixel Type of the input image */ typedef TInputImage InputImageType; typedef TOutputImage OutputImageType; @@ -121,7 +119,6 @@ class ITK_EXPORT MorphologicalSharpeningImageFilter : public ImageToImageFilter< return m_Erode->GetUseImageSpacing(); } - #ifdef ITK_USE_CONCEPT_CHECKING /** Begin concept checking */ itkConceptMacro(SameDimension, @@ -132,11 +129,9 @@ class ITK_EXPORT MorphologicalSharpeningImageFilter : public ImageToImageFilter< /** End concept checking */ #endif - - protected: MorphologicalSharpeningImageFilter(); - virtual ~MorphologicalSharpeningImageFilter() {}; + virtual ~MorphologicalSharpeningImageFilter() {} void PrintSelf(std::ostream & os, Indent indent) const; @@ -157,17 +152,16 @@ class ITK_EXPORT MorphologicalSharpeningImageFilter : public ImageToImageFilter< void operator=(const Self &); // purposely not implemented - int m_Iterations; + int m_Iterations; + typename ErodeType::Pointer m_Erode; typename DilateType::Pointer m_Dilate; typename CastType::Pointer m_Cast; typename SharpenOpType::Pointer m_SharpenOp; }; - } // namespace itk #ifndef ITK_MANUAL_INSTANTIATION # include "itkMorphologicalSharpeningImageFilter.hxx" #endif - #endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx index 72f0378a743..82b252cbbbd 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx @@ -1,5 +1,5 @@ -#ifndef __itkMorphologicalSharpeningImageFilter_hxx -#define __itkMorphologicalSharpeningImageFilter_hxx +#ifndef itkMorphologicalSharpeningImageFilter_hxx +#define itkMorphologicalSharpeningImageFilter_hxx #include "itkMorphologicalSharpeningImageFilter.h" #include "itkProgressAccumulator.h" @@ -22,13 +22,12 @@ MorphologicalSharpeningImageFilter::MorphologicalShar this->SetUseImageSpacing(false); } - template void MorphologicalSharpeningImageFilter::GenerateData(void) { - ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); + progress->SetMiniPipelineFilter(this); // Allocate the output @@ -48,7 +47,6 @@ MorphologicalSharpeningImageFilter::GenerateData(void progress->RegisterInternalFilter(m_Dilate, 1.0f); progress->RegisterInternalFilter(m_SharpenOp, 1.0f); - // set up the progrss monitor // WatershedMiniPipelineProgressCommand::Pointer c = // WatershedMiniPipelineProgressCommand::New(); @@ -59,7 +57,6 @@ MorphologicalSharpeningImageFilter::GenerateData(void // m_Dilate->AddObserver(ProgressEvent(), c); // m_SharpenOp->AddObserver(ProgressEvent(), c); - for (int i = 0; i < m_Iterations; i++) { if (i != 0) @@ -84,9 +81,6 @@ MorphologicalSharpeningImageFilter::PrintSelf(std::os Superclass::PrintSelf(os, indent); os << "Iterations = " << m_Iterations << std::endl; } - - } // end namespace itk - #endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h index 949bbeff8e0..09adfe9f8a6 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h @@ -1,5 +1,5 @@ -#ifndef __itkMorphologicalSignedDistanceTransformImageFilter_h -#define __itkMorphologicalSignedDistanceTransformImageFilter_h +#ifndef itkMorphologicalSignedDistanceTransformImageFilter_h +#define itkMorphologicalSignedDistanceTransformImageFilter_h #include "itkImageToImageFilter.h" #include "itkProgressReporter.h" @@ -50,7 +50,6 @@ namespace itk * **/ - template class ITK_EXPORT MorphologicalSignedDistanceTransformImageFilter : public ImageToImageFilter { @@ -67,7 +66,6 @@ class ITK_EXPORT MorphologicalSignedDistanceTransformImageFilter : public ImageT /** Runtime information support. */ itkTypeMacro(MorphologicalSignedDistanceTransformImageFilter, ImageToImageFilter); - /** Pixel Type of the input image */ typedef TInputImage InputImageType; typedef TOutputImage OutputImageType; @@ -138,14 +136,12 @@ class ITK_EXPORT MorphologicalSignedDistanceTransformImageFilter : public ImageT itkSetMacro(ParabolicAlgorithm, int); itkGetConstReferenceMacro(ParabolicAlgorithm, int); - const bool & GetUseImageSpacing() { return m_Erode->GetUseImageSpacing(); } - #ifdef ITK_USE_CONCEPT_CHECKING /** Begin concept checking */ itkConceptMacro(SameDimension, @@ -156,17 +152,16 @@ class ITK_EXPORT MorphologicalSignedDistanceTransformImageFilter : public ImageT /** End concept checking */ #endif - - protected: MorphologicalSignedDistanceTransformImageFilter(); - virtual ~MorphologicalSignedDistanceTransformImageFilter() {}; + virtual ~MorphologicalSignedDistanceTransformImageFilter() {} void PrintSelf(std::ostream & os, Indent indent) const; /** Generate Data */ void - GenerateData(void); + GenerateData(void); + int m_ParabolicAlgorithm; // do everything in the output image type, which should have high precision @@ -176,9 +171,11 @@ class ITK_EXPORT MorphologicalSignedDistanceTransformImageFilter : public ImageT typedef typename itk::MorphSDTHelperImageFilter HelperType; private: - MorphologicalSignedDistanceTransformImageFilter(const Self &); // purposely not implemented + MorphologicalSignedDistanceTransformImageFilter(const Self &); // purposely not + // implemented void - operator=(const Self &); // purposely not implemented + operator=(const Self &); // purposely not + // implemented InputPixelType m_OutsideValue; bool m_InsideIsPositive; @@ -187,11 +184,9 @@ class ITK_EXPORT MorphologicalSignedDistanceTransformImageFilter : public ImageT typename ThreshType::Pointer m_Thresh; typename HelperType::Pointer m_Helper; }; - } // namespace itk #ifndef ITK_MANUAL_INSTANTIATION # include "itkMorphologicalSignedDistanceTransformImageFilter.hxx" #endif - #endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx index 23b0d0d751f..d3e767bd9a8 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx @@ -1,5 +1,5 @@ -#ifndef __itkMorphologicalSignedDistanceTransformImageFilter_hxx -#define __itkMorphologicalSignedDistanceTransformImageFilter_hxx +#ifndef itkMorphologicalSignedDistanceTransformImageFilter_hxx +#define itkMorphologicalSignedDistanceTransformImageFilter_hxx #include "itkMorphologicalSignedDistanceTransformImageFilter.h" #include "itkProgressAccumulator.h" @@ -24,6 +24,7 @@ MorphologicalSignedDistanceTransformImageFilter void MorphologicalSignedDistanceTransformImageFilter::Modified() const @@ -39,8 +40,8 @@ template void MorphologicalSignedDistanceTransformImageFilter::GenerateData(void) { - ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); + progress->SetMiniPipelineFilter(this); // these values are guesses at present - need to profile to get a // real idea @@ -106,6 +107,7 @@ MorphologicalSignedDistanceTransformImageFilter::Gene this->GraftOutput(m_Dilate->GetOutput()); #endif } + template void MorphologicalSignedDistanceTransformImageFilter::PrintSelf(std::ostream & os, @@ -115,7 +117,6 @@ MorphologicalSignedDistanceTransformImageFilter::Prin os << "Outside Value = " << (OutputPixelType)m_OutsideValue << std::endl; os << "ImageScale = " << m_Erode->GetUseImageSpacing() << std::endl; } - } // namespace itk #endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h index 6945b9137e6..304467ac592 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h @@ -1,5 +1,5 @@ -#ifndef __itkParabolicCloseImageFilter_h -#define __itkParabolicCloseImageFilter_h +#ifndef itkParabolicCloseImageFilter_h +#define itkParabolicCloseImageFilter_h #include "itkParabolicOpenCloseSafeBorderImageFilter.h" #include "itkNumericTraits.h" @@ -33,7 +33,6 @@ template class ITK_EXPORT ParabolicCloseImageFilter : public ParabolicOpenCloseSafeBorderImageFilter { - public: /** Standard class typedefs. */ typedef ParabolicCloseImageFilter Self; @@ -47,7 +46,6 @@ class ITK_EXPORT ParabolicCloseImageFilter /** Runtime information support. */ itkTypeMacro(ParabolicCloseImageFilter, ParabolicOpenCloseSafeBorderImageFilter); - /** Pixel Type of the input image */ typedef TInputImage InputImageType; typedef TOutputImage OutputImageType; @@ -68,19 +66,15 @@ class ITK_EXPORT ParabolicCloseImageFilter /** Define the image type for internal computations RealType is usually 'double' in NumericTraits. Here we prefer float in order to save memory. */ - - protected: - ParabolicCloseImageFilter() {}; - virtual ~ParabolicCloseImageFilter() {}; + ParabolicCloseImageFilter() {} + virtual ~ParabolicCloseImageFilter() {} // void PrintSelf(std::ostream& os, Indent indent) const; - private: ParabolicCloseImageFilter(const Self &); // purposely not implemented void operator=(const Self &); // purposely not implemented }; - } // end namespace itk #endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h index 224a4614951..cfd3845d7eb 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h @@ -1,5 +1,5 @@ -#ifndef __itkParabolicDilateImageFilter_h -#define __itkParabolicDilateImageFilter_h +#ifndef itkParabolicDilateImageFilter_h +#define itkParabolicDilateImageFilter_h #include "itkParabolicErodeDilateImageFilter.h" #include "itkNumericTraits.h" @@ -31,7 +31,6 @@ namespace itk template class ITK_EXPORT ParabolicDilateImageFilter : public ParabolicErodeDilateImageFilter { - public: /** Standard class typedefs. */ typedef ParabolicDilateImageFilter Self; @@ -45,7 +44,6 @@ class ITK_EXPORT ParabolicDilateImageFilter : public ParabolicErodeDilateImageFi /** Runtime information support. */ itkTypeMacro(ParabolicDilateImageFilter, ParabolicErodeDilateImageFilter); - /** Pixel Type of the input image */ typedef TInputImage InputImageType; typedef TOutputImage OutputImageType; @@ -65,16 +63,14 @@ class ITK_EXPORT ParabolicDilateImageFilter : public ParabolicErodeDilateImageFi itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); protected: - ParabolicDilateImageFilter() {}; - virtual ~ParabolicDilateImageFilter() {}; + ParabolicDilateImageFilter() {} + virtual ~ParabolicDilateImageFilter() {} // void PrintSelf(std::ostream& os, Indent indent) const; - private: ParabolicDilateImageFilter(const Self &); // purposely not implemented void operator=(const Self &); // purposely not implemented }; - } // end namespace itk #endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index 3b6db2c42e7..d89d1b58897 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h @@ -1,5 +1,5 @@ -#ifndef __itkParabolicErodeDilateImageFilter_h -#define __itkParabolicErodeDilateImageFilter_h +#ifndef itkParabolicErodeDilateImageFilter_h +#define itkParabolicErodeDilateImageFilter_h #include "itkImageToImageFilter.h" #include "itkNumericTraits.h" @@ -62,11 +62,9 @@ namespace itk * **/ - template class ITK_EXPORT ParabolicErodeDilateImageFilter : public ImageToImageFilter { - public: /** Standard class typedefs. */ typedef ParabolicErodeDilateImageFilter Self; @@ -104,18 +102,19 @@ class ITK_EXPORT ParabolicErodeDilateImageFilter : public ImageToImageFilter::FloatType InternalRealType; - // typedef typename Image RealImageType; + // typedef typename Image RealImageType; // set all of the scales the same void SetScale(ScalarRealType scale); + itkSetMacro(Scale, RadiusType); itkGetConstReferenceMacro(Scale, RadiusType); @@ -153,16 +152,16 @@ class ITK_EXPORT ParabolicErodeDilateImageFilter : public ImageToImageFilter ParabolicErodeDilateImageFilter::ParabolicErodeDilateImageFilter() { @@ -99,12 +98,12 @@ ParabolicErodeDilateImageFilter::SplitReque return maxThreadIdUsed + 1; } - template void ParabolicErodeDilateImageFilter::SetScale(ScalarRealType scale) { RadiusType s; + s.Fill(scale); this->SetScale(s); } @@ -126,6 +125,7 @@ ParabolicErodeDilateImageFilter::GenerateIn image->SetRequestedRegion(this->GetInput()->GetLargestPossibleRegion()); } } + #endif #if 1 template @@ -139,6 +139,7 @@ ParabolicErodeDilateImageFilter::EnlargeOut out->SetRequestedRegion(out->GetLargestPossibleRegion()); } } + #endif template @@ -200,20 +201,17 @@ ParabolicErodeDilateImageFilter::ThreadedGe m_CurrentDimension * progressPerDimension, progressPerDimension); - typedef ImageLinearConstIteratorWithIndex InputConstIteratorType; typedef ImageLinearIteratorWithIndex OutputIteratorType; // for stages after the first typedef ImageLinearConstIteratorWithIndex OutputConstIteratorType; - typedef ImageRegion RegionType; typename TInputImage::ConstPointer inputImage(this->GetInput()); typename TOutputImage::Pointer outputImage(this->GetOutput()); - // outputImage->SetBufferedRegion( outputImage->GetRequestedRegion() ); // outputImage->Allocate(); RegionType region = outputRegionForThread; @@ -297,7 +295,6 @@ ParabolicErodeDilateImageFilter::ThreadedGe } } - template void ParabolicErodeDilateImageFilter::PrintSelf(std::ostream & os, Indent indent) const @@ -312,7 +309,5 @@ ParabolicErodeDilateImageFilter::PrintSelf( os << "Scale in voxels: " << m_Scale << std::endl; } } - - } // namespace itk #endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h index f245c4d1413..c53a4690858 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h @@ -1,5 +1,5 @@ -#ifndef __itkParabolicErodeImageFilter_h -#define __itkParabolicErodeImageFilter_h +#ifndef itkParabolicErodeImageFilter_h +#define itkParabolicErodeImageFilter_h #include "itkParabolicErodeDilateImageFilter.h" #include "itkNumericTraits.h" @@ -31,7 +31,6 @@ namespace itk template class ITK_EXPORT ParabolicErodeImageFilter : public ParabolicErodeDilateImageFilter { - public: /** Standard class typedefs. */ typedef ParabolicErodeImageFilter Self; @@ -45,7 +44,6 @@ class ITK_EXPORT ParabolicErodeImageFilter : public ParabolicErodeDilateImageFil /** Runtime information support. */ itkTypeMacro(ParabolicErodeImageFilter, ParabolicErodeDilateImageFilter); - /** Pixel Type of the input image */ typedef TInputImage InputImageType; typedef TOutputImage OutputImageType; @@ -66,19 +64,15 @@ class ITK_EXPORT ParabolicErodeImageFilter : public ParabolicErodeDilateImageFil /** Define the image type for internal computations RealType is usually 'double' in NumericTraits. Here we prefer float in order to save memory. */ - - protected: - ParabolicErodeImageFilter() {}; - virtual ~ParabolicErodeImageFilter() {}; + ParabolicErodeImageFilter() {} + virtual ~ParabolicErodeImageFilter() {} // void PrintSelf(std::ostream& os, Indent indent) const; - private: ParabolicErodeImageFilter(const Self &); // purposely not implemented void operator=(const Self &); // purposely not implemented }; - } // end namespace itk #endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h index db29779b973..ff9e267209e 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h @@ -1,12 +1,11 @@ -#ifndef __itkParabolicUtils_h -#define __itkParabolicUtils_h +#ifndef itkParabolicMorphUtils_h +#define itkParabolicMorphUtils_h #include #include "itkProgressReporter.h" namespace itk { - // contact point algorithm template void @@ -16,6 +15,7 @@ DoLineCP(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, const RealType m 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++) { @@ -78,6 +78,7 @@ DoLineIntAlg(LineBufferType & LineBuf, // have strange behaviour when I didn't do this. Also managed to get // rid of all the warnings by sticking to size_t and equivalents. RealType s; + /* holds precomputed scale*f(q) + q^2 for speedup */ // LineBufferType F(LineBuf.size()); @@ -125,7 +126,6 @@ DoLineIntAlg(LineBufferType & LineBuf, z[k] = s; itkAssertInDebugAndIgnoreInReleaseMacro((size_t)(k + 1) <= N); z[k + 1] = NumericTraits::max(); - } /* for q */ /* now reconstruct output */ if (doDilate) @@ -134,7 +134,9 @@ DoLineIntAlg(LineBufferType & LineBuf, for (size_t q = 0; q < N; q++) { while (z[k + 1] < static_cast(q)) + { k++; + } itkAssertInDebugAndIgnoreInReleaseMacro(static_cast(v[k]) < N); itkAssertInDebugAndIgnoreInReleaseMacro(static_cast(v[k]) >= 0); LineBuf[q] = static_cast( @@ -147,7 +149,9 @@ DoLineIntAlg(LineBufferType & LineBuf, for (size_t q = 0; q < N; q++) { while (z[k + 1] < static_cast(q)) + { k++; + } itkAssertInDebugAndIgnoreInReleaseMacro(static_cast(v[k]) < N); itkAssertInDebugAndIgnoreInReleaseMacro(static_cast(v[k]) >= 0); LineBuf[q] = ((static_cast(q) * (static_cast(q) - 2 * v[k]) + F[v[k]]) * magnitude); @@ -199,7 +203,6 @@ doOneDimension(TInIter & inputIterator, } } - if (ParabolicAlgorithmChoice == CONTACTPOINT) { // using the contact point algorithm @@ -293,7 +296,5 @@ doOneDimension(TInIter & inputIterator, } } } - - } // namespace itk #endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h index 29b5807dd21..07f04e8b071 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h @@ -1,5 +1,5 @@ -#ifndef __itkParabolicOpenCloseImageFilter_h -#define __itkParabolicOpenCloseImageFilter_h +#ifndef itkParabolicOpenCloseImageFilter_h +#define itkParabolicOpenCloseImageFilter_h #include "itkImageToImageFilter.h" #include "itkNumericTraits.h" @@ -35,7 +35,6 @@ namespace itk template class ITK_EXPORT ParabolicOpenCloseImageFilter : public ImageToImageFilter { - public: /** Standard class typedefs. */ typedef ParabolicOpenCloseImageFilter Self; @@ -49,7 +48,6 @@ class ITK_EXPORT ParabolicOpenCloseImageFilter : public ImageToImageFilter RadiusType; - /** Define the image type for internal computations RealType is usually 'double' in NumericTraits. Here we prefer float in order to save memory. */ typedef typename NumericTraits::FloatType InternalRealType; - // typedef typename Image RealImageType; + // typedef typename Image RealImageType; // set all of the scales the same void SetScale(ScalarRealType scale); + itkSetMacro(Scale, RadiusType); itkGetConstReferenceMacro(Scale, RadiusType); /** @@ -122,23 +120,25 @@ class ITK_EXPORT ParabolicOpenCloseImageFilter : public ImageToImageFilter ParabolicOpenCloseImageFilter::ParabolicOpenCloseImageFilter() { @@ -46,7 +45,7 @@ ParabolicOpenCloseImageFilter::ParabolicOpenC m_UseImageSpacing = false; m_ParabolicAlgorithm = INTERSECTION; m_Stage = 1; // indicate whether we are on the first pass or the - // second + // second } template @@ -108,12 +107,12 @@ ParabolicOpenCloseImageFilter::SplitRequested return maxThreadIdUsed + 1; } - template void ParabolicOpenCloseImageFilter::SetScale(ScalarRealType scale) { RadiusType s; + s.Fill(scale); this->SetScale(s); } @@ -135,6 +134,7 @@ ParabolicOpenCloseImageFilter::GenerateInputR image->SetRequestedRegion(this->GetInput()->GetLargestPossibleRegion()); } } + #endif #if 1 @@ -149,6 +149,7 @@ ParabolicOpenCloseImageFilter::EnlargeOutputR out->SetRequestedRegion(out->GetLargestPossibleRegion()); } } + #endif template @@ -157,19 +158,19 @@ ParabolicOpenCloseImageFilter::GenerateData(v { ThreadIdType nbthreads = this->GetNumberOfThreads(); - // typedef ImageLinearConstIteratorWithIndex< TInputImage > InputConstIteratorType; + // typedef ImageLinearConstIteratorWithIndex< TInputImage > + // InputConstIteratorType; // typedef ImageLinearIteratorWithIndex< TOutputImage > OutputIteratorType; // 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()); - // const unsigned int imageDimension = inputImage->GetImageDimension(); outputImage->SetBufferedRegion(outputImage->GetRequestedRegion()); @@ -213,12 +214,12 @@ ParabolicOpenCloseImageFilter::GenerateData(v // Set up the multithreaded processing typename ImageSource< TOutputImage >::ThreadStruct str; str.Filter = this; - this->GetMultiThreader()->SetNumberOfThreads(this->GetNumberOfThreads()); + this->GetMultiThreader()->SetNumberOfThreads( this->GetNumberOfThreads() ); this->GetMultiThreader()->SetSingleMethod(this->ThreaderCallback, &str); // multithread the execution - stage 1 - m_Stage=1; - for( unsigned int d=0; dGetMultiThreader()->SingleMethodExecute(); @@ -228,8 +229,8 @@ ParabolicOpenCloseImageFilter::GenerateData(v m_MagnitudeSign = m_MagnitudeSign2; // multithread the execution - stage 2 - m_Stage=2; - for( unsigned int d=0; dGetMultiThreader()->SingleMethodExecute(); @@ -237,7 +238,7 @@ ParabolicOpenCloseImageFilter::GenerateData(v // swap them back m_Extreme = m_Extreme1; m_MagnitudeSign = m_MagnitudeSign1; - m_Stage=1; + m_Stage = 1; #endif } @@ -273,27 +274,23 @@ ParabolicOpenCloseImageFilter::ThreadedGenera m_CurrentDimension * progressPerDimension, progressPerDimension); - typedef ImageLinearConstIteratorWithIndex InputConstIteratorType; typedef ImageLinearIteratorWithIndex OutputIteratorType; // for stages after the first typedef ImageLinearConstIteratorWithIndex OutputConstIteratorType; - typedef ImageRegion RegionType; typename TInputImage::ConstPointer inputImage(this->GetInput()); typename TOutputImage::Pointer outputImage(this->GetOutput()); - // const unsigned int imageDimension = inputImage->GetImageDimension(); // outputImage->SetBufferedRegion( outputImage->GetRequestedRegion() ); // outputImage->Allocate(); RegionType region = outputRegionForThread; - InputConstIteratorType inputIterator(inputImage, region); OutputIteratorType outputIterator(outputImage, region); OutputConstIteratorType inputIteratorStage2(outputImage, region); @@ -388,7 +385,6 @@ ParabolicOpenCloseImageFilter::ThreadedGenera } } - template void ParabolicOpenCloseImageFilter::PrintSelf(std::ostream & os, Indent indent) const @@ -403,7 +399,5 @@ ParabolicOpenCloseImageFilter::PrintSelf(std: os << "Scale in voxels: " << m_Scale << std::endl; } } - - } // namespace itk #endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h index 5d0b467be03..15e194d1c06 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h @@ -1,5 +1,5 @@ -#ifndef __itkParabolicOpenCloseSafeBorderImageFilter_h -#define __itkParabolicOpenCloseSafeBorderImageFilter_h +#ifndef itkParabolicOpenCloseSafeBorderImageFilter_h +#define itkParabolicOpenCloseSafeBorderImageFilter_h #include "itkParabolicOpenCloseImageFilter.h" #include "itkCropImageFilter.h" @@ -15,7 +15,6 @@ namespace itk template class ITK_EXPORT ParabolicOpenCloseSafeBorderImageFilter : public ImageToImageFilter { - public: /** Standard class typedefs. */ typedef ParabolicOpenCloseSafeBorderImageFilter Self; @@ -29,7 +28,6 @@ class ITK_EXPORT ParabolicOpenCloseSafeBorderImageFilter : public ImageToImageFi /** Runtime information support. */ itkTypeMacro(ParabolicOpenCloseSafeBorderImageFilter, ImageToImageFilter); - /** Pixel Type of the input image */ typedef TInputImage InputImageType; typedef TOutputImage OutputImageType; @@ -56,12 +54,14 @@ class ITK_EXPORT ParabolicOpenCloseSafeBorderImageFilter : public ImageToImageFi SetScale(ScalarRealType scale) { RadiusType s = this->GetScale(); + this->m_MorphFilt->SetScale(scale); if (s != this->GetScale()) { this->Modified(); } } + // different scale for each direction void SetScale(RadiusType scale) @@ -72,6 +72,7 @@ class ITK_EXPORT ParabolicOpenCloseSafeBorderImageFilter : public ImageToImageFi this->Modified(); } } + // const RadiusType & GetScale() const @@ -79,7 +80,6 @@ class ITK_EXPORT ParabolicOpenCloseSafeBorderImageFilter : public ImageToImageFi return (this->m_MorphFilt->GetScale()); } - void SetUseImageSpacing(bool B) { @@ -89,13 +89,14 @@ class ITK_EXPORT ParabolicOpenCloseSafeBorderImageFilter : public ImageToImageFi this->Modified(); } } + bool GetUseImageSpacing() const { return (this->m_MorphFilt->GetUseImageSpacing()); } - itkBooleanMacro(UseImageSpacing); + itkBooleanMacro(UseImageSpacing); itkSetMacro(SafeBorder, bool); itkGetConstReferenceMacro(SafeBorder, bool); @@ -117,13 +118,15 @@ class ITK_EXPORT ParabolicOpenCloseSafeBorderImageFilter : public ImageToImageFi itkSetMacro(ParabolicAlgorithm, int); itkGetConstReferenceMacro(ParabolicAlgorithm, int); - /** ParabolicOpenCloseImageFilter must forward the Modified() call to its internal filters */ + /** ParabolicOpenCloseImageFilter must forward the Modified() call to its + internal filters */ virtual void Modified() const; protected: void GenerateData(); + void PrintSelf(std::ostream & os, Indent indent) const; @@ -141,24 +144,26 @@ class ITK_EXPORT ParabolicOpenCloseSafeBorderImageFilter : public ImageToImageFi m_SafeBorder = true; m_ParabolicAlgorithm = INTERSECTION; } - virtual ~ParabolicOpenCloseSafeBorderImageFilter() {}; - int m_ParabolicAlgorithm; + virtual ~ParabolicOpenCloseSafeBorderImageFilter() {} + int m_ParabolicAlgorithm; private: - ParabolicOpenCloseSafeBorderImageFilter(const Self &); // purposely not implemented + ParabolicOpenCloseSafeBorderImageFilter(const Self &); // purposely not + // implemented void - operator=(const Self &); // purposely not implemented + operator=(const Self &); // purposely not + // implemented typename MorphFilterType::Pointer m_MorphFilt; typename PadFilterType::Pointer m_PadFilt; typename CropFilterType::Pointer m_CropFilt; typename StatsFilterType::Pointer m_StatsFilt; - bool m_SafeBorder; - bool m_UseContactPoint; - bool m_UseIntersection; -}; + bool m_SafeBorder; + bool m_UseContactPoint; + bool m_UseIntersection; +}; } // end namespace itk #ifndef ITK_MANUAL_INSTANTIATION # include "itkParabolicOpenCloseSafeBorderImageFilter.hxx" diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx index a160da1a061..013922bdb99 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx @@ -1,18 +1,17 @@ -#ifndef __itkParabolicOpenCloseSafeBorderImageFilter_hxx -#define __itkParabolicOpenCloseSafeBorderImageFilter_hxx +#ifndef itkParabolicOpenCloseSafeBorderImageFilter_hxx +#define itkParabolicOpenCloseSafeBorderImageFilter_hxx #include "itkProgressAccumulator.h" #include "itkParabolicOpenCloseSafeBorderImageFilter.h" namespace itk { - template void ParabolicOpenCloseSafeBorderImageFilter::GenerateData(void) { - ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); + progress->SetMiniPipelineFilter(this); // Allocate the output @@ -91,7 +90,6 @@ ParabolicOpenCloseSafeBorderImageFilter::Gene } } - template void ParabolicOpenCloseSafeBorderImageFilter::Modified() const @@ -103,7 +101,6 @@ ParabolicOpenCloseSafeBorderImageFilter::Modi m_StatsFilt->Modified(); } - /////////////////////////////////// template void diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h index 82a6e5b20de..2ce428276b5 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h @@ -1,5 +1,5 @@ -#ifndef __itkParabolicOpenImageFilter_h -#define __itkParabolicOpenImageFilter_h +#ifndef itkParabolicOpenImageFilter_h +#define itkParabolicOpenImageFilter_h #include "itkParabolicOpenCloseSafeBorderImageFilter.h" #include "itkNumericTraits.h" @@ -32,7 +32,6 @@ template class ITK_EXPORT ParabolicOpenImageFilter : public ParabolicOpenCloseSafeBorderImageFilter { - public: /** Standard class typedefs. */ typedef ParabolicOpenImageFilter Self; @@ -43,7 +42,6 @@ class ITK_EXPORT ParabolicOpenImageFilter /** Method for creation through the object factory. */ itkNewMacro(Self); - /** Pixel Type of the input image */ typedef TInputImage InputImageType; typedef TOutputImage OutputImageType; @@ -64,19 +62,15 @@ class ITK_EXPORT ParabolicOpenImageFilter /** Define the image type for internal computations RealType is usually 'double' in NumericTraits. Here we prefer float in order to save memory. */ - - protected: - ParabolicOpenImageFilter() {}; - virtual ~ParabolicOpenImageFilter() {}; + ParabolicOpenImageFilter() {} + virtual ~ParabolicOpenImageFilter() {} // void PrintSelf(std::ostream& os, Indent indent) const; - private: ParabolicOpenImageFilter(const Self &); // purposely not implemented void operator=(const Self &); // purposely not implemented }; - } // end namespace itk #endif diff --git a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h index 7d1164144da..79039135059 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h @@ -1,12 +1,10 @@ - -#ifndef __itkSharpenOpImageFilter_h -#define __itkSharpenOpImageFilter_h +#ifndef itkSharpenOpImageFilter_h +#define itkSharpenOpImageFilter_h #include "itkTernaryFunctorImageFilter.h" namespace itk { - /** \class SharpenOpImageFilter * \brief Implements the sharpening operation. The inputs are the * dilated, eroded and original images. @@ -30,7 +28,6 @@ namespace itk */ namespace Function { - template class SharpM { @@ -42,11 +39,13 @@ class SharpM { return false; } + bool operator==(const SharpM & other) const { return !(*this != other); } + inline TOutput operator()(const TInput1 & A, const TInput2 & B, const TInput3 & C) { @@ -56,9 +55,13 @@ class SharpM TInput2 diff2 = B - C; if (diff1 < diff2) + { return (TOutput)A; + } if (diff2 < diff1) + { return (TOutput)C; + } return ((TOutput)B); } }; @@ -105,8 +108,6 @@ class ITK_EXPORT SharpenOpImageFilter void operator=(const Self &); // purposely not implemented }; - } // end namespace itk - #endif From 69eb2a40188a7d6b8cac48bcd91982110957cf40 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Mon, 18 May 2015 20:59:53 +1000 Subject: [PATCH 109/165] DOC: license --- .../include/itkBinaryCloseParaImageFilter.h | 17 +++++++++++++++++ .../include/itkBinaryCloseParaImageFilter.hxx | 17 +++++++++++++++++ .../include/itkBinaryDilateParaImageFilter.h | 17 +++++++++++++++++ .../include/itkBinaryDilateParaImageFilter.hxx | 17 +++++++++++++++++ .../include/itkBinaryErodeParaImageFilter.h | 17 +++++++++++++++++ .../include/itkBinaryErodeParaImageFilter.hxx | 17 +++++++++++++++++ .../include/itkBinaryOpenParaImageFilter.h | 17 +++++++++++++++++ .../include/itkBinaryOpenParaImageFilter.hxx | 17 +++++++++++++++++ .../include/itkGreaterEqualValImageFilter.h | 17 +++++++++++++++++ .../include/itkMorphSDTHelperImageFilter.h | 17 +++++++++++++++++ ...kMorphologicalDistanceTransformImageFilter.h | 17 +++++++++++++++++ ...orphologicalDistanceTransformImageFilter.hxx | 17 +++++++++++++++++ .../itkMorphologicalSharpeningImageFilter.h | 17 +++++++++++++++++ .../itkMorphologicalSharpeningImageFilter.hxx | 17 +++++++++++++++++ ...ologicalSignedDistanceTransformImageFilter.h | 17 +++++++++++++++++ ...ogicalSignedDistanceTransformImageFilter.hxx | 17 +++++++++++++++++ .../include/itkParabolicCloseImageFilter.h | 17 +++++++++++++++++ .../include/itkParabolicDilateImageFilter.h | 17 +++++++++++++++++ .../itkParabolicErodeDilateImageFilter.h | 17 +++++++++++++++++ .../itkParabolicErodeDilateImageFilter.hxx | 17 +++++++++++++++++ .../include/itkParabolicErodeImageFilter.h | 17 +++++++++++++++++ .../include/itkParabolicMorphUtils.h | 17 +++++++++++++++++ .../include/itkParabolicOpenCloseImageFilter.h | 17 +++++++++++++++++ .../itkParabolicOpenCloseImageFilter.hxx | 17 +++++++++++++++++ ...itkParabolicOpenCloseSafeBorderImageFilter.h | 17 +++++++++++++++++ ...kParabolicOpenCloseSafeBorderImageFilter.hxx | 17 +++++++++++++++++ .../include/itkParabolicOpenImageFilter.h | 17 +++++++++++++++++ .../include/itkSharpenOpImageFilter.h | 17 +++++++++++++++++ 28 files changed, 476 insertions(+) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h index 1e4324e644f..a0b0bc6ced4 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.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 itkBinaryCloseParaImageFilter_h #define itkBinaryCloseParaImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx index 7a82398a9c6..c68be049bb9 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.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 itkBinaryCloseParaImageFilter_hxx #define itkBinaryCloseParaImageFilter_hxx diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h index cafd37ff793..2b7d7e1d18e 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.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 itkBinaryDilateParaImageFilter_h #define itkBinaryDilateParaImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx index 586bde94ab1..77b7bfeaa4b 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.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 itkBinaryDilateParaImageFilter_hxx #define itkBinaryDilateParaImageFilter_hxx diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h index ff43a0cc568..ce2652244e1 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.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 itkBinaryErodeParaImageFilter_h #define itkBinaryErodeParaImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx index 1aae9ded1be..416ce4b0ca7 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.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 itkBinaryErodeParaImageFilter_hxx #define itkBinaryErodeParaImageFilter_hxx diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h index 33d317ba22f..67a90d2ff46 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.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 itkBinaryOpenParaImageFilter_h #define itkBinaryOpenParaImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx index d7f4e4c4293..f3f680050ea 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.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 itkBinaryOpenParaImageFilter_hxx #define itkBinaryOpenParaImageFilter_hxx diff --git a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h index e0194e4491d..170547e9fc3 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.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 itkGreaterEqualValImageFilter_h #define itkGreaterEqualValImageFilter_h #include diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h index 50f949f8ad6..5ac4d2a6b6d 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.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 itkMorphSDTHelperImageFilter_h #define itkMorphSDTHelperImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h index 7f829a08df7..2f6f9d947e5 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.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 itkMorphologicalDistanceTransformImageFilter_h #define itkMorphologicalDistanceTransformImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx index 0c3687878a6..fb46f123a38 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.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 itkMorphologicalDistanceTransformImageFilter_hxx #define itkMorphologicalDistanceTransformImageFilter_hxx diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h index 511d7f23c74..6fde586d8ae 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.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 itkMorphologicalSharpeningImageFilter_h #define itkMorphologicalSharpeningImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx index 82b252cbbbd..f77413764e7 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.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 itkMorphologicalSharpeningImageFilter_hxx #define itkMorphologicalSharpeningImageFilter_hxx diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h index 09adfe9f8a6..74e61293a40 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.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 itkMorphologicalSignedDistanceTransformImageFilter_h #define itkMorphologicalSignedDistanceTransformImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx index d3e767bd9a8..c5f0adc3ab1 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.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 itkMorphologicalSignedDistanceTransformImageFilter_hxx #define itkMorphologicalSignedDistanceTransformImageFilter_hxx diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h index 304467ac592..987dd7466be 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.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 itkParabolicCloseImageFilter_h #define itkParabolicCloseImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h index cfd3845d7eb..b4dc95fcf78 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.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 itkParabolicDilateImageFilter_h #define itkParabolicDilateImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index d89d1b58897..75497d103a9 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.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 itkParabolicErodeDilateImageFilter_h #define itkParabolicErodeDilateImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx index f0fd0316037..f5f807213aa 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.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 __itkParabolicErodeDilateImageFilter_hxx #define __itkParabolicErodeDilateImageFilter_hxx diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h index c53a4690858..acf5468f30b 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.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 itkParabolicErodeImageFilter_h #define itkParabolicErodeImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h index ff9e267209e..3537654a9bc 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.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 itkParabolicMorphUtils_h #define itkParabolicMorphUtils_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h index 07f04e8b071..f5262b519e0 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.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 itkParabolicOpenCloseImageFilter_h #define itkParabolicOpenCloseImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx index ed2c65e51d0..4163f9d5fbb 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.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 itkParabolicOpenCloseImageFilter_hxx #define itkParabolicOpenCloseImageFilter_hxx diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h index 15e194d1c06..e5841701181 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.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 itkParabolicOpenCloseSafeBorderImageFilter_h #define itkParabolicOpenCloseSafeBorderImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx index 013922bdb99..0c6d6bcda9a 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.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 itkParabolicOpenCloseSafeBorderImageFilter_hxx #define itkParabolicOpenCloseSafeBorderImageFilter_hxx diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h index 2ce428276b5..78f20e49826 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.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 itkParabolicOpenImageFilter_h #define itkParabolicOpenImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h index 79039135059..eac33447245 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.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 itkSharpenOpImageFilter_h #define itkSharpenOpImageFilter_h From 22fcfd028bf64fb4118fc2081e3e4fe35645dab4 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Mon, 18 May 2015 21:16:53 +1000 Subject: [PATCH 110/165] ENH: KW and uncrust --- .../test/itkBinaryCloseParaTest.cxx | 3 - .../test/itkBinaryDilateParaTest.cxx | 3 - .../test/itkBinaryErodeParaTest.cxx | 3 - .../test/itkBinaryOpenParaTest.cxx | 3 - .../test/itkParaDTTest.cxx | 2 - .../test/itkParaDilateTest.cxx | 1 - .../test/itkParaOpenTest.cxx | 2 - .../test/itkParaSharpenTest.cxx | 21 +-- .../test/itkParaSpacingTest.cxx | 2 - .../ParabolicMorphology/test/mkSpot.cxx | 32 ---- .../ParabolicMorphology/test/perfDT.cxx | 126 ---------------- .../ParabolicMorphology/test/perfDT3D.cxx | 142 ------------------ .../ParabolicMorphology/test/rleTests.cxx | 135 ----------------- .../ParabolicMorphology/test/testClose.cxx | 57 ------- .../test/testCloseBinary.cxx | 59 -------- .../ParabolicMorphology/test/testDT.cxx | 59 -------- .../test/testDilateBinary.cxx | 81 ---------- .../test/testDistTrans.cxx | 67 --------- .../test/testErodeBinary.cxx | 81 ---------- .../ParabolicMorphology/test/testOpen.cxx | 66 -------- .../test/testOpenBinary.cxx | 59 -------- .../ParabolicMorphology/test/testSharpen.cxx | 123 --------------- .../ParabolicMorphology/test/testSpacing.cxx | 71 --------- 23 files changed, 8 insertions(+), 1190 deletions(-) delete mode 100644 Modules/Filtering/ParabolicMorphology/test/mkSpot.cxx delete mode 100644 Modules/Filtering/ParabolicMorphology/test/perfDT.cxx delete mode 100644 Modules/Filtering/ParabolicMorphology/test/perfDT3D.cxx delete mode 100644 Modules/Filtering/ParabolicMorphology/test/rleTests.cxx delete mode 100644 Modules/Filtering/ParabolicMorphology/test/testClose.cxx delete mode 100644 Modules/Filtering/ParabolicMorphology/test/testCloseBinary.cxx delete mode 100644 Modules/Filtering/ParabolicMorphology/test/testDT.cxx delete mode 100644 Modules/Filtering/ParabolicMorphology/test/testDilateBinary.cxx delete mode 100644 Modules/Filtering/ParabolicMorphology/test/testDistTrans.cxx delete mode 100644 Modules/Filtering/ParabolicMorphology/test/testErodeBinary.cxx delete mode 100644 Modules/Filtering/ParabolicMorphology/test/testOpen.cxx delete mode 100644 Modules/Filtering/ParabolicMorphology/test/testOpenBinary.cxx delete mode 100644 Modules/Filtering/ParabolicMorphology/test/testSharpen.cxx delete mode 100644 Modules/Filtering/ParabolicMorphology/test/testSpacing.cxx diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx index 9f2b5286ef3..17851202d31 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx @@ -12,15 +12,12 @@ int itkBinaryCloseParaTest(int argc, char * argv[]) { - - if (argc != 5) { std::cerr << "Usage: " << argv[0] << " inputimage threshold size outim " << std::endl; return (EXIT_FAILURE); } - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); const int dim = 2; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx index 724a4c54f0e..13d73ebfafc 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx @@ -12,15 +12,12 @@ int itkBinaryDilateParaTest(int argc, char * argv[]) { - - if (argc != 5) { std::cerr << "Usage: " << argv[0] << " inputimage threshold size outim " << std::endl; return (EXIT_FAILURE); } - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); const int dim = 2; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx index d8ea04429b9..0f851d6bd2a 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx @@ -12,15 +12,12 @@ int itkBinaryErodeParaTest(int argc, char * argv[]) { - - if (argc != 5) { std::cerr << "Usage: " << argv[0] << " inputimage threshold size outim " << std::endl; return (EXIT_FAILURE); } - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); const int dim = 2; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx index abd9617df27..9e5dea01183 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx @@ -12,15 +12,12 @@ int itkBinaryOpenParaTest(int argc, char * argv[]) { - - if (argc != 5) { std::cerr << "Usage: " << argv[0] << " inputimage threshold size outim " << std::endl; return (EXIT_FAILURE); } - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); const int dim = 2; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx index db1ee72c8c3..0af1aeb3343 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx @@ -9,11 +9,9 @@ #include "itkTimeProbe.h" #include "itkMultiThreader.h" - int itkParaDTTest(int argc, char * argv[]) { - // int iterations = 1; if (argc != 5) diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx index 4cf8de54909..1c2aec239ad 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx @@ -43,7 +43,6 @@ itkParaDilateTest(int argc, char * argv[]) FilterType::Pointer filter = FilterType::New(); - filter->SetInput(reader->GetOutput()); filter->SetScale(scale); diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx index d400243aab2..0a84ed14909 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx @@ -8,7 +8,6 @@ #include "itkTimeProbe.h" #include "itkMultiThreader.h" - int itkParaOpenTest(int argc, char * argv[]) { @@ -18,7 +17,6 @@ itkParaOpenTest(int argc, char * argv[]) typedef unsigned char PType; typedef itk::Image IType; - typedef itk::ImageFileReader ReaderType; ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(argv[1]); diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx index 6a56b52a1f4..99f9f1fc5cf 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx @@ -9,18 +9,15 @@ #include "itkGrayscaleDilateImageFilter.h" #include "itkBinaryBallStructuringElement.h" - #include "itkSmoothingRecursiveGaussianImageFilter.h" #include "itkBinaryThresholdImageFilter.h" #include "itkMorphologicalSharpeningImageFilter.h" #include "itkTimeProbe.h" #include "itkMultiThreader.h" - int itkParaSharpenTest(int argc, char * argv[]) { - int iterations = 1; if (argc != 3) @@ -92,7 +89,6 @@ itkParaSharpenTest(int argc, char * argv[]) return EXIT_FAILURE; } - writer->SetInput(smoother->GetOutput()); writer->SetFileName("blurrredinput.tif"); try @@ -105,7 +101,6 @@ itkParaSharpenTest(int argc, char * argv[]) return EXIT_FAILURE; } - // now to apply the sharpening typedef itk::MorphologicalSharpeningImageFilter FilterType; @@ -145,14 +140,14 @@ itkParaSharpenTest(int argc, char * argv[]) // write out profiles // input IType::IndexType first, last; - first[0]=50; - first[1]=0; - last[0]=50; - last[1]=99; - - extractProfile(smallDilate->GetOutput(), first, last, "inputprof.txt"); - extractProfile(smoother->GetOutput(), first, last, "blurredprof.txt"); - extractProfile(filter->GetOutput(), first, last, argv[3]); + first[0] = 50; + first[1] = 0; + last[0] = 50; + last[1] = 99; + + extractProfile< IType >(smallDilate->GetOutput(), first, last, "inputprof.txt"); + extractProfile< IType >(smoother->GetOutput(), first, last, "blurredprof.txt"); + extractProfile< FType >(filter->GetOutput(), first, last, argv[3]); #endif return EXIT_SUCCESS; } diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx index 2c308694987..a10405e2f04 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx @@ -20,7 +20,6 @@ itkParaSpacingTest(int, char * argv[]) typedef unsigned char PType; typedef itk::Image IType; - typedef itk::ImageFileReader ReaderType; ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(argv[1]); @@ -80,7 +79,6 @@ itkParaSpacingTest(int, char * argv[]) newspacing[0] = 1 / sqrt((float)1); newspacing[1] = 1 / sqrt((float)0.5); - changer->SetOutputSpacing(newspacing); changer->ChangeSpacingOn(); // set scales to deliver the same result diff --git a/Modules/Filtering/ParabolicMorphology/test/mkSpot.cxx b/Modules/Filtering/ParabolicMorphology/test/mkSpot.cxx deleted file mode 100644 index be1d64844ce..00000000000 --- a/Modules/Filtering/ParabolicMorphology/test/mkSpot.cxx +++ /dev/null @@ -1,32 +0,0 @@ -#include "ioutils.h" - -int -main(int argc, char * argv[]) -{ - const int dim = 2; - - typedef unsigned char PType; - typedef itk::Image IType; - - // create the input image - we will blur a dot, threshold then blur again - IType::Pointer input = IType::New(); - IType::SizeType size; - IType::IndexType index; - IType::RegionType region; - IType::SpacingType spacing; - - size.Fill(100); - spacing.Fill(1); - region.SetSize(size); - - index.Fill(50); - - input->SetRegions(region); - input->SetSpacing(spacing); - input->Allocate(); - - input->FillBuffer(255); - input->SetPixel(index, 0); - writeIm(input, argv[1]); - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/ParabolicMorphology/test/perfDT.cxx b/Modules/Filtering/ParabolicMorphology/test/perfDT.cxx deleted file mode 100644 index ee6e44397d5..00000000000 --- a/Modules/Filtering/ParabolicMorphology/test/perfDT.cxx +++ /dev/null @@ -1,126 +0,0 @@ -#include -#include "itkImageFileReader.h" -#include "itkImageFileWriter.h" -#include "itkCommand.h" -#include "itkSimpleFilterWatcher.h" -#include "itkChangeInformationImageFilter.h" -#include "itkSignedMaurerDistanceMapImageFilter.h" - -// #include "plotutils.h" -#include "ioutils.h" - -#include "itkBinaryThresholdImageFilter.h" -#include "itkMorphologicalSignedDistanceTransformImageFilter.h" - -#include "itkSignedDanielssonDistanceMapImageFilter.h" - -#include "itkTimeProbe.h" -#include "itkMultiThreader.h" - - -int -main(int argc, char * argv[]) -{ - - int iterations = 1; - - if (argc != 8) - { - std::cerr << "Usage: " << argv[0] << " inputimage threshold outsideval outim1 outim2 outim3" << std::endl; - return (EXIT_FAILURE); - } - - iterations = atoi(argv[1]); - - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; - - typedef unsigned char PType; - typedef itk::Image IType; - typedef itk::Image FType; - - IType::Pointer inputOrig = readIm(argv[1]); - - typedef itk::ChangeInformationImageFilter ChangeType; - ChangeType::Pointer changer = ChangeType::New(); - changer->SetInput(inputOrig); - ChangeType::SpacingType newspacing; - - newspacing[0] = 0.5; - newspacing[1] = 0.25; - - - changer->SetOutputSpacing(newspacing); - changer->ChangeSpacingOn(); - - IType::Pointer input = changer->GetOutput(); - - // threshold the input to create a mask - typedef itk::BinaryThresholdImageFilter ThreshType; - ThreshType::Pointer thresh = ThreshType::New(); - thresh->SetInput(input); - - thresh->SetUpperThreshold(atoi(argv[2])); - thresh->SetInsideValue(0); - thresh->SetOutsideValue(255); - writeIm(thresh->GetOutput(), argv[4]); - // now to apply the signed distance transform - typedef itk::MorphologicalSignedDistanceTransformImageFilter FilterType; - - FilterType::Pointer filter = FilterType::New(); - - filter->SetInput(thresh->GetOutput()); - // filter->SetOutsideValue(atoi(argv[3])); - filter->SetUseImageSpacing(true); - - itk::TimeProbe ParabolicT, MaurerT, DanielssonT; - - std::cout << "Parabolic Maurer Danielsson" << std::endl; - const unsigned TESTS = 10; -#if 1 - for (unsigned repeats = 0; repeats < TESTS; repeats++) - { - ParabolicT.Start(); - filter->Modified(); - filter->Update(); - ParabolicT.Stop(); - } - - writeIm(filter->GetOutput(), argv[5]); -#endif - typedef itk::SignedMaurerDistanceMapImageFilter MaurerType; - MaurerType::Pointer maurer = MaurerType::New(); - maurer->SetInput(thresh->GetOutput()); - maurer->SetUseImageSpacing(true); - maurer->SetSquaredDistance(false); - - for (unsigned repeats = 0; repeats < TESTS; repeats++) - { - MaurerT.Start(); - maurer->Modified(); - maurer->Update(); - MaurerT.Stop(); - } - writeIm(maurer->GetOutput(), argv[6]); - - typedef itk::SignedDanielssonDistanceMapImageFilter DanielssonType; - DanielssonType::Pointer daniel = DanielssonType::New(); - daniel->SetInput(thresh->GetOutput()); - daniel->SetUseImageSpacing(true); - - for (unsigned repeats = 0; repeats < TESTS; repeats++) - { - DanielssonT.Start(); - daniel->Modified(); - daniel->Update(); - DanielssonT.Stop(); - } - writeIm(daniel->GetDistanceMap(), argv[7]); - - - std::cout << std::setprecision(3) << ParabolicT.GetMean() << "\t" << MaurerT.GetMean() << "\t" - << DanielssonT.GetMean() << std::endl; - - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/ParabolicMorphology/test/perfDT3D.cxx b/Modules/Filtering/ParabolicMorphology/test/perfDT3D.cxx deleted file mode 100644 index 67f71b70ed1..00000000000 --- a/Modules/Filtering/ParabolicMorphology/test/perfDT3D.cxx +++ /dev/null @@ -1,142 +0,0 @@ -#include -#include "itkImageFileReader.h" -#include "itkImageFileWriter.h" -#include "itkCommand.h" -#include "itkSimpleFilterWatcher.h" -#include "itkChangeInformationImageFilter.h" - -// #include "plotutils.h" -#include "ioutils.h" - -#include "itkBinaryThresholdImageFilter.h" -#include "itkMorphologicalSignedDistanceTransformImageFilter.h" -// #include "itkMorphologicalDistanceTransformImageFilter.h" -#include "itkSignedMaurerDistanceMapImageFilter.h" - -#include "itkDanielssonDistanceMapImageFilter.h" - -#include "itkTimeProbe.h" -#include "itkMultiThreader.h" - - -int -main(int argc, char * argv[]) -{ - - int iterations = 1; - - if (argc != 8) - { - std::cerr << "Usage: " << argv[0] << " inputimage threshold outsideval outim1 outim2 outim3" << std::endl; - return (EXIT_FAILURE); - } - - iterations = atoi(argv[1]); - - // itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 3; - - typedef unsigned char PType; - typedef itk::Image IType; - typedef itk::Image FType; - - IType::Pointer inputOrig = readIm(argv[1]); - - typedef itk::ChangeInformationImageFilter ChangeType; - ChangeType::Pointer changer = ChangeType::New(); - changer->SetInput(inputOrig); - ChangeType::SpacingType newspacing; - - newspacing[0] = 0.5; - newspacing[1] = 0.25; - newspacing[2] = 0.75; - newspacing.Fill(1); - - changer->SetOutputSpacing(newspacing); - changer->ChangeSpacingOn(); - - IType::Pointer input = changer->GetOutput(); - - // threshold the input to create a mask - typedef itk::BinaryThresholdImageFilter ThreshType; - ThreshType::Pointer thresh = ThreshType::New(); - thresh->SetInput(input); - - thresh->SetUpperThreshold(atoi(argv[2])); - thresh->SetInsideValue(0); - thresh->SetOutsideValue(255); - writeIm(thresh->GetOutput(), argv[4]); - // now to apply the signed distance transform - std::cout << "Finished loading etc" << std::endl; - - - typedef itk::MorphologicalSignedDistanceTransformImageFilter FilterType; - - FilterType::Pointer filter = FilterType::New(); - - filter->SetInput(thresh->GetOutput()); - filter->SetOutsideValue(atoi(argv[3])); - filter->SetUseImageSpacing(true); - filter->SetParabolicAlgorithm(FilterType::CONTACTPOINT); - // filter->UseContactPointOn(); - itk::TimeProbe ParabolicCP, ParabolicInt, MaurerT, DanielssonT; - - std::cout << "ParabolicCP ParabolicIntersection Maurer Danielsson" << std::endl; - - const unsigned pTESTS = 10; - for (unsigned repeats = 0; repeats < pTESTS; repeats++) - { - ParabolicCP.Start(); - filter->Modified(); - filter->Update(); - ParabolicCP.Stop(); - } - - filter->SetParabolicAlgorithm(FilterType::INTERSECTION); - for (unsigned repeats = 0; repeats < pTESTS; repeats++) - { - ParabolicInt.Start(); - filter->Modified(); - filter->Update(); - ParabolicInt.Stop(); - } - - writeIm(filter->GetOutput(), argv[5]); - - typedef itk::SignedMaurerDistanceMapImageFilter MaurerType; - MaurerType::Pointer maurer = MaurerType::New(); - maurer->SetInput(thresh->GetOutput()); - maurer->SetUseImageSpacing(true); - maurer->SetSquaredDistance(false); - for (unsigned repeats = 0; repeats < pTESTS; repeats++) - { - MaurerT.Start(); - maurer->Modified(); - maurer->Update(); - MaurerT.Stop(); - } - writeIm(maurer->GetOutput(), argv[6]); - - - const unsigned TESTS = 10; - - typedef itk::DanielssonDistanceMapImageFilter DanielssonType; - DanielssonType::Pointer daniel = DanielssonType::New(); - daniel->SetInput(thresh->GetOutput()); - daniel->SetUseImageSpacing(true); - for (unsigned repeats = 0; repeats < 2; repeats++) - { - DanielssonT.Start(); - daniel->Modified(); - daniel->Update(); - DanielssonT.Stop(); - } - writeIm(daniel->GetDistanceMap(), argv[7]); - - - std::cout << std::setprecision(3) << ParabolicCP.GetMean() << "\t" << ParabolicInt.GetMean() << "\t" - << MaurerT.GetMean() << "\t" << DanielssonT.GetMean() << std::endl; - - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/ParabolicMorphology/test/rleTests.cxx b/Modules/Filtering/ParabolicMorphology/test/rleTests.cxx deleted file mode 100644 index 472ece4f19e..00000000000 --- a/Modules/Filtering/ParabolicMorphology/test/rleTests.cxx +++ /dev/null @@ -1,135 +0,0 @@ -// testing ideas for rotation of rle direction - -#include -#include "itkCommand.h" -#include "itkSimpleFilterWatcher.h" -#include "itkChangeInformationImageFilter.h" -#include "ioutils.h" - -#include "itkTimeProbe.h" -#include "itkMultiThreader.h" - -#include -#include -#include "itkConstantBoundaryCondition.h" -#include "itkConnectedComponentAlgorithm.h" - -#include -#include - -template -void -genRLE(std::vector fgSet, std::vector bgSet, int axis) -{ - // fgSet must be sorted correctly - - typedef typename std::vector IndVecType; - typedef typename IndVecType::const_iterator ItType; - - IndVecType startpoints, endpoints; - - // fgSet contains surface points. We therefore may have either a - // series of consecutive points, or two some distance apart. The - // first situation occurs at a straight edge parallel to image - // axes. The second occurs across the inside of an object. - // Actually we can have both, because a run may start as an edge and - // then go inside the object. - - for (ItType it = fgSet.begin(); it != fgSet.end(); it++) - { - } -} - -template -void -doAllRLE(std::string input, std::string output) -{ - typedef typename itk::Image ImType; - typedef typename ImType::Pointer PImType; - typedef typename ImType::IndexType IndexType; - - // probably a long int - typedef typename ImType::OffsetValueType SingleIndexType; - - - PImType inIm = readIm(input); - - typedef typename std::vector IndexSetType; - - typedef typename std::set SISetType; - - // fgSet could be a vector because we definitely only insert once - // bgSet needs to be a set - IndexSetType fgSet; - IndexSetType bgSet; - - SISetType bgSISet; - - typedef typename itk::ImageRegionConstIterator itRegType; - typedef typename itk::ConstShapedNeighborhoodIterator itShapedType; - - itk::Size radius; - radius.Fill(1); - - itRegType itReg(inIm, inIm->GetLargestPossibleRegion()); - itShapedType itShaped(radius, inIm, inIm->GetLargestPossibleRegion()); - - // set up the neighborhood - setConnectivity(&itShaped, true); - // set up boundary condition - itk::ConstantBoundaryCondition lcbc; - lcbc.SetConstant(0); - itShaped.OverrideBoundaryCondition(&lcbc); - - for (itReg.GoToBegin(); !itReg.IsAtEnd(); ++itReg) - { - if (itReg.Get()) - { - // found an on pixel, so check the neighborhood. - IndexType here = itReg.GetIndex(); - itShaped += here - itShaped.GetIndex(); - // iterate over the neighborhood - bool surface = false; - for (typename itShapedType::ConstIterator nIt = itShaped.Begin(); nIt != itShaped.End(); nIt++) - { - if (!nIt.Get()) - { - // this is a surface pixel - surface = true; - IndexType N = here + nIt.GetNeighborhoodOffset(); - SingleIndexType I = inIm->ComputeOffset(N); - typename SISetType::const_iterator loc = bgSISet.find(I); - if (loc != bgSISet.end()) - { - bgSISet.insert(I); - bgSet.push_back(N); - } - } - } - if (surface) - { - fgSet.push_back(here); - } - } - } - - genRLE(fgSet, bgSet, 0); -} - - -int -main(int argc, char * argv[]) -{ - - - if (argc != 3) - { - std::cerr << "Usage: " << argv[0] << " inputim outputim " << std::endl; - return (EXIT_FAILURE); - } - - - doAllRLE(std::string(argv[1]), std::string(argv[2])); - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/ParabolicMorphology/test/testClose.cxx b/Modules/Filtering/ParabolicMorphology/test/testClose.cxx deleted file mode 100644 index 101f58e3ed8..00000000000 --- a/Modules/Filtering/ParabolicMorphology/test/testClose.cxx +++ /dev/null @@ -1,57 +0,0 @@ -#include -#include "itkImageFileReader.h" -#include "itkImageFileWriter.h" -#include "itkCommand.h" -#include "itkSimpleFilterWatcher.h" - -#include "itkParabolicCloseImageFilter.h" -#include "itkTimeProbe.h" -#include "itkMultiThreader.h" - - -int -main(int, char * argv[]) -{ - // itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; - - // typedef unsigned char PType; - typedef float PType; - typedef itk::Image IType; - - - typedef itk::ImageFileReader ReaderType; - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName(argv[1]); - - typedef itk::ParabolicCloseImageFilter FilterType; - - FilterType::Pointer filter = FilterType::New(); - - filter->SetInput(reader->GetOutput()); - filter->SetSafeBorder(true); - FilterType::RadiusType scale; - // scale[0]=1; - // scale[1]=0.5; - scale.Fill(atof(argv[3])); - filter->SetScale(scale); - // itk::SimpleFilterWatcher watcher(filter, "filter"); - itk::TimeProbe NewTime; - - for (unsigned i = 0; i < 1; i++) - { - filter->Modified(); - NewTime.Start(); - filter->Update(); - NewTime.Stop(); - } - - typedef itk::ImageFileWriter WriterType; - WriterType::Pointer writer = WriterType::New(); - writer->SetInput(filter->GetOutput()); - writer->SetFileName(argv[2]); - writer->Update(); - std::cout << std::setprecision(3) << NewTime.GetMean() << std::endl; - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/ParabolicMorphology/test/testCloseBinary.cxx b/Modules/Filtering/ParabolicMorphology/test/testCloseBinary.cxx deleted file mode 100644 index f911612e43b..00000000000 --- a/Modules/Filtering/ParabolicMorphology/test/testCloseBinary.cxx +++ /dev/null @@ -1,59 +0,0 @@ -#include -#include "itkCommand.h" -#include "itkSimpleFilterWatcher.h" -#include "ioutils.h" - -#include - -#include "itkBinaryCloseParaImageFilter.h" - -#include "itkTimeProbe.h" -#include "itkMultiThreader.h" - - -int -main(int argc, char * argv[]) -{ - - - if (argc != 5) - { - std::cerr << "Usage: " << argv[0] << " inputim radius outimpref thresh" << std::endl; - return (EXIT_FAILURE); - } - - - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; - - typedef unsigned char PType; - typedef itk::Image IType; - typedef itk::Image FType; - - - IType::Pointer input = readIm(argv[1]); - - typedef itk::BinaryThresholdImageFilter ThreshType; - ThreshType::Pointer thresh = ThreshType::New(); - thresh->SetInput(input); - thresh->SetInsideValue(0); - thresh->SetOutsideValue(1); - thresh->SetUpperThreshold(atoi(argv[4])); - - typedef itk::BinaryCloseParaImageFilter FilterType; - - FilterType::Pointer filter = FilterType::New(); - int testrad = atoi(argv[2]); - filter->SetInput(thresh->GetOutput()); - filter->SetUseImageSpacing(true); - filter->SetCircular(true); - filter->SetRadius(testrad); - - writeIm(filter->GetOutput(), std::string(argv[3]) + "_" + argv[2] + ".png"); - writeIm(thresh->GetOutput(), std::string(argv[3]) + "_thresh.png"); - - - filter->Print(std::cout, itk::Indent(0)); - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/ParabolicMorphology/test/testDT.cxx b/Modules/Filtering/ParabolicMorphology/test/testDT.cxx deleted file mode 100644 index 816c925e533..00000000000 --- a/Modules/Filtering/ParabolicMorphology/test/testDT.cxx +++ /dev/null @@ -1,59 +0,0 @@ -#include -#include "itkImageFileReader.h" -#include "itkImageFileWriter.h" -#include "itkCommand.h" -#include "itkSimpleFilterWatcher.h" - -#include "plotutils.h" -#include "ioutils.h" - -#include "itkBinaryThresholdImageFilter.h" -#include "itkMorphologicalDistanceTransformImageFilter.h" -#include "itkTimeProbe.h" -#include "itkMultiThreader.h" - - -int -main(int argc, char * argv[]) -{ - - int iterations = 1; - - if (argc != 6) - { - std::cerr << "Usage: " << argv[0] << " inputimage threshold outsideval outim1 outim2" << std::endl; - return (EXIT_FAILURE); - } - - iterations = atoi(argv[1]); - - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; - - typedef unsigned char PType; - typedef itk::Image IType; - typedef itk::Image FType; - - IType::Pointer input = readIm(argv[1]); - - // threshold the input to create a mask - typedef itk::BinaryThresholdImageFilter ThreshType; - ThreshType::Pointer thresh = ThreshType::New(); - thresh->SetInput(input); - - thresh->SetUpperThreshold(atoi(argv[2])); - thresh->SetInsideValue(0); - thresh->SetOutsideValue(255); - writeIm(thresh->GetOutput(), argv[4]); - // now to apply the distance transform - typedef itk::MorphologicalDistanceTransformImageFilter FilterType; - - FilterType::Pointer filter = FilterType::New(); - - filter->SetInput(thresh->GetOutput()); - filter->SetOutsideValue(atoi(argv[3])); - filter->Update(); - - writeIm(filter->GetOutput(), argv[5]); - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/ParabolicMorphology/test/testDilateBinary.cxx b/Modules/Filtering/ParabolicMorphology/test/testDilateBinary.cxx deleted file mode 100644 index 3b6152deb51..00000000000 --- a/Modules/Filtering/ParabolicMorphology/test/testDilateBinary.cxx +++ /dev/null @@ -1,81 +0,0 @@ -#include -#include "itkCommand.h" -#include "itkSimpleFilterWatcher.h" -#include "itkChangeInformationImageFilter.h" -#include "ioutils.h" -#include -#include -#include - -#include "itkBinaryDilateParaImageFilter.h" - -#include "itkTimeProbe.h" -#include "itkMultiThreader.h" - - -int -main(int argc, char * argv[]) -{ - - - if (argc != 3) - { - std::cerr << "Usage: " << argv[0] << " radius outimpref " << std::endl; - return (EXIT_FAILURE); - } - - - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; - - typedef unsigned char PType; - typedef itk::Image IType; - typedef itk::Image FType; - - // create an image to test the erosion shape: - - IType::Pointer image = IType::New(); - IType::SizeType size; - IType::RegionType region; - IType::IndexType ind; - size.Fill(256); - ind.Fill(256 / 2); - - region.SetSize(size); - image->SetRegions(region); - image->Allocate(); - image->FillBuffer(0); - image->SetPixel(ind, 1); - - - typedef itk::BinaryDilateParaImageFilter FilterType; - - FilterType::Pointer filter = FilterType::New(); - int testrad = atoi(argv[1]); - filter->SetInput(image); - filter->SetUseImageSpacing(false); - filter->SetRadius(testrad); - // filter->SetCircular(false); - - writeIm(filter->GetOutput(), std::string(argv[2]) + "_" + argv[1] + ".png"); - - // traditional erosion for comparison - typedef itk::BinaryBallStructuringElement SEType; - SEType SE; - SEType::RadiusType SErad; - SErad.Fill(testrad); - - SE.SetRadius(SErad); - SE.CreateStructuringElement(); - - typedef itk::BinaryDilateImageFilter OldBinDilateType; - OldBinDilateType::Pointer olddilate = OldBinDilateType::New(); - olddilate->SetInput(image); - olddilate->SetKernel(SE); - olddilate->SetDilateValue(1); - - writeIm(olddilate->GetOutput(), std::string(argv[2]) + "_" + argv[1] + "_old.png"); - - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/ParabolicMorphology/test/testDistTrans.cxx b/Modules/Filtering/ParabolicMorphology/test/testDistTrans.cxx deleted file mode 100644 index aa3df88ba52..00000000000 --- a/Modules/Filtering/ParabolicMorphology/test/testDistTrans.cxx +++ /dev/null @@ -1,67 +0,0 @@ -#include -#include "itkImageFileReader.h" -#include "itkImageFileWriter.h" -#include "itkChangeInformationImageFilter.h" -#include "itkCommand.h" -#include "itkSimpleFilterWatcher.h" - -#include "itkMorphologicalSignedDistanceTransformImageFilter.h" -// #include "itkMorphologicalDistanceTransformImageFilter.h" -#include "itkSignedMaurerDistanceMapImageFilter.h" -#include "itkSubtractImageFilter.h" - -#include "itkTimeProbe.h" -#include "itkMultiThreader.h" - -// sanity check of the image spacing option - -int -main(int argc, char * argv[]) -{ - // itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 3; - - typedef unsigned char PType; - typedef itk::Image IType; - - typedef itk::Image FType; - - typedef itk::ImageFileReader ReaderType; - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName(argv[1]); - reader->Update(); - - typedef itk::MorphologicalSignedDistanceTransformImageFilter FilterType; - - FilterType::Pointer filter = FilterType::New(); - - filter->SetInput(reader->GetOutput()); - filter->SetOutsideValue(atoi(argv[3])); - filter->SetUseImageSpacing(true); - - typedef itk::ImageFileWriter WriterType; - WriterType::Pointer writer = WriterType::New(); - writer->SetInput(filter->GetOutput()); - writer->SetFileName(argv[2]); - writer->Update(); - - typedef itk::SignedMaurerDistanceMapImageFilter MaurerType; - MaurerType::Pointer maurer = MaurerType::New(); - maurer->SetInput(reader->GetOutput()); - maurer->SetUseImageSpacing(true); - maurer->SetSquaredDistance(false); - - writer->SetInput(maurer->GetOutput()); - writer->SetFileName(argv[3]); - writer->Update(); - - typedef itk::SubtractImageFilter SubType; - SubType::Pointer sub = SubType::New(); - sub->SetInput(filter->GetOutput()); - sub->SetInput2(maurer->GetOutput()); - - writer->SetInput(sub->GetOutput()); - writer->SetFileName(argv[4]); - writer->Update(); - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/ParabolicMorphology/test/testErodeBinary.cxx b/Modules/Filtering/ParabolicMorphology/test/testErodeBinary.cxx deleted file mode 100644 index 5e92c887f4c..00000000000 --- a/Modules/Filtering/ParabolicMorphology/test/testErodeBinary.cxx +++ /dev/null @@ -1,81 +0,0 @@ -#include -#include "itkCommand.h" -#include "itkSimpleFilterWatcher.h" -#include "itkChangeInformationImageFilter.h" -#include "ioutils.h" -#include -#include -#include - -#include "itkBinaryErodeParaImageFilter.h" - -#include "itkTimeProbe.h" -#include "itkMultiThreader.h" - - -int -main(int argc, char * argv[]) -{ - - - if (argc != 3) - { - std::cerr << "Usage: " << argv[0] << " radius outimpref " << std::endl; - return (EXIT_FAILURE); - } - - - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; - - typedef unsigned char PType; - typedef itk::Image IType; - typedef itk::Image FType; - - // create an image to test the erosion shape: - - IType::Pointer image = IType::New(); - IType::SizeType size; - IType::RegionType region; - IType::IndexType ind; - size.Fill(256); - ind.Fill(256 / 2); - - region.SetSize(size); - image->SetRegions(region); - image->Allocate(); - image->FillBuffer(1); - image->SetPixel(ind, 0); - - - typedef itk::BinaryErodeParaImageFilter FilterType; - - FilterType::Pointer filter = FilterType::New(); - int testrad = atoi(argv[1]); - filter->SetInput(image); - filter->SetUseImageSpacing(false); - filter->SetRadius(testrad); - // filter->SetCircular(false); - - writeIm(filter->GetOutput(), std::string(argv[2]) + "_" + argv[1] + ".png"); - - // traditional erosion for comparison - typedef itk::BinaryBallStructuringElement SEType; - SEType SE; - SEType::RadiusType SErad; - SErad.Fill(testrad); - - SE.SetRadius(SErad); - SE.CreateStructuringElement(); - - typedef itk::BinaryErodeImageFilter OldBinErodeType; - OldBinErodeType::Pointer olderode = OldBinErodeType::New(); - olderode->SetInput(image); - olderode->SetKernel(SE); - olderode->SetErodeValue(1); - - writeIm(olderode->GetOutput(), std::string(argv[2]) + "_" + argv[1] + "_old.png"); - - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/ParabolicMorphology/test/testOpen.cxx b/Modules/Filtering/ParabolicMorphology/test/testOpen.cxx deleted file mode 100644 index 231cfb773af..00000000000 --- a/Modules/Filtering/ParabolicMorphology/test/testOpen.cxx +++ /dev/null @@ -1,66 +0,0 @@ -#include -#include "itkImageFileReader.h" -#include "itkImageFileWriter.h" -#include "itkCommand.h" -#include "itkSimpleFilterWatcher.h" - -#include "itkParabolicOpenImageFilter.h" -#include "itkTimeProbe.h" -#include "itkMultiThreader.h" - - -int -main(int argc, char * argv[]) -{ - // itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; - - typedef unsigned char PType; - typedef itk::Image IType; - - - typedef itk::ImageFileReader ReaderType; - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName(argv[1]); - - typedef itk::ParabolicOpenImageFilter FilterType; - - FilterType::Pointer filter = FilterType::New(); - - filter->SetInput(reader->GetOutput()); - filter->SetSafeBorder(true); - FilterType::RadiusType scale; - scale[0] = 1; - scale[1] = 0.5; - filter->SetScale(scale); - - filter->SetParabolicAlgorithm(FilterType::INTERSECTION); - - // itk::SimpleFilterWatcher watcher(filter, "filter"); - itk::TimeProbe NewTime; - - for (unsigned i = 0; i < 1; i++) - { - filter->Modified(); - NewTime.Start(); - filter->Update(); - NewTime.Stop(); - } - - typedef itk::ImageFileWriter WriterType; - WriterType::Pointer writer = WriterType::New(); - writer->SetInput(filter->GetOutput()); - writer->SetFileName(argv[2]); - writer->Update(); - std::cout << std::setprecision(3) << NewTime.GetMean() << std::endl; - - if (argc > 3) - { - // testing equivalence - filter->SetParabolicAlgorithm(FilterType::CONTACTPOINT); - writer->SetFileName(argv[3]); - writer->Update(); - } - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/ParabolicMorphology/test/testOpenBinary.cxx b/Modules/Filtering/ParabolicMorphology/test/testOpenBinary.cxx deleted file mode 100644 index 3ee1e3efd48..00000000000 --- a/Modules/Filtering/ParabolicMorphology/test/testOpenBinary.cxx +++ /dev/null @@ -1,59 +0,0 @@ -#include -#include "itkCommand.h" -#include "itkSimpleFilterWatcher.h" -#include "ioutils.h" - -#include - -#include "itkBinaryOpenParaImageFilter.h" - -#include "itkTimeProbe.h" -#include "itkMultiThreader.h" - - -int -main(int argc, char * argv[]) -{ - - - if (argc != 5) - { - std::cerr << "Usage: " << argv[0] << " inputim radius outimpref thresh" << std::endl; - return (EXIT_FAILURE); - } - - - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; - - typedef unsigned char PType; - typedef itk::Image IType; - typedef itk::Image FType; - - - IType::Pointer input = readIm(argv[1]); - - typedef itk::BinaryThresholdImageFilter ThreshType; - ThreshType::Pointer thresh = ThreshType::New(); - thresh->SetInput(input); - thresh->SetInsideValue(0); - thresh->SetOutsideValue(1); - thresh->SetUpperThreshold(atoi(argv[4])); - - typedef itk::BinaryOpenParaImageFilter FilterType; - - FilterType::Pointer filter = FilterType::New(); - int testrad = atoi(argv[2]); - filter->SetInput(thresh->GetOutput()); - filter->SetUseImageSpacing(true); - filter->SetCircular(true); - filter->SetRadius(testrad); - - writeIm(filter->GetOutput(), std::string(argv[3]) + "_" + argv[2] + ".png"); - writeIm(thresh->GetOutput(), std::string(argv[3]) + "_thresh.png"); - - - filter->Print(std::cout, itk::Indent(0)); - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/ParabolicMorphology/test/testSharpen.cxx b/Modules/Filtering/ParabolicMorphology/test/testSharpen.cxx deleted file mode 100644 index ef57fc226c9..00000000000 --- a/Modules/Filtering/ParabolicMorphology/test/testSharpen.cxx +++ /dev/null @@ -1,123 +0,0 @@ -#include -#include "itkImageFileReader.h" -#include "itkImageFileWriter.h" -#include "itkCommand.h" -#include "itkSimpleFilterWatcher.h" - -#include "plotutils.h" - -#include "itkGrayscaleDilateImageFilter.h" -#include "itkBinaryBallStructuringElement.h" - - -#include "itkSmoothingRecursiveGaussianImageFilter.h" -#include "itkBinaryThresholdImageFilter.h" -#include "itkMorphologicalSharpeningImageFilter.h" -#include "itkTimeProbe.h" -#include "itkMultiThreader.h" - - -int -main(int argc, char * argv[]) -{ - - int iterations = 1; - - if (argc != 4) - { - std::cerr << "Usage: " << argv[0] << " iterations outputimage outputprofile" << std::endl; - return (EXIT_FAILURE); - } - - iterations = atoi(argv[1]); - - // itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; - - typedef unsigned char PType; - typedef itk::Image IType; - typedef itk::Image FType; - - typedef itk::ImageFileWriter WriterType; - WriterType::Pointer writer = WriterType::New(); - - // create the input image - we will blur a dot, threshold then blur again - IType::Pointer input = IType::New(); - IType::SizeType size; - IType::IndexType index; - IType::RegionType region; - IType::SpacingType spacing; - - size.Fill(100); - spacing.Fill(1); - region.SetSize(size); - - index.Fill(50); - - input->SetRegions(region); - input->SetSpacing(spacing); - input->Allocate(); - - input->FillBuffer(0); - input->SetPixel(index, 255); - - typedef itk::BinaryBallStructuringElement SRType; - typedef itk::GrayscaleDilateImageFilter DilateType; - DilateType::Pointer smallDilate = DilateType::New(); - SRType smallkernel; - SRType::RadiusType smallrad = smallkernel.GetRadius(); - smallrad.Fill(7); - smallkernel.SetRadius(smallrad); - smallkernel.CreateStructuringElement(); - smallDilate->SetKernel(smallkernel); - - typedef itk::SmoothingRecursiveGaussianImageFilter SmootherType; - - SmootherType::Pointer smoother = SmootherType::New(); - - smallDilate->SetInput(input); - - smoother->SetInput(smallDilate->GetOutput()); - smoother->SetSigma(3); - - writer->SetInput(smallDilate->GetOutput()); - writer->SetFileName("input.tif"); - writer->Update(); - - writer->SetInput(smoother->GetOutput()); - writer->SetFileName("blurrredinput.tif"); - writer->Update(); - - - // now to apply the sharpening - - typedef itk::MorphologicalSharpeningImageFilter FilterType; - - FilterType::Pointer filter = FilterType::New(); - - filter->SetInput(smoother->GetOutput()); - filter->SetScale(1); - filter->SetIterations(iterations); - filter->Update(); - - typedef itk::ImageFileWriter FlWriterType; - FlWriterType::Pointer flwriter = FlWriterType::New(); - - flwriter->SetInput(filter->GetOutput()); - flwriter->SetFileName(argv[2]); - flwriter->Update(); - - // write out profiles - // input - IType::IndexType first, last; - first[0] = 50; - first[1] = 0; - last[0] = 50; - last[1] = 99; - - extractProfile(smallDilate->GetOutput(), first, last, "inputprof.txt"); - extractProfile(smoother->GetOutput(), first, last, "blurredprof.txt"); - extractProfile(filter->GetOutput(), first, last, argv[3]); - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/ParabolicMorphology/test/testSpacing.cxx b/Modules/Filtering/ParabolicMorphology/test/testSpacing.cxx deleted file mode 100644 index cfd3594953b..00000000000 --- a/Modules/Filtering/ParabolicMorphology/test/testSpacing.cxx +++ /dev/null @@ -1,71 +0,0 @@ -#include -#include "itkImageFileReader.h" -#include "itkImageFileWriter.h" -#include "itkChangeInformationImageFilter.h" -#include "itkCommand.h" -#include "itkSimpleFilterWatcher.h" - -#include "itkParabolicOpenImageFilter.h" -#include "itkTimeProbe.h" -#include "itkMultiThreader.h" - -// sanity check of the image spacing option - -int -main(int, char * argv[]) -{ - // itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; - - typedef unsigned char PType; - typedef itk::Image IType; - - - typedef itk::ImageFileReader ReaderType; - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName(argv[1]); - - typedef itk::ParabolicOpenImageFilter FilterType; - - FilterType::Pointer filter = FilterType::New(); - - filter->SetInput(reader->GetOutput()); - filter->SetSafeBorder(true); - FilterType::RadiusType scale; - scale[0] = 1; - scale[1] = 0.5; - - filter->SetScale(scale); - filter->SetUseImageSpacing(false); - filter->Update(); - - typedef itk::ImageFileWriter WriterType; - WriterType::Pointer writer = WriterType::New(); - writer->SetInput(filter->GetOutput()); - writer->SetFileName(argv[2]); - writer->Update(); - - // now we'll change the image spacing and see if we can reproduce - // the result - typedef itk::ChangeInformationImageFilter ChangeType; - ChangeType::Pointer changer = ChangeType::New(); - changer->SetInput(reader->GetOutput()); - ChangeType::SpacingType newspacing; - - newspacing[0] = 1 / sqrt((float)1); - newspacing[1] = 1 / sqrt((float)0.5); - - - changer->SetOutputSpacing(newspacing); - changer->ChangeSpacingOn(); - // set scales to deliver the same result - scale[0] = 1; - scale[1] = 1; - filter->SetInput(changer->GetOutput()); - filter->SetScale(scale); - filter->SetUseImageSpacing(true); - filter->Update(); - writer->SetFileName(argv[3]); - writer->Update(); - return EXIT_SUCCESS; -} From 3cd6abd243b8b5bd161fd21847bffe2003c84a49 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Mon, 18 May 2015 21:17:39 +1000 Subject: [PATCH 111/165] ENH: KW and uncrust --- .../ParabolicMorphology/test/check.cxx | 56 ------------------- .../test/dilateBinary3D.cxx | 56 ------------------- .../test/erodeBinary2D.cxx | 56 ------------------- 3 files changed, 168 deletions(-) delete mode 100644 Modules/Filtering/ParabolicMorphology/test/check.cxx delete mode 100644 Modules/Filtering/ParabolicMorphology/test/dilateBinary3D.cxx delete mode 100644 Modules/Filtering/ParabolicMorphology/test/erodeBinary2D.cxx diff --git a/Modules/Filtering/ParabolicMorphology/test/check.cxx b/Modules/Filtering/ParabolicMorphology/test/check.cxx deleted file mode 100644 index f84b60fc7ae..00000000000 --- a/Modules/Filtering/ParabolicMorphology/test/check.cxx +++ /dev/null @@ -1,56 +0,0 @@ -#include -#include "itkImageFileReader.h" -#include "itkImageFileWriter.h" -#include "itkCommand.h" -#include "itkSimpleFilterWatcher.h" - -#include "itkParabolicDilateImageFilter.h" -#include "itkParabolicErodeImageFilter.h" -#include "itkTimeProbe.h" -#include "itkMultiThreader.h" - - -int -main(int, char * argv[]) -{ - // itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; - - typedef unsigned char PType; - typedef itk::Image IType; - - typedef itk::ImageFileReader ReaderType; - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName(argv[1]); - - typedef itk::ParabolicErodeImageFilter FilterType; - - FilterType::Pointer filter = FilterType::New(); - - filter->SetInput(reader->GetOutput()); - - FilterType::RadiusType scale; - scale[0] = 1; - scale[1] = 0.5; - - // filter->SetParabolicAlgorithm(FilterType::CONTACTPOINT); - filter->SetScale(scale); - itk::TimeProbe NewTime; - filter->SetUseImageSpacing(true); - for (unsigned i = 0; i < 100; i++) - { - filter->Modified(); - NewTime.Start(); - filter->Update(); - NewTime.Stop(); - } - - typedef itk::ImageFileWriter WriterType; - WriterType::Pointer writer = WriterType::New(); - writer->SetInput(filter->GetOutput()); - writer->SetFileName(argv[2]); - writer->Update(); - std::cout << std::setprecision(3) << NewTime.GetMean() << std::endl; - - return 0; -} diff --git a/Modules/Filtering/ParabolicMorphology/test/dilateBinary3D.cxx b/Modules/Filtering/ParabolicMorphology/test/dilateBinary3D.cxx deleted file mode 100644 index 5ad5365c7d7..00000000000 --- a/Modules/Filtering/ParabolicMorphology/test/dilateBinary3D.cxx +++ /dev/null @@ -1,56 +0,0 @@ -#include -#include "itkCommand.h" -#include "itkSimpleFilterWatcher.h" -#include "itkChangeInformationImageFilter.h" -#include "ioutils.h" -#include -#include "itkBinaryDilateParaImageFilter.h" - -#include "itkTimeProbe.h" -#include "itkMultiThreader.h" - - -int -main(int argc, char * argv[]) -{ - - - if (argc != 6) - { - std::cerr << "Usage: " << argv[0] << " inputimage threshold size outim outim2" << std::endl; - return (EXIT_FAILURE); - } - - - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 3; - - typedef unsigned char PType; - typedef itk::Image IType; - typedef itk::Image FType; - - IType::Pointer inputOrig = readIm(argv[1]); - - - // threshold the input to create a mask - typedef itk::BinaryThresholdImageFilter ThreshType; - ThreshType::Pointer thresh = ThreshType::New(); - thresh->SetInput(inputOrig); - - thresh->SetUpperThreshold(atoi(argv[2])); - thresh->SetInsideValue(0); - thresh->SetOutsideValue(1); - writeIm(thresh->GetOutput(), argv[5]); - // now to apply the erosion - typedef itk::BinaryDilateParaImageFilter FilterType; - - FilterType::Pointer filter = FilterType::New(); - - filter->SetInput(thresh->GetOutput()); - filter->SetUseImageSpacing(true); - filter->SetRadius(atof(argv[3])); - - writeIm(filter->GetOutput(), argv[4]); - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/ParabolicMorphology/test/erodeBinary2D.cxx b/Modules/Filtering/ParabolicMorphology/test/erodeBinary2D.cxx deleted file mode 100644 index 6992e7de1f9..00000000000 --- a/Modules/Filtering/ParabolicMorphology/test/erodeBinary2D.cxx +++ /dev/null @@ -1,56 +0,0 @@ -#include -#include "itkCommand.h" -#include "itkSimpleFilterWatcher.h" -#include "itkChangeInformationImageFilter.h" -#include "ioutils.h" -#include -#include "itkBinaryErodeParaImageFilter.h" - -#include "itkTimeProbe.h" -#include "itkMultiThreader.h" - - -int -main(int argc, char * argv[]) -{ - - - if (argc != 5) - { - std::cerr << "Usage: " << argv[0] << " inputimage threshold outim outim2" << std::endl; - return (EXIT_FAILURE); - } - - - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; - - typedef unsigned char PType; - typedef itk::Image IType; - typedef itk::Image FType; - - IType::Pointer inputOrig = readIm(argv[1]); - - - // threshold the input to create a mask - typedef itk::BinaryThresholdImageFilter ThreshType; - ThreshType::Pointer thresh = ThreshType::New(); - thresh->SetInput(inputOrig); - - thresh->SetUpperThreshold(atoi(argv[2])); - thresh->SetInsideValue(0); - thresh->SetOutsideValue(1); - writeIm(thresh->GetOutput(), argv[4]); - // now to apply the erosion - typedef itk::BinaryErodeParaImageFilter FilterType; - - FilterType::Pointer filter = FilterType::New(); - - filter->SetInput(thresh->GetOutput()); - filter->SetUseImageSpacing(false); - filter->SetRadius(11); - - writeIm(filter->GetOutput(), argv[3]); - - return EXIT_SUCCESS; -} From 97a17f443ede7037d8ea33d76f0f76b248b1b84e Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Mon, 18 May 2015 21:18:32 +1000 Subject: [PATCH 112/165] DOC: license --- .../test/itkBinaryCloseParaTest.cxx | 17 +++++++++++++++++ .../test/itkBinaryDilateParaTest.cxx | 17 +++++++++++++++++ .../test/itkBinaryErodeParaTest.cxx | 17 +++++++++++++++++ .../test/itkBinaryOpenParaTest.cxx | 17 +++++++++++++++++ .../ParabolicMorphology/test/itkParaDTTest.cxx | 17 +++++++++++++++++ .../test/itkParaDilateTest.cxx | 17 +++++++++++++++++ .../test/itkParaErodeTest.cxx | 17 +++++++++++++++++ .../test/itkParaOpenTest.cxx | 17 +++++++++++++++++ .../test/itkParaSharpenTest.cxx | 17 +++++++++++++++++ .../test/itkParaSpacingTest.cxx | 17 +++++++++++++++++ 10 files changed, 170 insertions(+) diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx index 17851202d31..3c6df249bfa 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.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/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx index 13d73ebfafc..2a122e511ae 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.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/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx index 0f851d6bd2a..e02ac0e36fa 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.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/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx index 9e5dea01183..094a6ca1b0e 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.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/ParabolicMorphology/test/itkParaDTTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx index 0af1aeb3343..54b57108563 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.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/ParabolicMorphology/test/itkParaDilateTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx index 1c2aec239ad..078d4617828 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.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/ParabolicMorphology/test/itkParaErodeTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx index d7c9105e853..85dbdcffdc5 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.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/ParabolicMorphology/test/itkParaOpenTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx index 0a84ed14909..f3a74929f06 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.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/ParabolicMorphology/test/itkParaSharpenTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx index 99f9f1fc5cf..fb882bb816a 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.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/ParabolicMorphology/test/itkParaSpacingTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx index a10405e2f04..e97353b8dda 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.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 82a18e3ee8d3d291ce17e359ccb71990acbfcf69 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Mon, 18 May 2015 21:20:29 +1000 Subject: [PATCH 113/165] ENH: missed one --- .../include/itkParabolicErodeDilateImageFilter.h | 3 ++- .../include/itkParabolicErodeDilateImageFilter.hxx | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index 75497d103a9..ac5eca32000 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h @@ -200,7 +200,8 @@ class ITK_EXPORT ParabolicErodeDilateImageFilter : public ImageToImageFilter Date: Mon, 29 Jun 2015 10:11:20 -0400 Subject: [PATCH 114/165] COMP: Escape @article in doxygen comments. The BibTeX entry is interpreted as an unknown Doxygen command and generates: for ITK/Modules/Remote/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h:37: warning: Found unknown command `\article' --- .../include/itkMorphologicalSharpeningImageFilter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h index 6fde586d8ae..2aedbffa1af 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h @@ -37,7 +37,7 @@ namespace itk * made to minimize memory consumption. * * - * @article{Schavemaker2000, + * \@article{Schavemaker2000, * author = {Schavemaker, J. and Reinders, M. and Gerbrands, J. and Backer, E. }, * title = {Image sharpening by morphological filtering}, From 4c65d981ba13863033b408a201a76378a083e77b Mon Sep 17 00:00:00 2001 From: Zach Williamson Date: Thu, 30 Jun 2016 11:08:27 -0500 Subject: [PATCH 115/165] STYLE: Use Macro for Function Deletion --- .../include/itkBinaryCloseParaImageFilter.h | 4 +--- .../include/itkBinaryDilateParaImageFilter.h | 4 +--- .../include/itkBinaryErodeParaImageFilter.h | 4 +--- .../include/itkBinaryOpenParaImageFilter.h | 4 +--- .../include/itkGreaterEqualValImageFilter.h | 4 +--- .../include/itkMorphSDTHelperImageFilter.h | 4 +--- .../include/itkMorphologicalDistanceTransformImageFilter.h | 6 +----- .../include/itkMorphologicalSharpeningImageFilter.h | 4 +--- .../itkMorphologicalSignedDistanceTransformImageFilter.h | 6 +----- .../include/itkParabolicCloseImageFilter.h | 4 +--- .../include/itkParabolicDilateImageFilter.h | 4 +--- .../include/itkParabolicErodeDilateImageFilter.h | 4 +--- .../include/itkParabolicErodeImageFilter.h | 4 +--- .../include/itkParabolicOpenCloseImageFilter.h | 4 +--- .../include/itkParabolicOpenCloseSafeBorderImageFilter.h | 6 +----- .../include/itkParabolicOpenImageFilter.h | 4 +--- .../ParabolicMorphology/include/itkSharpenOpImageFilter.h | 4 +--- 17 files changed, 17 insertions(+), 57 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h index a0b0bc6ced4..a3f755d820f 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h @@ -159,9 +159,7 @@ class ITK_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter RCastTypeB; private: - BinaryCloseParaImageFilter(const Self &); // purposely not implemented - void - operator=(const Self &); // purposely not implemented + ITK_DISALLOW_COPY_AND_ASSIGN(BinaryCloseParaImageFilter); RadiusType m_Radius; bool m_Circular; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h index 2b7d7e1d18e..e8feec32a1f 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h @@ -145,9 +145,7 @@ class ITK_EXPORT BinaryDilateParaImageFilter : public ImageToImageFilter RCastType; private: - BinaryDilateParaImageFilter(const Self &); // purposely not implemented - void - operator=(const Self &); // purposely not implemented + ITK_DISALLOW_COPY_AND_ASSIGN(BinaryDilateParaImageFilter); RadiusType m_Radius; bool m_Circular; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h index ce2652244e1..de94c74697b 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h @@ -146,9 +146,7 @@ class ITK_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilter RCastType; private: - BinaryErodeParaImageFilter(const Self &); // purposely not implemented - void - operator=(const Self &); // purposely not implemented + ITK_DISALLOW_COPY_AND_ASSIGN(BinaryErodeParaImageFilter); RadiusType m_Radius; bool m_Circular; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h index 67a90d2ff46..844bc722ae6 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h @@ -159,9 +159,7 @@ class ITK_EXPORT BinaryOpenParaImageFilter : public ImageToImageFilter RCastTypeB; private: - BinaryOpenParaImageFilter(const Self &); // purposely not implemented - void - operator=(const Self &); // purposely not implemented + ITK_DISALLOW_COPY_AND_ASSIGN(BinaryOpenParaImageFilter); RadiusType m_Radius; bool m_Circular; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h index 170547e9fc3..820fcc904bd 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h @@ -102,9 +102,7 @@ class ITK_EXPORT GreaterEqualValImageFilter virtual ~GreaterEqualValImageFilter() {} private: - GreaterEqualValImageFilter(const Self &); // purposely not implemented - void - operator=(const Self &); // purposely not implemented + ITK_DISALLOW_COPY_AND_ASSIGN(GreaterEqualValImageFilter); }; } // end namespace itk diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h index 5ac4d2a6b6d..52f2e37ad7a 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h @@ -136,9 +136,7 @@ class ITK_EXPORT MorphSDTHelperImageFilter virtual ~MorphSDTHelperImageFilter() {} private: - MorphSDTHelperImageFilter(const Self &); // purposely not implemented - void - operator=(const Self &); // purposely not implemented + ITK_DISALLOW_COPY_AND_ASSIGN(MorphSDTHelperImageFilter); }; } // end namespace itk diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h index 2f6f9d947e5..fdc9ad245fd 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h @@ -142,11 +142,7 @@ class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImage typedef typename itk::SqrtImageFilter SqrtType; private: - MorphologicalDistanceTransformImageFilter(const Self &); // purposely not - // implemented - void - operator=(const Self &); // purposely not - // implemented + ITK_DISALLOW_COPY_AND_ASSIGN(MorphologicalDistanceTransformImageFilter); InputPixelType m_OutsideValue; typename ErodeType::Pointer m_Erode; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h index 2aedbffa1af..5b354b25b54 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h @@ -165,9 +165,7 @@ class ITK_EXPORT MorphologicalSharpeningImageFilter : public ImageToImageFilter< SharpenOpType; private: - MorphologicalSharpeningImageFilter(const Self &); // purposely not implemented - void - operator=(const Self &); // purposely not implemented + ITK_DISALLOW_COPY_AND_ASSIGN(MorphologicalSharpeningImageFilter); int m_Iterations; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h index 74e61293a40..cdf0544ae54 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h @@ -188,11 +188,7 @@ class ITK_EXPORT MorphologicalSignedDistanceTransformImageFilter : public ImageT typedef typename itk::MorphSDTHelperImageFilter HelperType; private: - MorphologicalSignedDistanceTransformImageFilter(const Self &); // purposely not - // implemented - void - operator=(const Self &); // purposely not - // implemented + ITK_DISALLOW_COPY_AND_ASSIGN(MorphologicalSignedDistanceTransformImageFilter); InputPixelType m_OutsideValue; bool m_InsideIsPositive; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h index 987dd7466be..ffc8e63e42e 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h @@ -88,9 +88,7 @@ class ITK_EXPORT ParabolicCloseImageFilter virtual ~ParabolicCloseImageFilter() {} // void PrintSelf(std::ostream& os, Indent indent) const; private: - ParabolicCloseImageFilter(const Self &); // purposely not implemented - void - operator=(const Self &); // purposely not implemented + ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicCloseImageFilter); }; } // end namespace itk diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h index b4dc95fcf78..6034a3b0bea 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h @@ -84,9 +84,7 @@ class ITK_EXPORT ParabolicDilateImageFilter : public ParabolicErodeDilateImageFi virtual ~ParabolicDilateImageFilter() {} // void PrintSelf(std::ostream& os, Indent indent) const; private: - ParabolicDilateImageFilter(const Self &); // purposely not implemented - void - operator=(const Self &); // purposely not implemented + ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicDilateImageFilter); }; } // end namespace itk diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index ac5eca32000..d0a995eaab1 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h @@ -196,9 +196,7 @@ class ITK_EXPORT ParabolicErodeDilateImageFilter : public ImageToImageFilter Date: Fri, 15 Dec 2017 07:15:10 -0600 Subject: [PATCH 116/165] COMP: Remove override warnings Overrides a member function but is not marked 'override' [-Winconsistent-missing-override] --- .../include/itkBinaryCloseParaImageFilter.h | 4 ++-- .../include/itkBinaryDilateParaImageFilter.h | 6 +++--- .../include/itkBinaryErodeParaImageFilter.h | 6 +++--- .../include/itkBinaryOpenParaImageFilter.h | 4 ++-- .../itkMorphologicalDistanceTransformImageFilter.h | 6 +++--- .../include/itkMorphologicalSharpeningImageFilter.h | 4 ++-- .../include/itkParabolicErodeDilateImageFilter.h | 12 ++++++------ .../include/itkParabolicOpenCloseImageFilter.h | 12 ++++++------ .../itkParabolicOpenCloseSafeBorderImageFilter.h | 6 +++--- 9 files changed, 30 insertions(+), 30 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h index a3f755d820f..763d4415390 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h @@ -138,12 +138,12 @@ class ITK_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter InternalRealImageType; typedef typename itk::Image InternalIntImageType; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h index e8feec32a1f..744c0c13d39 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h @@ -109,7 +109,7 @@ class ITK_EXPORT BinaryDilateParaImageFilter : public ImageToImageFilter InternalRealImageType; typedef typename itk::Image InternalIntImageType; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h index de94c74697b..7f90c2bbcf9 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h @@ -127,16 +127,16 @@ class ITK_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilter InternalRealImageType; typedef typename itk::Image InternalIntImageType; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h index 844bc722ae6..3f497addbf4 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h @@ -138,12 +138,12 @@ class ITK_EXPORT BinaryOpenParaImageFilter : public ImageToImageFilter InternalRealImageType; typedef typename itk::Image InternalIntImageType; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h index fdc9ad245fd..f35bf4d55ef 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h @@ -91,7 +91,7 @@ class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImage /** a type to represent the "kernel radius" */ typedef typename itk::FixedArray RadiusType; virtual void - Modified() const; + Modified() const ITK_OVERRIDE; /** this describes the input mask - default value 0 - we compute the distance from all voxels with value not equal to "OutsideValue" to @@ -130,11 +130,11 @@ class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImage MorphologicalDistanceTransformImageFilter(); virtual ~MorphologicalDistanceTransformImageFilter() {} void - PrintSelf(std::ostream & os, Indent indent) const; + PrintSelf(std::ostream & os, Indent indent) const ITK_OVERRIDE; /** Generate Data */ void - GenerateData(void); + GenerateData(void) ITK_OVERRIDE; // do everything in the output image type, which should have high precision typedef typename itk::BinaryThresholdImageFilter ThreshType; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h index 5b354b25b54..134e3f4d98c 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h @@ -150,11 +150,11 @@ class ITK_EXPORT MorphologicalSharpeningImageFilter : public ImageToImageFilter< MorphologicalSharpeningImageFilter(); virtual ~MorphologicalSharpeningImageFilter() {} void - PrintSelf(std::ostream & os, Indent indent) const; + PrintSelf(std::ostream & os, Indent indent) const ITK_OVERRIDE; /** Generate Data */ void - GenerateData(void); + GenerateData(void) ITK_OVERRIDE; // do everything in the output image type, which should have high precision typedef typename itk::ParabolicErodeImageFilter ErodeType; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index d0a995eaab1..2e4816b8635 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h @@ -173,24 +173,24 @@ class ITK_EXPORT ParabolicErodeDilateImageFilter : public ImageToImageFilter MorphFilterType; typedef ConstantPadImageFilter PadFilterType; From 965b2e8967724db41931443c39bfa354fd4202b2 Mon Sep 17 00:00:00 2001 From: Richard Beare Date: Tue, 9 Jan 2018 12:01:42 +1100 Subject: [PATCH 117/165] ENH: change spacing back to original --- .../ParabolicMorphology/test/itkParaSpacingTest.cxx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx index e97353b8dda..e06134ac876 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx @@ -91,8 +91,9 @@ itkParaSpacingTest(int, char * argv[]) typedef itk::ChangeInformationImageFilter ChangeType; ChangeType::Pointer changer = ChangeType::New(); changer->SetInput(reader->GetOutput()); - ChangeType::SpacingType newspacing; + ChangeType::SpacingType oldspacing, newspacing; + oldspacing = filter->GetOutput()->GetSpacing(); newspacing[0] = 1 / sqrt((float)1); newspacing[1] = 1 / sqrt((float)0.5); @@ -104,15 +105,22 @@ itkParaSpacingTest(int, char * argv[]) filter->SetInput(changer->GetOutput()); filter->SetScale(scale); filter->SetUseImageSpacing(true); + // change the spacing back to original to allow comparison + ChangeType::Pointer changerback = ChangeType::New(); + changerback->SetInput(filter->GetOutput()); + changerback->SetOutputSpacing(oldspacing); + changerback->ChangeSpacingOn(); + try { - filter->Update(); + changerback->Update(); } catch (itk::ExceptionObject & excp) { std::cerr << excp << std::endl; return EXIT_FAILURE; } + writer->SetInput(changerback->GetOutput()); writer->SetFileName(argv[3]); try { From 5b15675dad9102854bbc76e424066dc27398c725 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Sat, 16 Dec 2017 19:17:09 -0600 Subject: [PATCH 118/165] 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. --- .../include/itkBinaryCloseParaImageFilter.h | 2 +- .../include/itkBinaryDilateParaImageFilter.h | 4 ++-- .../include/itkBinaryErodeParaImageFilter.h | 4 ++-- .../include/itkBinaryOpenParaImageFilter.h | 2 +- .../include/itkGreaterEqualValImageFilter.h | 2 +- .../include/itkMorphologicalDistanceTransformImageFilter.h | 4 ++-- .../include/itkMorphologicalSharpeningImageFilter.h | 2 +- .../include/itkParabolicDilateImageFilter.h | 2 +- .../include/itkParabolicErodeDilateImageFilter.h | 2 +- .../include/itkParabolicErodeImageFilter.h | 2 +- .../include/itkParabolicOpenCloseImageFilter.h | 4 ++-- .../include/itkParabolicOpenCloseSafeBorderImageFilter.h | 4 ++-- .../ParabolicMorphology/include/itkParabolicOpenImageFilter.h | 2 +- .../ParabolicMorphology/include/itkSharpenOpImageFilter.h | 2 +- 14 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h index 763d4415390..6e9a5a39041 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h @@ -141,7 +141,7 @@ class ITK_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter RadiusType; - virtual void + void Modified() const ITK_OVERRIDE; /** this describes the input mask - default value 0 - we compute the @@ -128,7 +128,7 @@ class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImage #endif protected: MorphologicalDistanceTransformImageFilter(); - virtual ~MorphologicalDistanceTransformImageFilter() {} + ~MorphologicalDistanceTransformImageFilter() ITK_OVERRIDE {} void PrintSelf(std::ostream & os, Indent indent) const ITK_OVERRIDE; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h index 134e3f4d98c..1d60c17a6e1 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h @@ -148,7 +148,7 @@ class ITK_EXPORT MorphologicalSharpeningImageFilter : public ImageToImageFilter< #endif protected: MorphologicalSharpeningImageFilter(); - virtual ~MorphologicalSharpeningImageFilter() {} + ~MorphologicalSharpeningImageFilter() ITK_OVERRIDE {} void PrintSelf(std::ostream & os, Indent indent) const ITK_OVERRIDE; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h index 6034a3b0bea..051fc3b9fda 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h @@ -81,7 +81,7 @@ class ITK_EXPORT ParabolicDilateImageFilter : public ParabolicErodeDilateImageFi protected: ParabolicDilateImageFilter() {} - virtual ~ParabolicDilateImageFilter() {} + ~ParabolicDilateImageFilter() ITK_OVERRIDE {} // void PrintSelf(std::ostream& os, Indent indent) const; private: ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicDilateImageFilter); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index 2e4816b8635..281d46cbc21 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h @@ -171,7 +171,7 @@ class ITK_EXPORT ParabolicErodeDilateImageFilter : public ImageToImageFilter Date: Sat, 16 Dec 2017 19:36:26 -0600 Subject: [PATCH 119/165] 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/itkBinaryCloseParaImageFilter.h | 6 +++--- .../include/itkBinaryDilateParaImageFilter.h | 8 ++++---- .../include/itkBinaryErodeParaImageFilter.h | 8 ++++---- .../include/itkBinaryOpenParaImageFilter.h | 6 +++--- .../include/itkGreaterEqualValImageFilter.h | 2 +- .../itkMorphologicalDistanceTransformImageFilter.h | 8 ++++---- .../itkMorphologicalSharpeningImageFilter.h | 6 +++--- .../include/itkParabolicDilateImageFilter.h | 2 +- .../include/itkParabolicErodeDilateImageFilter.h | 14 +++++++------- .../include/itkParabolicErodeImageFilter.h | 2 +- .../include/itkParabolicOpenCloseImageFilter.h | 14 +++++++------- .../itkParabolicOpenCloseSafeBorderImageFilter.h | 8 ++++---- .../include/itkParabolicOpenImageFilter.h | 2 +- .../include/itkSharpenOpImageFilter.h | 2 +- 14 files changed, 44 insertions(+), 44 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h index 6e9a5a39041..f6adc9a31ff 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h @@ -138,12 +138,12 @@ class ITK_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter InternalRealImageType; typedef typename itk::Image InternalIntImageType; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h index 91f0cbbd4d6..4d6fec10bad 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h @@ -109,7 +109,7 @@ class ITK_EXPORT BinaryDilateParaImageFilter : public ImageToImageFilter InternalRealImageType; typedef typename itk::Image InternalIntImageType; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h index a4eed4d0691..b21674d4b92 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h @@ -127,16 +127,16 @@ class ITK_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilter InternalRealImageType; typedef typename itk::Image InternalIntImageType; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h index e9599cefb66..c2b5df4876c 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h @@ -138,12 +138,12 @@ class ITK_EXPORT BinaryOpenParaImageFilter : public ImageToImageFilter InternalRealImageType; typedef typename itk::Image InternalIntImageType; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h index 2dc17a2a9a3..2c453748431 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h @@ -99,7 +99,7 @@ class ITK_EXPORT GreaterEqualValImageFilter #endif protected: GreaterEqualValImageFilter() {} - ~GreaterEqualValImageFilter() ITK_OVERRIDE {} + ~GreaterEqualValImageFilter() override {} private: ITK_DISALLOW_COPY_AND_ASSIGN(GreaterEqualValImageFilter); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h index f56d8cd3a48..ba80e912f32 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h @@ -91,7 +91,7 @@ class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImage /** a type to represent the "kernel radius" */ typedef typename itk::FixedArray RadiusType; void - Modified() const ITK_OVERRIDE; + Modified() const override; /** this describes the input mask - default value 0 - we compute the distance from all voxels with value not equal to "OutsideValue" to @@ -128,13 +128,13 @@ class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImage #endif protected: MorphologicalDistanceTransformImageFilter(); - ~MorphologicalDistanceTransformImageFilter() ITK_OVERRIDE {} + ~MorphologicalDistanceTransformImageFilter() override {} void - PrintSelf(std::ostream & os, Indent indent) const ITK_OVERRIDE; + PrintSelf(std::ostream & os, Indent indent) const override; /** Generate Data */ void - GenerateData(void) ITK_OVERRIDE; + GenerateData(void) override; // do everything in the output image type, which should have high precision typedef typename itk::BinaryThresholdImageFilter ThreshType; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h index 1d60c17a6e1..704e6a46997 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h @@ -148,13 +148,13 @@ class ITK_EXPORT MorphologicalSharpeningImageFilter : public ImageToImageFilter< #endif protected: MorphologicalSharpeningImageFilter(); - ~MorphologicalSharpeningImageFilter() ITK_OVERRIDE {} + ~MorphologicalSharpeningImageFilter() override {} void - PrintSelf(std::ostream & os, Indent indent) const ITK_OVERRIDE; + PrintSelf(std::ostream & os, Indent indent) const override; /** Generate Data */ void - GenerateData(void) ITK_OVERRIDE; + GenerateData(void) override; // do everything in the output image type, which should have high precision typedef typename itk::ParabolicErodeImageFilter ErodeType; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h index 051fc3b9fda..0a79b189d77 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h @@ -81,7 +81,7 @@ class ITK_EXPORT ParabolicDilateImageFilter : public ParabolicErodeDilateImageFi protected: ParabolicDilateImageFilter() {} - ~ParabolicDilateImageFilter() ITK_OVERRIDE {} + ~ParabolicDilateImageFilter() override {} // void PrintSelf(std::ostream& os, Indent indent) const; private: ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicDilateImageFilter); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index 281d46cbc21..779726c15d6 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h @@ -171,26 +171,26 @@ class ITK_EXPORT ParabolicErodeDilateImageFilter : public ImageToImageFilter MorphFilterType; typedef ConstantPadImageFilter PadFilterType; @@ -162,7 +162,7 @@ class ITK_EXPORT ParabolicOpenCloseSafeBorderImageFilter : public ImageToImageFi m_ParabolicAlgorithm = INTERSECTION; } - ~ParabolicOpenCloseSafeBorderImageFilter() ITK_OVERRIDE {} + ~ParabolicOpenCloseSafeBorderImageFilter() override {} int m_ParabolicAlgorithm; private: diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h index 71ac49625f3..7aad38114f1 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h @@ -81,7 +81,7 @@ class ITK_EXPORT ParabolicOpenImageFilter Here we prefer float in order to save memory. */ protected: ParabolicOpenImageFilter() {} - ~ParabolicOpenImageFilter() ITK_OVERRIDE {} + ~ParabolicOpenImageFilter() override {} // void PrintSelf(std::ostream& os, Indent indent) const; private: ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicOpenImageFilter); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h index babbc82004a..2baa85ec3d2 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h @@ -118,7 +118,7 @@ class ITK_EXPORT SharpenOpImageFilter protected: SharpenOpImageFilter() {} - ~SharpenOpImageFilter() ITK_OVERRIDE {} + ~SharpenOpImageFilter() override {} private: ITK_DISALLOW_COPY_AND_ASSIGN(SharpenOpImageFilter); From 787b6444bb69f6565dca8f999910c103a2e4b6b0 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Mon, 12 Feb 2018 15:23:56 -0600 Subject: [PATCH 120/165] 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 --- .../itkParabolicErodeDilateImageFilter.hxx | 18 +++++++++--------- .../include/itkParabolicMorphUtils.h | 6 +++--- .../itkParabolicOpenCloseImageFilter.hxx | 18 +++++++++--------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx index 54859be12ad..80622c01145 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx @@ -88,9 +88,9 @@ ParabolicErodeDilateImageFilter::SplitReque } // determine the actual number of pieces that will be generated - double range = static_cast(requestedRegionSize[splitAxis]); + auto range = static_cast(requestedRegionSize[splitAxis]); - unsigned int valuesPerThread = static_cast(vcl_ceil(range / static_cast(num))); + auto valuesPerThread = static_cast(vcl_ceil(range / static_cast(num))); unsigned int maxThreadIdUsed = static_cast(vcl_ceil(range / static_cast(valuesPerThread))) - 1; // Split the region @@ -149,7 +149,7 @@ template void ParabolicErodeDilateImageFilter::EnlargeOutputRequestedRegion(DataObject * output) { - TOutputImage * out = dynamic_cast(output); + auto * out = dynamic_cast(output); if (out) { @@ -211,12 +211,12 @@ ParabolicErodeDilateImageFilter::ThreadedGe } float progressPerDimension = 1.0 / ImageDimension; - ProgressReporter * progress = new ProgressReporter(this, - threadId, - NumberOfRows[m_CurrentDimension], - 30, - m_CurrentDimension * progressPerDimension, - progressPerDimension); + auto * progress = new ProgressReporter(this, + threadId, + NumberOfRows[m_CurrentDimension], + 30, + m_CurrentDimension * progressPerDimension, + progressPerDimension); typedef ImageLinearConstIteratorWithIndex InputConstIteratorType; typedef ImageLinearIteratorWithIndex OutputIteratorType; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h index 3537654a9bc..283ab04c802 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h @@ -36,8 +36,8 @@ DoLineCP(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, const RealType m // negative half of the parabola for (long pos = 0; pos < LineLength; 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++) { // difference needs to be paramaterised @@ -56,7 +56,7 @@ DoLineCP(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, const RealType m 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; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx index 4163f9d5fbb..e8c733b90e1 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx @@ -97,9 +97,9 @@ ParabolicOpenCloseImageFilter::SplitRequested } // determine the actual number of pieces that will be generated - double range = static_cast(requestedRegionSize[splitAxis]); + auto range = static_cast(requestedRegionSize[splitAxis]); - unsigned int valuesPerThread = static_cast(vcl_ceil(range / static_cast(num))); + auto valuesPerThread = static_cast(vcl_ceil(range / static_cast(num))); unsigned int maxThreadIdUsed = static_cast(vcl_ceil(range / static_cast(valuesPerThread))) - 1; // Split the region @@ -159,7 +159,7 @@ template void ParabolicOpenCloseImageFilter::EnlargeOutputRequestedRegion(DataObject * output) { - TOutputImage * out = dynamic_cast(output); + auto * out = dynamic_cast(output); if (out) { @@ -284,12 +284,12 @@ ParabolicOpenCloseImageFilter::ThreadedGenera } float progressPerDimension = 1.0 / ImageDimension; - ProgressReporter * progress = new ProgressReporter(this, - threadId, - NumberOfRows[m_CurrentDimension], - 30, - m_CurrentDimension * progressPerDimension, - progressPerDimension); + auto * progress = new ProgressReporter(this, + threadId, + NumberOfRows[m_CurrentDimension], + 30, + m_CurrentDimension * progressPerDimension, + progressPerDimension); typedef ImageLinearConstIteratorWithIndex InputConstIteratorType; typedef ImageLinearIteratorWithIndex OutputIteratorType; From 175e0559bb700700a2b990a0385ed15f28a05555 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Mon, 12 Feb 2018 21:04:10 -0600 Subject: [PATCH 121/165] 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/itkBinaryCloseParaImageFilter.h | 2 +- .../include/itkBinaryDilateParaImageFilter.h | 2 +- .../include/itkBinaryErodeParaImageFilter.h | 2 +- .../include/itkBinaryOpenParaImageFilter.h | 2 +- .../include/itkMorphologicalDistanceTransformImageFilter.h | 6 +++--- .../include/itkMorphologicalSharpeningImageFilter.h | 6 +++--- .../itkMorphologicalSignedDistanceTransformImageFilter.h | 6 +++--- .../include/itkParabolicCloseImageFilter.h | 2 +- .../include/itkParabolicDilateImageFilter.h | 2 +- .../include/itkParabolicErodeDilateImageFilter.h | 6 +++--- .../include/itkParabolicErodeImageFilter.h | 2 +- .../include/itkParabolicOpenCloseImageFilter.h | 6 +++--- .../include/itkParabolicOpenCloseSafeBorderImageFilter.h | 2 +- .../include/itkParabolicOpenImageFilter.h | 2 +- 14 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h index f6adc9a31ff..b6fd53428da 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h @@ -100,7 +100,7 @@ class ITK_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter RadiusType; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h index 4d6fec10bad..37b21552662 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h @@ -98,7 +98,7 @@ class ITK_EXPORT BinaryDilateParaImageFilter : public ImageToImageFilter RadiusType; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h index b21674d4b92..39d7d8eb413 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h @@ -99,7 +99,7 @@ class ITK_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilter RadiusType; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h index c2b5df4876c..5f30e50d70a 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h @@ -100,7 +100,7 @@ class ITK_EXPORT BinaryOpenParaImageFilter : public ImageToImageFilter RadiusType; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h index ba80e912f32..78ec13368ac 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h @@ -84,9 +84,9 @@ class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImage typedef typename TInputImage::ConstPointer InputImageConstPointer; /** Image related typedefs. */ - itkStaticConstMacro(OutputImageDimension, unsigned int, TOutputImage::ImageDimension); - itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension); - itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); + static constexpr unsigned int OutputImageDimension = TOutputImage::ImageDimension; + static constexpr unsigned int InputImageDimension = TInputImage::ImageDimension; + static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; /** a type to represent the "kernel radius" */ typedef typename itk::FixedArray RadiusType; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h index 704e6a46997..8ddfb0b5689 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h @@ -92,9 +92,9 @@ class ITK_EXPORT MorphologicalSharpeningImageFilter : public ImageToImageFilter< typedef typename TInputImage::ConstPointer InputImageConstPointer; /** Image related typedefs. */ - itkStaticConstMacro(OutputImageDimension, unsigned int, TOutputImage::ImageDimension); - itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension); - itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); + static constexpr unsigned int OutputImageDimension = TOutputImage::ImageDimension; + static constexpr unsigned int InputImageDimension = TInputImage::ImageDimension; + static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; /** a type to represent the "kernel radius" */ typedef typename itk::FixedArray RadiusType; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h index cdf0544ae54..400f647d1a7 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h @@ -96,9 +96,9 @@ class ITK_EXPORT MorphologicalSignedDistanceTransformImageFilter : public ImageT typedef typename TInputImage::ConstPointer InputImageConstPointer; /** Image related typedefs. */ - itkStaticConstMacro(OutputImageDimension, unsigned int, TOutputImage::ImageDimension); - itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension); - itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); + static constexpr unsigned int OutputImageDimension = TOutputImage::ImageDimension; + static constexpr unsigned int InputImageDimension = TInputImage::ImageDimension; + static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; /** a type to represent the "kernel radius" */ typedef typename itk::FixedArray RadiusType; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h index ffc8e63e42e..b09aafac135 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h @@ -79,7 +79,7 @@ class ITK_EXPORT ParabolicCloseImageFilter typedef typename itk::FixedArray RadiusType; /** Image dimension. */ - itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); + static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; /** Define the image type for internal computations RealType is usually 'double' in NumericTraits. Here we prefer float in order to save memory. */ diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h index 0a79b189d77..af8e684b9ec 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h @@ -77,7 +77,7 @@ class ITK_EXPORT ParabolicDilateImageFilter : public ParabolicErodeDilateImageFi typedef typename itk::FixedArray RadiusType; /** Image dimension. */ - itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); + static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; protected: ParabolicDilateImageFilter() {} diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index 779726c15d6..93b2e56357a 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h @@ -115,9 +115,9 @@ class ITK_EXPORT ParabolicErodeDilateImageFilter : public ImageToImageFilter RadiusType; /** 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; typedef typename OutputImageType::RegionType OutputImageRegionType; /** Define the image type for internal computations diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h index 6d44bcb1c1a..d69a456d637 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h @@ -77,7 +77,7 @@ class ITK_EXPORT ParabolicErodeImageFilter : public ParabolicErodeDilateImageFil typedef typename itk::FixedArray RadiusType; /** Image dimension. */ - itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); + static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; /** Define the image type for internal computations RealType is usually 'double' in NumericTraits. Here we prefer float in order to save memory. */ diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h index d5b7f136320..96f3d1c5e12 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h @@ -83,9 +83,9 @@ class ITK_EXPORT ParabolicOpenCloseImageFilter : public ImageToImageFilter RadiusType; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h index 8e9da01fbbe..73e2cb7f96f 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h @@ -61,7 +61,7 @@ class ITK_EXPORT ParabolicOpenCloseSafeBorderImageFilter : public ImageToImageFi typedef typename itk::FixedArray RadiusType; /** Image dimension. */ - itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); + static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; /** Define the image type for internal computations RealType is usually 'double' in NumericTraits. Here we prefer float in order to save memory. */ diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h index 7aad38114f1..7d25f50c623 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h @@ -75,7 +75,7 @@ class ITK_EXPORT ParabolicOpenImageFilter typedef typename itk::FixedArray RadiusType; /** Image dimension. */ - itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension); + static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; /** Define the image type for internal computations RealType is usually 'double' in NumericTraits. Here we prefer float in order to save memory. */ From aa01a0fbd5358fe40c3bca2f8619cc8dd0a7d2a0 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Mon, 12 Feb 2018 23:30:41 -0600 Subject: [PATCH 122/165] 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/itkBinaryCloseParaImageFilter.h | 60 +++++++++---------- .../include/itkBinaryCloseParaImageFilter.hxx | 16 ++--- .../include/itkBinaryDilateParaImageFilter.h | 52 ++++++++-------- .../include/itkBinaryErodeParaImageFilter.h | 52 ++++++++-------- .../include/itkBinaryOpenParaImageFilter.h | 60 +++++++++---------- .../include/itkBinaryOpenParaImageFilter.hxx | 16 ++--- .../include/itkGreaterEqualValImageFilter.h | 16 ++--- .../include/itkMorphSDTHelperImageFilter.h | 25 ++++---- ...orphologicalDistanceTransformImageFilter.h | 42 ++++++------- .../itkMorphologicalSharpeningImageFilter.h | 46 +++++++------- ...ogicalSignedDistanceTransformImageFilter.h | 44 +++++++------- .../include/itkParabolicCloseImageFilter.h | 30 +++++----- .../include/itkParabolicDilateImageFilter.h | 30 +++++----- .../itkParabolicErodeDilateImageFilter.h | 46 +++++++------- .../itkParabolicErodeDilateImageFilter.hxx | 12 ++-- .../include/itkParabolicErodeImageFilter.h | 30 +++++----- .../include/itkParabolicMorphUtils.h | 8 +-- .../itkParabolicOpenCloseImageFilter.h | 52 ++++++++-------- .../itkParabolicOpenCloseImageFilter.hxx | 22 ++++--- ...kParabolicOpenCloseSafeBorderImageFilter.h | 38 ++++++------ .../include/itkParabolicOpenImageFilter.h | 30 +++++----- .../include/itkSharpenOpImageFilter.h | 25 ++++---- .../test/itkBinaryCloseParaTest.cxx | 18 +++--- .../test/itkBinaryDilateParaTest.cxx | 18 +++--- .../test/itkBinaryErodeParaTest.cxx | 18 +++--- .../test/itkBinaryOpenParaTest.cxx | 18 +++--- .../test/itkParaDTTest.cxx | 20 +++---- .../test/itkParaDilateTest.cxx | 14 ++--- .../test/itkParaErodeTest.cxx | 14 ++--- .../test/itkParaOpenTest.cxx | 14 ++--- .../test/itkParaSharpenTest.cxx | 28 ++++----- .../test/itkParaSpacingTest.cxx | 18 +++--- 32 files changed, 464 insertions(+), 468 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h index b6fd53428da..47f97e421c1 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h @@ -70,11 +70,11 @@ class ITK_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; + /** Standard class type alias. */ + using Self = BinaryCloseParaImageFilter; + using Superclass = ImageToImageFilter; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -83,26 +83,26 @@ class ITK_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter::RealType RealType; - typedef typename NumericTraits::ScalarRealType ScalarRealType; - typedef typename TOutputImage::PixelType OutputPixelType; - - /** Smart pointer typedef support. */ - typedef typename TInputImage::Pointer InputImagePointer; - typedef typename TInputImage::ConstPointer InputImageConstPointer; - - typedef typename NumericTraits::FloatType InternalRealType; + using InputImageType = TInputImage; + using OutputImageType = TOutputImage; + using PixelType = typename TInputImage::PixelType; + using RealType = typename NumericTraits::RealType; + using ScalarRealType = typename NumericTraits::ScalarRealType; + using OutputPixelType = typename TOutputImage::PixelType; + + /** Smart pointer type alias support. */ + using InputImagePointer = typename TInputImage::Pointer; + using InputImageConstPointer = typename TInputImage::ConstPointer; + + using InternalRealType = typename NumericTraits::FloatType; // perhaps a bit dodgy, change to int if you want to do enormous // binary operations - typedef short InternalIntType; + using InternalIntType = short; /** Image dimension. */ static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; - typedef typename itk::FixedArray RadiusType; + using RadiusType = typename itk::FixedArray; void SetRadius(ScalarRealType radius); @@ -133,7 +133,7 @@ class ITK_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter InternalRealImageType; - typedef typename itk::Image InternalIntImageType; - typedef typename itk::ParabolicErodeImageFilter CircErodeType; - typedef typename itk::ParabolicErodeImageFilter RectErodeType; - typedef typename itk::ParabolicDilateImageFilter CircDilateType; - typedef typename itk::ParabolicDilateImageFilter RectDilateType; + using InternalRealImageType = typename itk::Image; + using InternalIntImageType = typename itk::Image; + using CircErodeType = typename itk::ParabolicErodeImageFilter; + using RectErodeType = typename itk::ParabolicErodeImageFilter; + using CircDilateType = typename itk::ParabolicDilateImageFilter; + using RectDilateType = typename itk::ParabolicDilateImageFilter; - typedef typename itk::GreaterEqualValImageFilter CCastTypeA; - typedef typename itk::BinaryThresholdImageFilter CCastTypeB; + using CCastTypeA = typename itk::GreaterEqualValImageFilter; + using CCastTypeB = typename itk::BinaryThresholdImageFilter; - typedef typename itk::GreaterEqualValImageFilter RCastTypeA; - typedef typename itk::BinaryThresholdImageFilter RCastTypeB; + using RCastTypeA = typename itk::GreaterEqualValImageFilter; + using RCastTypeB = typename itk::BinaryThresholdImageFilter; private: ITK_DISALLOW_COPY_AND_ASSIGN(BinaryCloseParaImageFilter); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx index c68be049bb9..98099920dc3 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx @@ -134,8 +134,8 @@ BinaryCloseParaImageFilter::GenerateData(void) if (m_SafeBorder) { - typedef typename itk::ConstantPadImageFilter PadType; - typename PadType::Pointer pad = PadType::New(); + using PadType = typename itk::ConstantPadImageFilter; + typename PadType::Pointer pad = PadType::New(); pad->SetPadLowerBound(Pad); pad->SetPadUpperBound(Pad); pad->SetConstant(0); @@ -146,8 +146,8 @@ BinaryCloseParaImageFilter::GenerateData(void) // writeIm(m_CircCastB->GetOutput(), "dil.nii.gz"); // writeIm(m_CircCastA->GetOutput(), "ero.nii.gz"); // m_CircCastA->UpdateOutputInformation(); - typedef typename itk::CropImageFilter CropType; - typename CropType::Pointer crop = CropType::New(); + using CropType = typename itk::CropImageFilter; + typename CropType::Pointer crop = CropType::New(); crop->SetInput(m_CircCastA->GetOutput()); crop->SetUpperBoundaryCropSize(Pad); crop->SetLowerBoundaryCropSize(Pad); @@ -189,8 +189,8 @@ BinaryCloseParaImageFilter::GenerateData(void) if (m_SafeBorder) { - typedef typename itk::ConstantPadImageFilter PadType; - typename PadType::Pointer pad = PadType::New(); + using PadType = typename itk::ConstantPadImageFilter; + typename PadType::Pointer pad = PadType::New(); pad->SetPadLowerBound(Pad); pad->SetPadUpperBound(Pad); pad->SetConstant(0); @@ -198,8 +198,8 @@ BinaryCloseParaImageFilter::GenerateData(void) m_RectDilate->SetInput(pad->GetOutput()); - typedef typename itk::CropImageFilter CropType; - typename CropType::Pointer crop = CropType::New(); + using CropType = typename itk::CropImageFilter; + typename CropType::Pointer crop = CropType::New(); crop->SetInput(m_RectCastA->GetOutput()); crop->SetUpperBoundaryCropSize(Pad); crop->SetLowerBoundaryCropSize(Pad); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h index 37b21552662..ba8b7311c56 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h @@ -68,11 +68,11 @@ class ITK_EXPORT BinaryDilateParaImageFilter : public ImageToImageFilter Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; + /** Standard class type alias. */ + using Self = BinaryDilateParaImageFilter; + using Superclass = ImageToImageFilter; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -81,26 +81,26 @@ class ITK_EXPORT BinaryDilateParaImageFilter : public ImageToImageFilter::RealType RealType; - typedef typename NumericTraits::ScalarRealType ScalarRealType; - typedef typename TOutputImage::PixelType OutputPixelType; - - /** Smart pointer typedef support. */ - typedef typename TInputImage::Pointer InputImagePointer; - typedef typename TInputImage::ConstPointer InputImageConstPointer; - - typedef typename NumericTraits::FloatType InternalRealType; + using InputImageType = TInputImage; + using OutputImageType = TOutputImage; + using PixelType = typename TInputImage::PixelType; + using RealType = typename NumericTraits::RealType; + using ScalarRealType = typename NumericTraits::ScalarRealType; + using OutputPixelType = typename TOutputImage::PixelType; + + /** Smart pointer type alias support. */ + using InputImagePointer = typename TInputImage::Pointer; + using InputImageConstPointer = typename TInputImage::ConstPointer; + + using InternalRealType = typename NumericTraits::FloatType; // perhaps a bit dodgy, change to int if you want to do enormous // binary operations - typedef short InternalIntType; + using InternalIntType = short; /** Image dimension. */ static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; - typedef typename itk::FixedArray RadiusType; + using RadiusType = typename itk::FixedArray; void SetRadius(ScalarRealType radius); @@ -125,7 +125,7 @@ class ITK_EXPORT BinaryDilateParaImageFilter : public ImageToImageFilter InternalRealImageType; - typedef typename itk::Image InternalIntImageType; - typedef typename itk::ParabolicDilateImageFilter CircParabolicType; - typedef typename itk::ParabolicDilateImageFilter RectParabolicType; - typedef typename itk::BinaryThresholdImageFilter CCastType; - typedef typename itk::BinaryThresholdImageFilter RCastType; + using InternalRealImageType = typename itk::Image; + using InternalIntImageType = typename itk::Image; + using CircParabolicType = typename itk::ParabolicDilateImageFilter; + using RectParabolicType = typename itk::ParabolicDilateImageFilter; + using CCastType = typename itk::BinaryThresholdImageFilter; + using RCastType = typename itk::BinaryThresholdImageFilter; private: ITK_DISALLOW_COPY_AND_ASSIGN(BinaryDilateParaImageFilter); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h index 39d7d8eb413..ef7e1be2894 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h @@ -69,11 +69,11 @@ class ITK_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilter Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; + /** Standard class type alias. */ + using Self = BinaryErodeParaImageFilter; + using Superclass = ImageToImageFilter; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -82,26 +82,26 @@ class ITK_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilter::RealType RealType; - typedef typename NumericTraits::ScalarRealType ScalarRealType; - typedef typename TOutputImage::PixelType OutputPixelType; - - /** Smart pointer typedef support. */ - typedef typename TInputImage::Pointer InputImagePointer; - typedef typename TInputImage::ConstPointer InputImageConstPointer; - - typedef typename NumericTraits::FloatType InternalRealType; + using InputImageType = TInputImage; + using OutputImageType = TOutputImage; + using PixelType = typename TInputImage::PixelType; + using RealType = typename NumericTraits::RealType; + using ScalarRealType = typename NumericTraits::ScalarRealType; + using OutputPixelType = typename TOutputImage::PixelType; + + /** Smart pointer type alias support. */ + using InputImagePointer = typename TInputImage::Pointer; + using InputImageConstPointer = typename TInputImage::ConstPointer; + + using InternalRealType = typename NumericTraits::FloatType; // perhaps a bit dodgy, change to int if you want to do enormous // binary operations - typedef short InternalIntType; + using InternalIntType = short; /** Image dimension. */ static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; - typedef typename itk::FixedArray RadiusType; + using RadiusType = typename itk::FixedArray; void SetRadius(ScalarRealType radius); @@ -123,7 +123,7 @@ class ITK_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilter InternalRealImageType; - typedef typename itk::Image InternalIntImageType; - typedef typename itk::ParabolicErodeImageFilter CircParabolicType; - typedef typename itk::ParabolicErodeImageFilter RectParabolicType; - typedef typename itk::GreaterEqualValImageFilter CCastType; - typedef typename itk::GreaterEqualValImageFilter RCastType; + using InternalRealImageType = typename itk::Image; + using InternalIntImageType = typename itk::Image; + using CircParabolicType = typename itk::ParabolicErodeImageFilter; + using RectParabolicType = typename itk::ParabolicErodeImageFilter; + using CCastType = typename itk::GreaterEqualValImageFilter; + using RCastType = typename itk::GreaterEqualValImageFilter; private: ITK_DISALLOW_COPY_AND_ASSIGN(BinaryErodeParaImageFilter); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h index 5f30e50d70a..e5b2f56e907 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h @@ -70,11 +70,11 @@ class ITK_EXPORT BinaryOpenParaImageFilter : public ImageToImageFilter Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; + /** Standard class type alias. */ + using Self = BinaryOpenParaImageFilter; + using Superclass = ImageToImageFilter; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -83,26 +83,26 @@ class ITK_EXPORT BinaryOpenParaImageFilter : public ImageToImageFilter::RealType RealType; - typedef typename NumericTraits::ScalarRealType ScalarRealType; - typedef typename TOutputImage::PixelType OutputPixelType; - - /** Smart pointer typedef support. */ - typedef typename TInputImage::Pointer InputImagePointer; - typedef typename TInputImage::ConstPointer InputImageConstPointer; - - typedef typename NumericTraits::FloatType InternalRealType; + using InputImageType = TInputImage; + using OutputImageType = TOutputImage; + using PixelType = typename TInputImage::PixelType; + using RealType = typename NumericTraits::RealType; + using ScalarRealType = typename NumericTraits::ScalarRealType; + using OutputPixelType = typename TOutputImage::PixelType; + + /** Smart pointer type alias support. */ + using InputImagePointer = typename TInputImage::Pointer; + using InputImageConstPointer = typename TInputImage::ConstPointer; + + using InternalRealType = typename NumericTraits::FloatType; // perhaps a bit dodgy, change to int if you want to do enormous // binary operations - typedef short InternalIntType; + using InternalIntType = short; /** Image dimension. */ static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; - typedef typename itk::FixedArray RadiusType; + using RadiusType = typename itk::FixedArray; void SetRadius(ScalarRealType radius); @@ -133,7 +133,7 @@ class ITK_EXPORT BinaryOpenParaImageFilter : public ImageToImageFilter InternalRealImageType; - typedef typename itk::Image InternalIntImageType; - typedef typename itk::ParabolicErodeImageFilter CircErodeType; - typedef typename itk::ParabolicErodeImageFilter RectErodeType; - typedef typename itk::ParabolicDilateImageFilter CircDilateType; - typedef typename itk::ParabolicDilateImageFilter RectDilateType; + using InternalRealImageType = typename itk::Image; + using InternalIntImageType = typename itk::Image; + using CircErodeType = typename itk::ParabolicErodeImageFilter; + using RectErodeType = typename itk::ParabolicErodeImageFilter; + using CircDilateType = typename itk::ParabolicDilateImageFilter; + using RectDilateType = typename itk::ParabolicDilateImageFilter; - typedef typename itk::GreaterEqualValImageFilter CCastTypeA; - typedef typename itk::BinaryThresholdImageFilter CCastTypeB; + using CCastTypeA = typename itk::GreaterEqualValImageFilter; + using CCastTypeB = typename itk::BinaryThresholdImageFilter; - typedef typename itk::GreaterEqualValImageFilter RCastTypeA; - typedef typename itk::BinaryThresholdImageFilter RCastTypeB; + using RCastTypeA = typename itk::GreaterEqualValImageFilter; + using RCastTypeB = typename itk::BinaryThresholdImageFilter; private: ITK_DISALLOW_COPY_AND_ASSIGN(BinaryOpenParaImageFilter); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx index f3f680050ea..969e4757943 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx @@ -142,15 +142,15 @@ BinaryOpenParaImageFilter::GenerateData(void) if (m_SafeBorder) { - typedef typename itk::ConstantPadImageFilter PadType; - typename PadType::Pointer pad = PadType::New(); + using PadType = typename itk::ConstantPadImageFilter; + typename PadType::Pointer pad = PadType::New(); pad->SetPadLowerBound(Pad); pad->SetPadUpperBound(Pad); pad->SetConstant(1); pad->SetInput(inputImage); m_CircErode->SetInput(pad->GetOutput()); - typedef typename itk::CropImageFilter CropType; - typename CropType::Pointer crop = CropType::New(); + using CropType = typename itk::CropImageFilter; + typename CropType::Pointer crop = CropType::New(); crop->SetInput(m_CircCastB->GetOutput()); crop->SetUpperBoundaryCropSize(Pad); crop->SetLowerBoundaryCropSize(Pad); @@ -192,16 +192,16 @@ BinaryOpenParaImageFilter::GenerateData(void) if (m_SafeBorder) { - typedef typename itk::ConstantPadImageFilter PadType; - typename PadType::Pointer pad = PadType::New(); + using PadType = typename itk::ConstantPadImageFilter; + typename PadType::Pointer pad = PadType::New(); pad->SetPadLowerBound(Pad); pad->SetPadUpperBound(Pad); pad->SetConstant(1); pad->SetInput(inputImage); m_RectErode->SetInput(pad->GetOutput()); - typedef typename itk::CropImageFilter CropType; - typename CropType::Pointer crop = CropType::New(); + using CropType = typename itk::CropImageFilter; + typename CropType::Pointer crop = CropType::New(); crop->SetInput(m_RectCastB->GetOutput()); crop->SetUpperBoundaryCropSize(Pad); crop->SetLowerBoundaryCropSize(Pad); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h index 2c453748431..fa392618753 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h @@ -72,14 +72,14 @@ class ITK_EXPORT GreaterEqualValImageFilter Functor::GEConst> { public: - /** Standard class typedefs. */ - typedef GreaterEqualValImageFilter Self; - typedef UnaryFunctorImageFilter> - Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; + /** Standard class type alias. */ + using Self = GreaterEqualValImageFilter; + using Superclass = + UnaryFunctorImageFilter>; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h index 52f2e37ad7a..d1b0933b5aa 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h @@ -93,20 +93,19 @@ class ITK_EXPORT MorphSDTHelperImageFilter typename TOutputImage::PixelType>> { public: - /** Standard class typedefs. */ - typedef MorphSDTHelperImageFilter Self; - typedef TernaryFunctorImageFilter> - Superclass; + /** Standard class type alias. */ + using Self = MorphSDTHelperImageFilter; + using Superclass = TernaryFunctorImageFilter>; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h index 78ec13368ac..f0b3c2f3e27 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h @@ -59,11 +59,11 @@ template class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImageFilter { public: - /** Standard class typedefs. */ - typedef MorphologicalDistanceTransformImageFilter Self; - typedef ImageToImageFilter Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; + /** Standard class type alias. */ + using Self = MorphologicalDistanceTransformImageFilter; + using Superclass = ImageToImageFilter; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -72,24 +72,24 @@ class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImage itkTypeMacro(MorphologicalDistanceTransformImageFilter, ImageToImageFilter); /** Pixel Type of the input image */ - typedef TInputImage InputImageType; - typedef TOutputImage OutputImageType; - typedef typename TInputImage::PixelType InputPixelType; - typedef typename NumericTraits::RealType RealType; - typedef typename NumericTraits::ScalarRealType ScalarRealType; - typedef typename TOutputImage::PixelType OutputPixelType; - - /** Smart pointer typedef support. */ - typedef typename TInputImage::Pointer InputImagePointer; - typedef typename TInputImage::ConstPointer InputImageConstPointer; - - /** Image related typedefs. */ + using InputImageType = TInputImage; + using OutputImageType = TOutputImage; + using InputPixelType = typename TInputImage::PixelType; + using RealType = typename NumericTraits::RealType; + using ScalarRealType = typename NumericTraits::ScalarRealType; + using OutputPixelType = typename TOutputImage::PixelType; + + /** Smart pointer type alias support. */ + using InputImagePointer = typename TInputImage::Pointer; + using InputImageConstPointer = typename TInputImage::ConstPointer; + + /** Image related type alias. */ static constexpr unsigned int OutputImageDimension = TOutputImage::ImageDimension; static constexpr unsigned int InputImageDimension = TInputImage::ImageDimension; static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; /** a type to represent the "kernel radius" */ - typedef typename itk::FixedArray RadiusType; + using RadiusType = typename itk::FixedArray; void Modified() const override; @@ -137,9 +137,9 @@ class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImage GenerateData(void) override; // do everything in the output image type, which should have high precision - typedef typename itk::BinaryThresholdImageFilter ThreshType; - typedef typename itk::ParabolicErodeImageFilter ErodeType; - typedef typename itk::SqrtImageFilter SqrtType; + using ThreshType = typename itk::BinaryThresholdImageFilter; + using ErodeType = typename itk::ParabolicErodeImageFilter; + using SqrtType = typename itk::SqrtImageFilter; private: ITK_DISALLOW_COPY_AND_ASSIGN(MorphologicalDistanceTransformImageFilter); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h index 8ddfb0b5689..a03db1ec305 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h @@ -67,11 +67,11 @@ template class ITK_EXPORT MorphologicalSharpeningImageFilter : public ImageToImageFilter { public: - /** Standard class typedefs. */ - typedef MorphologicalSharpeningImageFilter Self; - typedef ImageToImageFilter Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; + /** Standard class type alias. */ + using Self = MorphologicalSharpeningImageFilter; + using Superclass = ImageToImageFilter; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -80,24 +80,24 @@ class ITK_EXPORT MorphologicalSharpeningImageFilter : public ImageToImageFilter< itkTypeMacro(MorphologicalSharpeningImageFilter, ImageToImageFilter); /** Pixel Type of the input image */ - typedef TInputImage InputImageType; - typedef TOutputImage OutputImageType; - typedef typename TInputImage::PixelType InputPixelType; - typedef typename NumericTraits::RealType RealType; - typedef typename NumericTraits::ScalarRealType ScalarRealType; - typedef typename TOutputImage::PixelType OutputPixelType; - - /** Smart pointer typedef support. */ - typedef typename TInputImage::Pointer InputImagePointer; - typedef typename TInputImage::ConstPointer InputImageConstPointer; - - /** Image related typedefs. */ + using InputImageType = TInputImage; + using OutputImageType = TOutputImage; + using InputPixelType = typename TInputImage::PixelType; + using RealType = typename NumericTraits::RealType; + using ScalarRealType = typename NumericTraits::ScalarRealType; + using OutputPixelType = typename TOutputImage::PixelType; + + /** Smart pointer type alias support. */ + using InputImagePointer = typename TInputImage::Pointer; + using InputImageConstPointer = typename TInputImage::ConstPointer; + + /** Image related type alias. */ static constexpr unsigned int OutputImageDimension = TOutputImage::ImageDimension; static constexpr unsigned int InputImageDimension = TInputImage::ImageDimension; static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; /** a type to represent the "kernel radius" */ - typedef typename itk::FixedArray RadiusType; + using RadiusType = typename itk::FixedArray; itkSetMacro(Iterations, int); itkGetConstReferenceMacro(Iterations, int); @@ -157,12 +157,12 @@ class ITK_EXPORT MorphologicalSharpeningImageFilter : public ImageToImageFilter< GenerateData(void) override; // do everything in the output image type, which should have high precision - typedef typename itk::ParabolicErodeImageFilter ErodeType; - typedef typename itk::ParabolicDilateImageFilter DilateType; - typedef typename itk::CastImageFilter CastType; + using ErodeType = typename itk::ParabolicErodeImageFilter; + using DilateType = typename itk::ParabolicDilateImageFilter; + using CastType = typename itk::CastImageFilter; - typedef typename itk::SharpenOpImageFilter - SharpenOpType; + using SharpenOpType = + typename itk::SharpenOpImageFilter; private: ITK_DISALLOW_COPY_AND_ASSIGN(MorphologicalSharpeningImageFilter); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h index 400f647d1a7..795dad51827 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h @@ -71,11 +71,11 @@ template class ITK_EXPORT MorphologicalSignedDistanceTransformImageFilter : public ImageToImageFilter { public: - /** Standard class typedefs. */ - typedef MorphologicalSignedDistanceTransformImageFilter Self; - typedef ImageToImageFilter Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; + /** Standard class type alias. */ + using Self = MorphologicalSignedDistanceTransformImageFilter; + using Superclass = ImageToImageFilter; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -84,24 +84,24 @@ class ITK_EXPORT MorphologicalSignedDistanceTransformImageFilter : public ImageT itkTypeMacro(MorphologicalSignedDistanceTransformImageFilter, ImageToImageFilter); /** Pixel Type of the input image */ - typedef TInputImage InputImageType; - typedef TOutputImage OutputImageType; - typedef typename TInputImage::PixelType InputPixelType; - typedef typename NumericTraits::RealType RealType; - typedef typename NumericTraits::ScalarRealType ScalarRealType; - typedef typename TOutputImage::PixelType OutputPixelType; - - /** Smart pointer typedef support. */ - typedef typename TInputImage::Pointer InputImagePointer; - typedef typename TInputImage::ConstPointer InputImageConstPointer; - - /** Image related typedefs. */ + using InputImageType = TInputImage; + using OutputImageType = TOutputImage; + using InputPixelType = typename TInputImage::PixelType; + using RealType = typename NumericTraits::RealType; + using ScalarRealType = typename NumericTraits::ScalarRealType; + using OutputPixelType = typename TOutputImage::PixelType; + + /** Smart pointer type alias support. */ + using InputImagePointer = typename TInputImage::Pointer; + using InputImageConstPointer = typename TInputImage::ConstPointer; + + /** Image related type alias. */ static constexpr unsigned int OutputImageDimension = TOutputImage::ImageDimension; static constexpr unsigned int InputImageDimension = TInputImage::ImageDimension; static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; /** a type to represent the "kernel radius" */ - typedef typename itk::FixedArray RadiusType; + using RadiusType = typename itk::FixedArray; virtual void Modified() const; @@ -182,10 +182,10 @@ class ITK_EXPORT MorphologicalSignedDistanceTransformImageFilter : public ImageT int m_ParabolicAlgorithm; // do everything in the output image type, which should have high precision - typedef typename itk::BinaryThresholdImageFilter ThreshType; - typedef typename itk::ParabolicErodeImageFilter ErodeType; - typedef typename itk::ParabolicDilateImageFilter DilateType; - typedef typename itk::MorphSDTHelperImageFilter HelperType; + using ThreshType = typename itk::BinaryThresholdImageFilter; + using ErodeType = typename itk::ParabolicErodeImageFilter; + using DilateType = typename itk::ParabolicDilateImageFilter; + using HelperType = typename itk::MorphSDTHelperImageFilter; private: ITK_DISALLOW_COPY_AND_ASSIGN(MorphologicalSignedDistanceTransformImageFilter); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h index b09aafac135..e5abd5f8419 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h @@ -51,11 +51,11 @@ class ITK_EXPORT ParabolicCloseImageFilter : public ParabolicOpenCloseSafeBorderImageFilter { public: - /** Standard class typedefs. */ - typedef ParabolicCloseImageFilter Self; - typedef ParabolicOpenCloseSafeBorderImageFilter Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; + /** Standard class type alias. */ + using Self = ParabolicCloseImageFilter; + using Superclass = ParabolicOpenCloseSafeBorderImageFilter; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -64,19 +64,19 @@ class ITK_EXPORT ParabolicCloseImageFilter itkTypeMacro(ParabolicCloseImageFilter, ParabolicOpenCloseSafeBorderImageFilter); /** Pixel Type of the input image */ - typedef TInputImage InputImageType; - typedef TOutputImage OutputImageType; - typedef typename TInputImage::PixelType PixelType; - typedef typename NumericTraits::RealType RealType; - typedef typename NumericTraits::ScalarRealType ScalarRealType; - typedef typename TOutputImage::PixelType OutputPixelType; + using InputImageType = TInputImage; + using OutputImageType = TOutputImage; + using PixelType = typename TInputImage::PixelType; + using RealType = typename NumericTraits::RealType; + using ScalarRealType = typename NumericTraits::ScalarRealType; + using OutputPixelType = typename TOutputImage::PixelType; - /** Smart pointer typedef support. */ - typedef typename TInputImage::Pointer InputImagePointer; - typedef typename TInputImage::ConstPointer InputImageConstPointer; + /** Smart pointer type alias support. */ + using InputImagePointer = typename TInputImage::Pointer; + using InputImageConstPointer = typename TInputImage::ConstPointer; /** a type to represent the "kernel radius" */ - typedef typename itk::FixedArray RadiusType; + using RadiusType = typename itk::FixedArray; /** Image dimension. */ static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h index af8e684b9ec..711e943d578 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h @@ -49,11 +49,11 @@ template class ITK_EXPORT ParabolicDilateImageFilter : public ParabolicErodeDilateImageFilter { public: - /** Standard class typedefs. */ - typedef ParabolicDilateImageFilter Self; - typedef ParabolicErodeDilateImageFilter Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; + /** Standard class type alias. */ + using Self = ParabolicDilateImageFilter; + using Superclass = ParabolicErodeDilateImageFilter; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -62,19 +62,19 @@ class ITK_EXPORT ParabolicDilateImageFilter : public ParabolicErodeDilateImageFi itkTypeMacro(ParabolicDilateImageFilter, ParabolicErodeDilateImageFilter); /** Pixel Type of the input image */ - typedef TInputImage InputImageType; - typedef TOutputImage OutputImageType; - typedef typename TInputImage::PixelType PixelType; - typedef typename NumericTraits::RealType RealType; - typedef typename NumericTraits::ScalarRealType ScalarRealType; - typedef typename TOutputImage::PixelType OutputPixelType; + using InputImageType = TInputImage; + using OutputImageType = TOutputImage; + using PixelType = typename TInputImage::PixelType; + using RealType = typename NumericTraits::RealType; + using ScalarRealType = typename NumericTraits::ScalarRealType; + using OutputPixelType = typename TOutputImage::PixelType; - /** Smart pointer typedef support. */ - typedef typename TInputImage::Pointer InputImagePointer; - typedef typename TInputImage::ConstPointer InputImageConstPointer; + /** Smart pointer type alias support. */ + using InputImagePointer = typename TInputImage::Pointer; + using InputImageConstPointer = typename TInputImage::ConstPointer; /** a type to represent the "kernel radius" */ - typedef typename itk::FixedArray RadiusType; + using RadiusType = typename itk::FixedArray; /** Image dimension. */ static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index 93b2e56357a..b8dff8bbf9a 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h @@ -83,11 +83,11 @@ template { public: - /** Standard class typedefs. */ - typedef ParabolicErodeDilateImageFilter Self; - typedef ImageToImageFilter Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; + /** Standard class type alias. */ + using Self = ParabolicErodeDilateImageFilter; + using Superclass = ImageToImageFilter; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -96,37 +96,37 @@ class ITK_EXPORT ParabolicErodeDilateImageFilter : public ImageToImageFilter::RealType RealType; - typedef typename NumericTraits::ScalarRealType ScalarRealType; - typedef typename TOutputImage::PixelType OutputPixelType; + using InputImageType = TInputImage; + using OutputImageType = TOutputImage; + using PixelType = typename TInputImage::PixelType; + using RealType = typename NumericTraits::RealType; + using ScalarRealType = typename NumericTraits::ScalarRealType; + using OutputPixelType = typename TOutputImage::PixelType; - /** 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::IndexType OutputIndexType; + using OutputIndexType = typename OutputImageType::IndexType; /** a type to represent the "kernel radius" */ - typedef typename itk::FixedArray RadiusType; + using RadiusType = typename itk::FixedArray; /** Image dimension. */ static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; static constexpr unsigned int OutputImageDimension = TOutputImage::ImageDimension; static constexpr unsigned int InputImageDimension = TInputImage::ImageDimension; - typedef typename OutputImageType::RegionType OutputImageRegionType; + using OutputImageRegionType = typename OutputImageType::RegionType; /** Define the image type for internal computations RealType is usually 'double' in NumericTraits. Here we prefer float in order to save memory. */ - typedef typename NumericTraits::FloatType InternalRealType; - // typedef typename Image RealImageType; + using InternalRealType = typename NumericTraits::FloatType; + // using RealImageType = typename Image; // set all of the scales the same void @@ -157,7 +157,7 @@ class ITK_EXPORT ParabolicErodeDilateImageFilter : public ImageToImageFilter::ThreadedGe m_CurrentDimension * progressPerDimension, progressPerDimension); - typedef ImageLinearConstIteratorWithIndex InputConstIteratorType; - typedef ImageLinearIteratorWithIndex OutputIteratorType; + using InputConstIteratorType = ImageLinearConstIteratorWithIndex; + using OutputIteratorType = ImageLinearIteratorWithIndex; // for stages after the first - typedef ImageLinearConstIteratorWithIndex OutputConstIteratorType; + using OutputConstIteratorType = ImageLinearConstIteratorWithIndex; - typedef ImageRegion RegionType; + using RegionType = ImageRegion; typename TInputImage::ConstPointer inputImage(this->GetInput()); typename TOutputImage::Pointer outputImage(this->GetOutput()); @@ -273,8 +273,8 @@ ParabolicErodeDilateImageFilter::ThreadedGe else { // copy to output - typedef ImageRegionConstIterator InItType; - typedef ImageRegionIterator OutItType; + using InItType = ImageRegionConstIterator; + using OutItType = ImageRegionIterator; InItType InIt(inputImage, region); OutItType OutIt(outputImage, region); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h index d69a456d637..cfd05fc8440 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h @@ -49,11 +49,11 @@ template class ITK_EXPORT ParabolicErodeImageFilter : public ParabolicErodeDilateImageFilter { public: - /** Standard class typedefs. */ - typedef ParabolicErodeImageFilter Self; - typedef ParabolicErodeDilateImageFilter Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; + /** Standard class type alias. */ + using Self = ParabolicErodeImageFilter; + using Superclass = ParabolicErodeDilateImageFilter; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -62,19 +62,19 @@ class ITK_EXPORT ParabolicErodeImageFilter : public ParabolicErodeDilateImageFil itkTypeMacro(ParabolicErodeImageFilter, ParabolicErodeDilateImageFilter); /** Pixel Type of the input image */ - typedef TInputImage InputImageType; - typedef TOutputImage OutputImageType; - typedef typename TInputImage::PixelType PixelType; - typedef typename NumericTraits::RealType RealType; - typedef typename NumericTraits::ScalarRealType ScalarRealType; - typedef typename TOutputImage::PixelType OutputPixelType; + using InputImageType = TInputImage; + using OutputImageType = TOutputImage; + using PixelType = typename TInputImage::PixelType; + using RealType = typename NumericTraits::RealType; + using ScalarRealType = typename NumericTraits::ScalarRealType; + using OutputPixelType = typename TOutputImage::PixelType; - /** Smart pointer typedef support. */ - typedef typename TInputImage::Pointer InputImagePointer; - typedef typename TInputImage::ConstPointer InputImageConstPointer; + /** Smart pointer type alias support. */ + using InputImagePointer = typename TInputImage::Pointer; + using InputImageConstPointer = typename TInputImage::ConstPointer; /** a type to represent the "kernel radius" */ - typedef typename itk::FixedArray RadiusType; + using RadiusType = typename itk::FixedArray; /** Image dimension. */ static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h index 283ab04c802..b701ed863c2 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h @@ -197,12 +197,12 @@ doOneDimension(TInIter & inputIterator, INTERSECTION = 2 // default }; - // typedef typename std::vector LineBufferType; + // using LineBufferType = typename std::vector; // message from M.Starring suggested performance gain using Array // instead of std::vector. - typedef typename itk::Array LineBufferType; - RealType iscale = 1.0; + using LineBufferType = typename itk::Array; + RealType iscale = 1.0; if (m_UseImageSpacing) { iscale = image_scale; @@ -269,7 +269,7 @@ doOneDimension(TInIter & inputIterator, else { // using the Intersection algorithm - typedef typename itk::Array IndexBufferType; + using IndexBufferType = typename itk::Array; const RealType magnitudeInt = (iscale * iscale) / (2.0 * Sigma); LineBufferType LineBuf(LineLength); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h index 96f3d1c5e12..1b1af7342da 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h @@ -53,11 +53,11 @@ template { public: - /** Standard class typedefs. */ - typedef ParabolicOpenCloseImageFilter Self; - typedef ImageToImageFilter Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; + /** Standard class type alias. */ + using Self = ParabolicOpenCloseImageFilter; + using Superclass = ImageToImageFilter; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -66,37 +66,37 @@ class ITK_EXPORT ParabolicOpenCloseImageFilter : public ImageToImageFilter::RealType RealType; - typedef typename NumericTraits::ScalarRealType ScalarRealType; - typedef typename TOutputImage::PixelType OutputPixelType; - typedef typename OutputImageType::RegionType OutputImageRegionType; - typedef typename TInputImage::SizeType InputSizeType; - typedef typename TOutputImage::SizeType OutputSizeType; - - /** Smart pointer typedef support. */ - typedef typename TInputImage::Pointer InputImagePointer; - typedef typename TInputImage::ConstPointer InputImageConstPointer; - - typedef typename OutputImageType::IndexType OutputIndexType; - - /** Image related typedefs. */ + using InputImageType = TInputImage; + using OutputImageType = TOutputImage; + using PixelType = typename TInputImage::PixelType; + using RealType = typename NumericTraits::RealType; + using ScalarRealType = typename NumericTraits::ScalarRealType; + using OutputPixelType = typename TOutputImage::PixelType; + using OutputImageRegionType = typename OutputImageType::RegionType; + using InputSizeType = typename TInputImage::SizeType; + using OutputSizeType = typename TOutputImage::SizeType; + + /** Smart pointer type alias support. */ + using InputImagePointer = typename TInputImage::Pointer; + using InputImageConstPointer = typename TInputImage::ConstPointer; + + using OutputIndexType = typename OutputImageType::IndexType; + + /** Image related type alias. */ static constexpr unsigned int OutputImageDimension = TOutputImage::ImageDimension; static constexpr unsigned int InputImageDimension = TInputImage::ImageDimension; static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; /** a type to represent the "kernel radius" */ - typedef typename itk::FixedArray RadiusType; + using RadiusType = typename itk::FixedArray; /** Define the image type for internal computations RealType is usually 'double' in NumericTraits. Here we prefer float in order to save memory. */ - typedef typename NumericTraits::FloatType InternalRealType; - // typedef typename Image RealImageType; + using InternalRealType = typename NumericTraits::FloatType; + // using RealImageType = typename Image; // set all of the scales the same void diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx index e8c733b90e1..53befd712d5 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx @@ -175,15 +175,13 @@ ParabolicOpenCloseImageFilter::GenerateData(v { ThreadIdType nbthreads = this->GetNumberOfThreads(); - // typedef ImageLinearConstIteratorWithIndex< TInputImage > - // InputConstIteratorType; - // typedef ImageLinearIteratorWithIndex< TOutputImage > OutputIteratorType; + // using InputConstIteratorType = ImageLinearConstIteratorWithIndex< TInputImage > ; + // using OutputIteratorType = ImageLinearIteratorWithIndex< TOutputImage >; // 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()); @@ -291,13 +289,13 @@ ParabolicOpenCloseImageFilter::ThreadedGenera m_CurrentDimension * progressPerDimension, progressPerDimension); - typedef ImageLinearConstIteratorWithIndex InputConstIteratorType; - typedef ImageLinearIteratorWithIndex OutputIteratorType; + using InputConstIteratorType = ImageLinearConstIteratorWithIndex; + using OutputIteratorType = ImageLinearIteratorWithIndex; // for stages after the first - typedef ImageLinearConstIteratorWithIndex OutputConstIteratorType; + using OutputConstIteratorType = ImageLinearConstIteratorWithIndex; - typedef ImageRegion RegionType; + using RegionType = ImageRegion; typename TInputImage::ConstPointer inputImage(this->GetInput()); typename TOutputImage::Pointer outputImage(this->GetOutput()); @@ -341,8 +339,8 @@ ParabolicOpenCloseImageFilter::ThreadedGenera else { // copy to output - typedef ImageRegionConstIterator InItType; - typedef ImageRegionIterator OutItType; + using InItType = ImageRegionConstIterator; + using OutItType = ImageRegionIterator; InItType InIt(inputImage, region); OutItType OutIt(outputImage, region); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h index 73e2cb7f96f..792bfcb0b27 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h @@ -33,11 +33,11 @@ template { public: - /** Standard class typedefs. */ - typedef ParabolicOpenCloseSafeBorderImageFilter Self; - typedef ImageToImageFilter Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; + /** Standard class type alias. */ + using Self = ParabolicOpenCloseSafeBorderImageFilter; + using Superclass = ImageToImageFilter; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -46,19 +46,19 @@ class ITK_EXPORT ParabolicOpenCloseSafeBorderImageFilter : public ImageToImageFi itkTypeMacro(ParabolicOpenCloseSafeBorderImageFilter, ImageToImageFilter); /** Pixel Type of the input image */ - typedef TInputImage InputImageType; - typedef TOutputImage OutputImageType; - typedef typename TInputImage::PixelType InputPixelType; - typedef typename NumericTraits::RealType RealType; - typedef typename NumericTraits::ScalarRealType ScalarRealType; - typedef typename TOutputImage::PixelType OutputPixelType; + using InputImageType = TInputImage; + using OutputImageType = TOutputImage; + using InputPixelType = typename TInputImage::PixelType; + using RealType = typename NumericTraits::RealType; + using ScalarRealType = typename NumericTraits::ScalarRealType; + using OutputPixelType = typename TOutputImage::PixelType; - /** Smart pointer typedef support. */ - typedef typename TInputImage::Pointer InputImagePointer; - typedef typename TInputImage::ConstPointer InputImageConstPointer; + /** Smart pointer type alias support. */ + using InputImagePointer = typename TInputImage::Pointer; + using InputImageConstPointer = typename TInputImage::ConstPointer; /** a type to represent the "kernel radius" */ - typedef typename itk::FixedArray RadiusType; + using RadiusType = typename itk::FixedArray; /** Image dimension. */ static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; @@ -147,10 +147,10 @@ class ITK_EXPORT ParabolicOpenCloseSafeBorderImageFilter : public ImageToImageFi void PrintSelf(std::ostream & os, Indent indent) const override; - typedef ParabolicOpenCloseImageFilter MorphFilterType; - typedef ConstantPadImageFilter PadFilterType; - typedef CropImageFilter CropFilterType; - typedef StatisticsImageFilter StatsFilterType; + using MorphFilterType = ParabolicOpenCloseImageFilter; + using PadFilterType = ConstantPadImageFilter; + using CropFilterType = CropImageFilter; + using StatsFilterType = StatisticsImageFilter; ParabolicOpenCloseSafeBorderImageFilter() { diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h index 7d25f50c623..32e5fde7272 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h @@ -50,29 +50,29 @@ class ITK_EXPORT ParabolicOpenImageFilter : public ParabolicOpenCloseSafeBorderImageFilter { public: - /** Standard class typedefs. */ - typedef ParabolicOpenImageFilter Self; - typedef ParabolicOpenCloseSafeBorderImageFilter Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; + /** Standard class type alias. */ + using Self = ParabolicOpenImageFilter; + using Superclass = ParabolicOpenCloseSafeBorderImageFilter; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); /** Pixel Type of the input image */ - typedef TInputImage InputImageType; - typedef TOutputImage OutputImageType; - typedef typename TInputImage::PixelType PixelType; - typedef typename NumericTraits::RealType RealType; - typedef typename NumericTraits::ScalarRealType ScalarRealType; - typedef typename TOutputImage::PixelType OutputPixelType; + using InputImageType = TInputImage; + using OutputImageType = TOutputImage; + using PixelType = typename TInputImage::PixelType; + using RealType = typename NumericTraits::RealType; + using ScalarRealType = typename NumericTraits::ScalarRealType; + using OutputPixelType = typename TOutputImage::PixelType; - /** Smart pointer typedef support. */ - typedef typename TInputImage::Pointer InputImagePointer; - typedef typename TInputImage::ConstPointer InputImageConstPointer; + /** Smart pointer type alias support. */ + using InputImagePointer = typename TInputImage::Pointer; + using InputImageConstPointer = typename TInputImage::ConstPointer; /** a type to represent the "kernel radius" */ - typedef typename itk::FixedArray RadiusType; + using RadiusType = typename itk::FixedArray; /** Image dimension. */ static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h index 2baa85ec3d2..7f84ee416b1 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h @@ -96,19 +96,18 @@ class ITK_EXPORT SharpenOpImageFilter typename TOutputImage::PixelType>> { public: - /** Standard class typedefs. */ - typedef SharpenOpImageFilter Self; - typedef TernaryFunctorImageFilter> - Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; + /** Standard class type alias. */ + using Self = SharpenOpImageFilter; + using Superclass = TernaryFunctorImageFilter>; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx index 3c6df249bfa..1f496c66f18 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx @@ -38,11 +38,11 @@ itkBinaryCloseParaTest(int argc, char * argv[]) itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); const int dim = 2; - typedef unsigned char PType; - typedef itk::Image IType; + using PType = unsigned char; + using IType = itk::Image; - typedef itk::ImageFileReader ReaderType; - ReaderType::Pointer reader = ReaderType::New(); + using ReaderType = itk::ImageFileReader; + ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(argv[1]); try { @@ -54,15 +54,15 @@ itkBinaryCloseParaTest(int argc, char * argv[]) return EXIT_FAILURE; } // threshold the input to create a mask - typedef itk::BinaryThresholdImageFilter ThreshType; - ThreshType::Pointer thresh = ThreshType::New(); + using ThreshType = itk::BinaryThresholdImageFilter; + ThreshType::Pointer thresh = ThreshType::New(); thresh->SetInput(reader->GetOutput()); thresh->SetUpperThreshold(atoi(argv[2])); thresh->SetInsideValue(0); thresh->SetOutsideValue(1); // now to apply the erosion - typedef itk::BinaryCloseParaImageFilter FilterType; + using FilterType = itk::BinaryCloseParaImageFilter; FilterType::Pointer filter = FilterType::New(); @@ -70,8 +70,8 @@ itkBinaryCloseParaTest(int argc, char * argv[]) filter->SetUseImageSpacing(true); filter->SetRadius(atof(argv[3])); - typedef itk::ImageFileWriter WriterType; - WriterType::Pointer writer = WriterType::New(); + using WriterType = itk::ImageFileWriter; + WriterType::Pointer writer = WriterType::New(); writer->SetInput(filter->GetOutput()); writer->SetFileName(argv[4]); try diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx index 2a122e511ae..c4f6786bc69 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx @@ -38,11 +38,11 @@ itkBinaryDilateParaTest(int argc, char * argv[]) itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); const int dim = 2; - typedef unsigned char PType; - typedef itk::Image IType; + using PType = unsigned char; + using IType = itk::Image; - typedef itk::ImageFileReader ReaderType; - ReaderType::Pointer reader = ReaderType::New(); + using ReaderType = itk::ImageFileReader; + ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(argv[1]); try { @@ -54,15 +54,15 @@ itkBinaryDilateParaTest(int argc, char * argv[]) return EXIT_FAILURE; } // threshold the input to create a mask - typedef itk::BinaryThresholdImageFilter ThreshType; - ThreshType::Pointer thresh = ThreshType::New(); + using ThreshType = itk::BinaryThresholdImageFilter; + ThreshType::Pointer thresh = ThreshType::New(); thresh->SetInput(reader->GetOutput()); thresh->SetUpperThreshold(atoi(argv[2])); thresh->SetInsideValue(0); thresh->SetOutsideValue(1); // now to apply the erosion - typedef itk::BinaryDilateParaImageFilter FilterType; + using FilterType = itk::BinaryDilateParaImageFilter; FilterType::Pointer filter = FilterType::New(); @@ -70,8 +70,8 @@ itkBinaryDilateParaTest(int argc, char * argv[]) filter->SetUseImageSpacing(true); filter->SetRadius(atof(argv[3])); - typedef itk::ImageFileWriter WriterType; - WriterType::Pointer writer = WriterType::New(); + using WriterType = itk::ImageFileWriter; + WriterType::Pointer writer = WriterType::New(); writer->SetInput(filter->GetOutput()); writer->SetFileName(argv[4]); try diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx index e02ac0e36fa..f8d244aa959 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx @@ -38,11 +38,11 @@ itkBinaryErodeParaTest(int argc, char * argv[]) itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); const int dim = 2; - typedef unsigned char PType; - typedef itk::Image IType; + using PType = unsigned char; + using IType = itk::Image; - typedef itk::ImageFileReader ReaderType; - ReaderType::Pointer reader = ReaderType::New(); + using ReaderType = itk::ImageFileReader; + ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(argv[1]); try { @@ -54,15 +54,15 @@ itkBinaryErodeParaTest(int argc, char * argv[]) return EXIT_FAILURE; } // threshold the input to create a mask - typedef itk::BinaryThresholdImageFilter ThreshType; - ThreshType::Pointer thresh = ThreshType::New(); + using ThreshType = itk::BinaryThresholdImageFilter; + ThreshType::Pointer thresh = ThreshType::New(); thresh->SetInput(reader->GetOutput()); thresh->SetUpperThreshold(atoi(argv[2])); thresh->SetInsideValue(0); thresh->SetOutsideValue(1); // now to apply the erosion - typedef itk::BinaryErodeParaImageFilter FilterType; + using FilterType = itk::BinaryErodeParaImageFilter; FilterType::Pointer filter = FilterType::New(); @@ -70,8 +70,8 @@ itkBinaryErodeParaTest(int argc, char * argv[]) filter->SetUseImageSpacing(true); filter->SetRadius(atof(argv[3])); - typedef itk::ImageFileWriter WriterType; - WriterType::Pointer writer = WriterType::New(); + using WriterType = itk::ImageFileWriter; + WriterType::Pointer writer = WriterType::New(); writer->SetInput(filter->GetOutput()); writer->SetFileName(argv[4]); try diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx index 094a6ca1b0e..84f17804a61 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx @@ -38,11 +38,11 @@ itkBinaryOpenParaTest(int argc, char * argv[]) itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); const int dim = 2; - typedef unsigned char PType; - typedef itk::Image IType; + using PType = unsigned char; + using IType = itk::Image; - typedef itk::ImageFileReader ReaderType; - ReaderType::Pointer reader = ReaderType::New(); + using ReaderType = itk::ImageFileReader; + ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(argv[1]); try { @@ -54,15 +54,15 @@ itkBinaryOpenParaTest(int argc, char * argv[]) return EXIT_FAILURE; } // threshold the input to create a mask - typedef itk::BinaryThresholdImageFilter ThreshType; - ThreshType::Pointer thresh = ThreshType::New(); + using ThreshType = itk::BinaryThresholdImageFilter; + ThreshType::Pointer thresh = ThreshType::New(); thresh->SetInput(reader->GetOutput()); thresh->SetUpperThreshold(atoi(argv[2])); thresh->SetInsideValue(0); thresh->SetOutsideValue(1); // now to apply the erosion - typedef itk::BinaryOpenParaImageFilter FilterType; + using FilterType = itk::BinaryOpenParaImageFilter; FilterType::Pointer filter = FilterType::New(); @@ -70,8 +70,8 @@ itkBinaryOpenParaTest(int argc, char * argv[]) filter->SetUseImageSpacing(true); filter->SetRadius(atof(argv[3])); - typedef itk::ImageFileWriter WriterType; - WriterType::Pointer writer = WriterType::New(); + using WriterType = itk::ImageFileWriter; + WriterType::Pointer writer = WriterType::New(); writer->SetInput(filter->GetOutput()); writer->SetFileName(argv[4]); try diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx index 54b57108563..7acd5e80941 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx @@ -40,12 +40,12 @@ itkParaDTTest(int argc, char * argv[]) itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); const int dim = 2; - typedef unsigned char PType; - typedef itk::Image IType; - typedef itk::Image FType; + using PType = unsigned char; + using IType = itk::Image; + using FType = itk::Image; - typedef itk::ImageFileReader ReaderType; - ReaderType::Pointer reader = ReaderType::New(); + using ReaderType = itk::ImageFileReader; + ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(argv[1]); try { @@ -60,8 +60,8 @@ itkParaDTTest(int argc, char * argv[]) IType::Pointer input = reader->GetOutput(); // threshold the input to create a mask - typedef itk::BinaryThresholdImageFilter ThreshType; - ThreshType::Pointer thresh = ThreshType::New(); + using ThreshType = itk::BinaryThresholdImageFilter; + ThreshType::Pointer thresh = ThreshType::New(); thresh->SetInput(input); thresh->SetUpperThreshold(atoi(argv[2])); @@ -69,7 +69,7 @@ itkParaDTTest(int argc, char * argv[]) thresh->SetOutsideValue(255); // now to apply the distance transform - typedef itk::MorphologicalDistanceTransformImageFilter FilterType; + using FilterType = itk::MorphologicalDistanceTransformImageFilter; FilterType::Pointer filter = FilterType::New(); @@ -85,8 +85,8 @@ itkParaDTTest(int argc, char * argv[]) return EXIT_FAILURE; } - typedef itk::ImageFileWriter WriterType; - WriterType::Pointer writer = WriterType::New(); + using WriterType = itk::ImageFileWriter; + WriterType::Pointer writer = WriterType::New(); writer->SetInput(filter->GetOutput()); writer->SetFileName(argv[4]); try diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx index 078d4617828..83916ea4d93 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx @@ -34,8 +34,8 @@ itkParaDilateTest(int argc, char * argv[]) itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); const int dim = 2; - typedef unsigned char PType; - typedef itk::Image IType; + using PType = unsigned char; + using IType = itk::Image; float scale(1.0); if (argc > 4) @@ -43,8 +43,8 @@ itkParaDilateTest(int argc, char * argv[]) scale = atof(argv[4]); } - typedef itk::ImageFileReader ReaderType; - ReaderType::Pointer reader = ReaderType::New(); + using ReaderType = itk::ImageFileReader; + ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(argv[1]); try { @@ -56,7 +56,7 @@ itkParaDilateTest(int argc, char * argv[]) return EXIT_FAILURE; } - typedef itk::ParabolicDilateImageFilter FilterType; + using FilterType = itk::ParabolicDilateImageFilter; FilterType::Pointer filter = FilterType::New(); @@ -75,8 +75,8 @@ itkParaDilateTest(int argc, char * argv[]) return EXIT_FAILURE; } - typedef itk::ImageFileWriter WriterType; - WriterType::Pointer writer = WriterType::New(); + using WriterType = itk::ImageFileWriter; + WriterType::Pointer writer = WriterType::New(); writer->SetInput(filter->GetOutput()); writer->SetFileName(argv[2]); try diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx index 85dbdcffdc5..24c502ee263 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx @@ -34,8 +34,8 @@ itkParaErodeTest(int argc, char * argv[]) itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); const int dim = 2; - typedef unsigned char PType; - typedef itk::Image IType; + using PType = unsigned char; + using IType = itk::Image; float scale(1.0); if (argc > 4) @@ -43,8 +43,8 @@ itkParaErodeTest(int argc, char * argv[]) scale = atof(argv[4]); } - typedef itk::ImageFileReader ReaderType; - ReaderType::Pointer reader = ReaderType::New(); + using ReaderType = itk::ImageFileReader; + ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(argv[1]); try { @@ -56,7 +56,7 @@ itkParaErodeTest(int argc, char * argv[]) return EXIT_FAILURE; } - typedef itk::ParabolicErodeImageFilter FilterType; + using FilterType = itk::ParabolicErodeImageFilter; FilterType::Pointer filter = FilterType::New(); @@ -75,8 +75,8 @@ itkParaErodeTest(int argc, char * argv[]) return EXIT_FAILURE; } - typedef itk::ImageFileWriter WriterType; - WriterType::Pointer writer = WriterType::New(); + using WriterType = itk::ImageFileWriter; + WriterType::Pointer writer = WriterType::New(); writer->SetInput(filter->GetOutput()); writer->SetFileName(argv[2]); try diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx index f3a74929f06..15bbdf974c5 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx @@ -31,11 +31,11 @@ itkParaOpenTest(int argc, char * argv[]) itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); const int dim = 2; - typedef unsigned char PType; - typedef itk::Image IType; + using PType = unsigned char; + using IType = itk::Image; - typedef itk::ImageFileReader ReaderType; - ReaderType::Pointer reader = ReaderType::New(); + using ReaderType = itk::ImageFileReader; + ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(argv[1]); try { @@ -47,7 +47,7 @@ itkParaOpenTest(int argc, char * argv[]) return EXIT_FAILURE; } - typedef itk::ParabolicOpenImageFilter FilterType; + using FilterType = itk::ParabolicOpenImageFilter; FilterType::Pointer filter = FilterType::New(); @@ -69,8 +69,8 @@ itkParaOpenTest(int argc, char * argv[]) return EXIT_FAILURE; } - typedef itk::ImageFileWriter WriterType; - WriterType::Pointer writer = WriterType::New(); + using WriterType = itk::ImageFileWriter; + WriterType::Pointer writer = WriterType::New(); writer->SetInput(filter->GetOutput()); writer->SetFileName(argv[2]); try diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx index fb882bb816a..f285bebc158 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx @@ -48,12 +48,12 @@ itkParaSharpenTest(int argc, char * argv[]) // itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); const int dim = 2; - typedef unsigned char PType; - typedef itk::Image IType; - typedef itk::Image FType; + using PType = unsigned char; + using IType = itk::Image; + using FType = itk::Image; - typedef itk::ImageFileWriter WriterType; - WriterType::Pointer writer = WriterType::New(); + using WriterType = itk::ImageFileWriter; + WriterType::Pointer writer = WriterType::New(); // create the input image - we will blur a dot, threshold then blur again IType::Pointer input = IType::New(); @@ -75,17 +75,17 @@ itkParaSharpenTest(int argc, char * argv[]) input->FillBuffer(0); input->SetPixel(index, 255); - typedef itk::BinaryBallStructuringElement SRType; - typedef itk::GrayscaleDilateImageFilter DilateType; - DilateType::Pointer smallDilate = DilateType::New(); - SRType smallkernel; - SRType::RadiusType smallrad = smallkernel.GetRadius(); + using SRType = itk::BinaryBallStructuringElement; + using DilateType = itk::GrayscaleDilateImageFilter; + DilateType::Pointer smallDilate = DilateType::New(); + SRType smallkernel; + SRType::RadiusType smallrad = smallkernel.GetRadius(); smallrad.Fill(7); smallkernel.SetRadius(smallrad); smallkernel.CreateStructuringElement(); smallDilate->SetKernel(smallkernel); - typedef itk::SmoothingRecursiveGaussianImageFilter SmootherType; + using SmootherType = itk::SmoothingRecursiveGaussianImageFilter; SmootherType::Pointer smoother = SmootherType::New(); @@ -120,7 +120,7 @@ itkParaSharpenTest(int argc, char * argv[]) // now to apply the sharpening - typedef itk::MorphologicalSharpeningImageFilter FilterType; + using FilterType = itk::MorphologicalSharpeningImageFilter; FilterType::Pointer filter = FilterType::New(); @@ -137,8 +137,8 @@ itkParaSharpenTest(int argc, char * argv[]) return EXIT_FAILURE; } - typedef itk::ImageFileWriter FlWriterType; - FlWriterType::Pointer flwriter = FlWriterType::New(); + using FlWriterType = itk::ImageFileWriter; + FlWriterType::Pointer flwriter = FlWriterType::New(); flwriter->SetInput(filter->GetOutput()); flwriter->SetFileName(argv[2]); diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx index e06134ac876..be43cc13091 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx @@ -34,11 +34,11 @@ itkParaSpacingTest(int, char * argv[]) itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); const int dim = 2; - typedef unsigned char PType; - typedef itk::Image IType; + using PType = unsigned char; + using IType = itk::Image; - typedef itk::ImageFileReader ReaderType; - ReaderType::Pointer reader = ReaderType::New(); + using ReaderType = itk::ImageFileReader; + ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(argv[1]); try { @@ -50,7 +50,7 @@ itkParaSpacingTest(int, char * argv[]) return EXIT_FAILURE; } - typedef itk::ParabolicOpenImageFilter FilterType; + using FilterType = itk::ParabolicOpenImageFilter; FilterType::Pointer filter = FilterType::New(); @@ -72,8 +72,8 @@ itkParaSpacingTest(int, char * argv[]) return EXIT_FAILURE; } - typedef itk::ImageFileWriter WriterType; - WriterType::Pointer writer = WriterType::New(); + using WriterType = itk::ImageFileWriter; + WriterType::Pointer writer = WriterType::New(); writer->SetInput(filter->GetOutput()); writer->SetFileName(argv[2]); try @@ -88,8 +88,8 @@ itkParaSpacingTest(int, char * argv[]) // now we'll change the image spacing and see if we can reproduce // the result - typedef itk::ChangeInformationImageFilter ChangeType; - ChangeType::Pointer changer = ChangeType::New(); + using ChangeType = itk::ChangeInformationImageFilter; + ChangeType::Pointer changer = ChangeType::New(); changer->SetInput(reader->GetOutput()); ChangeType::SpacingType oldspacing, newspacing; From cf91a98cd3a703513e4a665e6b02871a7b093a6a Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Tue, 13 Feb 2018 08:25:02 -0600 Subject: [PATCH 123/165] STYLE: Prefer constexpr for const numeric literals Use constexpr for constant numeric literals. --- .../ParabolicMorphology/test/itkBinaryCloseParaTest.cxx | 2 +- .../ParabolicMorphology/test/itkBinaryDilateParaTest.cxx | 2 +- .../ParabolicMorphology/test/itkBinaryErodeParaTest.cxx | 2 +- .../ParabolicMorphology/test/itkBinaryOpenParaTest.cxx | 2 +- Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx | 2 +- .../Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx | 2 +- Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx | 2 +- Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx | 2 +- .../Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx | 2 +- .../Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx index 1f496c66f18..23cba75a2db 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx @@ -36,7 +36,7 @@ itkBinaryCloseParaTest(int argc, char * argv[]) } itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; + constexpr int dim = 2; using PType = unsigned char; using IType = itk::Image; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx index c4f6786bc69..27acdc059e8 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx @@ -36,7 +36,7 @@ itkBinaryDilateParaTest(int argc, char * argv[]) } itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; + constexpr int dim = 2; using PType = unsigned char; using IType = itk::Image; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx index f8d244aa959..884688a5a7a 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx @@ -36,7 +36,7 @@ itkBinaryErodeParaTest(int argc, char * argv[]) } itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; + constexpr int dim = 2; using PType = unsigned char; using IType = itk::Image; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx index 84f17804a61..edcabdaa177 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx @@ -36,7 +36,7 @@ itkBinaryOpenParaTest(int argc, char * argv[]) } itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; + constexpr int dim = 2; using PType = unsigned char; using IType = itk::Image; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx index 7acd5e80941..d8be369fe33 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx @@ -38,7 +38,7 @@ itkParaDTTest(int argc, char * argv[]) } itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; + constexpr int dim = 2; using PType = unsigned char; using IType = itk::Image; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx index 83916ea4d93..c0772397745 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx @@ -32,7 +32,7 @@ int itkParaDilateTest(int argc, char * argv[]) { itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; + constexpr int dim = 2; using PType = unsigned char; using IType = itk::Image; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx index 24c502ee263..a7a8c4ec016 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx @@ -32,7 +32,7 @@ int itkParaErodeTest(int argc, char * argv[]) { itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; + constexpr int dim = 2; using PType = unsigned char; using IType = itk::Image; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx index 15bbdf974c5..08ba6b19a84 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx @@ -29,7 +29,7 @@ int itkParaOpenTest(int argc, char * argv[]) { itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; + constexpr int dim = 2; using PType = unsigned char; using IType = itk::Image; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx index f285bebc158..5b8d296febf 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx @@ -46,7 +46,7 @@ itkParaSharpenTest(int argc, char * argv[]) iterations = atoi(argv[1]); // itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; + constexpr int dim = 2; using PType = unsigned char; using IType = itk::Image; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx index be43cc13091..4122e701d52 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx @@ -32,7 +32,7 @@ int itkParaSpacingTest(int, char * argv[]) { itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); - const int dim = 2; + constexpr int dim = 2; using PType = unsigned char; using IType = itk::Image; From c62fd5d3e0e1a78d488cda77d9c7293ad2478498 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Sun, 18 Mar 2018 15:23:01 -0400 Subject: [PATCH 124/165] ENH: Add support for independent module builds --- Modules/Filtering/ParabolicMorphology/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt index 0859b488847..e55581e3de3 100644 --- a/Modules/Filtering/ParabolicMorphology/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/CMakeLists.txt @@ -1,2 +1,3 @@ project(ParabolicMorphology) + itk_module_impl() From 7d33664a2d6477c4125395f02d7fa9858486df10 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Sun, 18 Mar 2018 15:37:11 -0400 Subject: [PATCH 125/165] COMP: Address change in GetMultiThreader return type To address: /home/matt/src/ITKParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx:184:18: error: cannot initialize a variable of type 'itk::MultiThreader *' with an rvalue of type 'MultiThreaderType *' (aka 'itk::MultiThreaderBase *') MultiThreader *multithreader = this->GetMultiThreader(); ^ ~~~~~~~~~~~~~~~~~~~~~~~~ /home/matt/src/ITKParabolicMorphology/include/itkParabolicErodeImageFilter.h:88:3: note: in instantiation of member function 'itk::ParabolicErodeDilateImageFilter, false, itk::Image >::GenerateData' requested here ParabolicErodeImageFilter(){} ->GetMultiThreader() returns itk::MultiThreaderBase * type instead of itk::MultiThreader. --- .../include/itkParabolicErodeDilateImageFilter.hxx | 2 +- .../include/itkParabolicOpenCloseImageFilter.hxx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx index 6965d473331..c924e825eb9 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx @@ -176,7 +176,7 @@ ParabolicErodeDilateImageFilter::GenerateDa typename ImageSource::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/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx index 53befd712d5..9b25ff8fb4a 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx @@ -194,7 +194,7 @@ ParabolicOpenCloseImageFilter::GenerateData(v typename ImageSource::ThreadStruct str; str.Filter = this; - MultiThreader * multithreader = this->GetMultiThreader(); + ProcessObject::MultiThreaderType * multithreader = this->GetMultiThreader(); multithreader->SetNumberOfThreads(nbthreads); multithreader->SetSingleMethod(this->ThreaderCallback, &str); From 1e99b790b0098d876bc3ce97941895e8b666497f Mon Sep 17 00:00:00 2001 From: Francois Budin Date: Tue, 27 Mar 2018 14:07:42 -0400 Subject: [PATCH 126/165] BUG: Bounds type in GenerateData() needs to be of type PadFilterType::SizeType Using an array of type `long` leads to compilations errors on Windows: error C2664: 'void itk::PadImageFilter::SetPadLowerBound(const unsigned __int64 [])': cannot convert argument 1 from 'unsigned long [2]' to 'const itk::Size<2>' --- .../include/itkParabolicOpenCloseSafeBorderImageFilter.hxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx index 0c6d6bcda9a..2a8a6566c74 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx @@ -33,9 +33,9 @@ ParabolicOpenCloseSafeBorderImageFilter::Gene // Allocate the output this->AllocateOutputs(); - InputImageConstPointer inputImage; - unsigned long Bounds[ImageDimension]; - typename TInputImage::SizeType BoundsSize; + InputImageConstPointer inputImage; + PadFilterType::SizeType Bounds; + typename PadFilterType::SizeType BoundsSize; if (this->m_SafeBorder) { // need to compute some image statistics and determine the padding From 41f6d6fb5ad8d27a397682df3fb7d26d58ee2430 Mon Sep 17 00:00:00 2001 From: Francois Budin Date: Wed, 28 Mar 2018 10:38:49 -0400 Subject: [PATCH 127/165] BUG: Missing typename Missing typename introduced by previous commit that changed a variable type to correct a compilation problem on Windows [1]. [1] 1e99b790b0098d876bc3ce97941895e8b666497f --- .../include/itkParabolicOpenCloseSafeBorderImageFilter.hxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx index 2a8a6566c74..845f48a2811 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx @@ -34,7 +34,7 @@ ParabolicOpenCloseSafeBorderImageFilter::Gene // Allocate the output this->AllocateOutputs(); InputImageConstPointer inputImage; - PadFilterType::SizeType Bounds; + typename PadFilterType::SizeType Bounds; typename PadFilterType::SizeType BoundsSize; if (this->m_SafeBorder) { From ce3d7f9bc39dab7a02029381c338a3279e38425b Mon Sep 17 00:00:00 2001 From: Jon Haitz Legarreta Date: Sat, 14 Apr 2018 19:25:53 +0200 Subject: [PATCH 128/165] 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. --- .../include/itkBinaryCloseParaImageFilter.h | 4 ++-- .../include/itkBinaryDilateParaImageFilter.h | 4 ++-- .../include/itkBinaryErodeParaImageFilter.h | 4 ++-- .../include/itkBinaryOpenParaImageFilter.h | 4 ++-- .../include/itkGreaterEqualValImageFilter.h | 5 ++--- .../include/itkMorphSDTHelperImageFilter.h | 5 ++--- .../include/itkMorphologicalDistanceTransformImageFilter.h | 4 ++-- .../include/itkMorphologicalSharpeningImageFilter.h | 4 ++-- .../itkMorphologicalSignedDistanceTransformImageFilter.h | 4 ++-- .../include/itkParabolicCloseImageFilter.h | 4 ++-- .../include/itkParabolicDilateImageFilter.h | 4 ++-- .../include/itkParabolicErodeDilateImageFilter.h | 4 ++-- .../include/itkParabolicErodeImageFilter.h | 4 ++-- .../include/itkParabolicOpenCloseImageFilter.h | 4 ++-- .../include/itkParabolicOpenCloseSafeBorderImageFilter.h | 4 ++-- .../include/itkParabolicOpenImageFilter.h | 4 ++-- .../ParabolicMorphology/include/itkSharpenOpImageFilter.h | 5 ++--- 17 files changed, 34 insertions(+), 37 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h index 47f97e421c1..cc089e3c8cd 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h @@ -70,6 +70,8 @@ class ITK_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter; @@ -159,8 +161,6 @@ class ITK_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter; private: - ITK_DISALLOW_COPY_AND_ASSIGN(BinaryCloseParaImageFilter); - RadiusType m_Radius; bool m_Circular; bool m_SafeBorder; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h index ba8b7311c56..f193e7d53d5 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h @@ -68,6 +68,8 @@ class ITK_EXPORT BinaryDilateParaImageFilter : public ImageToImageFilter; @@ -145,8 +147,6 @@ class ITK_EXPORT BinaryDilateParaImageFilter : public ImageToImageFilter; private: - ITK_DISALLOW_COPY_AND_ASSIGN(BinaryDilateParaImageFilter); - RadiusType m_Radius; bool m_Circular; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h index ef7e1be2894..888187feeeb 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h @@ -69,6 +69,8 @@ class ITK_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilter; @@ -146,8 +148,6 @@ class ITK_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilter; private: - ITK_DISALLOW_COPY_AND_ASSIGN(BinaryErodeParaImageFilter); - RadiusType m_Radius; bool m_Circular; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h index e5b2f56e907..c8da9a63536 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h @@ -70,6 +70,8 @@ class ITK_EXPORT BinaryOpenParaImageFilter : public ImageToImageFilter; @@ -159,8 +161,6 @@ class ITK_EXPORT BinaryOpenParaImageFilter : public ImageToImageFilter; private: - ITK_DISALLOW_COPY_AND_ASSIGN(BinaryOpenParaImageFilter); - RadiusType m_Radius; bool m_Circular; bool m_SafeBorder; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h index fa392618753..9ee924ddbbb 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h @@ -72,6 +72,8 @@ class ITK_EXPORT GreaterEqualValImageFilter Functor::GEConst> { public: + ITK_DISALLOW_COPY_AND_ASSIGN(GreaterEqualValImageFilter); + /** Standard class type alias. */ using Self = GreaterEqualValImageFilter; using Superclass = @@ -100,9 +102,6 @@ class ITK_EXPORT GreaterEqualValImageFilter protected: GreaterEqualValImageFilter() {} ~GreaterEqualValImageFilter() override {} - -private: - ITK_DISALLOW_COPY_AND_ASSIGN(GreaterEqualValImageFilter); }; } // end namespace itk diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h index d1b0933b5aa..962f1dfa86c 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h @@ -93,6 +93,8 @@ class ITK_EXPORT MorphSDTHelperImageFilter typename TOutputImage::PixelType>> { public: + ITK_DISALLOW_COPY_AND_ASSIGN(MorphSDTHelperImageFilter); + /** Standard class type alias. */ using Self = MorphSDTHelperImageFilter; using Superclass = TernaryFunctorImageFilter class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImageFilter { public: + ITK_DISALLOW_COPY_AND_ASSIGN(MorphologicalDistanceTransformImageFilter); + /** Standard class type alias. */ using Self = MorphologicalDistanceTransformImageFilter; using Superclass = ImageToImageFilter; @@ -142,8 +144,6 @@ class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImage using SqrtType = typename itk::SqrtImageFilter; private: - ITK_DISALLOW_COPY_AND_ASSIGN(MorphologicalDistanceTransformImageFilter); - InputPixelType m_OutsideValue; typename ErodeType::Pointer m_Erode; typename ThreshType::Pointer m_Thresh; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h index a03db1ec305..676c37458d0 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h @@ -67,6 +67,8 @@ template class ITK_EXPORT MorphologicalSharpeningImageFilter : public ImageToImageFilter { public: + ITK_DISALLOW_COPY_AND_ASSIGN(MorphologicalSharpeningImageFilter); + /** Standard class type alias. */ using Self = MorphologicalSharpeningImageFilter; using Superclass = ImageToImageFilter; @@ -165,8 +167,6 @@ class ITK_EXPORT MorphologicalSharpeningImageFilter : public ImageToImageFilter< typename itk::SharpenOpImageFilter; private: - ITK_DISALLOW_COPY_AND_ASSIGN(MorphologicalSharpeningImageFilter); - int m_Iterations; typename ErodeType::Pointer m_Erode; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h index 795dad51827..5998f09b920 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h @@ -71,6 +71,8 @@ template class ITK_EXPORT MorphologicalSignedDistanceTransformImageFilter : public ImageToImageFilter { public: + ITK_DISALLOW_COPY_AND_ASSIGN(MorphologicalSignedDistanceTransformImageFilter); + /** Standard class type alias. */ using Self = MorphologicalSignedDistanceTransformImageFilter; using Superclass = ImageToImageFilter; @@ -188,8 +190,6 @@ class ITK_EXPORT MorphologicalSignedDistanceTransformImageFilter : public ImageT using HelperType = typename itk::MorphSDTHelperImageFilter; private: - ITK_DISALLOW_COPY_AND_ASSIGN(MorphologicalSignedDistanceTransformImageFilter); - InputPixelType m_OutsideValue; bool m_InsideIsPositive; typename ErodeType::Pointer m_Erode; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h index e5abd5f8419..ba22b72a50d 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h @@ -51,6 +51,8 @@ class ITK_EXPORT ParabolicCloseImageFilter : public ParabolicOpenCloseSafeBorderImageFilter { public: + ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicCloseImageFilter); + /** Standard class type alias. */ using Self = ParabolicCloseImageFilter; using Superclass = ParabolicOpenCloseSafeBorderImageFilter; @@ -87,8 +89,6 @@ class ITK_EXPORT ParabolicCloseImageFilter ParabolicCloseImageFilter() {} virtual ~ParabolicCloseImageFilter() {} // void PrintSelf(std::ostream& os, Indent indent) const; -private: - ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicCloseImageFilter); }; } // end namespace itk diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h index 711e943d578..f2a0e938e48 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h @@ -49,6 +49,8 @@ template class ITK_EXPORT ParabolicDilateImageFilter : public ParabolicErodeDilateImageFilter { public: + ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicDilateImageFilter); + /** Standard class type alias. */ using Self = ParabolicDilateImageFilter; using Superclass = ParabolicErodeDilateImageFilter; @@ -83,8 +85,6 @@ class ITK_EXPORT ParabolicDilateImageFilter : public ParabolicErodeDilateImageFi ParabolicDilateImageFilter() {} ~ParabolicDilateImageFilter() override {} // void PrintSelf(std::ostream& os, Indent indent) const; -private: - ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicDilateImageFilter); }; } // end namespace itk diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index b8dff8bbf9a..20619a630ee 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h @@ -83,6 +83,8 @@ template { public: + ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicErodeDilateImageFilter); + /** Standard class type alias. */ using Self = ParabolicErodeDilateImageFilter; using Superclass = ImageToImageFilter; @@ -196,8 +198,6 @@ class ITK_EXPORT ParabolicErodeDilateImageFilter : public ImageToImageFilter class ITK_EXPORT ParabolicErodeImageFilter : public ParabolicErodeDilateImageFilter { public: + ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicErodeImageFilter); + /** Standard class type alias. */ using Self = ParabolicErodeImageFilter; using Superclass = ParabolicErodeDilateImageFilter; @@ -85,8 +87,6 @@ class ITK_EXPORT ParabolicErodeImageFilter : public ParabolicErodeDilateImageFil ParabolicErodeImageFilter() {} ~ParabolicErodeImageFilter() override {} // void PrintSelf(std::ostream& os, Indent indent) const; -private: - ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicErodeImageFilter); }; } // end namespace itk diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h index 1b1af7342da..7c15033ce42 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h @@ -53,6 +53,8 @@ template { public: + ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicOpenCloseImageFilter); + /** Standard class type alias. */ using Self = ParabolicOpenCloseImageFilter; using Superclass = ImageToImageFilter; @@ -163,8 +165,6 @@ class ITK_EXPORT ParabolicOpenCloseImageFilter : public ImageToImageFilter { public: + ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicOpenCloseSafeBorderImageFilter); + /** Standard class type alias. */ using Self = ParabolicOpenCloseSafeBorderImageFilter; using Superclass = ImageToImageFilter; @@ -166,8 +168,6 @@ class ITK_EXPORT ParabolicOpenCloseSafeBorderImageFilter : public ImageToImageFi int m_ParabolicAlgorithm; private: - ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicOpenCloseSafeBorderImageFilter); - typename MorphFilterType::Pointer m_MorphFilt; typename PadFilterType::Pointer m_PadFilt; typename CropFilterType::Pointer m_CropFilt; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h index 32e5fde7272..98e9c76a172 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h @@ -50,6 +50,8 @@ class ITK_EXPORT ParabolicOpenImageFilter : public ParabolicOpenCloseSafeBorderImageFilter { public: + ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicOpenImageFilter); + /** Standard class type alias. */ using Self = ParabolicOpenImageFilter; using Superclass = ParabolicOpenCloseSafeBorderImageFilter; @@ -83,8 +85,6 @@ class ITK_EXPORT ParabolicOpenImageFilter ParabolicOpenImageFilter() {} ~ParabolicOpenImageFilter() override {} // void PrintSelf(std::ostream& os, Indent indent) const; -private: - ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicOpenImageFilter); }; } // end namespace itk diff --git a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h index 7f84ee416b1..c479a1e9893 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h @@ -96,6 +96,8 @@ class ITK_EXPORT SharpenOpImageFilter typename TOutputImage::PixelType>> { public: + ITK_DISALLOW_COPY_AND_ASSIGN(SharpenOpImageFilter); + /** Standard class type alias. */ using Self = SharpenOpImageFilter; using Superclass = TernaryFunctorImageFilter Date: Mon, 21 May 2018 19:13:48 +0200 Subject: [PATCH 129/165] 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/ --- .../itkParabolicErodeDilateImageFilter.h | 2 +- .../itkParabolicErodeDilateImageFilter.hxx | 40 +------------------ .../include/itkParabolicMorphUtils.h | 24 +++++------ .../itkParabolicOpenCloseImageFilter.h | 2 +- .../itkParabolicOpenCloseImageFilter.hxx | 32 +-------------- 5 files changed, 16 insertions(+), 84 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index 20619a630ee..4872b52d5ea 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h @@ -185,7 +185,7 @@ class ITK_EXPORT ParabolicErodeDilateImageFilter : public ImageToImageFilter::GenerateDa template void -ParabolicErodeDilateImageFilter::ThreadedGenerateData( - const OutputImageRegionType & outputRegionForThread, - ThreadIdType threadId) +ParabolicErodeDilateImageFilter::DynamicThreadedGenerateData( + const OutputImageRegionType & outputRegionForThread) { - // 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++) - { - 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[m_CurrentDimension], - 30, - m_CurrentDimension * progressPerDimension, - progressPerDimension); - using InputConstIteratorType = ImageLinearConstIteratorWithIndex; using OutputIteratorType = ImageLinearIteratorWithIndex; @@ -237,15 +212,6 @@ ParabolicErodeDilateImageFilter::ThreadedGe OutputIteratorType outputIterator(outputImage, region); OutputConstIteratorType inputIteratorStage2(outputImage, region); - // setup the progress reporting - // unsigned int numberOfLinesToProcess = 0; - // for (unsigned dd = 0; dd < imageDimension; dd++) - // { - // numberOfLinesToProcess += region.GetSize()[dd]; - // } - - // ProgressReporter progress(this,0, numberOfLinesToProcess); - // deal with the first dimension - this should be copied to the // output if the scale is 0 if (m_CurrentDimension == 0) @@ -260,7 +226,6 @@ ParabolicErodeDilateImageFilter::ThreadedGe doOneDimension( inputIterator, outputIterator, - *progress, LineLength, 0, this->m_MagnitudeSign, @@ -299,7 +264,6 @@ ParabolicErodeDilateImageFilter::ThreadedGe doOneDimension( inputIteratorStage2, outputIterator, - *progress, LineLength, m_CurrentDimension, this->m_MagnitudeSign, diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h index b701ed863c2..7f53239636f 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h @@ -20,7 +20,6 @@ #include -#include "itkProgressReporter.h" namespace itk { // contact point algorithm @@ -178,17 +177,16 @@ DoLineIntAlg(LineBufferType & LineBuf, template void -doOneDimension(TInIter & inputIterator, - TOutIter & outputIterator, - ProgressReporter & progress, - const long LineLength, - const unsigned direction, - const int m_MagnitudeSign, - const bool m_UseImageSpacing, - const RealType m_Extreme, - const RealType image_scale, - const RealType Sigma, - int ParabolicAlgorithmChoice) +doOneDimension(TInIter & inputIterator, + TOutIter & outputIterator, + const long LineLength, + const unsigned direction, + const int m_MagnitudeSign, + const bool m_UseImageSpacing, + const RealType m_Extreme, + const RealType image_scale, + const RealType Sigma, + int ParabolicAlgorithmChoice) { enum ParabolicAlgorithm { @@ -263,7 +261,6 @@ doOneDimension(TInIter & inputIterator, // now onto the next line inputIterator.NextLine(); outputIterator.NextLine(); - progress.CompletedPixel(); } } else @@ -309,7 +306,6 @@ doOneDimension(TInIter & inputIterator, // now onto the next line inputIterator.NextLine(); outputIterator.NextLine(); - progress.CompletedPixel(); } } } diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h index 7c15033ce42..61195da8b93 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h @@ -153,7 +153,7 @@ class ITK_EXPORT ParabolicOpenCloseImageFilter : public ImageToImageFilter::GenerateData(v template void -ParabolicOpenCloseImageFilter::ThreadedGenerateData( - const OutputImageRegionType & outputRegionForThread, - ThreadIdType threadId) +ParabolicOpenCloseImageFilter::DynamicThreadedGenerateData( + const OutputImageRegionType & outputRegionForThread) { - // 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++) - { - 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[m_CurrentDimension], - 30, - m_CurrentDimension * progressPerDimension, - progressPerDimension); - using InputConstIteratorType = ImageLinearConstIteratorWithIndex; using OutputIteratorType = ImageLinearIteratorWithIndex; @@ -326,7 +301,6 @@ ParabolicOpenCloseImageFilter::ThreadedGenera doOneDimension( inputIterator, outputIterator, - *progress, LineLength, 0, this->m_MagnitudeSign, @@ -363,7 +337,6 @@ ParabolicOpenCloseImageFilter::ThreadedGenera doOneDimension( inputIteratorStage2, outputIterator, - *progress, LineLength, m_CurrentDimension, this->m_MagnitudeSign, @@ -387,7 +360,6 @@ ParabolicOpenCloseImageFilter::ThreadedGenera doOneDimension( inputIteratorStage2, outputIterator, - *progress, LineLength, m_CurrentDimension, this->m_MagnitudeSign, From 6e3c949473697e9705ccb3e77cf50459fc9f4bad Mon Sep 17 00:00:00 2001 From: Jon Haitz Legarreta Date: Mon, 28 May 2018 09:02:37 +0200 Subject: [PATCH 130/165] BUG: Initialize the dynamic multi-threading member variable. Initialize the `m_DynamicMultiThreadingp` member by calling `this->DynamicMultiThreadingOn();`. --- .../include/itkParabolicErodeDilateImageFilter.hxx | 2 ++ .../include/itkParabolicOpenCloseImageFilter.hxx | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx index 5d6d03c0eff..e61942099ec 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx @@ -54,6 +54,8 @@ ParabolicErodeDilateImageFilter::ParabolicE } m_UseImageSpacing = false; m_ParabolicAlgorithm = INTERSECTION; + + this->DynamicMultiThreadingOn(); } template diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx index 05ed8886529..7b505b019bf 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx @@ -63,6 +63,8 @@ ParabolicOpenCloseImageFilter::ParabolicOpenC m_ParabolicAlgorithm = INTERSECTION; m_Stage = 1; // indicate whether we are on the first pass or the // second + + this->DynamicMultiThreadingOn(); } template From 7b98976216ca1b6a2292d8496e6df7a56c47c710 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Sun, 30 Sep 2018 13:26:43 -0400 Subject: [PATCH 131/165] COMP: Adapt to new multi-threading naming convention. Adapt to new multi-threading naming convention. Specifically: - Change `itk::DomainThreader::GetNumberOfThreads` to `itk::DomainThreader::GetNumberOfWorkUnits`. - Change `itk::DomainThreader::SetNumberOfThreads` to `itk::DomainThreader::SetNumberOfWorkUnits`. after commit: InsightSoftwareConsortium/ITK@ce15429 Addresses deprecation warnings such as: ``` /ITKParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx:206:36: warning: 'virtual void itk::MultiThreaderBase::SetNumberOfThreads(itk::ThreadIdType)' is deprecated [-Wdeprecated-declarations] multithreader->SetNumberOfThreads(nbthreads); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~ In file included from /ITK/Modules/IO/ImageBase/include/itkImageFileReaderException.h:22:0, from /ITK/Modules/IO/ImageBase/include/itkImageFileReader.h:20, from /ITKParabolicMorphology/test/itkParaOpenTest.cxx:19: /ITK/Modules/Core/Common/include/itkMultiThreaderBase.h:158:32: note: declared here itkLegacyMacro( virtual void SetNumberOfThreads( ThreadIdType numberOfThreads ) ) ^ /ITK/Modules/Core/Common/include/itkMacro.h:559:32: note: in definition of macro 'itkLegacyMacro' ^~~~~~ ``` Uncovered by the CI added in PR #15 and Circle CI failures in: https://circleci.com/gh/InsightSoftwareConsortium/ITKParabolicMorphology/4?utm_campaign=vcs-integration-link&utm_medium=referral&utm_source=github-build-link --- .../include/itkParabolicErodeDilateImageFilter.hxx | 2 +- .../include/itkParabolicOpenCloseImageFilter.hxx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx index e61942099ec..9819cc7e60b 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx @@ -165,7 +165,7 @@ template void ParabolicErodeDilateImageFilter::GenerateData(void) { - ThreadIdType nbthreads = this->GetNumberOfThreads(); + ThreadIdType nbthreads = this->GetNumberOfWorkUnits(); typename TInputImage::ConstPointer inputImage(this->GetInput()); typename TOutputImage::Pointer outputImage(this->GetOutput()); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx index 7b505b019bf..fed4840f779 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx @@ -175,7 +175,7 @@ template void ParabolicOpenCloseImageFilter::GenerateData(void) { - ThreadIdType nbthreads = this->GetNumberOfThreads(); + ThreadIdType nbthreads = this->GetNumberOfWorkUnits(); // using InputConstIteratorType = ImageLinearConstIteratorWithIndex< TInputImage > ; // using OutputIteratorType = ImageLinearIteratorWithIndex< TOutputImage >; @@ -197,7 +197,7 @@ ParabolicOpenCloseImageFilter::GenerateData(v str.Filter = this; ProcessObject::MultiThreaderType * multithreader = this->GetMultiThreader(); - multithreader->SetNumberOfThreads(nbthreads); + multithreader->SetNumberOfWorkUnits(nbthreads); multithreader->SetSingleMethod(this->ThreaderCallback, &str); // multithread the execution @@ -231,7 +231,7 @@ ParabolicOpenCloseImageFilter::GenerateData(v // Set up the multithreaded processing typename ImageSource< TOutputImage >::ThreadStruct str; str.Filter = this; - this->GetMultiThreader()->SetNumberOfThreads( this->GetNumberOfThreads() ); + this->GetMultiThreader()->SetNumberOfWorkUnits( this->GetNumberOfWorkUnits() ); this->GetMultiThreader()->SetSingleMethod(this->ThreaderCallback, &str); // multithread the execution - stage 1 From 2ed4577252d4ab46814b258c0eaa3233d69ad849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C5=BEenan=20Zuki=C4=87?= Date: Sat, 20 Oct 2018 12:51:19 -0400 Subject: [PATCH 132/165] COMP: fix building with current master --- .../include/itkParabolicErodeDilateImageFilter.hxx | 2 +- .../ParabolicMorphology/test/itkBinaryCloseParaTest.cxx | 4 ++-- .../ParabolicMorphology/test/itkBinaryDilateParaTest.cxx | 4 ++-- .../ParabolicMorphology/test/itkBinaryErodeParaTest.cxx | 4 ++-- .../ParabolicMorphology/test/itkBinaryOpenParaTest.cxx | 4 ++-- Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx | 4 ++-- .../Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx | 4 ++-- .../Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx | 4 ++-- .../Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx | 4 ++-- .../Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx | 4 ++-- .../Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx | 4 ++-- 11 files changed, 21 insertions(+), 21 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx index 9819cc7e60b..e102957df9f 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx @@ -179,7 +179,7 @@ ParabolicErodeDilateImageFilter::GenerateDa str.Filter = this; ProcessObject::MultiThreaderType * multithreader = this->GetMultiThreader(); - multithreader->SetNumberOfThreads(nbthreads); + multithreader->SetNumberOfWorkUnits(nbthreads); multithreader->SetSingleMethod(this->ThreaderCallback, &str); // multithread the execution diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx index 23cba75a2db..3acfbefaba7 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx @@ -22,7 +22,7 @@ #include "itkSimpleFilterWatcher.h" #include "itkTimeProbe.h" -#include "itkMultiThreader.h" +#include "itkMultiThreaderBase.h" #include #include "itkBinaryCloseParaImageFilter.h" @@ -35,7 +35,7 @@ itkBinaryCloseParaTest(int argc, char * argv[]) return (EXIT_FAILURE); } - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads(1); constexpr int dim = 2; using PType = unsigned char; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx index 27acdc059e8..e33a0ee4842 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx @@ -22,7 +22,7 @@ #include "itkSimpleFilterWatcher.h" #include "itkTimeProbe.h" -#include "itkMultiThreader.h" +#include "itkMultiThreaderBase.h" #include #include "itkBinaryDilateParaImageFilter.h" @@ -35,7 +35,7 @@ itkBinaryDilateParaTest(int argc, char * argv[]) return (EXIT_FAILURE); } - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads(1); constexpr int dim = 2; using PType = unsigned char; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx index 884688a5a7a..9b266f1b7f9 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx @@ -22,7 +22,7 @@ #include "itkSimpleFilterWatcher.h" #include "itkTimeProbe.h" -#include "itkMultiThreader.h" +#include "itkMultiThreaderBase.h" #include #include "itkBinaryErodeParaImageFilter.h" @@ -35,7 +35,7 @@ itkBinaryErodeParaTest(int argc, char * argv[]) return (EXIT_FAILURE); } - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads(1); constexpr int dim = 2; using PType = unsigned char; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx index edcabdaa177..11a95517b96 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx @@ -22,7 +22,7 @@ #include "itkSimpleFilterWatcher.h" #include "itkTimeProbe.h" -#include "itkMultiThreader.h" +#include "itkMultiThreaderBase.h" #include #include "itkBinaryOpenParaImageFilter.h" @@ -35,7 +35,7 @@ itkBinaryOpenParaTest(int argc, char * argv[]) return (EXIT_FAILURE); } - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads(1); constexpr int dim = 2; using PType = unsigned char; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx index d8be369fe33..d011df083a7 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx @@ -24,7 +24,7 @@ #include "itkBinaryThresholdImageFilter.h" #include "itkMorphologicalDistanceTransformImageFilter.h" #include "itkTimeProbe.h" -#include "itkMultiThreader.h" +#include "itkMultiThreaderBase.h" int itkParaDTTest(int argc, char * argv[]) @@ -37,7 +37,7 @@ itkParaDTTest(int argc, char * argv[]) return (EXIT_FAILURE); } - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads(1); constexpr int dim = 2; using PType = unsigned char; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx index c0772397745..1fd9f6517b1 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx @@ -24,14 +24,14 @@ #include "itkParabolicDilateImageFilter.h" #include "itkTimeProbe.h" -#include "itkMultiThreader.h" +#include "itkMultiThreaderBase.h" // sanity check of the image spacing option int itkParaDilateTest(int argc, char * argv[]) { - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads(1); constexpr int dim = 2; using PType = unsigned char; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx index a7a8c4ec016..be0787fc6b9 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx @@ -24,14 +24,14 @@ #include "itkParabolicErodeImageFilter.h" #include "itkTimeProbe.h" -#include "itkMultiThreader.h" +#include "itkMultiThreaderBase.h" // sanity check of the image spacing option int itkParaErodeTest(int argc, char * argv[]) { - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads(1); constexpr int dim = 2; using PType = unsigned char; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx index 08ba6b19a84..cabae865acc 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx @@ -23,12 +23,12 @@ #include "itkParabolicOpenImageFilter.h" #include "itkTimeProbe.h" -#include "itkMultiThreader.h" +#include "itkMultiThreaderBase.h" int itkParaOpenTest(int argc, char * argv[]) { - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads(1); constexpr int dim = 2; using PType = unsigned char; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx index 5b8d296febf..9785e94081f 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx @@ -30,7 +30,7 @@ #include "itkBinaryThresholdImageFilter.h" #include "itkMorphologicalSharpeningImageFilter.h" #include "itkTimeProbe.h" -#include "itkMultiThreader.h" +#include "itkMultiThreaderBase.h" int itkParaSharpenTest(int argc, char * argv[]) @@ -45,7 +45,7 @@ itkParaSharpenTest(int argc, char * argv[]) iterations = atoi(argv[1]); - // itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + // itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads( 1 ); constexpr int dim = 2; using PType = unsigned char; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx index 4122e701d52..1bd1592892b 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx @@ -24,14 +24,14 @@ #include "itkParabolicOpenImageFilter.h" #include "itkTimeProbe.h" -#include "itkMultiThreader.h" +#include "itkMultiThreaderBase.h" // sanity check of the image spacing option int itkParaSpacingTest(int, char * argv[]) { - itk::MultiThreader::SetGlobalMaximumNumberOfThreads(1); + itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads(1); constexpr int dim = 2; using PType = unsigned char; From 20ad6689c7bfc07f4e8308a2c788a5605405a1cf Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Thu, 1 Nov 2018 15:46:30 -0500 Subject: [PATCH 133/165] COMP: Prefer C++11 math over vcl_* The vcl_ functions are aliases to the C++11 variants, so just use C++11 directly. --- .../include/itkMorphSDTHelperImageFilter.h | 4 ++-- .../include/itkParabolicErodeDilateImageFilter.hxx | 4 ++-- .../include/itkParabolicOpenCloseImageFilter.hxx | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h index 962f1dfa86c..5d171285509 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h @@ -64,12 +64,12 @@ class MorphSDTHelper if (C > 0) { // inside the mask - return static_cast(vcl_sqrt((double)A + m_Val)); + return static_cast(std::sqrt((double)A + m_Val)); } else { // outside the mask - return static_cast(-vcl_sqrt(m_Val - (double)B)); + return static_cast(-std::sqrt(m_Val - (double)B)); } } diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx index e102957df9f..0ac99a7e87e 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx @@ -92,8 +92,8 @@ ParabolicErodeDilateImageFilter::SplitReque // determine the actual number of pieces that will be generated auto range = static_cast(requestedRegionSize[splitAxis]); - auto valuesPerThread = static_cast(vcl_ceil(range / static_cast(num))); - unsigned int maxThreadIdUsed = static_cast(vcl_ceil(range / static_cast(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) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx index fed4840f779..391f08278bb 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx @@ -101,8 +101,8 @@ ParabolicOpenCloseImageFilter::SplitRequested // determine the actual number of pieces that will be generated auto range = static_cast(requestedRegionSize[splitAxis]); - auto valuesPerThread = static_cast(vcl_ceil(range / static_cast(num))); - unsigned int maxThreadIdUsed = static_cast(vcl_ceil(range / static_cast(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) From 4b2286ec3bb4cfdf776636bbad94187215defde2 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Sat, 3 Nov 2018 09:28:25 -0500 Subject: [PATCH 134/165] COMP: Future proof vnl_math_XXX function usage. Prefer C++ over aliased names vnl_math_[min|max] -> std::[min|max] Prefer vnl_math::abs over deprecated alias vnl_math_abs In all compilers currently supported by VXL, vnl_math_[min|max] could be replaced with std::[min|max] without loss of functionality. This also circumvents part of the backwards compatibility requirements as vnl_math_ has been recently replaced with a namespace of vnl_math::. Since Wed Nov 14 07:42:48 2012: The vnl_math_* functions use #define aliases to their vnl_math::* counterparts in the "real" vnl_math:: namespace. The new syntax should be backwards compatible to VXL versions as old as 2012. Prefer to use itk::Math:: over vnl_math:: namespace --- .../include/itkBinaryCloseParaImageFilter.hxx | 4 ++-- .../include/itkBinaryOpenParaImageFilter.hxx | 4 ++-- .../include/itkMorphSDTHelperImageFilter.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx index 98099920dc3..33d87381d8b 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx @@ -24,7 +24,7 @@ #include "itkProgressAccumulator.h" #include "itkCropImageFilter.h" #include "itkConstantPadImageFilter.h" -#include "vnl/vnl_math.h" +#include "itkMath.h" namespace itk { @@ -83,7 +83,7 @@ BinaryCloseParaImageFilter::GenerateData(void) { typename TInputImage::SpacingValueType tsp = this->GetInput()->GetSpacing()[P]; R[P] = 0.5 * (m_Radius[P] * m_Radius[P]) + tsp * tsp; - Pad[P] = (typename TInputImage::SizeType::SizeValueType)(vnl_math_rnd_halfinttoeven(m_Radius[P] / tsp + 1) + 1); + Pad[P] = (typename TInputImage::SizeType::SizeValueType)(itk::Math::rnd_halfinttoeven(m_Radius[P] / tsp + 1) + 1); } m_RectErode->SetScale(R); m_CircErode->SetScale(R); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx index 969e4757943..1e497f82563 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx @@ -24,7 +24,7 @@ #include "itkProgressAccumulator.h" #include "itkCropImageFilter.h" #include "itkConstantPadImageFilter.h" -#include "vnl/vnl_math.h" +#include "itkMath.h" namespace itk { @@ -92,7 +92,7 @@ BinaryOpenParaImageFilter::GenerateData(void) // R[P] = 0.5 * thisRad * thisRad + // this->GetInput()->GetSpacing()[P]; R[P] = 0.5 * (m_Radius[P] * m_Radius[P]) + tsp * tsp; - Pad[P] = (typename TInputImage::SizeType::SizeValueType)(vnl_math_rnd_halfinttoeven(m_Radius[P] / tsp) + 2); + Pad[P] = (typename TInputImage::SizeType::SizeValueType)(itk::Math::rnd_halfinttoeven(m_Radius[P] / tsp) + 2); } m_RectErode->SetScale(R); m_CircErode->SetScale(R); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h index 5d171285509..068d07b4cdd 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h @@ -19,7 +19,7 @@ #define itkMorphSDTHelperImageFilter_h #include "itkTernaryFunctorImageFilter.h" -#include "vnl/vnl_math.h" +#include "itkMath.h" namespace itk { From cc0e17c21c00474e0ce6eff6775c818c05b0cc25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Thu, 1 Nov 2018 21:49:08 -0400 Subject: [PATCH 135/165] 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 condition 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. In agreement with: http://review.source.kitware.com/#/c/23738/ --- .../ParabolicMorphology/test/itkBinaryCloseParaTest.cxx | 4 ++-- .../ParabolicMorphology/test/itkBinaryDilateParaTest.cxx | 4 ++-- .../ParabolicMorphology/test/itkBinaryErodeParaTest.cxx | 4 ++-- .../ParabolicMorphology/test/itkBinaryOpenParaTest.cxx | 4 ++-- Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx | 4 ++-- .../Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx | 2 +- .../Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx | 2 +- .../Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx | 2 +- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx index 3acfbefaba7..ec70784abcd 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx @@ -58,7 +58,7 @@ itkBinaryCloseParaTest(int argc, char * argv[]) ThreshType::Pointer thresh = ThreshType::New(); thresh->SetInput(reader->GetOutput()); - thresh->SetUpperThreshold(atoi(argv[2])); + thresh->SetUpperThreshold(std::stoi(argv[2])); thresh->SetInsideValue(0); thresh->SetOutsideValue(1); // now to apply the erosion @@ -68,7 +68,7 @@ itkBinaryCloseParaTest(int argc, char * argv[]) filter->SetInput(thresh->GetOutput()); filter->SetUseImageSpacing(true); - filter->SetRadius(atof(argv[3])); + filter->SetRadius(std::stod(argv[3])); using WriterType = itk::ImageFileWriter; WriterType::Pointer writer = WriterType::New(); diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx index e33a0ee4842..0b4ec2bd675 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx @@ -58,7 +58,7 @@ itkBinaryDilateParaTest(int argc, char * argv[]) ThreshType::Pointer thresh = ThreshType::New(); thresh->SetInput(reader->GetOutput()); - thresh->SetUpperThreshold(atoi(argv[2])); + thresh->SetUpperThreshold(std::stoi(argv[2])); thresh->SetInsideValue(0); thresh->SetOutsideValue(1); // now to apply the erosion @@ -68,7 +68,7 @@ itkBinaryDilateParaTest(int argc, char * argv[]) filter->SetInput(thresh->GetOutput()); filter->SetUseImageSpacing(true); - filter->SetRadius(atof(argv[3])); + filter->SetRadius(std::stod(argv[3])); using WriterType = itk::ImageFileWriter; WriterType::Pointer writer = WriterType::New(); diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx index 9b266f1b7f9..3f11c7860e7 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx @@ -58,7 +58,7 @@ itkBinaryErodeParaTest(int argc, char * argv[]) ThreshType::Pointer thresh = ThreshType::New(); thresh->SetInput(reader->GetOutput()); - thresh->SetUpperThreshold(atoi(argv[2])); + thresh->SetUpperThreshold(std::stoi(argv[2])); thresh->SetInsideValue(0); thresh->SetOutsideValue(1); // now to apply the erosion @@ -68,7 +68,7 @@ itkBinaryErodeParaTest(int argc, char * argv[]) filter->SetInput(thresh->GetOutput()); filter->SetUseImageSpacing(true); - filter->SetRadius(atof(argv[3])); + filter->SetRadius(std::stod(argv[3])); using WriterType = itk::ImageFileWriter; WriterType::Pointer writer = WriterType::New(); diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx index 11a95517b96..7058528e833 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx @@ -58,7 +58,7 @@ itkBinaryOpenParaTest(int argc, char * argv[]) ThreshType::Pointer thresh = ThreshType::New(); thresh->SetInput(reader->GetOutput()); - thresh->SetUpperThreshold(atoi(argv[2])); + thresh->SetUpperThreshold(std::stoi(argv[2])); thresh->SetInsideValue(0); thresh->SetOutsideValue(1); // now to apply the erosion @@ -68,7 +68,7 @@ itkBinaryOpenParaTest(int argc, char * argv[]) filter->SetInput(thresh->GetOutput()); filter->SetUseImageSpacing(true); - filter->SetRadius(atof(argv[3])); + filter->SetRadius(std::stod(argv[3])); using WriterType = itk::ImageFileWriter; WriterType::Pointer writer = WriterType::New(); diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx index d011df083a7..2357fd1e5d7 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx @@ -64,7 +64,7 @@ itkParaDTTest(int argc, char * argv[]) ThreshType::Pointer thresh = ThreshType::New(); thresh->SetInput(input); - thresh->SetUpperThreshold(atoi(argv[2])); + thresh->SetUpperThreshold(std::stoi(argv[2])); thresh->SetInsideValue(0); thresh->SetOutsideValue(255); @@ -74,7 +74,7 @@ itkParaDTTest(int argc, char * argv[]) FilterType::Pointer filter = FilterType::New(); filter->SetInput(thresh->GetOutput()); - filter->SetOutsideValue(atoi(argv[3])); + filter->SetOutsideValue(std::stoi(argv[3])); try { filter->Update(); diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx index 1fd9f6517b1..4d692552f88 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx @@ -40,7 +40,7 @@ itkParaDilateTest(int argc, char * argv[]) float scale(1.0); if (argc > 4) { - scale = atof(argv[4]); + scale = std::stod(argv[4]); } using ReaderType = itk::ImageFileReader; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx index be0787fc6b9..a074b4a24df 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx @@ -40,7 +40,7 @@ itkParaErodeTest(int argc, char * argv[]) float scale(1.0); if (argc > 4) { - scale = atof(argv[4]); + scale = std::stod(argv[4]); } using ReaderType = itk::ImageFileReader; diff --git a/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx index 9785e94081f..5e5219e1fa5 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx @@ -43,7 +43,7 @@ itkParaSharpenTest(int argc, char * argv[]) return (EXIT_FAILURE); } - iterations = atoi(argv[1]); + iterations = std::stoi(argv[1]); // itk::MultiThreaderBase::SetGlobalMaximumNumberOfThreads( 1 ); constexpr int dim = 2; From 6912b3a3de9131defc2323e0488cc70aa6afb352 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Sun, 30 Sep 2018 10:51:01 -0400 Subject: [PATCH 136/165] ENH: Add CI configuration files. Add CircleCI configuration files and badges. --- .../ParabolicMorphology/itk-module.cmake | 18 +++++++++--------- .../wrapping/CMakeLists.txt | 11 +++++++++++ ...phologicalDistanceTransformImageFilter.wrap | 6 +++--- ...icalSignedDistanceTransformImageFilter.wrap | 6 +++--- .../wrapping/itkParabolicCloseImageFilter.wrap | 6 +++--- .../itkParabolicDilateImageFilter.wrap | 6 +++--- .../wrapping/itkParabolicErodeImageFilter.wrap | 6 +++--- .../wrapping/itkParabolicOpenImageFilter.wrap | 6 +++--- 8 files changed, 38 insertions(+), 27 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/itk-module.cmake b/Modules/Filtering/ParabolicMorphology/itk-module.cmake index 7429811471e..be9c7b7d88f 100644 --- a/Modules/Filtering/ParabolicMorphology/itk-module.cmake +++ b/Modules/Filtering/ParabolicMorphology/itk-module.cmake @@ -1,11 +1,11 @@ -set( - DOCUMENTATION - "This module contains classes for mathematical morphology using parabolic functions. -Parabolic functions can be used to build fast distance transforms, and -binary morphology using spheres. - http://www.insight-journal.org/browse/publication/228 - http://hdl.handle.net/1926/1370" -) +# the top-level README is used for describing this module, just +# re-used it for documentation here +# itk_module() defines the module dependencies in ParabolicMorphology +# The testing module in ParabolicMorphology 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( ParabolicMorphology DEPENDS @@ -17,5 +17,5 @@ itk_module( ITKMathematicalMorphology ITKSmoothing EXCLUDE_FROM_DEFAULT - DESCRIPTION "${DOCUMENTATION}" + DESCRIPTION "Module ingested from upstream." ) diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/wrapping/CMakeLists.txt index c110d759119..96db9f815b8 100644 --- a/Modules/Filtering/ParabolicMorphology/wrapping/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/wrapping/CMakeLists.txt @@ -1,3 +1,14 @@ itk_wrap_module(ParabolicMorphology) + +set( + WRAPPER_SUBMODULE_ORDER + itkMorphologicalDistanceTransformImageFilter + itkMorphologicalSignedDistanceTransformImageFilter + itkParabolicCloseImageFilter + itkParabolicDilateImageFilter + itkParabolicErodeImageFilter + itkParabolicOpenImageFilter +) + itk_auto_load_submodules() itk_end_wrap_module() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalDistanceTransformImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalDistanceTransformImageFilter.wrap index 3ee0eddd383..22489f78480 100644 --- a/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalDistanceTransformImageFilter.wrap +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalDistanceTransformImageFilter.wrap @@ -1,3 +1,3 @@ -WRAP_CLASS("itk::MorphologicalDistanceTransformImageFilter" POINTER) - WRAP_IMAGE_FILTER_COMBINATIONS("${WRAP_ITK_USIGN_INT}" "${WRAP_ITK_SCALAR}") -END_WRAP_CLASS() +itk_wrap_class("itk::MorphologicalDistanceTransformImageFilter" POINTER) +itk_wrap_image_filter_combinations("${WRAP_ITK_USIGN_INT}" "${WRAP_ITK_SCALAR}") +itk_end_wrap_class() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalSignedDistanceTransformImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalSignedDistanceTransformImageFilter.wrap index dc031684394..414af8ef784 100644 --- a/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalSignedDistanceTransformImageFilter.wrap +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalSignedDistanceTransformImageFilter.wrap @@ -1,3 +1,3 @@ -WRAP_CLASS("itk::MorphologicalSignedDistanceTransformImageFilter" POINTER) - WRAP_IMAGE_FILTER_COMBINATIONS("${WRAP_ITK_USIGN_INT}" "${WRAP_ITK_SCALAR}") -END_WRAP_CLASS() +itk_wrap_class("itk::MorphologicalSignedDistanceTransformImageFilter" POINTER) +itk_wrap_image_filter_combinations("${WRAP_ITK_USIGN_INT}" "${WRAP_ITK_SCALAR}") +itk_end_wrap_class() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicCloseImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicCloseImageFilter.wrap index 98d750ee5b0..04583e77338 100644 --- a/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicCloseImageFilter.wrap +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicCloseImageFilter.wrap @@ -1,3 +1,3 @@ -WRAP_CLASS("itk::ParabolicCloseImageFilter" POINTER_WITH_SUPERCLASS) - WRAP_IMAGE_FILTER_SCALAR(2) -END_WRAP_CLASS() +itk_wrap_class("itk::ParabolicCloseImageFilter" POINTER_WITH_SUPERCLASS) +itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2 2+) +itk_end_wrap_class() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicDilateImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicDilateImageFilter.wrap index e5dbdc58b8f..0dd82281082 100644 --- a/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicDilateImageFilter.wrap +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicDilateImageFilter.wrap @@ -1,3 +1,3 @@ -WRAP_CLASS("itk::ParabolicDilateImageFilter" POINTER_WITH_SUPERCLASS) - WRAP_IMAGE_FILTER_SCALAR(2) -END_WRAP_CLASS() +itk_wrap_class("itk::ParabolicDilateImageFilter" POINTER_WITH_SUPERCLASS) +itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2 2+) +itk_end_wrap_class() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicErodeImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicErodeImageFilter.wrap index c6c2ffeb2dd..41b67f4eda4 100644 --- a/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicErodeImageFilter.wrap +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicErodeImageFilter.wrap @@ -1,3 +1,3 @@ -WRAP_CLASS("itk::ParabolicErodeImageFilter" POINTER_WITH_SUPERCLASS) - WRAP_IMAGE_FILTER_SCALAR(2) -END_WRAP_CLASS() +itk_wrap_class("itk::ParabolicErodeImageFilter" POINTER_WITH_SUPERCLASS) +itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2 2+) +itk_end_wrap_class() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicOpenImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicOpenImageFilter.wrap index b1e268ab3f8..c8f763a1201 100644 --- a/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicOpenImageFilter.wrap +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkParabolicOpenImageFilter.wrap @@ -1,3 +1,3 @@ -WRAP_CLASS("itk::ParabolicOpenImageFilter" POINTER_WITH_SUPERCLASS) - WRAP_IMAGE_FILTER_SCALAR(2) -END_WRAP_CLASS() +itk_wrap_class("itk::ParabolicOpenImageFilter" POINTER_WITH_SUPERCLASS) +itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2 2+) +itk_end_wrap_class() From aa285b95173052b13ee677a578c69237cb5904c8 Mon Sep 17 00:00:00 2001 From: Bradley Lowekamp Date: Thu, 16 May 2019 12:18:20 -0400 Subject: [PATCH 137/165] BUG: Don't use StatisticsImageFilter output image Use the best practice of using a graft'ed input image proxy, to isolate internal pipeline execution. The ITKv5 StatisticsImageFilter no longer creates an aliased output image, so this proxy input image is now used as input. --- .../itkParabolicOpenCloseSafeBorderImageFilter.hxx | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx index 845f48a2811..da53f66efa2 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx @@ -38,13 +38,16 @@ ParabolicOpenCloseSafeBorderImageFilter::Gene typename PadFilterType::SizeType BoundsSize; if (this->m_SafeBorder) { + auto localInput = TInputImage::New(); + localInput->Graft(this->GetInput()); + // need to compute some image statistics and determine the padding // extent. This will almost certainly be an over estimate - m_StatsFilt->SetInput(this->GetInput()); + m_StatsFilt->SetInput(localInput); m_StatsFilt->Update(); InputPixelType range = m_StatsFilt->GetMaximum() - m_StatsFilt->GetMinimum(); typename MorphFilterType::RadiusType Sigma = m_MorphFilt->GetScale(); - typename TInputImage::SpacingType spcing = m_StatsFilt->GetOutput()->GetSpacing(); + typename TInputImage::SpacingType spcing = localInput->GetSpacing(); for (unsigned s = 0; s < ImageDimension; s++) { if (m_MorphFilt->GetUseImageSpacing()) @@ -73,13 +76,16 @@ ParabolicOpenCloseSafeBorderImageFilter::Gene // m_PadFilt->SetConstant(NumericTraits::NonpositiveMin()); m_PadFilt->SetConstant(m_StatsFilt->GetMinimum()); } - m_PadFilt->SetInput(m_StatsFilt->GetOutput()); + m_PadFilt->SetInput(localInput); progress->RegisterInternalFilter(m_PadFilt, 0.1f); inputImage = m_PadFilt->GetOutput(); } else { - inputImage = this->GetInput(); + auto localInput = TInputImage::New(); + localInput->Graft(this->GetInput()); + + inputImage = localInput; } m_MorphFilt->SetInput(inputImage); From 2cabfdd0cc75fd5280d17f0273db5428a2dc101a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Sat, 20 Oct 2018 16:22:55 -0400 Subject: [PATCH 138/165] STYLE: Use "typename" for template parameters. As discussed in: http://review.source.kitware.com/#/c/12655/ the use of the template keyword "class" was substituted by "typename" in the toolkit for the reasons stated in that topic. --- .../include/itkGreaterEqualValImageFilter.h | 4 ++-- .../include/itkMorphSDTHelperImageFilter.h | 10 +++++----- .../include/itkParabolicMorphUtils.h | 6 +++--- .../include/itkSharpenOpImageFilter.h | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h index 9ee924ddbbb..d1ec7469de6 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h @@ -30,7 +30,7 @@ namespace itk namespace Functor { -template +template class GEConst { public: @@ -65,7 +65,7 @@ class GEConst }; } // namespace Functor -template +template class ITK_EXPORT GreaterEqualValImageFilter : public UnaryFunctorImageFilter +template class MorphSDTHelper { public: @@ -78,10 +78,10 @@ class MorphSDTHelper }; } // namespace Function -template +template class ITK_EXPORT MorphSDTHelperImageFilter : public TernaryFunctorImageFilter +template void DoLineCP(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, const RealType magnitude, const RealType m_Extreme) { @@ -74,7 +74,7 @@ DoLineCP(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, const RealType m // This algorithm has been described a couple of times. First by van // den Boomgaard and more recently by Felzenszwalb and Huttenlocher, // in the context of generalized distance transform -template +template void DoLineIntAlg(LineBufferType & LineBuf, EnvBufferType & F, @@ -175,7 +175,7 @@ DoLineIntAlg(LineBufferType & LineBuf, } } -template +template void doOneDimension(TInIter & inputIterator, TOutIter & outputIterator, diff --git a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h index c479a1e9893..1ebd2ebe5ee 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h @@ -45,7 +45,7 @@ namespace itk */ namespace Function { -template +template class SharpM { public: From 4d9e5707e699596c18fa4e1e2d6667d88a5a0848 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Wed, 19 Feb 2020 17:08:05 -0600 Subject: [PATCH 139/165] 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/itkBinaryDilateParaImageFilter.hxx | 6 +++--- .../include/itkBinaryErodeParaImageFilter.hxx | 8 ++++---- .../include/itkParabolicErodeDilateImageFilter.h | 2 +- .../include/itkParabolicOpenCloseImageFilter.h | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx index 77b7bfeaa4b..102a08001b5 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx @@ -97,9 +97,9 @@ BinaryDilateParaImageFilter::GenerateData(void) m_CircCast->SetInput(m_CircPara->GetOutput()); // m_CircCast->SetInsideValue(0); // m_CircCast->SetOutsideValue(1); - // setting the correct threshold value is a little tricky - needs would - // to produce a result matching a bresenham circle, but these - // circles are such that the voxel centres need to be less than radius + // setting the correct threshold value is a little tricky - needs would + // to produce a result matching a bresenham circle, but these + // circles are such that the voxel centres need to be less than radius m_CircCast->SetUpperThreshold(0); m_CircCast->SetOutsideValue(1); m_CircCast->SetInsideValue(0); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx index 416ce4b0ca7..3ee389bac8f 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx @@ -98,11 +98,11 @@ BinaryErodeParaImageFilter::GenerateData(void) m_CircCast->SetVal(1.0); // m_CircCast->SetInsideValue(0); // m_CircCast->SetOutsideValue(1); - // setting the correct threshold value is a little tricky - needs would - // to produce a result matching a bresenham circle, but these - // circles are such that the voxel centres need to be less than radius + // setting the correct threshold value is a little tricky - needs would + // to produce a result matching a bresenham circle, but these + // circles are such that the voxel centres need to be less than radius // m_CircCast->SetUpperThreshold(1 - - // itk::NumericTraits::min()); + // itk::NumericTraits::min()); // m_CircCast->SetUpperThreshold(0.99); m_CircCast->GraftOutput(this->GetOutput()); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index 4872b52d5ea..910a328023c 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h @@ -128,7 +128,7 @@ class ITK_EXPORT ParabolicErodeDilateImageFilter : public ImageToImageFilter::FloatType; // using RealImageType = typename Image; + // itkGetStaticConstMacro(ImageDimension) >; // set all of the scales the same void diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h index 61195da8b93..ba3414a04a7 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h @@ -98,7 +98,7 @@ class ITK_EXPORT ParabolicOpenCloseImageFilter : public ImageToImageFilter::FloatType; // using RealImageType = typename Image; + // itkGetStaticConstMacro(ImageDimension) >; // set all of the scales the same void From bbf70da370e03c56aeb34c2f5ef3426fb0a55f04 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Mon, 17 Feb 2020 14:29:55 -0600 Subject: [PATCH 140/165] 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. --- .../include/itkBinaryCloseParaImageFilter.h | 2 +- .../include/itkBinaryDilateParaImageFilter.h | 2 +- .../include/itkBinaryErodeParaImageFilter.h | 2 +- .../include/itkBinaryOpenParaImageFilter.h | 2 +- .../include/itkGreaterEqualValImageFilter.h | 6 +++--- .../itkMorphologicalDistanceTransformImageFilter.h | 2 +- .../include/itkMorphologicalSharpeningImageFilter.h | 2 +- .../include/itkParabolicDilateImageFilter.h | 4 ++-- .../include/itkParabolicErodeDilateImageFilter.h | 2 +- .../include/itkParabolicErodeImageFilter.h | 4 ++-- .../include/itkParabolicOpenCloseImageFilter.h | 2 +- .../include/itkParabolicOpenCloseSafeBorderImageFilter.h | 2 +- .../include/itkParabolicOpenImageFilter.h | 4 ++-- .../ParabolicMorphology/include/itkSharpenOpImageFilter.h | 8 ++++---- 14 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h index cc089e3c8cd..50b50932472 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h @@ -143,7 +143,7 @@ class ITK_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter Date: Mon, 17 Feb 2020 14:48:30 -0600 Subject: [PATCH 141/165] STYLE: Remove redundant void argument lists Find and remove redundant void argument lists. --- .../ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h | 2 +- .../include/itkBinaryCloseParaImageFilter.hxx | 2 +- .../include/itkBinaryDilateParaImageFilter.h | 2 +- .../include/itkBinaryDilateParaImageFilter.hxx | 2 +- .../ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h | 2 +- .../include/itkBinaryErodeParaImageFilter.hxx | 2 +- .../ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h | 2 +- .../include/itkBinaryOpenParaImageFilter.hxx | 2 +- .../include/itkMorphologicalDistanceTransformImageFilter.h | 2 +- .../include/itkMorphologicalDistanceTransformImageFilter.hxx | 2 +- .../include/itkMorphologicalSharpeningImageFilter.h | 2 +- .../include/itkMorphologicalSharpeningImageFilter.hxx | 2 +- .../include/itkParabolicErodeDilateImageFilter.h | 2 +- .../include/itkParabolicErodeDilateImageFilter.hxx | 2 +- .../include/itkParabolicOpenCloseImageFilter.h | 2 +- .../include/itkParabolicOpenCloseImageFilter.hxx | 2 +- .../include/itkParabolicOpenCloseSafeBorderImageFilter.hxx | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h index 50b50932472..330fdca398a 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h @@ -140,7 +140,7 @@ class ITK_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter::SetRadius(ScalarRealType template void -BinaryCloseParaImageFilter::GenerateData(void) +BinaryCloseParaImageFilter::GenerateData() { // Allocate the output this->AllocateOutputs(); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h index 563e5cb1b40..f2a1f876ce6 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h @@ -132,7 +132,7 @@ class ITK_EXPORT BinaryDilateParaImageFilter : public ImageToImageFilter::SetRadius(ScalarRealType template void -BinaryDilateParaImageFilter::GenerateData(void) +BinaryDilateParaImageFilter::GenerateData() { // Allocate the output this->AllocateOutputs(); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h index 6796f240434..734a2c04783 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h @@ -133,7 +133,7 @@ class ITK_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilter::SetRadius(ScalarRealType template void -BinaryErodeParaImageFilter::GenerateData(void) +BinaryErodeParaImageFilter::GenerateData() { // Allocate the output this->AllocateOutputs(); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h index c34e298ec9c..9ba822a0e2c 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h @@ -140,7 +140,7 @@ class ITK_EXPORT BinaryOpenParaImageFilter : public ImageToImageFilter::SetRadius(ScalarRealType r template void -BinaryOpenParaImageFilter::GenerateData(void) +BinaryOpenParaImageFilter::GenerateData() { // Allocate the output this->AllocateOutputs(); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h index c1515241145..863f85b62da 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h @@ -136,7 +136,7 @@ class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImage /** Generate Data */ void - GenerateData(void) override; + GenerateData() override; // do everything in the output image type, which should have high precision using ThreshType = typename itk::BinaryThresholdImageFilter; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx index fb46f123a38..ee8e5486333 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx @@ -50,7 +50,7 @@ MorphologicalDistanceTransformImageFilter::Modified() template void -MorphologicalDistanceTransformImageFilter::GenerateData(void) +MorphologicalDistanceTransformImageFilter::GenerateData() { ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h index c74cdbd833e..37706919252 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h @@ -156,7 +156,7 @@ class ITK_EXPORT MorphologicalSharpeningImageFilter : public ImageToImageFilter< /** Generate Data */ void - GenerateData(void) override; + GenerateData() override; // do everything in the output image type, which should have high precision using ErodeType = typename itk::ParabolicErodeImageFilter; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx index f77413764e7..cc00c7e9a5e 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx @@ -41,7 +41,7 @@ MorphologicalSharpeningImageFilter::MorphologicalShar template void -MorphologicalSharpeningImageFilter::GenerateData(void) +MorphologicalSharpeningImageFilter::GenerateData() { ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index c518ba81f3b..8071fadd38c 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h @@ -179,7 +179,7 @@ class ITK_EXPORT ParabolicErodeDilateImageFilter : public ImageToImageFilter::EnlargeOut template void -ParabolicErodeDilateImageFilter::GenerateData(void) +ParabolicErodeDilateImageFilter::GenerateData() { ThreadIdType nbthreads = this->GetNumberOfWorkUnits(); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h index b8080515998..70dac80f09a 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h @@ -147,7 +147,7 @@ class ITK_EXPORT ParabolicOpenCloseImageFilter : public ImageToImageFilter::EnlargeOutputR template void -ParabolicOpenCloseImageFilter::GenerateData(void) +ParabolicOpenCloseImageFilter::GenerateData() { ThreadIdType nbthreads = this->GetNumberOfWorkUnits(); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx index da53f66efa2..f29b24b50bc 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx @@ -25,7 +25,7 @@ namespace itk { template void -ParabolicOpenCloseSafeBorderImageFilter::GenerateData(void) +ParabolicOpenCloseSafeBorderImageFilter::GenerateData() { ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); From 77ff1193ffd740ff4852e84a844ebb76e2d070ad Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Wed, 19 Feb 2020 10:45:26 -0600 Subject: [PATCH 142/165] DOC: Update copyright assignment to NumFOCUS The mission of NumFOCUS is to promote open practices in research, data, and scientific computing. https://numfocus.org --- .../ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h | 2 +- .../include/itkBinaryCloseParaImageFilter.hxx | 2 +- .../include/itkBinaryDilateParaImageFilter.h | 2 +- .../include/itkBinaryDilateParaImageFilter.hxx | 2 +- .../ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h | 2 +- .../include/itkBinaryErodeParaImageFilter.hxx | 2 +- .../ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h | 2 +- .../include/itkBinaryOpenParaImageFilter.hxx | 2 +- .../ParabolicMorphology/include/itkGreaterEqualValImageFilter.h | 2 +- .../ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h | 2 +- .../include/itkMorphologicalDistanceTransformImageFilter.h | 2 +- .../include/itkMorphologicalDistanceTransformImageFilter.hxx | 2 +- .../include/itkMorphologicalSharpeningImageFilter.h | 2 +- .../include/itkMorphologicalSharpeningImageFilter.hxx | 2 +- .../itkMorphologicalSignedDistanceTransformImageFilter.h | 2 +- .../itkMorphologicalSignedDistanceTransformImageFilter.hxx | 2 +- .../ParabolicMorphology/include/itkParabolicCloseImageFilter.h | 2 +- .../ParabolicMorphology/include/itkParabolicDilateImageFilter.h | 2 +- .../include/itkParabolicErodeDilateImageFilter.h | 2 +- .../include/itkParabolicErodeDilateImageFilter.hxx | 2 +- .../ParabolicMorphology/include/itkParabolicErodeImageFilter.h | 2 +- .../ParabolicMorphology/include/itkParabolicMorphUtils.h | 2 +- .../include/itkParabolicOpenCloseImageFilter.h | 2 +- .../include/itkParabolicOpenCloseImageFilter.hxx | 2 +- .../include/itkParabolicOpenCloseSafeBorderImageFilter.h | 2 +- .../include/itkParabolicOpenCloseSafeBorderImageFilter.hxx | 2 +- .../ParabolicMorphology/include/itkParabolicOpenImageFilter.h | 2 +- .../ParabolicMorphology/include/itkSharpenOpImageFilter.h | 2 +- .../ParabolicMorphology/test/itkBinaryCloseParaTest.cxx | 2 +- .../ParabolicMorphology/test/itkBinaryDilateParaTest.cxx | 2 +- .../ParabolicMorphology/test/itkBinaryErodeParaTest.cxx | 2 +- .../ParabolicMorphology/test/itkBinaryOpenParaTest.cxx | 2 +- Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx | 2 +- .../Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx | 2 +- Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx | 2 +- Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx | 2 +- .../Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx | 2 +- .../Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx | 2 +- 38 files changed, 38 insertions(+), 38 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h index 330fdca398a..6f0fcf6b1c5 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.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/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx index 5866e0baa30..10f8aec9fda 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.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/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h index f2a1f876ce6..0a9f9f5ef7a 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.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/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx index 2ea91de89f5..509c1fcaa3a 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.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/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h index 734a2c04783..8ccad9a3b5f 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.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/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx index 218f67b56d8..924131a85d2 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.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/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h index 9ba822a0e2c..ee35db1b2dd 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.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/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx index c2e0390b520..11f550124fa 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.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/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h index 778054295cf..86ccd7968cd 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.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/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h index 13e2f1fea13..91cb6aca7d3 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.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/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h index 863f85b62da..f5e8b31952a 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.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/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx index ee8e5486333..bd46fd8eca1 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.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/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h index 37706919252..000793a84ef 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.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/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx index cc00c7e9a5e..a3869339a5f 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.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/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h index 5998f09b920..de037c9bf85 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.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/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx index c5f0adc3ab1..df4c65a9404 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.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/ParabolicMorphology/include/itkParabolicCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h index ba22b72a50d..6e55289b547 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.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/ParabolicMorphology/include/itkParabolicDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h index 2e76dd8e6b7..5fa9b7c6690 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.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/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index 8071fadd38c..42c139700fc 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.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/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx index 3b70cbfb802..64af45b54ef 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.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/ParabolicMorphology/include/itkParabolicErodeImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h index ebd75f39e2e..6561d12807a 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.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/ParabolicMorphology/include/itkParabolicMorphUtils.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h index 1c429cb1349..0ef5f5bcca7 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.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/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h index 70dac80f09a..5fb73bd90d7 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.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/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx index 664b2d5646f..d842389bbee 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.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/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h index ef6f112837e..cbcb2454e63 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.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/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx index f29b24b50bc..a43f3570ed5 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.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/ParabolicMorphology/include/itkParabolicOpenImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h index c13ffccaad1..68b9f58a6c6 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.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/ParabolicMorphology/include/itkSharpenOpImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h index 8573691b3da..f2b9e95d663 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.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/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx index ec70784abcd..9d7bcd09949 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.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/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx index 0b4ec2bd675..9be4f490fb3 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.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/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx index 3f11c7860e7..751da8b5d6d 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.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/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx index 7058528e833..86d86ced729 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.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/ParabolicMorphology/test/itkParaDTTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx index 2357fd1e5d7..0de8978619d 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.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/ParabolicMorphology/test/itkParaDilateTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx index 4d692552f88..5f105530728 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.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/ParabolicMorphology/test/itkParaErodeTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx index a074b4a24df..d460e1969d5 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.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/ParabolicMorphology/test/itkParaOpenTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx index cabae865acc..24f4eec85cc 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.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/ParabolicMorphology/test/itkParaSharpenTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx index 5e5219e1fa5..a1204b78f64 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.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/ParabolicMorphology/test/itkParaSpacingTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx index 1bd1592892b..00c843b50c8 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.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 ffd4b7d6b295bdd90a7249836def40ee4c904204 Mon Sep 17 00:00:00 2001 From: Mathew Seng Date: Tue, 14 Apr 2020 11:19:32 -0500 Subject: [PATCH 143/165] 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 method. --- .../itkParabolicErodeDilateImageFilter.h | 2 +- .../itkParabolicErodeDilateImageFilter.hxx | 34 +++++++++++++++++-- .../include/itkParabolicMorphUtils.h | 25 ++++++++------ .../itkParabolicOpenCloseImageFilter.h | 2 +- .../itkParabolicOpenCloseImageFilter.hxx | 34 +++++++++++++++++-- 5 files changed, 79 insertions(+), 18 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index 42c139700fc..b935b11edde 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h @@ -185,7 +185,7 @@ class ITK_EXPORT ParabolicErodeDilateImageFilter : public ImageToImageFilter::ParabolicE m_UseImageSpacing = false; m_ParabolicAlgorithm = INTERSECTION; - this->DynamicMultiThreadingOn(); + this->DynamicMultiThreadingOff(); } template @@ -192,9 +192,35 @@ ParabolicErodeDilateImageFilter::GenerateDa template void -ParabolicErodeDilateImageFilter::DynamicThreadedGenerateData( - const OutputImageRegionType & outputRegionForThread) +ParabolicErodeDilateImageFilter::ThreadedGenerateData( + const OutputImageRegionType & outputRegionForThread, + ThreadIdType threadId) { + // 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++) + { + 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[m_CurrentDimension], + 30, + m_CurrentDimension * progressPerDimension, + progressPerDimension); + + using InputConstIteratorType = ImageLinearConstIteratorWithIndex; using OutputIteratorType = ImageLinearIteratorWithIndex; @@ -228,6 +254,7 @@ ParabolicErodeDilateImageFilter::DynamicThr doOneDimension( inputIterator, outputIterator, + *progress, LineLength, 0, this->m_MagnitudeSign, @@ -266,6 +293,7 @@ ParabolicErodeDilateImageFilter::DynamicThr doOneDimension( inputIteratorStage2, outputIterator, + *progress, LineLength, m_CurrentDimension, this->m_MagnitudeSign, diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h index 0ef5f5bcca7..26f41f094a1 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h @@ -20,6 +20,8 @@ #include +#include "itkProgressReporter.h" + namespace itk { // contact point algorithm @@ -177,16 +179,17 @@ DoLineIntAlg(LineBufferType & LineBuf, template void -doOneDimension(TInIter & inputIterator, - TOutIter & outputIterator, - const long LineLength, - const unsigned direction, - const int m_MagnitudeSign, - const bool m_UseImageSpacing, - const RealType m_Extreme, - const RealType image_scale, - const RealType Sigma, - int ParabolicAlgorithmChoice) +doOneDimension(TInIter & inputIterator, + TOutIter & outputIterator, + ProgressReporter & progress, + const long LineLength, + const unsigned direction, + const int m_MagnitudeSign, + const bool m_UseImageSpacing, + const RealType m_Extreme, + const RealType image_scale, + const RealType Sigma, + int ParabolicAlgorithmChoice) { enum ParabolicAlgorithm { @@ -261,6 +264,7 @@ doOneDimension(TInIter & inputIterator, // now onto the next line inputIterator.NextLine(); outputIterator.NextLine(); + progress.CompletedPixel(); } } else @@ -306,6 +310,7 @@ doOneDimension(TInIter & inputIterator, // now onto the next line inputIterator.NextLine(); outputIterator.NextLine(); + progress.CompletedPixel(); } } } diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h index 5fb73bd90d7..4e240e21c8a 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h @@ -153,7 +153,7 @@ class ITK_EXPORT ParabolicOpenCloseImageFilter : public ImageToImageFilter::ParabolicOpenC m_Stage = 1; // indicate whether we are on the first pass or the // second - this->DynamicMultiThreadingOn(); + this->DynamicMultiThreadingOff(); } template @@ -263,9 +263,34 @@ ParabolicOpenCloseImageFilter::GenerateData() template void -ParabolicOpenCloseImageFilter::DynamicThreadedGenerateData( - const OutputImageRegionType & outputRegionForThread) +ParabolicOpenCloseImageFilter::ThreadedGenerateData( + const OutputImageRegionType & outputRegionForThread, + ThreadIdType threadId) { + // 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++) + { + 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[m_CurrentDimension], + 30, + m_CurrentDimension * progressPerDimension, + progressPerDimension); + using InputConstIteratorType = ImageLinearConstIteratorWithIndex; using OutputIteratorType = ImageLinearIteratorWithIndex; @@ -303,6 +328,7 @@ ParabolicOpenCloseImageFilter::DynamicThreade doOneDimension( inputIterator, outputIterator, + *progress, LineLength, 0, this->m_MagnitudeSign, @@ -339,6 +365,7 @@ ParabolicOpenCloseImageFilter::DynamicThreade doOneDimension( inputIteratorStage2, outputIterator, + *progress, LineLength, m_CurrentDimension, this->m_MagnitudeSign, @@ -362,6 +389,7 @@ ParabolicOpenCloseImageFilter::DynamicThreade doOneDimension( inputIteratorStage2, outputIterator, + *progress, LineLength, m_CurrentDimension, this->m_MagnitudeSign, From 6546259c5965f4d81f462b80c3a016bde62d81ec Mon Sep 17 00:00:00 2001 From: Mathew Seng Date: Tue, 14 Apr 2020 12:13:26 -0500 Subject: [PATCH 144/165] BUG: Fix failing KWStyle check. Changed parameter doOpen to DoOpen to fit template --- .../itkParabolicOpenCloseImageFilter.h | 2 +- .../itkParabolicOpenCloseImageFilter.hxx | 40 +++++++++---------- ...kParabolicOpenCloseSafeBorderImageFilter.h | 4 +- ...arabolicOpenCloseSafeBorderImageFilter.hxx | 14 +++---- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h index 4e240e21c8a..a913c4db69d 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h @@ -49,7 +49,7 @@ namespace itk * Australia. * **/ -template +template class ITK_EXPORT ParabolicOpenCloseImageFilter : public ImageToImageFilter { public: diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx index eb671ecd9a4..206d85de3f5 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx @@ -35,13 +35,13 @@ namespace itk { -template -ParabolicOpenCloseImageFilter::ParabolicOpenCloseImageFilter() +template +ParabolicOpenCloseImageFilter::ParabolicOpenCloseImageFilter() { this->SetNumberOfRequiredOutputs(1); this->SetNumberOfRequiredInputs(1); // needs to be selected according to erosion/dilation - if (doOpen) + if (DoOpen) { // erosion then dilation m_Extreme1 = NumericTraits::max(); @@ -67,9 +67,9 @@ ParabolicOpenCloseImageFilter::ParabolicOpenC this->DynamicMultiThreadingOff(); } -template +template unsigned int -ParabolicOpenCloseImageFilter::SplitRequestedRegion( +ParabolicOpenCloseImageFilter::SplitRequestedRegion( unsigned int i, unsigned int num, OutputImageRegionType & splitRegion) @@ -126,9 +126,9 @@ ParabolicOpenCloseImageFilter::SplitRequested return maxThreadIdUsed + 1; } -template +template void -ParabolicOpenCloseImageFilter::SetScale(ScalarRealType scale) +ParabolicOpenCloseImageFilter::SetScale(ScalarRealType scale) { RadiusType s; @@ -137,9 +137,9 @@ ParabolicOpenCloseImageFilter::SetScale(Scala } #if 1 -template +template void -ParabolicOpenCloseImageFilter::GenerateInputRequestedRegion() throw( +ParabolicOpenCloseImageFilter::GenerateInputRequestedRegion() throw( InvalidRequestedRegionError) { // call the superclass' implementation of this method. this should @@ -157,9 +157,9 @@ ParabolicOpenCloseImageFilter::GenerateInputR #endif #if 1 -template +template void -ParabolicOpenCloseImageFilter::EnlargeOutputRequestedRegion(DataObject * output) +ParabolicOpenCloseImageFilter::EnlargeOutputRequestedRegion(DataObject * output) { auto * out = dynamic_cast(output); @@ -171,9 +171,9 @@ ParabolicOpenCloseImageFilter::EnlargeOutputR #endif -template +template void -ParabolicOpenCloseImageFilter::GenerateData() +ParabolicOpenCloseImageFilter::GenerateData() { ThreadIdType nbthreads = this->GetNumberOfWorkUnits(); @@ -261,9 +261,9 @@ ParabolicOpenCloseImageFilter::GenerateData() //////////////////////////////////////////////////////////// -template +template void -ParabolicOpenCloseImageFilter::ThreadedGenerateData( +ParabolicOpenCloseImageFilter::ThreadedGenerateData( const OutputImageRegionType & outputRegionForThread, ThreadIdType threadId) { @@ -325,7 +325,7 @@ ParabolicOpenCloseImageFilter::ThreadedGenera unsigned long LineLength = region.GetSize()[0]; RealType image_scale = this->GetInput()->GetSpacing()[0]; - doOneDimension( + doOneDimension( inputIterator, outputIterator, *progress, @@ -362,7 +362,7 @@ ParabolicOpenCloseImageFilter::ThreadedGenera unsigned long LineLength = region.GetSize()[m_CurrentDimension]; RealType image_scale = this->GetInput()->GetSpacing()[m_CurrentDimension]; - doOneDimension( + doOneDimension( inputIteratorStage2, outputIterator, *progress, @@ -386,7 +386,7 @@ ParabolicOpenCloseImageFilter::ThreadedGenera unsigned long LineLength = region.GetSize()[m_CurrentDimension]; RealType image_scale = this->GetInput()->GetSpacing()[m_CurrentDimension]; - doOneDimension( + doOneDimension( inputIteratorStage2, outputIterator, *progress, @@ -402,9 +402,9 @@ ParabolicOpenCloseImageFilter::ThreadedGenera } } -template +template void -ParabolicOpenCloseImageFilter::PrintSelf(std::ostream & os, Indent indent) const +ParabolicOpenCloseImageFilter::PrintSelf(std::ostream & os, Indent indent) const { Superclass::PrintSelf(os, indent); if (m_UseImageSpacing) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h index cbcb2454e63..2506206b198 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h @@ -29,7 +29,7 @@ namespace itk { -template +template class ITK_EXPORT ParabolicOpenCloseSafeBorderImageFilter : public ImageToImageFilter { public: @@ -149,7 +149,7 @@ class ITK_EXPORT ParabolicOpenCloseSafeBorderImageFilter : public ImageToImageFi void PrintSelf(std::ostream & os, Indent indent) const override; - using MorphFilterType = ParabolicOpenCloseImageFilter; + using MorphFilterType = ParabolicOpenCloseImageFilter; using PadFilterType = ConstantPadImageFilter; using CropFilterType = CropImageFilter; using StatsFilterType = StatisticsImageFilter; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx index a43f3570ed5..bbbab0ff087 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx @@ -23,9 +23,9 @@ namespace itk { -template +template void -ParabolicOpenCloseSafeBorderImageFilter::GenerateData() +ParabolicOpenCloseSafeBorderImageFilter::GenerateData() { ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); @@ -66,7 +66,7 @@ ParabolicOpenCloseSafeBorderImageFilter::Gene m_PadFilt->SetPadUpperBound(Bounds); // need to select between opening and closing here - if (doOpen) + if (DoOpen) { // m_PadFilt->SetConstant(NumericTraits::max()); m_PadFilt->SetConstant(m_StatsFilt->GetMaximum()); @@ -113,9 +113,9 @@ ParabolicOpenCloseSafeBorderImageFilter::Gene } } -template +template void -ParabolicOpenCloseSafeBorderImageFilter::Modified() const +ParabolicOpenCloseSafeBorderImageFilter::Modified() const { Superclass::Modified(); m_MorphFilt->Modified(); @@ -125,9 +125,9 @@ ParabolicOpenCloseSafeBorderImageFilter::Modi } /////////////////////////////////// -template +template void -ParabolicOpenCloseSafeBorderImageFilter::PrintSelf(std::ostream & os, +ParabolicOpenCloseSafeBorderImageFilter::PrintSelf(std::ostream & os, Indent indent) const { os << indent << "SafeBorder: " << m_SafeBorder << std::endl; From addef2c63515254ea36eb3368c848d2f9f9a6e01 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Wed, 13 May 2020 16:16:49 -0400 Subject: [PATCH 145/165] COMP: Remove deprecated dynamic exception specification To address: include/itkParabolicErodeDilateImageFilter.h:191:34: warning: dynamic exception specifications are deprecated in C++11 [-Wdeprecated] --- .../include/itkParabolicErodeDilateImageFilter.h | 2 +- .../include/itkParabolicErodeDilateImageFilter.hxx | 3 +-- .../include/itkParabolicOpenCloseImageFilter.h | 2 +- .../include/itkParabolicOpenCloseImageFilter.hxx | 3 +-- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index b935b11edde..c65ba54e216 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h @@ -188,7 +188,7 @@ class ITK_EXPORT ParabolicErodeDilateImageFilter : public ImageToImageFilter::SetScale(S #if 1 template void -ParabolicErodeDilateImageFilter::GenerateInputRequestedRegion() throw( - InvalidRequestedRegionError) +ParabolicErodeDilateImageFilter::GenerateInputRequestedRegion() { // call the superclass' implementation of this method. this should // copy the output requested region to the input requested region diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h index a913c4db69d..8b72b8c1a78 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h @@ -156,7 +156,7 @@ class ITK_EXPORT ParabolicOpenCloseImageFilter : public ImageToImageFilter::SetScale(Scala #if 1 template void -ParabolicOpenCloseImageFilter::GenerateInputRequestedRegion() throw( - InvalidRequestedRegionError) +ParabolicOpenCloseImageFilter::GenerateInputRequestedRegion() { // call the superclass' implementation of this method. this should // copy the output requested region to the input requested region From c29cd8100588c18e0ab954d78b639f30096a8a70 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Tue, 9 Jun 2020 12:40:18 -0400 Subject: [PATCH 146/165] ENH: Add wrapping for MorphologicalSharpeningImageFilter --- .../wrapping/itkMorphologicalSharpeningImageFilter.wrap | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalSharpeningImageFilter.wrap diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalSharpeningImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalSharpeningImageFilter.wrap new file mode 100644 index 00000000000..e3f08df8218 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalSharpeningImageFilter.wrap @@ -0,0 +1,3 @@ +itk_wrap_class("itk::MorphologicalSharpeningImageFilter" POINTER) +itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2 2+) +itk_end_wrap_class() From 6cd6abdc8a2e283bb36360ba6009d7c3ba06087c Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Tue, 9 Jun 2020 12:40:45 -0400 Subject: [PATCH 147/165] COMP: Replace ITK_EXPORT with ITK_TEMPLATE_EXPORT Fixes runtime linking on macOS in static builds. --- .../include/itkBinaryCloseParaImageFilter.h | 2 +- .../include/itkBinaryDilateParaImageFilter.h | 2 +- .../include/itkBinaryErodeParaImageFilter.h | 2 +- .../ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h | 2 +- .../include/itkGreaterEqualValImageFilter.h | 2 +- .../ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h | 2 +- .../include/itkMorphologicalDistanceTransformImageFilter.h | 3 ++- .../include/itkMorphologicalSharpeningImageFilter.h | 2 +- .../itkMorphologicalSignedDistanceTransformImageFilter.h | 3 ++- .../ParabolicMorphology/include/itkParabolicCloseImageFilter.h | 2 +- .../include/itkParabolicDilateImageFilter.h | 3 ++- .../include/itkParabolicErodeDilateImageFilter.h | 2 +- .../ParabolicMorphology/include/itkParabolicErodeImageFilter.h | 3 ++- .../include/itkParabolicOpenCloseImageFilter.h | 2 +- .../include/itkParabolicOpenCloseSafeBorderImageFilter.h | 2 +- .../ParabolicMorphology/include/itkParabolicOpenImageFilter.h | 2 +- .../ParabolicMorphology/include/itkSharpenOpImageFilter.h | 2 +- 17 files changed, 21 insertions(+), 17 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h index 6f0fcf6b1c5..30cdeda2ca6 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h @@ -66,7 +66,7 @@ namespace itk **/ template -class ITK_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter +class ITK_TEMPLATE_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter { public: diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h index 0a9f9f5ef7a..bee87666ed7 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h @@ -64,7 +64,7 @@ namespace itk **/ template -class ITK_EXPORT BinaryDilateParaImageFilter : public ImageToImageFilter +class ITK_TEMPLATE_EXPORT BinaryDilateParaImageFilter : public ImageToImageFilter { public: diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h index 8ccad9a3b5f..482e58ff3d9 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h @@ -65,7 +65,7 @@ namespace itk **/ template -class ITK_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilter +class ITK_TEMPLATE_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilter { public: diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h index ee35db1b2dd..a38fa6cad5f 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h @@ -66,7 +66,7 @@ namespace itk **/ template -class ITK_EXPORT BinaryOpenParaImageFilter : public ImageToImageFilter +class ITK_TEMPLATE_EXPORT BinaryOpenParaImageFilter : public ImageToImageFilter { public: diff --git a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h index 86ccd7968cd..4e2d755e342 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h @@ -66,7 +66,7 @@ class GEConst } // namespace Functor template -class ITK_EXPORT GreaterEqualValImageFilter +class ITK_TEMPLATE_EXPORT GreaterEqualValImageFilter : public UnaryFunctorImageFilter> diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h index 91cb6aca7d3..3ce69cb6bfb 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h @@ -82,7 +82,7 @@ template -class ITK_EXPORT MorphSDTHelperImageFilter +class ITK_TEMPLATE_EXPORT MorphSDTHelperImageFilter : public TernaryFunctorImageFilter -class ITK_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImageFilter +class ITK_TEMPLATE_EXPORT MorphologicalDistanceTransformImageFilter + : public ImageToImageFilter { public: ITK_DISALLOW_COPY_AND_ASSIGN(MorphologicalDistanceTransformImageFilter); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h index 000793a84ef..c19b6daf052 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h @@ -64,7 +64,7 @@ namespace itk **/ template -class ITK_EXPORT MorphologicalSharpeningImageFilter : public ImageToImageFilter +class ITK_TEMPLATE_EXPORT MorphologicalSharpeningImageFilter : public ImageToImageFilter { public: ITK_DISALLOW_COPY_AND_ASSIGN(MorphologicalSharpeningImageFilter); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h index de037c9bf85..02c86866517 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h @@ -68,7 +68,8 @@ namespace itk **/ template -class ITK_EXPORT MorphologicalSignedDistanceTransformImageFilter : public ImageToImageFilter +class ITK_TEMPLATE_EXPORT MorphologicalSignedDistanceTransformImageFilter + : public ImageToImageFilter { public: ITK_DISALLOW_COPY_AND_ASSIGN(MorphologicalSignedDistanceTransformImageFilter); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h index 6e55289b547..bd436b6211d 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h @@ -47,7 +47,7 @@ namespace itk **/ template -class ITK_EXPORT ParabolicCloseImageFilter +class ITK_TEMPLATE_EXPORT ParabolicCloseImageFilter : public ParabolicOpenCloseSafeBorderImageFilter { public: diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h index 5fa9b7c6690..7452bd3c07f 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h @@ -46,7 +46,8 @@ namespace itk **/ template -class ITK_EXPORT ParabolicDilateImageFilter : public ParabolicErodeDilateImageFilter +class ITK_TEMPLATE_EXPORT ParabolicDilateImageFilter + : public ParabolicErodeDilateImageFilter { public: ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicDilateImageFilter); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index c65ba54e216..c86f0f1a52e 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h @@ -80,7 +80,7 @@ namespace itk **/ template -class ITK_EXPORT ParabolicErodeDilateImageFilter : public ImageToImageFilter +class ITK_TEMPLATE_EXPORT ParabolicErodeDilateImageFilter : public ImageToImageFilter { public: ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicErodeDilateImageFilter); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h index 6561d12807a..c17285668d1 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h @@ -46,7 +46,8 @@ namespace itk * Australia. **/ template -class ITK_EXPORT ParabolicErodeImageFilter : public ParabolicErodeDilateImageFilter +class ITK_TEMPLATE_EXPORT ParabolicErodeImageFilter + : public ParabolicErodeDilateImageFilter { public: ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicErodeImageFilter); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h index 8b72b8c1a78..f2e43209c6e 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h @@ -50,7 +50,7 @@ namespace itk * **/ template -class ITK_EXPORT ParabolicOpenCloseImageFilter : public ImageToImageFilter +class ITK_TEMPLATE_EXPORT ParabolicOpenCloseImageFilter : public ImageToImageFilter { public: ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicOpenCloseImageFilter); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h index 2506206b198..f2d9c3d0e5f 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h @@ -30,7 +30,7 @@ namespace itk { template -class ITK_EXPORT ParabolicOpenCloseSafeBorderImageFilter : public ImageToImageFilter +class ITK_TEMPLATE_EXPORT ParabolicOpenCloseSafeBorderImageFilter : public ImageToImageFilter { public: ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicOpenCloseSafeBorderImageFilter); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h index 68b9f58a6c6..3d8be099930 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h @@ -46,7 +46,7 @@ namespace itk **/ template -class ITK_EXPORT ParabolicOpenImageFilter +class ITK_TEMPLATE_EXPORT ParabolicOpenImageFilter : public ParabolicOpenCloseSafeBorderImageFilter { public: diff --git a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h index f2b9e95d663..c6d0f87a220 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h @@ -85,7 +85,7 @@ class SharpM } // namespace Function template -class ITK_EXPORT SharpenOpImageFilter +class ITK_TEMPLATE_EXPORT SharpenOpImageFilter : public TernaryFunctorImageFilter Date: Wed, 14 Oct 2020 11:52:57 -0500 Subject: [PATCH 148/165] 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. --- .../ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h | 2 +- .../include/itkBinaryDilateParaImageFilter.h | 2 +- .../ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h | 2 +- .../ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h | 2 +- .../ParabolicMorphology/include/itkGreaterEqualValImageFilter.h | 2 +- .../ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h | 2 +- .../include/itkMorphologicalDistanceTransformImageFilter.h | 2 +- .../include/itkMorphologicalSharpeningImageFilter.h | 2 +- .../itkMorphologicalSignedDistanceTransformImageFilter.h | 2 +- .../ParabolicMorphology/include/itkParabolicCloseImageFilter.h | 2 +- .../ParabolicMorphology/include/itkParabolicDilateImageFilter.h | 2 +- .../include/itkParabolicErodeDilateImageFilter.h | 2 +- .../ParabolicMorphology/include/itkParabolicErodeImageFilter.h | 2 +- .../include/itkParabolicOpenCloseImageFilter.h | 2 +- .../include/itkParabolicOpenCloseSafeBorderImageFilter.h | 2 +- .../ParabolicMorphology/include/itkParabolicOpenImageFilter.h | 2 +- .../ParabolicMorphology/include/itkSharpenOpImageFilter.h | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h index 30cdeda2ca6..a9319506455 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h @@ -70,7 +70,7 @@ class ITK_TEMPLATE_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter { public: - ITK_DISALLOW_COPY_AND_ASSIGN(BinaryCloseParaImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(BinaryCloseParaImageFilter); /** Standard class type alias. */ using Self = BinaryCloseParaImageFilter; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h index bee87666ed7..0be5e0e688b 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h @@ -68,7 +68,7 @@ class ITK_TEMPLATE_EXPORT BinaryDilateParaImageFilter : public ImageToImageFilte { public: - ITK_DISALLOW_COPY_AND_ASSIGN(BinaryDilateParaImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(BinaryDilateParaImageFilter); /** Standard class type alias. */ using Self = BinaryDilateParaImageFilter; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h index 482e58ff3d9..c86f2e247a7 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h @@ -69,7 +69,7 @@ class ITK_TEMPLATE_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilter { public: - ITK_DISALLOW_COPY_AND_ASSIGN(BinaryErodeParaImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(BinaryErodeParaImageFilter); /** Standard class type alias. */ using Self = BinaryErodeParaImageFilter; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h index a38fa6cad5f..1ad812cb6a6 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h @@ -70,7 +70,7 @@ class ITK_TEMPLATE_EXPORT BinaryOpenParaImageFilter : public ImageToImageFilter< { public: - ITK_DISALLOW_COPY_AND_ASSIGN(BinaryOpenParaImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(BinaryOpenParaImageFilter); /** Standard class type alias. */ using Self = BinaryOpenParaImageFilter; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h index 4e2d755e342..ce7a55d2730 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h @@ -72,7 +72,7 @@ class ITK_TEMPLATE_EXPORT GreaterEqualValImageFilter Functor::GEConst> { public: - ITK_DISALLOW_COPY_AND_ASSIGN(GreaterEqualValImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(GreaterEqualValImageFilter); /** Standard class type alias. */ using Self = GreaterEqualValImageFilter; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h index 3ce69cb6bfb..c5137559edd 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h @@ -93,7 +93,7 @@ class ITK_TEMPLATE_EXPORT MorphSDTHelperImageFilter typename TOutputImage::PixelType>> { public: - ITK_DISALLOW_COPY_AND_ASSIGN(MorphSDTHelperImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(MorphSDTHelperImageFilter); /** Standard class type alias. */ using Self = MorphSDTHelperImageFilter; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h index c10c6c0b0d9..b27b4858c87 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h @@ -60,7 +60,7 @@ class ITK_TEMPLATE_EXPORT MorphologicalDistanceTransformImageFilter : public ImageToImageFilter { public: - ITK_DISALLOW_COPY_AND_ASSIGN(MorphologicalDistanceTransformImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(MorphologicalDistanceTransformImageFilter); /** Standard class type alias. */ using Self = MorphologicalDistanceTransformImageFilter; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h index c19b6daf052..41e80341a18 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h @@ -67,7 +67,7 @@ template class ITK_TEMPLATE_EXPORT MorphologicalSharpeningImageFilter : public ImageToImageFilter { public: - ITK_DISALLOW_COPY_AND_ASSIGN(MorphologicalSharpeningImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(MorphologicalSharpeningImageFilter); /** Standard class type alias. */ using Self = MorphologicalSharpeningImageFilter; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h index 02c86866517..790ef32dc3f 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h @@ -72,7 +72,7 @@ class ITK_TEMPLATE_EXPORT MorphologicalSignedDistanceTransformImageFilter : public ImageToImageFilter { public: - ITK_DISALLOW_COPY_AND_ASSIGN(MorphologicalSignedDistanceTransformImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(MorphologicalSignedDistanceTransformImageFilter); /** Standard class type alias. */ using Self = MorphologicalSignedDistanceTransformImageFilter; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h index bd436b6211d..34cd88dd9af 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h @@ -51,7 +51,7 @@ class ITK_TEMPLATE_EXPORT ParabolicCloseImageFilter : public ParabolicOpenCloseSafeBorderImageFilter { public: - ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicCloseImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(ParabolicCloseImageFilter); /** Standard class type alias. */ using Self = ParabolicCloseImageFilter; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h index 7452bd3c07f..bf540dd096d 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h @@ -50,7 +50,7 @@ class ITK_TEMPLATE_EXPORT ParabolicDilateImageFilter : public ParabolicErodeDilateImageFilter { public: - ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicDilateImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(ParabolicDilateImageFilter); /** Standard class type alias. */ using Self = ParabolicDilateImageFilter; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index c86f0f1a52e..12f120015fe 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h @@ -83,7 +83,7 @@ template { public: - ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicErodeDilateImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(ParabolicErodeDilateImageFilter); /** Standard class type alias. */ using Self = ParabolicErodeDilateImageFilter; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h index c17285668d1..02d72514442 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h @@ -50,7 +50,7 @@ class ITK_TEMPLATE_EXPORT ParabolicErodeImageFilter : public ParabolicErodeDilateImageFilter { public: - ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicErodeImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(ParabolicErodeImageFilter); /** Standard class type alias. */ using Self = ParabolicErodeImageFilter; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h index f2e43209c6e..6eaf564bbfb 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h @@ -53,7 +53,7 @@ template { public: - ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicOpenCloseImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(ParabolicOpenCloseImageFilter); /** Standard class type alias. */ using Self = ParabolicOpenCloseImageFilter; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h index f2d9c3d0e5f..18c4e38e09d 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h @@ -33,7 +33,7 @@ template { public: - ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicOpenCloseSafeBorderImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(ParabolicOpenCloseSafeBorderImageFilter); /** Standard class type alias. */ using Self = ParabolicOpenCloseSafeBorderImageFilter; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h index 3d8be099930..2b92df804fc 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h @@ -50,7 +50,7 @@ class ITK_TEMPLATE_EXPORT ParabolicOpenImageFilter : public ParabolicOpenCloseSafeBorderImageFilter { public: - ITK_DISALLOW_COPY_AND_ASSIGN(ParabolicOpenImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(ParabolicOpenImageFilter); /** Standard class type alias. */ using Self = ParabolicOpenImageFilter; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h index c6d0f87a220..213fbeb40be 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h @@ -96,7 +96,7 @@ class ITK_TEMPLATE_EXPORT SharpenOpImageFilter typename TOutputImage::PixelType>> { public: - ITK_DISALLOW_COPY_AND_ASSIGN(SharpenOpImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(SharpenOpImageFilter); /** Standard class type alias. */ using Self = SharpenOpImageFilter; From 5c707428066eb853480e7c36de8f9f28a3b2e3c7 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Fri, 17 Dec 2021 09:40:15 -0600 Subject: [PATCH 149/165] 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). --- .../include/itkBinaryCloseParaImageFilter.hxx | 1 - .../include/itkBinaryDilateParaImageFilter.hxx | 1 - .../include/itkBinaryErodeParaImageFilter.hxx | 1 - .../ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx | 1 - .../include/itkMorphologicalDistanceTransformImageFilter.hxx | 1 - .../include/itkMorphologicalSharpeningImageFilter.hxx | 1 - .../itkMorphologicalSignedDistanceTransformImageFilter.hxx | 1 - .../include/itkParabolicErodeDilateImageFilter.hxx | 1 - .../include/itkParabolicOpenCloseImageFilter.hxx | 1 - .../include/itkParabolicOpenCloseSafeBorderImageFilter.hxx | 1 - 10 files changed, 10 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx index 10f8aec9fda..d1d1cd0cf43 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx @@ -19,7 +19,6 @@ #define itkBinaryCloseParaImageFilter_hxx #include "itkProgressAccumulator.h" -#include "itkBinaryCloseParaImageFilter.h" #include "itkParabolicErodeImageFilter.h" #include "itkProgressAccumulator.h" #include "itkCropImageFilter.h" diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx index 509c1fcaa3a..4cbcc18bd1a 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx @@ -19,7 +19,6 @@ #define itkBinaryDilateParaImageFilter_hxx #include "itkProgressAccumulator.h" -#include "itkBinaryDilateParaImageFilter.h" #include "itkParabolicDilateImageFilter.h" #include "itkProgressAccumulator.h" diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx index 924131a85d2..f2ac9696e78 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx @@ -19,7 +19,6 @@ #define itkBinaryErodeParaImageFilter_hxx #include "itkProgressAccumulator.h" -#include "itkBinaryErodeParaImageFilter.h" #include "itkParabolicErodeImageFilter.h" #include "itkProgressAccumulator.h" diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx index 11f550124fa..34378bb8d46 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx @@ -19,7 +19,6 @@ #define itkBinaryOpenParaImageFilter_hxx #include "itkProgressAccumulator.h" -#include "itkBinaryOpenParaImageFilter.h" #include "itkParabolicErodeImageFilter.h" #include "itkProgressAccumulator.h" #include "itkCropImageFilter.h" diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx index bd46fd8eca1..94e369fcef1 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx @@ -18,7 +18,6 @@ #ifndef itkMorphologicalDistanceTransformImageFilter_hxx #define itkMorphologicalDistanceTransformImageFilter_hxx -#include "itkMorphologicalDistanceTransformImageFilter.h" #include "itkProgressAccumulator.h" namespace itk diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx index a3869339a5f..d7ffda0dbcb 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx @@ -18,7 +18,6 @@ #ifndef itkMorphologicalSharpeningImageFilter_hxx #define itkMorphologicalSharpeningImageFilter_hxx -#include "itkMorphologicalSharpeningImageFilter.h" #include "itkProgressAccumulator.h" namespace itk diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx index df4c65a9404..c902e8c7c04 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx @@ -18,7 +18,6 @@ #ifndef itkMorphologicalSignedDistanceTransformImageFilter_hxx #define itkMorphologicalSignedDistanceTransformImageFilter_hxx -#include "itkMorphologicalSignedDistanceTransformImageFilter.h" #include "itkProgressAccumulator.h" namespace itk diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx index 77afda9af20..a1d24ec24c5 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx @@ -18,7 +18,6 @@ #ifndef itkParabolicErodeDilateImageFilter_hxx #define itkParabolicErodeDilateImageFilter_hxx -#include "itkParabolicErodeDilateImageFilter.h" #include "itkImageRegionConstIterator.h" #include "itkImageRegionIterator.h" diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx index 5c8658b75ad..d8f4b0a146c 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx @@ -21,7 +21,6 @@ #include "itkImageRegionConstIterator.h" #include "itkImageRegionIterator.h" -#include "itkParabolicOpenCloseImageFilter.h" // #define NOINDEX #ifndef NOINDEX # include "itkImageLinearIteratorWithIndex.h" diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx index bbbab0ff087..b5db793e9a0 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx @@ -19,7 +19,6 @@ #define itkParabolicOpenCloseSafeBorderImageFilter_hxx #include "itkProgressAccumulator.h" -#include "itkParabolicOpenCloseSafeBorderImageFilter.h" namespace itk { From 273bba32cab20a58a1cddc23e813392d682066f2 Mon Sep 17 00:00:00 2001 From: Tom Birdsong Date: Tue, 31 May 2022 11:52:46 -0400 Subject: [PATCH 150/165] ENH: Bump ITK and replace http with https using script --- .../include/itkBinaryCloseParaImageFilter.h | 4 ++-- .../include/itkBinaryCloseParaImageFilter.hxx | 2 +- .../include/itkBinaryDilateParaImageFilter.h | 4 ++-- .../include/itkBinaryDilateParaImageFilter.hxx | 2 +- .../include/itkBinaryErodeParaImageFilter.h | 4 ++-- .../include/itkBinaryErodeParaImageFilter.hxx | 2 +- .../include/itkBinaryOpenParaImageFilter.h | 4 ++-- .../include/itkBinaryOpenParaImageFilter.hxx | 2 +- .../include/itkGreaterEqualValImageFilter.h | 2 +- .../include/itkMorphSDTHelperImageFilter.h | 2 +- .../itkMorphologicalDistanceTransformImageFilter.h | 4 ++-- .../itkMorphologicalDistanceTransformImageFilter.hxx | 2 +- .../include/itkMorphologicalSharpeningImageFilter.h | 8 ++++---- .../include/itkMorphologicalSharpeningImageFilter.hxx | 2 +- .../itkMorphologicalSignedDistanceTransformImageFilter.h | 4 ++-- ...itkMorphologicalSignedDistanceTransformImageFilter.hxx | 2 +- .../include/itkParabolicCloseImageFilter.h | 4 ++-- .../include/itkParabolicDilateImageFilter.h | 4 ++-- .../include/itkParabolicErodeDilateImageFilter.h | 4 ++-- .../include/itkParabolicErodeDilateImageFilter.hxx | 2 +- .../include/itkParabolicErodeImageFilter.h | 4 ++-- .../ParabolicMorphology/include/itkParabolicMorphUtils.h | 2 +- .../include/itkParabolicOpenCloseImageFilter.h | 4 ++-- .../include/itkParabolicOpenCloseImageFilter.hxx | 2 +- .../include/itkParabolicOpenCloseSafeBorderImageFilter.h | 2 +- .../itkParabolicOpenCloseSafeBorderImageFilter.hxx | 2 +- .../include/itkParabolicOpenImageFilter.h | 4 ++-- .../ParabolicMorphology/include/itkSharpenOpImageFilter.h | 4 ++-- .../ParabolicMorphology/test/itkBinaryCloseParaTest.cxx | 2 +- .../ParabolicMorphology/test/itkBinaryDilateParaTest.cxx | 2 +- .../ParabolicMorphology/test/itkBinaryErodeParaTest.cxx | 2 +- .../ParabolicMorphology/test/itkBinaryOpenParaTest.cxx | 2 +- .../Filtering/ParabolicMorphology/test/itkParaDTTest.cxx | 2 +- .../ParabolicMorphology/test/itkParaDilateTest.cxx | 2 +- .../ParabolicMorphology/test/itkParaErodeTest.cxx | 2 +- .../ParabolicMorphology/test/itkParaOpenTest.cxx | 2 +- .../ParabolicMorphology/test/itkParaSharpenTest.cxx | 2 +- .../ParabolicMorphology/test/itkParaSpacingTest.cxx | 2 +- 38 files changed, 54 insertions(+), 54 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h index a9319506455..1758ffcc1f3 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.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, @@ -55,7 +55,7 @@ namespace itk * Core methods described in the InsightJournal article: * "Morphology with parabolic structuring elements" * - * http://hdl.handle.net/1926/1370 + * https://hdl.handle.net/1926/1370 * * \sa itkParabolicErodeImageFilter * diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx index d1d1cd0cf43..49a0c38d595 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.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/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h index 0be5e0e688b..92e44fe2579 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.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, @@ -53,7 +53,7 @@ namespace itk * Core methods described in the InsightJournal article: * "Morphology with parabolic structuring elements" * - * http://hdl.handle.net/1926/1370 + * https://hdl.handle.net/1926/1370 * * \sa itkParabolicDilateImageFilter * diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx index 4cbcc18bd1a..4c0573148a8 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.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/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h index c86f2e247a7..a7fdae2c990 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.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, @@ -53,7 +53,7 @@ namespace itk * Core methods described in the InsightJournal article: * "Morphology with parabolic structuring elements" * - * http://hdl.handle.net/1926/1370 + * https://hdl.handle.net/1926/1370 * * \sa itkParabolicErodeImageFilter * diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx index f2ac9696e78..240dfdcb08c 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.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/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h index 1ad812cb6a6..e5d07550daa 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.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, @@ -55,7 +55,7 @@ namespace itk * Core methods described in the InsightJournal article: * "Morphology with parabolic structuring elements" * - * http://hdl.handle.net/1926/1370 + * https://hdl.handle.net/1926/1370 * \sa itkParabolicErodeImageFilter * * diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx index 34378bb8d46..74652413015 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.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/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h index ce7a55d2730..b13426da017 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkGreaterEqualValImageFilter.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/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h index c5137559edd..372d6751e12 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphSDTHelperImageFilter.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/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h index b27b4858c87..2e0c66e4a3c 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.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, @@ -46,7 +46,7 @@ namespace itk * Core methods described in the InsightJournal article: * "Morphology with parabolic structuring elements" * - * http://hdl.handle.net/1926/1370 + * https://hdl.handle.net/1926/1370 * * \ingroup ParabolicMorphology * diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx index 94e369fcef1..77691e196ed 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalDistanceTransformImageFilter.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/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h index 41e80341a18..bda9f1e7898 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.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, @@ -46,14 +46,14 @@ namespace itk * number = {6}, * year = {2000}, * pages = {997-1012}, - * ee = {http://dx.doi.org/10.1016/S0031-3203(99)00160-0}, - * bibsource = {DBLP, http://dblp.uni-trier.de} + * ee = {https://dx.doi.org/10.1016/S0031-3203(99)00160-0}, + * bibsource = {DBLP, https://dblp.uni-trier.de} } * Core methods described in the InsightJournal article: * "Morphology with parabolic structuring elements" * - * http://hdl.handle.net/1926/1370 + * https://hdl.handle.net/1926/1370 * * * \ingroup ParabolicMorphology diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx index d7ffda0dbcb..2129dc11eea 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSharpeningImageFilter.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/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h index 790ef32dc3f..5be90086c09 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.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, @@ -57,7 +57,7 @@ namespace itk * Core methods described in the InsightJournal article: * "Morphology with parabolic structuring elements" * - * http://hdl.handle.net/1926/1370 + * https://hdl.handle.net/1926/1370 * * * \ingroup ParabolicMorphology diff --git a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx index c902e8c7c04..f3ce8ee9b24 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkMorphologicalSignedDistanceTransformImageFilter.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/ParabolicMorphology/include/itkParabolicCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h index 34cd88dd9af..c51bc719c3b 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicCloseImageFilter.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, @@ -35,7 +35,7 @@ namespace itk * Core methods described in the InsightJournal article: * "Morphology with parabolic structuring elements" * - * http://hdl.handle.net/1926/1370 + * https://hdl.handle.net/1926/1370 * * \sa itkParabolicOpenCloseImageFilter * diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h index bf540dd096d..8d3022025f7 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicDilateImageFilter.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, @@ -33,7 +33,7 @@ namespace itk * Core methods described in the InsightJournal article: * "Morphology with parabolic structuring elements" * - * http://hdl.handle.net/1926/1370 + * https://hdl.handle.net/1926/1370 * * \sa itkParabolicOpenCloseImageFilter * diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index 12f120015fe..0efd9a68a45 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.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, @@ -69,7 +69,7 @@ namespace itk * Core methods described in the InsightJournal article: * "Morphology with parabolic structuring elements" * - * http://hdl.handle.net/1926/1370 + * https://hdl.handle.net/1926/1370 * * * \ingroup ParabolicMorphology diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx index a1d24ec24c5..b4e8806fe9e 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.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/ParabolicMorphology/include/itkParabolicErodeImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h index 02d72514442..a1c872ea146 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeImageFilter.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, @@ -35,7 +35,7 @@ namespace itk * Core methods described in the InsightJournal article: * "Morphology with parabolic structuring elements" * - * http://hdl.handle.net/1926/1370 + * https://hdl.handle.net/1926/1370 * * \sa itkParabolicErodeDilateImageFilter * diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h index 26f41f094a1..8bfce7ec9e6 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.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/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h index 6eaf564bbfb..17888d6b050 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.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, @@ -38,7 +38,7 @@ namespace itk * Core methods described in the InsightJournal article: * "Morphology with parabolic structuring elements" * - * http://hdl.handle.net/1926/1370 + * https://hdl.handle.net/1926/1370 * * \sa itkParabolicErodeDilateImageFilter * diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx index d8f4b0a146c..1b471dc89dc 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.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/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h index 18c4e38e09d..869710e5ec3 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.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/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx index b5db793e9a0..93d4bc40c31 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseSafeBorderImageFilter.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/ParabolicMorphology/include/itkParabolicOpenImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h index 2b92df804fc..f3fbb5d2d17 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenImageFilter.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, @@ -35,7 +35,7 @@ namespace itk * Core methods described in the InsightJournal article: * "Morphology with parabolic structuring elements" * - * http://hdl.handle.net/1926/1370 + * https://hdl.handle.net/1926/1370 * * \sa itkParabolicOpenCloseImageFilter * diff --git a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h index 213fbeb40be..9412662bd0d 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkSharpenOpImageFilter.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, @@ -36,7 +36,7 @@ namespace itk * Core methods described in the InsightJournal article: * "Morphology with parabolic structuring elements" * - * http://hdl.handle.net/1926/1370 + * https://hdl.handle.net/1926/1370 * \ingroup ParabolicMorphology * * \author Richard Beare, Department of Medicine, Monash University, diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx index 9d7bcd09949..7a5e269790a 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.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/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx index 9be4f490fb3..ecba10231a0 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.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/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx index 751da8b5d6d..6282cfa94ca 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.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/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx index 86d86ced729..16784fa44cc 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.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/ParabolicMorphology/test/itkParaDTTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx index 0de8978619d..8718e6eaa79 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDTTest.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/ParabolicMorphology/test/itkParaDilateTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx index 5f105530728..020d0f425e7 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaDilateTest.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/ParabolicMorphology/test/itkParaErodeTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx index d460e1969d5..01006387c41 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaErodeTest.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/ParabolicMorphology/test/itkParaOpenTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx index 24f4eec85cc..ea5afdc2589 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaOpenTest.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/ParabolicMorphology/test/itkParaSharpenTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx index a1204b78f64..71150722958 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaSharpenTest.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/ParabolicMorphology/test/itkParaSpacingTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx index 00c843b50c8..7a52d35d709 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkParaSpacingTest.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 383ec49cd569a90c78593dd809fdec7845083d19 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Tue, 14 Feb 2023 22:13:08 -0500 Subject: [PATCH 151/165] BUG: Distance filters should only be wrapped for real outputs Distance maps will have real outputs. --- .../wrapping/itkMorphologicalDistanceTransformImageFilter.wrap | 2 +- .../itkMorphologicalSignedDistanceTransformImageFilter.wrap | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalDistanceTransformImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalDistanceTransformImageFilter.wrap index 22489f78480..e8a46c09f46 100644 --- a/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalDistanceTransformImageFilter.wrap +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalDistanceTransformImageFilter.wrap @@ -1,3 +1,3 @@ itk_wrap_class("itk::MorphologicalDistanceTransformImageFilter" POINTER) -itk_wrap_image_filter_combinations("${WRAP_ITK_USIGN_INT}" "${WRAP_ITK_SCALAR}") +itk_wrap_image_filter_combinations("${WRAP_ITK_USIGN_INT}" "${WRAP_ITK_REAL}") itk_end_wrap_class() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalSignedDistanceTransformImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalSignedDistanceTransformImageFilter.wrap index 414af8ef784..9d3c1363e96 100644 --- a/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalSignedDistanceTransformImageFilter.wrap +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkMorphologicalSignedDistanceTransformImageFilter.wrap @@ -1,3 +1,3 @@ itk_wrap_class("itk::MorphologicalSignedDistanceTransformImageFilter" POINTER) -itk_wrap_image_filter_combinations("${WRAP_ITK_USIGN_INT}" "${WRAP_ITK_SCALAR}") +itk_wrap_image_filter_combinations("${WRAP_ITK_USIGN_INT}" "${WRAP_ITK_REAL}") itk_end_wrap_class() From 7233b040d6738c731b91a62f8524d3dd3e884a96 Mon Sep 17 00:00:00 2001 From: Niels Dekker Date: Tue, 2 Jul 2024 12:04:37 +0200 Subject: [PATCH 152/165] BUG: Fix memory leaks by moving `progress` from the heap to the stack Declaring those two local `ProgressReporter` objects on the stack (instead of on the heap) may benefit run-time performance. But moreover, it fixes two memory leaks (missing `delete progress`). --- .../itkParabolicErodeDilateImageFilter.hxx | 17 ++++++++--------- .../itkParabolicOpenCloseImageFilter.hxx | 18 +++++++++--------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx index b4e8806fe9e..7608fce09a4 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx @@ -211,13 +211,12 @@ ParabolicErodeDilateImageFilter::ThreadedGe } float progressPerDimension = 1.0 / ImageDimension; - auto * progress = new ProgressReporter(this, - threadId, - NumberOfRows[m_CurrentDimension], - 30, - m_CurrentDimension * progressPerDimension, - progressPerDimension); - + ProgressReporter progress(this, + threadId, + NumberOfRows[m_CurrentDimension], + 30, + m_CurrentDimension * progressPerDimension, + progressPerDimension); using InputConstIteratorType = ImageLinearConstIteratorWithIndex; using OutputIteratorType = ImageLinearIteratorWithIndex; @@ -252,7 +251,7 @@ ParabolicErodeDilateImageFilter::ThreadedGe doOneDimension( inputIterator, outputIterator, - *progress, + progress, LineLength, 0, this->m_MagnitudeSign, @@ -291,7 +290,7 @@ ParabolicErodeDilateImageFilter::ThreadedGe doOneDimension( inputIteratorStage2, outputIterator, - *progress, + progress, LineLength, m_CurrentDimension, this->m_MagnitudeSign, diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx index 1b471dc89dc..d94f3a53c61 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx @@ -282,12 +282,12 @@ ParabolicOpenCloseImageFilter::ThreadedGenera } float progressPerDimension = 1.0 / ImageDimension; - auto * progress = new ProgressReporter(this, - threadId, - NumberOfRows[m_CurrentDimension], - 30, - m_CurrentDimension * progressPerDimension, - progressPerDimension); + ProgressReporter progress(this, + threadId, + NumberOfRows[m_CurrentDimension], + 30, + m_CurrentDimension * progressPerDimension, + progressPerDimension); using InputConstIteratorType = ImageLinearConstIteratorWithIndex; using OutputIteratorType = ImageLinearIteratorWithIndex; @@ -326,7 +326,7 @@ ParabolicOpenCloseImageFilter::ThreadedGenera doOneDimension( inputIterator, outputIterator, - *progress, + progress, LineLength, 0, this->m_MagnitudeSign, @@ -363,7 +363,7 @@ ParabolicOpenCloseImageFilter::ThreadedGenera doOneDimension( inputIteratorStage2, outputIterator, - *progress, + progress, LineLength, m_CurrentDimension, this->m_MagnitudeSign, @@ -387,7 +387,7 @@ ParabolicOpenCloseImageFilter::ThreadedGenera doOneDimension( inputIteratorStage2, outputIterator, - *progress, + progress, LineLength, m_CurrentDimension, this->m_MagnitudeSign, From e5457290ca7dafc6d82b19e92b60408e95e97e29 Mon Sep 17 00:00:00 2001 From: Niels Dekker Date: Wed, 3 Jul 2024 16:34:37 +0200 Subject: [PATCH 153/165] STYLE: Remove m_Extreme and m_MagnitudeSign data members The "magnitude sign" fully depends on `doDilate`, and the "extreme" just depends on `doDilate` and the input pixel type. Both values can be estimated at compile-time, so it is not necessary to have member variables for those values. This commit might yield some performance improvement. --- .../itkParabolicErodeDilateImageFilter.h | 3 -- .../itkParabolicErodeDilateImageFilter.hxx | 20 ++--------- .../include/itkParabolicMorphUtils.h | 28 +++++++++------ .../itkParabolicOpenCloseImageFilter.h | 7 ---- .../itkParabolicOpenCloseImageFilter.hxx | 36 ++----------------- 5 files changed, 22 insertions(+), 72 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h index 0efd9a68a45..c90d88a0efe 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.h @@ -200,9 +200,6 @@ class ITK_TEMPLATE_EXPORT ParabolicErodeDilateImageFilter : public ImageToImageF private: RadiusType m_Scale; - typename TInputImage::PixelType m_Extreme; - - int m_MagnitudeSign; int m_CurrentDimension; }; } // end namespace itk diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx index b4e8806fe9e..4a8e90fa8ce 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx @@ -38,19 +38,7 @@ ParabolicErodeDilateImageFilter::ParabolicE { this->SetNumberOfRequiredOutputs(1); this->SetNumberOfRequiredInputs(1); - // needs to be selected according to erosion/dilation - if (doDilate) - { - // m_Extreme = NumericTraits::min(); - m_Extreme = NumericTraits::NonpositiveMin(); - m_MagnitudeSign = 1; - } - else - { - m_Extreme = NumericTraits::max(); - m_MagnitudeSign = -1; - } m_UseImageSpacing = false; m_ParabolicAlgorithm = INTERSECTION; @@ -249,15 +237,13 @@ ParabolicErodeDilateImageFilter::ThreadedGe unsigned long LineLength = region.GetSize()[0]; RealType image_scale = this->GetInput()->GetSpacing()[0]; - doOneDimension( + doOneDimension( inputIterator, outputIterator, *progress, LineLength, 0, - this->m_MagnitudeSign, this->m_UseImageSpacing, - this->m_Extreme, image_scale, this->m_Scale[0], m_ParabolicAlgorithm); @@ -288,15 +274,13 @@ ParabolicErodeDilateImageFilter::ThreadedGe // RealType magnitude = 1.0/(2.0 * m_Scale[dd]); RealType image_scale = this->GetInput()->GetSpacing()[m_CurrentDimension]; - doOneDimension( + doOneDimension( inputIteratorStage2, outputIterator, *progress, LineLength, m_CurrentDimension, - this->m_MagnitudeSign, this->m_UseImageSpacing, - this->m_Extreme, image_scale, this->m_Scale[m_CurrentDimension], m_ParabolicAlgorithm); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h index 8bfce7ec9e6..c2c025faf43 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h @@ -25,10 +25,13 @@ namespace itk { // contact point algorithm -template +template void -DoLineCP(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, const RealType magnitude, const RealType m_Extreme) +DoLineCP(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, const RealType magnitude) { + static constexpr RealType extreme = + doDilate ? NumericTraits::NonpositiveMin() : NumericTraits::max(); + // contact point algorithm long koffset = 0, newcontact = 0; // how far away the search starts. @@ -37,8 +40,7 @@ DoLineCP(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, const RealType m // negative half of the parabola for (long pos = 0; pos < LineLength; pos++) { - auto BaseVal = (RealType)m_Extreme; // the base value for - // comparison + auto BaseVal = extreme; // the base value for comparison for (long krange = koffset; krange <= 0; krange++) { // difference needs to be paramaterised @@ -57,7 +59,7 @@ DoLineCP(LineBufferType & LineBuf, LineBufferType & tmpLineBuf, const RealType m koffset = newcontact = 0; for (long pos = LineLength - 1; pos >= 0; pos--) { - auto BaseVal = (RealType)m_Extreme; // the base value for comparison + auto BaseVal = extreme; // the base value for comparison for (long krange = koffset; krange >= 0; krange--) { RealType T = tmpLineBuf[pos + krange] - magnitude * krange * krange; @@ -177,16 +179,19 @@ DoLineIntAlg(LineBufferType & LineBuf, } } -template +template void doOneDimension(TInIter & inputIterator, TOutIter & outputIterator, ProgressReporter & progress, const long LineLength, const unsigned direction, - const int m_MagnitudeSign, const bool m_UseImageSpacing, - const RealType m_Extreme, const RealType image_scale, const RealType Sigma, int ParabolicAlgorithmChoice) @@ -225,10 +230,11 @@ doOneDimension(TInIter & inputIterator, { // using the contact point algorithm - // const RealType magnitude = m_MagnitudeSign * 1.0/(2.0 * + // const RealType magnitude = magnitudeSign * 1.0/(2.0 * // Sigma/(iscale*iscale)); // restructure equation to reduce numerical error - const RealType magnitudeCP = (m_MagnitudeSign * iscale * iscale) / (2.0 * Sigma); + constexpr int magnitudeSign = doDilate ? 1 : -1; + const RealType magnitudeCP = (magnitudeSign * iscale * iscale) / (2.0 * Sigma); LineBufferType LineBuf(LineLength); LineBufferType tmpLineBuf(LineLength); @@ -251,7 +257,7 @@ doOneDimension(TInIter & inputIterator, ++inputIterator; } - DoLineCP(LineBuf, tmpLineBuf, magnitudeCP, m_Extreme); + DoLineCP(LineBuf, tmpLineBuf, magnitudeCP); // copy the line back unsigned int j = 0; while (!outputIterator.IsAtEndOfLine()) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h index 17888d6b050..944cde9a56f 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.h @@ -167,13 +167,6 @@ class ITK_TEMPLATE_EXPORT ParabolicOpenCloseImageFilter : public ImageToImageFil private: RadiusType m_Scale; - typename TInputImage::PixelType m_Extreme; - typename TInputImage::PixelType m_Extreme1; - typename TInputImage::PixelType m_Extreme2; - - int m_MagnitudeSign; - int m_MagnitudeSign1; - int m_MagnitudeSign2; int m_CurrentDimension; int m_Stage; bool m_UseImageSpacing; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx index 1b471dc89dc..456e63ca50b 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx @@ -40,24 +40,6 @@ ParabolicOpenCloseImageFilter::ParabolicOpenC this->SetNumberOfRequiredOutputs(1); this->SetNumberOfRequiredInputs(1); // needs to be selected according to erosion/dilation - if (DoOpen) - { - // erosion then dilation - m_Extreme1 = NumericTraits::max(); - m_Extreme2 = NumericTraits::NonpositiveMin(); - m_MagnitudeSign1 = -1; - m_MagnitudeSign2 = 1; - } - else - { - // dilation then erosion - m_Extreme1 = NumericTraits::NonpositiveMin(); - m_Extreme2 = NumericTraits::max(); - m_MagnitudeSign1 = 1; - m_MagnitudeSign2 = -1; - } - m_Extreme = m_Extreme1; - m_MagnitudeSign = m_MagnitudeSign1; m_UseImageSpacing = false; m_ParabolicAlgorithm = INTERSECTION; m_Stage = 1; // indicate whether we are on the first pass or the @@ -208,9 +190,6 @@ ParabolicOpenCloseImageFilter::GenerateData() m_CurrentDimension = d; multithreader->SingleMethodExecute(); } - // swap over the parameters controlling erosion/dilation - m_Extreme = m_Extreme2; - m_MagnitudeSign = m_MagnitudeSign2; // multithread the execution - stage 2 m_Stage = 2; @@ -220,9 +199,6 @@ ParabolicOpenCloseImageFilter::GenerateData() multithreader->SingleMethodExecute(); } - // swap them back - m_Extreme = m_Extreme1; - m_MagnitudeSign = m_MagnitudeSign1; m_Stage = 1; #if 0 @@ -323,15 +299,13 @@ ParabolicOpenCloseImageFilter::ThreadedGenera unsigned long LineLength = region.GetSize()[0]; RealType image_scale = this->GetInput()->GetSpacing()[0]; - doOneDimension( + doOneDimension( inputIterator, outputIterator, *progress, LineLength, 0, - this->m_MagnitudeSign, this->m_UseImageSpacing, - this->m_Extreme, image_scale, this->m_Scale[0], m_ParabolicAlgorithm); @@ -360,15 +334,13 @@ ParabolicOpenCloseImageFilter::ThreadedGenera unsigned long LineLength = region.GetSize()[m_CurrentDimension]; RealType image_scale = this->GetInput()->GetSpacing()[m_CurrentDimension]; - doOneDimension( + doOneDimension( inputIteratorStage2, outputIterator, *progress, LineLength, m_CurrentDimension, - this->m_MagnitudeSign, this->m_UseImageSpacing, - this->m_Extreme, image_scale, this->m_Scale[m_CurrentDimension], m_ParabolicAlgorithm); @@ -384,15 +356,13 @@ ParabolicOpenCloseImageFilter::ThreadedGenera unsigned long LineLength = region.GetSize()[m_CurrentDimension]; RealType image_scale = this->GetInput()->GetSpacing()[m_CurrentDimension]; - doOneDimension( + doOneDimension( inputIteratorStage2, outputIterator, *progress, LineLength, m_CurrentDimension, - this->m_MagnitudeSign, this->m_UseImageSpacing, - this->m_Extreme, image_scale, this->m_Scale[m_CurrentDimension], m_ParabolicAlgorithm); From f30e1a326dc53c2aa5352ab88519c89845ccdf02 Mon Sep 17 00:00:00 2001 From: Niels Dekker Date: Fri, 19 Jul 2024 23:24:28 +0200 Subject: [PATCH 154/165] STYLE: Compute numberOfRows only for the current dimension `ParabolicErodeDilateImageFilter` and `ParabolicOpenCloseImageFilter` should not compute the number of rows for all dimensions, but just for their `m_CurrentDimension`. - Following elastix pull request https://github.com/SuperElastix/elastix/pull/1184 commit https://github.com/SuperElastix/elastix/commit/17b3bd0907f6bb7100c52571f80b3c5f386e47b9 "STYLE: ParabolicMorphology compute numberOfRows only for one dimension" --- .../itkParabolicErodeDilateImageFilter.hxx | 23 +++++++------------ .../itkParabolicOpenCloseImageFilter.hxx | 23 +++++++------------ 2 files changed, 16 insertions(+), 30 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx index 69f43ae0a84..7745dcb0398 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx @@ -183,28 +183,21 @@ ParabolicErodeDilateImageFilter::ThreadedGe ThreadIdType threadId) { // compute the number of rows first, so we can setup a progress reporter - typename std::vector NumberOfRows; - InputSizeType size = outputRegionForThread.GetSize(); + unsigned int numberOfRows = 1; + InputSizeType size = outputRegionForThread.GetSize(); - for (unsigned int i = 0; i < InputImageDimension; i++) + for (unsigned int d = 0; d < InputImageDimension; ++d) { - NumberOfRows.push_back(1); - for (unsigned int d = 0; d < InputImageDimension; d++) + if (d != m_CurrentDimension) { - if (d != i) - { - NumberOfRows[i] *= size[d]; - } + numberOfRows *= size[d]; } } + float progressPerDimension = 1.0 / ImageDimension; - ProgressReporter progress(this, - threadId, - NumberOfRows[m_CurrentDimension], - 30, - m_CurrentDimension * progressPerDimension, - progressPerDimension); + ProgressReporter progress( + this, threadId, numberOfRows, 30, m_CurrentDimension * progressPerDimension, progressPerDimension); using InputConstIteratorType = ImageLinearConstIteratorWithIndex; using OutputIteratorType = ImageLinearIteratorWithIndex; diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx index af4747c3561..19edbd62d15 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx @@ -242,28 +242,21 @@ ParabolicOpenCloseImageFilter::ThreadedGenera ThreadIdType threadId) { // compute the number of rows first, so we can setup a progress reporter - typename std::vector NumberOfRows; - InputSizeType size = outputRegionForThread.GetSize(); + unsigned int numberOfRows = 1; + InputSizeType size = outputRegionForThread.GetSize(); - for (unsigned int i = 0; i < InputImageDimension; i++) + for (unsigned int d = 0; d < InputImageDimension; ++d) { - NumberOfRows.push_back(1); - for (unsigned int d = 0; d < InputImageDimension; d++) + if (d != m_CurrentDimension) { - if (d != i) - { - NumberOfRows[i] *= size[d]; - } + numberOfRows *= size[d]; } } + float progressPerDimension = 1.0 / ImageDimension; - ProgressReporter progress(this, - threadId, - NumberOfRows[m_CurrentDimension], - 30, - m_CurrentDimension * progressPerDimension, - progressPerDimension); + ProgressReporter progress( + this, threadId, numberOfRows, 30, m_CurrentDimension * progressPerDimension, progressPerDimension); using InputConstIteratorType = ImageLinearConstIteratorWithIndex; using OutputIteratorType = ImageLinearIteratorWithIndex; From 4e07f126392e088764465de109eec8097d8b2d93 Mon Sep 17 00:00:00 2001 From: Niels Dekker Date: Thu, 15 Aug 2024 15:01:33 +0200 Subject: [PATCH 155/165] STYLE: Remove unused local `count` variables from `doOneDimension` Addressed compile time warnings, as observed by Richard Beare, https://github.com/InsightSoftwareConsortium/ITKParabolicMorphology/pull/48#issuecomment-2288453087 For the record, the first unused `count` variable appears introduced in itkParabolicMorphUtils.h with commit 5f61892202ad14d2ed625da1cc98afc3b6684717, "almost working version of intersection algorithm...", 29 February 2012. --- .../ParabolicMorphology/include/itkParabolicMorphUtils.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h index c2c025faf43..157a2248d50 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicMorphUtils.h @@ -243,7 +243,6 @@ doOneDimension(TInIter & inputIterator, inputIterator.GoToBegin(); outputIterator.GoToBegin(); - unsigned count = 0; while (!inputIterator.IsAtEnd() && !outputIterator.IsAtEnd()) { // process this direction @@ -266,7 +265,6 @@ doOneDimension(TInIter & inputIterator, ++outputIterator; } - ++count; // now onto the next line inputIterator.NextLine(); outputIterator.NextLine(); @@ -289,7 +287,6 @@ doOneDimension(TInIter & inputIterator, inputIterator.GoToBegin(); outputIterator.GoToBegin(); - unsigned count = 0; while (!inputIterator.IsAtEnd() && !outputIterator.IsAtEnd()) { // process this direction @@ -312,7 +309,6 @@ doOneDimension(TInIter & inputIterator, ++outputIterator; } - ++count; // now onto the next line inputIterator.NextLine(); outputIterator.NextLine(); From d1f93b9c2d5342cd535b051da0e16e37317e5da7 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Thu, 2 Apr 2026 21:25:35 -0500 Subject: [PATCH 156/165] COMP: Replace deprecated MultiThreaderType with itk::MultiThreaderBase ProcessObject::MultiThreaderType is deprecated. Use itk::MultiThreaderBase directly to silence -Wdeprecated-declarations warnings that cause the CTest dashboard to report build failures. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../include/itkParabolicErodeDilateImageFilter.hxx | 2 +- .../include/itkParabolicOpenCloseImageFilter.hxx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx index 7745dcb0398..77b49172ae2 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicErodeDilateImageFilter.hxx @@ -164,7 +164,7 @@ ParabolicErodeDilateImageFilter::GenerateDa typename ImageSource::ThreadStruct str; str.Filter = this; - ProcessObject::MultiThreaderType * multithreader = this->GetMultiThreader(); + itk::MultiThreaderBase * multithreader = this->GetMultiThreader(); multithreader->SetNumberOfWorkUnits(nbthreads); multithreader->SetSingleMethod(this->ThreaderCallback, &str); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx index 19edbd62d15..10d2598a7a2 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkParabolicOpenCloseImageFilter.hxx @@ -176,7 +176,7 @@ ParabolicOpenCloseImageFilter::GenerateData() typename ImageSource::ThreadStruct str; str.Filter = this; - ProcessObject::MultiThreaderType * multithreader = this->GetMultiThreader(); + itk::MultiThreaderBase * multithreader = this->GetMultiThreader(); multithreader->SetNumberOfWorkUnits(nbthreads); multithreader->SetSingleMethod(this->ThreaderCallback, &str); From 28ef0b2323bd8c81f95ba258e13f70ea6c33cd50 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 12 May 2026 11:22:33 -0500 Subject: [PATCH 157/165] DOC: Add ParabolicMorphology README pointing at upstream --- .../Filtering/ParabolicMorphology/README.md | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 Modules/Filtering/ParabolicMorphology/README.md diff --git a/Modules/Filtering/ParabolicMorphology/README.md b/Modules/Filtering/ParabolicMorphology/README.md new file mode 100644 index 00000000000..b2bcf3de5fe --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/README.md @@ -0,0 +1,29 @@ +# ParabolicMorphology + +In-tree ITK module providing fast mathematical morphology using +parabolic structuring functions. Implements distance transforms, +binary erosions, dilations, openings, closings by spheres, grayscale +operations, and sharpenings in linear time per pixel via +separable parabolic filtering. + +## Origin + +Ingested from the standalone remote module +[**InsightSoftwareConsortium/ITKParabolicMorphology**](https://github.com/InsightSoftwareConsortium/ITKParabolicMorphology) +on 2026-05-12, following the v4 ingestion guidelines defined in +InsightSoftwareConsortium/ITK#6204. The upstream repository will be +archived read-only after this PR merges; it remains reachable at the +URL above for historical reference (notably the `doc/`, `examples/`, +and `oldtests/` directories, which were intentionally left in the +upstream archive). + +## References + +- Beare R. *A Locally Constrained Radial Sum Decomposition for Fast + Spherical Mathematical Morphology.* International Symposium on + Mathematical Morphology, 2007. +- Felzenszwalb P., Huttenlocher D. *Distance Transforms of Sampled + Functions.* Theory of Computing 8(19), 415-428, 2012. + +- Beare R., Jackway P. *Parabolic Morphology in ITK.* The Insight + Journal. 2012. From eb30d60ea8427904d5f098ebeadd3aa150717279 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 12 May 2026 11:22:36 -0500 Subject: [PATCH 158/165] COMP: Remove ParabolicMorphology .remote.cmake (in-tree) --- .../Remote/ParabolicMorphology.remote.cmake | 53 ------------------- 1 file changed, 53 deletions(-) delete mode 100644 Modules/Remote/ParabolicMorphology.remote.cmake diff --git a/Modules/Remote/ParabolicMorphology.remote.cmake b/Modules/Remote/ParabolicMorphology.remote.cmake deleted file mode 100644 index 5e92848c4e0..00000000000 --- a/Modules/Remote/ParabolicMorphology.remote.cmake +++ /dev/null @@ -1,53 +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) -#-- - [ ] API | executable interface is considered mostly stable and feature complete -#-- - [ ] 10% C0-code coverage demonstrated for testing suite -#-- - [ ] 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( - ParabolicMorphology - "Classes performing morphology using parabolic functions. - Fast distance transforms and binary erosions/dilations/openings/closings - by spheres, sharpenings and grayscale operations. - https://doi.org/10.54294/aq68pt" - MODULE_COMPLIANCE_LEVEL 2 - GIT_REPOSITORY https://github.com/InsightSoftwareConsortium/ITKParabolicMorphology.git - GIT_TAG 68286edc7459072eb33422a7d53c855318496922 - ) From e672b9f6b51c58f2b5a3cdd6a96284f40306ee45 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 12 May 2026 11:24:11 -0500 Subject: [PATCH 159/165] ENH: Enable Module_ParabolicMorphology in configure-ci --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index c71c17ff58e..55c0c0e6e75 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -69,6 +69,7 @@ cmd = '''cmake \ -DModule_IOMeshMZ3:BOOL=ON \ -DModule_IOFDF:BOOL=ON \ -DModule_MorphologicalContourInterpolation:BOOL=ON \ + -DModule_ParabolicMorphology:BOOL=ON \ -DModule_RLEImage:BOOL=ON \ -DModule_SubdivisionQuadEdgeMeshFilter:BOOL=ON \ -DModule_TextureFeatures:BOOL=ON \ From 7e5d6549c519b4ba6bdfb7fe98c8bf1df545f5d3 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 12 May 2026 11:59:15 -0500 Subject: [PATCH 160/165] DOC: Add Beare 2008 IJ reference to ParabolicMorphology README --- Modules/Filtering/ParabolicMorphology/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/README.md b/Modules/Filtering/ParabolicMorphology/README.md index b2bcf3de5fe..a19c2514fbd 100644 --- a/Modules/Filtering/ParabolicMorphology/README.md +++ b/Modules/Filtering/ParabolicMorphology/README.md @@ -19,11 +19,11 @@ upstream archive). ## References -- Beare R. *A Locally Constrained Radial Sum Decomposition for Fast - Spherical Mathematical Morphology.* International Symposium on - Mathematical Morphology, 2007. +- Beare R. *Morphology with parabolic structuring elements.* The + Insight Journal. January-June. 2008. + +- Beare R., Jackway P. *Parabolic Morphology in ITK.* The Insight + Journal. 2012. - Felzenszwalb P., Huttenlocher D. *Distance Transforms of Sampled Functions.* Theory of Computing 8(19), 415-428, 2012. -- Beare R., Jackway P. *Parabolic Morphology in ITK.* The Insight - Journal. 2012. From 5943436d2b43cc3bf8d78ef3fd9afe7bb4ba7458 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 12 May 2026 11:59:18 -0500 Subject: [PATCH 161/165] COMP: Restore ParabolicMorphology DESCRIPTION and add maintainer --- .../Filtering/ParabolicMorphology/itk-module.cmake | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/itk-module.cmake b/Modules/Filtering/ParabolicMorphology/itk-module.cmake index be9c7b7d88f..969625a2ae9 100644 --- a/Modules/Filtering/ParabolicMorphology/itk-module.cmake +++ b/Modules/Filtering/ParabolicMorphology/itk-module.cmake @@ -1,11 +1,4 @@ -# the top-level README is used for describing this module, just -# re-used it for documentation here -# itk_module() defines the module dependencies in ParabolicMorphology -# The testing module in ParabolicMorphology 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 +# Maintainer: Richard Beare itk_module( ParabolicMorphology DEPENDS @@ -17,5 +10,6 @@ itk_module( ITKMathematicalMorphology ITKSmoothing EXCLUDE_FROM_DEFAULT - DESCRIPTION "Module ingested from upstream." + DESCRIPTION + "Classes performing morphology using parabolic functions. Fast distance transforms and binary erosions/dilations/openings/closings by spheres, sharpenings and grayscale operations. https://doi.org/10.54294/aq68pt" ) From 8f056133b63b461248e7390093944030403347c3 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 12 May 2026 11:59:21 -0500 Subject: [PATCH 162/165] ENH: Add Python wrapping for ParabolicMorphology binary filters --- .../Filtering/ParabolicMorphology/wrapping/CMakeLists.txt | 5 +++++ .../wrapping/itkBinaryCloseParaImageFilter.wrap | 3 +++ .../wrapping/itkBinaryDilateParaImageFilter.wrap | 3 +++ .../wrapping/itkBinaryErodeParaImageFilter.wrap | 3 +++ .../wrapping/itkBinaryOpenParaImageFilter.wrap | 3 +++ 5 files changed, 17 insertions(+) create mode 100644 Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryCloseParaImageFilter.wrap create mode 100644 Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryDilateParaImageFilter.wrap create mode 100644 Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryErodeParaImageFilter.wrap create mode 100644 Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryOpenParaImageFilter.wrap diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/wrapping/CMakeLists.txt index 96db9f815b8..949f1439b25 100644 --- a/Modules/Filtering/ParabolicMorphology/wrapping/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/wrapping/CMakeLists.txt @@ -3,11 +3,16 @@ itk_wrap_module(ParabolicMorphology) set( WRAPPER_SUBMODULE_ORDER itkMorphologicalDistanceTransformImageFilter + itkMorphologicalSharpeningImageFilter itkMorphologicalSignedDistanceTransformImageFilter itkParabolicCloseImageFilter itkParabolicDilateImageFilter itkParabolicErodeImageFilter itkParabolicOpenImageFilter + itkBinaryCloseParaImageFilter + itkBinaryDilateParaImageFilter + itkBinaryErodeParaImageFilter + itkBinaryOpenParaImageFilter ) itk_auto_load_submodules() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryCloseParaImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryCloseParaImageFilter.wrap new file mode 100644 index 00000000000..3f393f5a918 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryCloseParaImageFilter.wrap @@ -0,0 +1,3 @@ +itk_wrap_class("itk::BinaryCloseParaImageFilter" POINTER_WITH_SUPERCLASS) +itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2 2+) +itk_end_wrap_class() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryDilateParaImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryDilateParaImageFilter.wrap new file mode 100644 index 00000000000..c2c2f89e253 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryDilateParaImageFilter.wrap @@ -0,0 +1,3 @@ +itk_wrap_class("itk::BinaryDilateParaImageFilter" POINTER_WITH_SUPERCLASS) +itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2 2+) +itk_end_wrap_class() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryErodeParaImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryErodeParaImageFilter.wrap new file mode 100644 index 00000000000..a1faeefbe22 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryErodeParaImageFilter.wrap @@ -0,0 +1,3 @@ +itk_wrap_class("itk::BinaryErodeParaImageFilter" POINTER_WITH_SUPERCLASS) +itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2 2+) +itk_end_wrap_class() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryOpenParaImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryOpenParaImageFilter.wrap new file mode 100644 index 00000000000..4a04adcac86 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryOpenParaImageFilter.wrap @@ -0,0 +1,3 @@ +itk_wrap_class("itk::BinaryOpenParaImageFilter" POINTER_WITH_SUPERCLASS) +itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2 2+) +itk_end_wrap_class() From c1444da7d5c6bfbb55451ff0637d39734a8ca02e Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 12 May 2026 11:59:24 -0500 Subject: [PATCH 163/165] STYLE: Remove unused IJMacros.txt scaffolding from ParabolicMorphology tests --- .../ParabolicMorphology/test/IJMacros.txt | 72 ------------------- 1 file changed, 72 deletions(-) delete mode 100644 Modules/Filtering/ParabolicMorphology/test/IJMacros.txt diff --git a/Modules/Filtering/ParabolicMorphology/test/IJMacros.txt b/Modules/Filtering/ParabolicMorphology/test/IJMacros.txt deleted file mode 100644 index 902199a4213..00000000000 --- a/Modules/Filtering/ParabolicMorphology/test/IJMacros.txt +++ /dev/null @@ -1,72 +0,0 @@ -#Macro to find a package and load it -#(you shouldn't need to modify this code) -MACRO(LOADPACKAGE Package) - SET(Included FALSE) - IF(EXISTS "/home/tester/XMLTestParser.py") - #If we're in the test environment, check and see if we're being asked for - #a specific version of some package. If so, we'll provide a direct path - #instead of counting on CMake to choose the right version. - IF(${Package} MATCHES "^ITK.*2[.]2[.]1$") - SET(ITK_DIR "/home/tester/ITK2.2.1/bin") - INCLUDE("/usr/local/share/CMake/Modules/FindITK.cmake") - INCLUDE(${ITK_USE_FILE}) - SET(Included TRUE) - ENDIF(${Package} MATCHES "^ITK.*2[.]2[.]1$") - IF(NOT Included AND ${Package} MATCHES "^ITK.*1[.]8[.]1$") - SET(ITK_DIR "/home/tester/ITK1.8.1/bin") - INCLUDE("/usr/local/share/CMake/Modules/FindITK.cmake") - INCLUDE(${ITK_USE_FILE}) - SET(Included TRUE) - ENDIF(NOT Included AND ${Package} MATCHES "^ITK.*1[.]8[.]1$") - IF(NOT Included AND ${Package} MATCHES "^VTK.*4[.]4$") - SET(VTK_DIR "/home/tester/VTK4.4/bin") - INCLUDE("/usr/local/share/CMake/Modules/FindVTK.cmake") - INCLUDE(${VTK_USE_FILE}) - SET(Included TRUE) - ENDIF(NOT Included AND ${Package} MATCHES "^VTK.*4[.]4$") - IF(NOT Included AND ${Package} MATCHES "^VTK.*5[.]0$") - SET(VTK_DIR "/home/tester/VTK5.0/bin") - INCLUDE("/usr/local/share/CMake/Modules/FindVTK.cmake") - INCLUDE(${VTK_USE_FILE}) - SET(Included TRUE) - ENDIF(NOT Included AND ${Package} MATCHES "^VTK.*5[.]0$") - #If we get this far and we still haven't found a match, set it up so the - #next block of code has a chance at finding the package. - IF(NOT Included AND ${Package} MATCHES "^VTK") - SET(Package "VTK") - ENDIF(NOT Included AND ${Package} MATCHES "^VTK") - IF(NOT Included AND ${Package} MATCHES "^ITK") - SET(Package "ITK") - ENDIF(NOT Included AND ${Package} MATCHES "^ITK") - ENDIF(EXISTS "/home/tester/XMLTestParser.py") - - #no point in executing the code below if we already found the package we're - #looking for. - IF(NOT Included) - FIND_PACKAGE(${Package}) - IF(${Package}_FOUND) - #most packages define a Package_INCLUDE_DIR variable, so we'll check for - #that first - IF(${Package}_INCLUDE_DIR) - INCLUDE(${${Package}_INCLUDE_DIR}) - SET(Included TRUE) - ELSE(${Package}_INCLUDE_DIR) - #VTK and ITK prefer to define a Package_USE_FILE, so we need to look for - #that too - IF(${Package}_USE_FILE) - INCLUDE(${${Package}_USE_FILE}) - SET(Included TRUE) - ENDIF(${Package}_USE_FILE) - ENDIF(${Package}_INCLUDE_DIR) - #then there's some other pesky packages that don't like to define standard - #variables at all. If you're trying to include one of those you might have - #to do a little bit of investigating on your own. - IF(NOT Included) - MESSAGE(FATAL_ERROR "${Package} was found, but couldn't be included.\n - Try including it manually out of the FOREACH in the CMakeLists file.\n - Look at Find${Package}.cmake in the CMake module directory for clues - on what you're supposed to include. Good luck.") - ENDIF(NOT Included) - ENDIF(${Package}_FOUND) - ENDIF(NOT Included) -ENDMACRO(LOADPACKAGE) From 883a885946f869383db14b7387466763202151fb Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 12 May 2026 12:04:46 -0500 Subject: [PATCH 164/165] STYLE: Rename Binary*Para to Binary*Parabolic for naming consistency --- ...h => itkBinaryCloseParabolicImageFilter.h} | 28 +++++++++---------- ...=> itkBinaryCloseParabolicImageFilter.hxx} | 12 ++++---- ... => itkBinaryDilateParabolicImageFilter.h} | 22 +++++++-------- ...> itkBinaryDilateParabolicImageFilter.hxx} | 14 +++++----- ...h => itkBinaryErodeParabolicImageFilter.h} | 22 +++++++-------- ...=> itkBinaryErodeParabolicImageFilter.hxx} | 14 +++++----- ....h => itkBinaryOpenParabolicImageFilter.h} | 28 +++++++++---------- ... => itkBinaryOpenParabolicImageFilter.hxx} | 12 ++++---- .../ParabolicMorphology/test/CMakeLists.txt | 24 ++++++++-------- ...st.cxx => itkBinaryCloseParabolicTest.cxx} | 6 ++-- ...t.cxx => itkBinaryDilateParabolicTest.cxx} | 6 ++-- ...st.cxx => itkBinaryErodeParabolicTest.cxx} | 6 ++-- ...est.cxx => itkBinaryOpenParabolicTest.cxx} | 6 ++-- .../wrapping/CMakeLists.txt | 8 +++--- .../itkBinaryCloseParaImageFilter.wrap | 3 -- .../itkBinaryCloseParabolicImageFilter.wrap | 3 ++ .../itkBinaryDilateParaImageFilter.wrap | 3 -- .../itkBinaryDilateParabolicImageFilter.wrap | 3 ++ .../itkBinaryErodeParaImageFilter.wrap | 3 -- .../itkBinaryErodeParabolicImageFilter.wrap | 3 ++ .../itkBinaryOpenParaImageFilter.wrap | 3 -- .../itkBinaryOpenParabolicImageFilter.wrap | 3 ++ 22 files changed, 116 insertions(+), 116 deletions(-) rename Modules/Filtering/ParabolicMorphology/include/{itkBinaryOpenParaImageFilter.h => itkBinaryCloseParabolicImageFilter.h} (91%) rename Modules/Filtering/ParabolicMorphology/include/{itkBinaryCloseParaImageFilter.hxx => itkBinaryCloseParabolicImageFilter.hxx} (94%) rename Modules/Filtering/ParabolicMorphology/include/{itkBinaryDilateParaImageFilter.h => itkBinaryDilateParabolicImageFilter.h} (89%) rename Modules/Filtering/ParabolicMorphology/include/{itkBinaryDilateParaImageFilter.hxx => itkBinaryDilateParabolicImageFilter.hxx} (88%) rename Modules/Filtering/ParabolicMorphology/include/{itkBinaryErodeParaImageFilter.h => itkBinaryErodeParabolicImageFilter.h} (89%) rename Modules/Filtering/ParabolicMorphology/include/{itkBinaryErodeParaImageFilter.hxx => itkBinaryErodeParabolicImageFilter.hxx} (89%) rename Modules/Filtering/ParabolicMorphology/include/{itkBinaryCloseParaImageFilter.h => itkBinaryOpenParabolicImageFilter.h} (91%) rename Modules/Filtering/ParabolicMorphology/include/{itkBinaryOpenParaImageFilter.hxx => itkBinaryOpenParabolicImageFilter.hxx} (94%) rename Modules/Filtering/ParabolicMorphology/test/{itkBinaryCloseParaTest.cxx => itkBinaryCloseParabolicTest.cxx} (93%) rename Modules/Filtering/ParabolicMorphology/test/{itkBinaryErodeParaTest.cxx => itkBinaryDilateParabolicTest.cxx} (93%) rename Modules/Filtering/ParabolicMorphology/test/{itkBinaryDilateParaTest.cxx => itkBinaryErodeParabolicTest.cxx} (93%) rename Modules/Filtering/ParabolicMorphology/test/{itkBinaryOpenParaTest.cxx => itkBinaryOpenParabolicTest.cxx} (93%) delete mode 100644 Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryCloseParaImageFilter.wrap create mode 100644 Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryCloseParabolicImageFilter.wrap delete mode 100644 Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryDilateParaImageFilter.wrap create mode 100644 Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryDilateParabolicImageFilter.wrap delete mode 100644 Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryErodeParaImageFilter.wrap create mode 100644 Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryErodeParabolicImageFilter.wrap delete mode 100644 Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryOpenParaImageFilter.wrap create mode 100644 Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryOpenParabolicImageFilter.wrap diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParabolicImageFilter.h similarity index 91% rename from Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h rename to Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParabolicImageFilter.h index e5d07550daa..38805016b84 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParabolicImageFilter.h @@ -15,8 +15,8 @@ * limitations under the License. * *=========================================================================*/ -#ifndef itkBinaryOpenParaImageFilter_h -#define itkBinaryOpenParaImageFilter_h +#ifndef itkBinaryCloseParabolicImageFilter_h +#define itkBinaryCloseParabolicImageFilter_h #include "itkParabolicErodeImageFilter.h" #include "itkParabolicDilateImageFilter.h" @@ -26,7 +26,7 @@ namespace itk { /** - * \class BinaryOpenParaImageFilter + * \class BinaryCloseParabolicImageFilter * \brief Class for binary morphological opening operation. * * This class uses the parabolic morphology operations to do very @@ -47,17 +47,17 @@ namespace itk * equal to the circle radius, rather than any part of the voxel * inside the circle. * + * Also note that the inputs must be 0/1 not 0/max for pixel type. + * * This filter was developed as a result of discussions with * M.Starring on the ITK mailing list. * - * Also note that the inputs must be 0/1 not 0/max for pixel type. - * * Core methods described in the InsightJournal article: * "Morphology with parabolic structuring elements" * * https://hdl.handle.net/1926/1370 - * \sa itkParabolicErodeImageFilter * + * \sa itkParabolicErodeImageFilter * * \ingroup ParabolicMorphology * @@ -66,14 +66,14 @@ namespace itk **/ template -class ITK_TEMPLATE_EXPORT BinaryOpenParaImageFilter : public ImageToImageFilter +class ITK_TEMPLATE_EXPORT BinaryCloseParabolicImageFilter : public ImageToImageFilter { public: - ITK_DISALLOW_COPY_AND_MOVE(BinaryOpenParaImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(BinaryCloseParabolicImageFilter); /** Standard class type alias. */ - using Self = BinaryOpenParaImageFilter; + using Self = BinaryCloseParabolicImageFilter; using Superclass = ImageToImageFilter; using Pointer = SmartPointer; using ConstPointer = SmartPointer; @@ -82,7 +82,7 @@ class ITK_TEMPLATE_EXPORT BinaryOpenParaImageFilter : public ImageToImageFilter< itkNewMacro(Self); /** Runtime information support. */ - itkTypeMacro(BinaryOpenParaImageFilter, ImageToImageFilter); + itkTypeMacro(BinaryCloseParabolicImageFilter, ImageToImageFilter); /** Pixel Type of the input image */ using InputImageType = TInputImage; @@ -142,8 +142,8 @@ class ITK_TEMPLATE_EXPORT BinaryOpenParaImageFilter : public ImageToImageFilter< void GenerateData() override; - BinaryOpenParaImageFilter(); - ~BinaryOpenParaImageFilter() override = default; + BinaryCloseParabolicImageFilter(); + ~BinaryCloseParabolicImageFilter() override = default; void PrintSelf(std::ostream & os, Indent indent) const override; @@ -180,7 +180,7 @@ class ITK_TEMPLATE_EXPORT BinaryOpenParaImageFilter : public ImageToImageFilter< } // end namespace itk #ifndef ITK_MANUAL_INSTANTIATION -# include "itkBinaryOpenParaImageFilter.hxx" +# include "itkBinaryCloseParabolicImageFilter.hxx" #endif -#endif //__itkBinaryOpenParaImageFilter_h +#endif //__itkBinaryCloseParabolicImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParabolicImageFilter.hxx similarity index 94% rename from Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx rename to Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParabolicImageFilter.hxx index 49a0c38d595..e565fe72e15 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParabolicImageFilter.hxx @@ -15,8 +15,8 @@ * limitations under the License. * *=========================================================================*/ -#ifndef itkBinaryCloseParaImageFilter_hxx -#define itkBinaryCloseParaImageFilter_hxx +#ifndef itkBinaryCloseParabolicImageFilter_hxx +#define itkBinaryCloseParabolicImageFilter_hxx #include "itkProgressAccumulator.h" #include "itkParabolicErodeImageFilter.h" @@ -28,7 +28,7 @@ namespace itk { template -BinaryCloseParaImageFilter::BinaryCloseParaImageFilter() +BinaryCloseParabolicImageFilter::BinaryCloseParabolicImageFilter() { this->SetNumberOfRequiredOutputs(1); this->SetNumberOfRequiredInputs(1); @@ -49,7 +49,7 @@ BinaryCloseParaImageFilter::BinaryCloseParaImageFilte template void -BinaryCloseParaImageFilter::SetRadius(ScalarRealType radius) +BinaryCloseParabolicImageFilter::SetRadius(ScalarRealType radius) { RadiusType s; @@ -59,7 +59,7 @@ BinaryCloseParaImageFilter::SetRadius(ScalarRealType template void -BinaryCloseParaImageFilter::GenerateData() +BinaryCloseParabolicImageFilter::GenerateData() { // Allocate the output this->AllocateOutputs(); @@ -219,7 +219,7 @@ BinaryCloseParaImageFilter::GenerateData() template void -BinaryCloseParaImageFilter::PrintSelf(std::ostream & os, Indent indent) const +BinaryCloseParabolicImageFilter::PrintSelf(std::ostream & os, Indent indent) const { Superclass::PrintSelf(os, indent); if (this->m_CircErode->GetUseImageSpacing()) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParabolicImageFilter.h similarity index 89% rename from Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h rename to Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParabolicImageFilter.h index 92e44fe2579..068b77ca0d0 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParabolicImageFilter.h @@ -15,8 +15,8 @@ * limitations under the License. * *=========================================================================*/ -#ifndef itkBinaryDilateParaImageFilter_h -#define itkBinaryDilateParaImageFilter_h +#ifndef itkBinaryDilateParabolicImageFilter_h +#define itkBinaryDilateParabolicImageFilter_h #include "itkParabolicDilateImageFilter.h" #include "itkBinaryThresholdImageFilter.h" @@ -24,7 +24,7 @@ namespace itk { /** - * \class BinaryDilateParaImageFilter + * \class BinaryDilateParabolicImageFilter * \brief Class for binary morphological erosion operation. * * This class uses the parabolic morphology operations to do very @@ -64,14 +64,14 @@ namespace itk **/ template -class ITK_TEMPLATE_EXPORT BinaryDilateParaImageFilter : public ImageToImageFilter +class ITK_TEMPLATE_EXPORT BinaryDilateParabolicImageFilter : public ImageToImageFilter { public: - ITK_DISALLOW_COPY_AND_MOVE(BinaryDilateParaImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(BinaryDilateParabolicImageFilter); /** Standard class type alias. */ - using Self = BinaryDilateParaImageFilter; + using Self = BinaryDilateParabolicImageFilter; using Superclass = ImageToImageFilter; using Pointer = SmartPointer; using ConstPointer = SmartPointer; @@ -80,7 +80,7 @@ class ITK_TEMPLATE_EXPORT BinaryDilateParaImageFilter : public ImageToImageFilte itkNewMacro(Self); /** Runtime information support. */ - itkTypeMacro(BinaryDilateParaImageFilter, ImageToImageFilter); + itkTypeMacro(BinaryDilateParabolicImageFilter, ImageToImageFilter); /** Pixel Type of the input image */ using InputImageType = TInputImage; @@ -134,8 +134,8 @@ class ITK_TEMPLATE_EXPORT BinaryDilateParaImageFilter : public ImageToImageFilte void GenerateData() override; - BinaryDilateParaImageFilter(); - ~BinaryDilateParaImageFilter() override = default; + BinaryDilateParabolicImageFilter(); + ~BinaryDilateParabolicImageFilter() override = default; void PrintSelf(std::ostream & os, Indent indent) const override; @@ -159,7 +159,7 @@ class ITK_TEMPLATE_EXPORT BinaryDilateParaImageFilter : public ImageToImageFilte } // end namespace itk #ifndef ITK_MANUAL_INSTANTIATION -# include "itkBinaryDilateParaImageFilter.hxx" +# include "itkBinaryDilateParabolicImageFilter.hxx" #endif -#endif //__itkBinaryDilateParaImageFilter_h +#endif //__itkBinaryDilateParabolicImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParabolicImageFilter.hxx similarity index 88% rename from Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx rename to Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParabolicImageFilter.hxx index 4c0573148a8..f6147e291f6 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParabolicImageFilter.hxx @@ -15,8 +15,8 @@ * limitations under the License. * *=========================================================================*/ -#ifndef itkBinaryDilateParaImageFilter_hxx -#define itkBinaryDilateParaImageFilter_hxx +#ifndef itkBinaryDilateParabolicImageFilter_hxx +#define itkBinaryDilateParabolicImageFilter_hxx #include "itkProgressAccumulator.h" #include "itkParabolicDilateImageFilter.h" @@ -25,7 +25,7 @@ namespace itk { template -BinaryDilateParaImageFilter::BinaryDilateParaImageFilter() +BinaryDilateParabolicImageFilter::BinaryDilateParabolicImageFilter() { this->SetNumberOfRequiredOutputs(1); this->SetNumberOfRequiredInputs(1); @@ -41,7 +41,7 @@ BinaryDilateParaImageFilter::BinaryDilateParaImageFil template void -BinaryDilateParaImageFilter::SetRadius(ScalarRealType radius) +BinaryDilateParabolicImageFilter::SetRadius(ScalarRealType radius) { RadiusType s; @@ -51,7 +51,7 @@ BinaryDilateParaImageFilter::SetRadius(ScalarRealType template void -BinaryDilateParaImageFilter::GenerateData() +BinaryDilateParabolicImageFilter::GenerateData() { // Allocate the output this->AllocateOutputs(); @@ -129,7 +129,7 @@ BinaryDilateParaImageFilter::GenerateData() template void -BinaryDilateParaImageFilter::Modified() const +BinaryDilateParabolicImageFilter::Modified() const { Superclass::Modified(); m_CircPara->Modified(); @@ -140,7 +140,7 @@ BinaryDilateParaImageFilter::Modified() const template void -BinaryDilateParaImageFilter::PrintSelf(std::ostream & os, Indent indent) const +BinaryDilateParabolicImageFilter::PrintSelf(std::ostream & os, Indent indent) const { Superclass::PrintSelf(os, indent); if (this->m_CircPara->GetUseImageSpacing()) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParabolicImageFilter.h similarity index 89% rename from Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h rename to Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParabolicImageFilter.h index a7fdae2c990..fed4ed3b65e 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParabolicImageFilter.h @@ -15,8 +15,8 @@ * limitations under the License. * *=========================================================================*/ -#ifndef itkBinaryErodeParaImageFilter_h -#define itkBinaryErodeParaImageFilter_h +#ifndef itkBinaryErodeParabolicImageFilter_h +#define itkBinaryErodeParabolicImageFilter_h #include "itkParabolicErodeImageFilter.h" #include "itkGreaterEqualValImageFilter.h" @@ -24,7 +24,7 @@ namespace itk { /** - * \class BinaryErodeParaImageFilter + * \class BinaryErodeParabolicImageFilter * \brief Class for binary morphological erosion operation. * * This class uses the parabolic morphology operations to do very @@ -65,14 +65,14 @@ namespace itk **/ template -class ITK_TEMPLATE_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilter +class ITK_TEMPLATE_EXPORT BinaryErodeParabolicImageFilter : public ImageToImageFilter { public: - ITK_DISALLOW_COPY_AND_MOVE(BinaryErodeParaImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(BinaryErodeParabolicImageFilter); /** Standard class type alias. */ - using Self = BinaryErodeParaImageFilter; + using Self = BinaryErodeParabolicImageFilter; using Superclass = ImageToImageFilter; using Pointer = SmartPointer; using ConstPointer = SmartPointer; @@ -81,7 +81,7 @@ class ITK_TEMPLATE_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilter itkNewMacro(Self); /** Runtime information support. */ - itkTypeMacro(BinaryErodeParaImageFilter, ImageToImageFilter); + itkTypeMacro(BinaryErodeParabolicImageFilter, ImageToImageFilter); /** Pixel Type of the input image */ using InputImageType = TInputImage; @@ -135,8 +135,8 @@ class ITK_TEMPLATE_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilter void GenerateData() override; - BinaryErodeParaImageFilter(); - ~BinaryErodeParaImageFilter() override = default; + BinaryErodeParabolicImageFilter(); + ~BinaryErodeParabolicImageFilter() override = default; void PrintSelf(std::ostream & os, Indent indent) const override; @@ -160,7 +160,7 @@ class ITK_TEMPLATE_EXPORT BinaryErodeParaImageFilter : public ImageToImageFilter } // end namespace itk #ifndef ITK_MANUAL_INSTANTIATION -# include "itkBinaryErodeParaImageFilter.hxx" +# include "itkBinaryErodeParabolicImageFilter.hxx" #endif -#endif //__itkBinaryErodeParaImageFilter_h +#endif //__itkBinaryErodeParabolicImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParabolicImageFilter.hxx similarity index 89% rename from Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx rename to Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParabolicImageFilter.hxx index 240dfdcb08c..e1ccb2e1fa8 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParabolicImageFilter.hxx @@ -15,8 +15,8 @@ * limitations under the License. * *=========================================================================*/ -#ifndef itkBinaryErodeParaImageFilter_hxx -#define itkBinaryErodeParaImageFilter_hxx +#ifndef itkBinaryErodeParabolicImageFilter_hxx +#define itkBinaryErodeParabolicImageFilter_hxx #include "itkProgressAccumulator.h" #include "itkParabolicErodeImageFilter.h" @@ -25,7 +25,7 @@ namespace itk { template -BinaryErodeParaImageFilter::BinaryErodeParaImageFilter() +BinaryErodeParabolicImageFilter::BinaryErodeParabolicImageFilter() { this->SetNumberOfRequiredOutputs(1); this->SetNumberOfRequiredInputs(1); @@ -41,7 +41,7 @@ BinaryErodeParaImageFilter::BinaryErodeParaImageFilte template void -BinaryErodeParaImageFilter::SetRadius(ScalarRealType radius) +BinaryErodeParabolicImageFilter::SetRadius(ScalarRealType radius) { RadiusType s; @@ -51,7 +51,7 @@ BinaryErodeParaImageFilter::SetRadius(ScalarRealType template void -BinaryErodeParaImageFilter::GenerateData() +BinaryErodeParabolicImageFilter::GenerateData() { // Allocate the output this->AllocateOutputs(); @@ -129,7 +129,7 @@ BinaryErodeParaImageFilter::GenerateData() template void -BinaryErodeParaImageFilter::PrintSelf(std::ostream & os, Indent indent) const +BinaryErodeParabolicImageFilter::PrintSelf(std::ostream & os, Indent indent) const { Superclass::PrintSelf(os, indent); if (this->m_CircPara->GetUseImageSpacing()) @@ -144,7 +144,7 @@ BinaryErodeParaImageFilter::PrintSelf(std::ostream & template void -BinaryErodeParaImageFilter::Modified() const +BinaryErodeParabolicImageFilter::Modified() const { Superclass::Modified(); m_CircPara->Modified(); diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParabolicImageFilter.h similarity index 91% rename from Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h rename to Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParabolicImageFilter.h index 1758ffcc1f3..8583bad62bc 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParaImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParabolicImageFilter.h @@ -15,8 +15,8 @@ * limitations under the License. * *=========================================================================*/ -#ifndef itkBinaryCloseParaImageFilter_h -#define itkBinaryCloseParaImageFilter_h +#ifndef itkBinaryOpenParabolicImageFilter_h +#define itkBinaryOpenParabolicImageFilter_h #include "itkParabolicErodeImageFilter.h" #include "itkParabolicDilateImageFilter.h" @@ -26,7 +26,7 @@ namespace itk { /** - * \class BinaryCloseParaImageFilter + * \class BinaryOpenParabolicImageFilter * \brief Class for binary morphological opening operation. * * This class uses the parabolic morphology operations to do very @@ -47,18 +47,18 @@ namespace itk * equal to the circle radius, rather than any part of the voxel * inside the circle. * - * Also note that the inputs must be 0/1 not 0/max for pixel type. - * * This filter was developed as a result of discussions with * M.Starring on the ITK mailing list. * + * Also note that the inputs must be 0/1 not 0/max for pixel type. + * * Core methods described in the InsightJournal article: * "Morphology with parabolic structuring elements" * * https://hdl.handle.net/1926/1370 - * * \sa itkParabolicErodeImageFilter * + * * \ingroup ParabolicMorphology * * \author Richard Beare, Department of Medicine, Monash University, @@ -66,14 +66,14 @@ namespace itk **/ template -class ITK_TEMPLATE_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter +class ITK_TEMPLATE_EXPORT BinaryOpenParabolicImageFilter : public ImageToImageFilter { public: - ITK_DISALLOW_COPY_AND_MOVE(BinaryCloseParaImageFilter); + ITK_DISALLOW_COPY_AND_MOVE(BinaryOpenParabolicImageFilter); /** Standard class type alias. */ - using Self = BinaryCloseParaImageFilter; + using Self = BinaryOpenParabolicImageFilter; using Superclass = ImageToImageFilter; using Pointer = SmartPointer; using ConstPointer = SmartPointer; @@ -82,7 +82,7 @@ class ITK_TEMPLATE_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter itkNewMacro(Self); /** Runtime information support. */ - itkTypeMacro(BinaryCloseParaImageFilter, ImageToImageFilter); + itkTypeMacro(BinaryOpenParabolicImageFilter, ImageToImageFilter); /** Pixel Type of the input image */ using InputImageType = TInputImage; @@ -142,8 +142,8 @@ class ITK_TEMPLATE_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter void GenerateData() override; - BinaryCloseParaImageFilter(); - ~BinaryCloseParaImageFilter() override = default; + BinaryOpenParabolicImageFilter(); + ~BinaryOpenParabolicImageFilter() override = default; void PrintSelf(std::ostream & os, Indent indent) const override; @@ -180,7 +180,7 @@ class ITK_TEMPLATE_EXPORT BinaryCloseParaImageFilter : public ImageToImageFilter } // end namespace itk #ifndef ITK_MANUAL_INSTANTIATION -# include "itkBinaryCloseParaImageFilter.hxx" +# include "itkBinaryOpenParabolicImageFilter.hxx" #endif -#endif //__itkBinaryCloseParaImageFilter_h +#endif //__itkBinaryOpenParabolicImageFilter_h diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParabolicImageFilter.hxx similarity index 94% rename from Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx rename to Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParabolicImageFilter.hxx index 74652413015..fb622d218bc 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParaImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParabolicImageFilter.hxx @@ -15,8 +15,8 @@ * limitations under the License. * *=========================================================================*/ -#ifndef itkBinaryOpenParaImageFilter_hxx -#define itkBinaryOpenParaImageFilter_hxx +#ifndef itkBinaryOpenParabolicImageFilter_hxx +#define itkBinaryOpenParabolicImageFilter_hxx #include "itkProgressAccumulator.h" #include "itkParabolicErodeImageFilter.h" @@ -28,7 +28,7 @@ namespace itk { template -BinaryOpenParaImageFilter::BinaryOpenParaImageFilter() +BinaryOpenParabolicImageFilter::BinaryOpenParabolicImageFilter() { this->SetNumberOfRequiredOutputs(1); this->SetNumberOfRequiredInputs(1); @@ -49,7 +49,7 @@ BinaryOpenParaImageFilter::BinaryOpenParaImageFilter( template void -BinaryOpenParaImageFilter::SetRadius(ScalarRealType radius) +BinaryOpenParabolicImageFilter::SetRadius(ScalarRealType radius) { RadiusType s; @@ -59,7 +59,7 @@ BinaryOpenParaImageFilter::SetRadius(ScalarRealType r template void -BinaryOpenParaImageFilter::GenerateData() +BinaryOpenParabolicImageFilter::GenerateData() { // Allocate the output this->AllocateOutputs(); @@ -222,7 +222,7 @@ BinaryOpenParaImageFilter::GenerateData() template void -BinaryOpenParaImageFilter::PrintSelf(std::ostream & os, Indent indent) const +BinaryOpenParabolicImageFilter::PrintSelf(std::ostream & os, Indent indent) const { Superclass::PrintSelf(os, indent); if (this->m_Circular) diff --git a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt index cf18f104a1e..ba83d9ce1ea 100644 --- a/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/test/CMakeLists.txt @@ -7,10 +7,10 @@ set( itkParaSpacingTest.cxx itkParaSharpenTest.cxx itkParaDTTest.cxx - itkBinaryDilateParaTest.cxx - itkBinaryErodeParaTest.cxx - itkBinaryOpenParaTest.cxx - itkBinaryCloseParaTest.cxx + itkBinaryDilateParabolicTest.cxx + itkBinaryErodeParabolicTest.cxx + itkBinaryOpenParabolicTest.cxx + itkBinaryCloseParabolicTest.cxx ) set(INPUT_IMAGE ${CMAKE_CURRENT_SOURCE_DIR}/images/cthead1.png) @@ -236,13 +236,13 @@ itk_add_test( ## Binary morphology itk_add_test( - NAME itkBinaryDilatePara2D_10 + NAME itkBinaryDilateParabolic2D_10 COMMAND ParabolicMorphologyTestDriver --compare dilatebinary10.mha ${CMAKE_CURRENT_SOURCE_DIR}/baseline/dilatebinary10.mha - itkBinaryDilateParaTest + itkBinaryDilateParabolicTest ${INPUT_IMAGE} 150 10 @@ -250,13 +250,13 @@ itk_add_test( ) itk_add_test( - NAME itkBinaryErodePara2D_10 + NAME itkBinaryErodeParabolic2D_10 COMMAND ParabolicMorphologyTestDriver --compare erodebinary10.mha ${CMAKE_CURRENT_SOURCE_DIR}/baseline/erodebinary10.mha - itkBinaryErodeParaTest + itkBinaryErodeParabolicTest ${INPUT_IMAGE} 120 10 @@ -264,13 +264,13 @@ itk_add_test( ) itk_add_test( - NAME itkBinaryOpenPara2D_10 + NAME itkBinaryOpenParabolic2D_10 COMMAND ParabolicMorphologyTestDriver --compare openbinary10.mha ${CMAKE_CURRENT_SOURCE_DIR}/baseline/openbinary10.mha - itkBinaryOpenParaTest + itkBinaryOpenParabolicTest ${INPUT_IMAGE} 130 10 @@ -278,13 +278,13 @@ itk_add_test( ) itk_add_test( - NAME itkBinaryClosePara2D_10 + NAME itkBinaryCloseParabolic2D_10 COMMAND ParabolicMorphologyTestDriver --compare closebinary10.mha ${CMAKE_CURRENT_SOURCE_DIR}/baseline/closebinary10.mha - itkBinaryCloseParaTest + itkBinaryCloseParabolicTest ${INPUT_IMAGE} 150 10 diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParabolicTest.cxx similarity index 93% rename from Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx rename to Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParabolicTest.cxx index 7a5e269790a..899a37c35b2 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryCloseParabolicTest.cxx @@ -24,10 +24,10 @@ #include "itkTimeProbe.h" #include "itkMultiThreaderBase.h" #include -#include "itkBinaryCloseParaImageFilter.h" +#include "itkBinaryCloseParabolicImageFilter.h" int -itkBinaryCloseParaTest(int argc, char * argv[]) +itkBinaryCloseParabolicTest(int argc, char * argv[]) { if (argc != 5) { @@ -62,7 +62,7 @@ itkBinaryCloseParaTest(int argc, char * argv[]) thresh->SetInsideValue(0); thresh->SetOutsideValue(1); // now to apply the erosion - using FilterType = itk::BinaryCloseParaImageFilter; + using FilterType = itk::BinaryCloseParabolicImageFilter; FilterType::Pointer filter = FilterType::New(); diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParabolicTest.cxx similarity index 93% rename from Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx rename to Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParabolicTest.cxx index 6282cfa94ca..6993cada922 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParabolicTest.cxx @@ -24,10 +24,10 @@ #include "itkTimeProbe.h" #include "itkMultiThreaderBase.h" #include -#include "itkBinaryErodeParaImageFilter.h" +#include "itkBinaryDilateParabolicImageFilter.h" int -itkBinaryErodeParaTest(int argc, char * argv[]) +itkBinaryDilateParabolicTest(int argc, char * argv[]) { if (argc != 5) { @@ -62,7 +62,7 @@ itkBinaryErodeParaTest(int argc, char * argv[]) thresh->SetInsideValue(0); thresh->SetOutsideValue(1); // now to apply the erosion - using FilterType = itk::BinaryErodeParaImageFilter; + using FilterType = itk::BinaryDilateParabolicImageFilter; FilterType::Pointer filter = FilterType::New(); diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParabolicTest.cxx similarity index 93% rename from Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx rename to Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParabolicTest.cxx index ecba10231a0..5da07c94e8a 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryDilateParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryErodeParabolicTest.cxx @@ -24,10 +24,10 @@ #include "itkTimeProbe.h" #include "itkMultiThreaderBase.h" #include -#include "itkBinaryDilateParaImageFilter.h" +#include "itkBinaryErodeParabolicImageFilter.h" int -itkBinaryDilateParaTest(int argc, char * argv[]) +itkBinaryErodeParabolicTest(int argc, char * argv[]) { if (argc != 5) { @@ -62,7 +62,7 @@ itkBinaryDilateParaTest(int argc, char * argv[]) thresh->SetInsideValue(0); thresh->SetOutsideValue(1); // now to apply the erosion - using FilterType = itk::BinaryDilateParaImageFilter; + using FilterType = itk::BinaryErodeParabolicImageFilter; FilterType::Pointer filter = FilterType::New(); diff --git a/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx b/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParabolicTest.cxx similarity index 93% rename from Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx rename to Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParabolicTest.cxx index 16784fa44cc..f07d6771eeb 100644 --- a/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParaTest.cxx +++ b/Modules/Filtering/ParabolicMorphology/test/itkBinaryOpenParabolicTest.cxx @@ -24,10 +24,10 @@ #include "itkTimeProbe.h" #include "itkMultiThreaderBase.h" #include -#include "itkBinaryOpenParaImageFilter.h" +#include "itkBinaryOpenParabolicImageFilter.h" int -itkBinaryOpenParaTest(int argc, char * argv[]) +itkBinaryOpenParabolicTest(int argc, char * argv[]) { if (argc != 5) { @@ -62,7 +62,7 @@ itkBinaryOpenParaTest(int argc, char * argv[]) thresh->SetInsideValue(0); thresh->SetOutsideValue(1); // now to apply the erosion - using FilterType = itk::BinaryOpenParaImageFilter; + using FilterType = itk::BinaryOpenParabolicImageFilter; FilterType::Pointer filter = FilterType::New(); diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/wrapping/CMakeLists.txt index 949f1439b25..fc929d1620f 100644 --- a/Modules/Filtering/ParabolicMorphology/wrapping/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/wrapping/CMakeLists.txt @@ -9,10 +9,10 @@ set( itkParabolicDilateImageFilter itkParabolicErodeImageFilter itkParabolicOpenImageFilter - itkBinaryCloseParaImageFilter - itkBinaryDilateParaImageFilter - itkBinaryErodeParaImageFilter - itkBinaryOpenParaImageFilter + itkBinaryCloseParabolicImageFilter + itkBinaryDilateParabolicImageFilter + itkBinaryErodeParabolicImageFilter + itkBinaryOpenParabolicImageFilter ) itk_auto_load_submodules() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryCloseParaImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryCloseParaImageFilter.wrap deleted file mode 100644 index 3f393f5a918..00000000000 --- a/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryCloseParaImageFilter.wrap +++ /dev/null @@ -1,3 +0,0 @@ -itk_wrap_class("itk::BinaryCloseParaImageFilter" POINTER_WITH_SUPERCLASS) -itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2 2+) -itk_end_wrap_class() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryCloseParabolicImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryCloseParabolicImageFilter.wrap new file mode 100644 index 00000000000..4c9152b989a --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryCloseParabolicImageFilter.wrap @@ -0,0 +1,3 @@ +itk_wrap_class("itk::BinaryCloseParabolicImageFilter" POINTER_WITH_SUPERCLASS) +itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2 2+) +itk_end_wrap_class() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryDilateParaImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryDilateParaImageFilter.wrap deleted file mode 100644 index c2c2f89e253..00000000000 --- a/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryDilateParaImageFilter.wrap +++ /dev/null @@ -1,3 +0,0 @@ -itk_wrap_class("itk::BinaryDilateParaImageFilter" POINTER_WITH_SUPERCLASS) -itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2 2+) -itk_end_wrap_class() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryDilateParabolicImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryDilateParabolicImageFilter.wrap new file mode 100644 index 00000000000..8e248d520a8 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryDilateParabolicImageFilter.wrap @@ -0,0 +1,3 @@ +itk_wrap_class("itk::BinaryDilateParabolicImageFilter" POINTER_WITH_SUPERCLASS) +itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2 2+) +itk_end_wrap_class() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryErodeParaImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryErodeParaImageFilter.wrap deleted file mode 100644 index a1faeefbe22..00000000000 --- a/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryErodeParaImageFilter.wrap +++ /dev/null @@ -1,3 +0,0 @@ -itk_wrap_class("itk::BinaryErodeParaImageFilter" POINTER_WITH_SUPERCLASS) -itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2 2+) -itk_end_wrap_class() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryErodeParabolicImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryErodeParabolicImageFilter.wrap new file mode 100644 index 00000000000..486aabd9631 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryErodeParabolicImageFilter.wrap @@ -0,0 +1,3 @@ +itk_wrap_class("itk::BinaryErodeParabolicImageFilter" POINTER_WITH_SUPERCLASS) +itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2 2+) +itk_end_wrap_class() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryOpenParaImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryOpenParaImageFilter.wrap deleted file mode 100644 index 4a04adcac86..00000000000 --- a/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryOpenParaImageFilter.wrap +++ /dev/null @@ -1,3 +0,0 @@ -itk_wrap_class("itk::BinaryOpenParaImageFilter" POINTER_WITH_SUPERCLASS) -itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2 2+) -itk_end_wrap_class() diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryOpenParabolicImageFilter.wrap b/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryOpenParabolicImageFilter.wrap new file mode 100644 index 00000000000..65a347e2b08 --- /dev/null +++ b/Modules/Filtering/ParabolicMorphology/wrapping/itkBinaryOpenParabolicImageFilter.wrap @@ -0,0 +1,3 @@ +itk_wrap_class("itk::BinaryOpenParabolicImageFilter" POINTER_WITH_SUPERCLASS) +itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2 2+) +itk_end_wrap_class() From c897d2dc918f57f64d5ecf080d17a625dead71e3 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 12 May 2026 14:35:11 -0500 Subject: [PATCH 165/165] STYLE: Address dzenanz/greptile review on ParabolicMorphology - Drop WRAPPER_SUBMODULE_ORDER list (filters are independent; itk_auto_load_submodules handles them without explicit ordering). - Fix Doxygen brief on BinaryDilateParabolicImageFilter (said erosion). - Remove duplicate #include of itkProgressAccumulator.h in four Binary* parabolic .hxx files. --- .../itkBinaryCloseParabolicImageFilter.hxx | 1 - .../itkBinaryDilateParabolicImageFilter.h | 2 +- .../itkBinaryDilateParabolicImageFilter.hxx | 1 - .../itkBinaryErodeParabolicImageFilter.hxx | 1 - .../itkBinaryOpenParabolicImageFilter.hxx | 1 - .../ParabolicMorphology/wrapping/CMakeLists.txt | 16 ---------------- 6 files changed, 1 insertion(+), 21 deletions(-) diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParabolicImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParabolicImageFilter.hxx index e565fe72e15..db0c621d5bc 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParabolicImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryCloseParabolicImageFilter.hxx @@ -20,7 +20,6 @@ #include "itkProgressAccumulator.h" #include "itkParabolicErodeImageFilter.h" -#include "itkProgressAccumulator.h" #include "itkCropImageFilter.h" #include "itkConstantPadImageFilter.h" #include "itkMath.h" diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParabolicImageFilter.h b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParabolicImageFilter.h index 068b77ca0d0..3710b4c523a 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParabolicImageFilter.h +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParabolicImageFilter.h @@ -25,7 +25,7 @@ namespace itk { /** * \class BinaryDilateParabolicImageFilter - * \brief Class for binary morphological erosion operation. + * \brief Class for binary morphological dilation operation. * * This class uses the parabolic morphology operations to do very * efficient erosions by circles/spheres. The operations are efficient diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParabolicImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParabolicImageFilter.hxx index f6147e291f6..ba64a971e5a 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParabolicImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryDilateParabolicImageFilter.hxx @@ -20,7 +20,6 @@ #include "itkProgressAccumulator.h" #include "itkParabolicDilateImageFilter.h" -#include "itkProgressAccumulator.h" namespace itk { diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParabolicImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParabolicImageFilter.hxx index e1ccb2e1fa8..6519659f858 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParabolicImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryErodeParabolicImageFilter.hxx @@ -20,7 +20,6 @@ #include "itkProgressAccumulator.h" #include "itkParabolicErodeImageFilter.h" -#include "itkProgressAccumulator.h" namespace itk { diff --git a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParabolicImageFilter.hxx b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParabolicImageFilter.hxx index fb622d218bc..634751a3565 100644 --- a/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParabolicImageFilter.hxx +++ b/Modules/Filtering/ParabolicMorphology/include/itkBinaryOpenParabolicImageFilter.hxx @@ -20,7 +20,6 @@ #include "itkProgressAccumulator.h" #include "itkParabolicErodeImageFilter.h" -#include "itkProgressAccumulator.h" #include "itkCropImageFilter.h" #include "itkConstantPadImageFilter.h" #include "itkMath.h" diff --git a/Modules/Filtering/ParabolicMorphology/wrapping/CMakeLists.txt b/Modules/Filtering/ParabolicMorphology/wrapping/CMakeLists.txt index fc929d1620f..c110d759119 100644 --- a/Modules/Filtering/ParabolicMorphology/wrapping/CMakeLists.txt +++ b/Modules/Filtering/ParabolicMorphology/wrapping/CMakeLists.txt @@ -1,19 +1,3 @@ itk_wrap_module(ParabolicMorphology) - -set( - WRAPPER_SUBMODULE_ORDER - itkMorphologicalDistanceTransformImageFilter - itkMorphologicalSharpeningImageFilter - itkMorphologicalSignedDistanceTransformImageFilter - itkParabolicCloseImageFilter - itkParabolicDilateImageFilter - itkParabolicErodeImageFilter - itkParabolicOpenImageFilter - itkBinaryCloseParabolicImageFilter - itkBinaryDilateParabolicImageFilter - itkBinaryErodeParabolicImageFilter - itkBinaryOpenParabolicImageFilter -) - itk_auto_load_submodules() itk_end_wrap_module()