From 861989d728ba025e478329905a11d45bd80143d8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Leonardo=20Fl=C3=B3rez-Valencia?= Date: Mon, 13 Mar 2017 17:11:53 -0500 Subject: [PATCH] ... --- CMakeLists.txt | 29 +- appli/CMakeLists.txt | 11 - appli/examples/CMakeLists.txt | 4 - appli/examples/ImageDijkstra.cxx | 69 ---- appli/experiments/CMakeLists.txt | 11 - appli/experiments/Hausdorff.cxx | 48 --- appli/experiments/Skeleton_00.cxx | 91 ----- cmake/BaseConfig.cmake | 51 --- cmake/CMakeLists.txt | 11 - cmake/Functions.cmake | 328 ------------------ cmake/KitwareTools.cmake | 19 - cmake/QtTools.cmake | 26 -- data/binary_test_2D_00.png | Bin 5192 -> 0 bytes data/ones_image.png | Bin 1697 -> 0 bytes data/test_mori_2D.png | Bin 69669 -> 0 bytes data/test_skeleton_2D.png | Bin 4886 -> 0 bytes data/workspaces/workspace_airwaysappli.wxml | 73 ---- examples/CMakeLists.txt | 21 -- examples/FastMarching_00.cxx | 55 --- examples/MoriRegionGrow_00.cxx | 60 ---- examples/RegionGrow_00.cxx | 100 ------ examples/Skeleton_00.cxx | 58 ---- lib/CMakeLists.txt | 8 - lib/fpa/Base/Algorithm.h | 150 -------- lib/fpa/Base/Algorithm.hxx | 269 -------------- lib/fpa/Base/Dijkstra.h | 66 ---- lib/fpa/Base/Dijkstra.hxx | 94 ----- lib/fpa/Base/Events.h | 100 ------ lib/fpa/Base/FastMarching.h | 59 ---- lib/fpa/Base/FastMarching.hxx | 82 ----- lib/fpa/Base/Functors/GaussianModel.h | 82 ----- lib/fpa/Base/Functors/GaussianModel.hxx | 100 ------ lib/fpa/Base/Functors/Inverse.h | 63 ---- lib/fpa/Base/Functors/Inverse.hxx | 36 -- lib/fpa/Base/Functors/RegionGrow/Base.h | 72 ---- lib/fpa/Base/Functors/RegionGrow/Tautology.h | 62 ---- .../Base/Functors/VertexCostFunctionBase.h | 55 --- lib/fpa/Base/MinimumSpanningTree.h | 80 ----- lib/fpa/Base/MinimumSpanningTree.hxx | 244 ------------- lib/fpa/Base/PriorityQueueAlgorithm.h | 64 ---- lib/fpa/Base/PriorityQueueAlgorithm.hxx | 60 ---- lib/fpa/Base/QueueAlgorithm.h | 59 ---- lib/fpa/Base/QueueAlgorithm.hxx | 57 --- lib/fpa/Base/RegionGrow.h | 79 ----- lib/fpa/Base/RegionGrow.hxx | 128 ------- lib/fpa/Config.h | 12 - lib/fpa/Image/Algorithm.h | 74 ---- lib/fpa/Image/Algorithm.hxx | 149 -------- lib/fpa/Image/Dijkstra.h | 54 --- lib/fpa/Image/Dijkstra.hxx | 26 -- lib/fpa/Image/EndPointsFilter.h | 77 ---- lib/fpa/Image/EndPointsFilter.hxx | 153 -------- lib/fpa/Image/FastMarching.h | 55 --- lib/fpa/Image/FastMarching.hxx | 50 --- lib/fpa/Image/Functors/Base.h | 56 --- .../Functors/RegionGrow/BinaryThreshold.h | 75 ---- .../Functors/RegionGrow/BinaryThreshold.hxx | 49 --- lib/fpa/Image/Functors/SimpleNeighborhood.h | 71 ---- lib/fpa/Image/Functors/SimpleNeighborhood.hxx | 113 ------ lib/fpa/Image/Functors/VertexCost.h | 68 ---- lib/fpa/Image/Functors/VertexCost.hxx | 42 --- lib/fpa/Image/MinimumSpanningTree.h | 65 ---- lib/fpa/Image/MinimumSpanningTree.hxx | 63 ---- lib/fpa/Image/MoriRegionGrow.h | 94 ----- lib/fpa/Image/MoriRegionGrow.hxx | 162 --------- lib/fpa/Image/MoriRegionGrowHelper.h | 90 ----- lib/fpa/Image/MoriRegionGrowHelper.hxx | 144 -------- lib/fpa/Image/RegionGrow.h | 55 --- lib/fpa/Image/RegionGrow.hxx | 34 -- lib/fpa/Image/SkeletonFilter.h | 83 ----- lib/fpa/Image/SkeletonFilter.hxx | 274 --------------- lib/fpaInstances/BaseFilters.i | 12 - lib/fpaInstances/CMakeLists.txt | 40 --- lib/fpaInstances/DataObjects.i | 9 - lib/fpaInstances/ImageFilters.i | 28 -- lib/fpaInstances/ImageFunctors.i | 16 - plugins/CMakeLists.txt | 57 --- plugins/DijkstraFunctors/DijkstraFunctors.i | 12 - .../ExtractPathFromMinimumSpanningTree.cxx | 80 ----- .../ExtractPathFromMinimumSpanningTree.h | 29 -- .../DijkstraFunctors/GaussianModelCost.cxx | 54 --- plugins/DijkstraFunctors/GaussianModelCost.h | 29 -- plugins/DijkstraFunctors/InvertCost.cxx | 56 --- plugins/DijkstraFunctors/InvertCost.h | 29 -- .../SimpleImageDijkstraCost.cxx | 74 ---- .../SimpleImageDijkstraCost.h | 32 -- plugins/Experiments/InsertNoiseIntoPoints.cxx | 76 ---- plugins/Experiments/InsertNoiseIntoPoints.h | 25 -- .../Experiments/SkeletonHausdorffDistance.cxx | 136 -------- .../Experiments/SkeletonHausdorffDistance.h | 40 --- plugins/Functors/Functors.i | 6 - plugins/Functors/Inverse.cxx | 89 ----- plugins/Functors/Inverse.h | 32 -- plugins/ImageAlgorithms/BaseFilter.cxx | 27 -- plugins/ImageAlgorithms/BaseFilter.h | 98 ------ plugins/ImageAlgorithms/Dijkstra.cxx | 99 ------ plugins/ImageAlgorithms/Dijkstra.h | 27 -- .../ExtractPathFromMinimumSpanningTree.cxx | 80 ----- .../ExtractPathFromMinimumSpanningTree.h | 29 -- plugins/ImageAlgorithms/FastMarching.cxx | 96 ----- plugins/ImageAlgorithms/FastMarching.h | 27 -- plugins/ImageAlgorithms/ImageAlgorithms.i | 50 --- plugins/ImageAlgorithms/RegionGrow.cxx | 87 ----- plugins/ImageAlgorithms/RegionGrow.h | 27 -- plugins/ImageFunctors/BinaryThreshold.cxx | 90 ----- plugins/ImageFunctors/BinaryThreshold.h | 32 -- plugins/ImageFunctors/Tautology.cxx | 87 ----- plugins/ImageFunctors/Tautology.h | 32 -- plugins/ImageFunctors/VertexCost.cxx | 89 ----- plugins/ImageFunctors/VertexCost.h | 32 -- .../RegionGrowFunctors/BinaryThreshold.cxx | 125 ------- plugins/RegionGrowFunctors/BinaryThreshold.h | 29 -- .../RegionGrowFunctors/RegionGrowFunctors.i | 7 - 113 files changed, 13 insertions(+), 7440 deletions(-) delete mode 100644 appli/CMakeLists.txt delete mode 100644 appli/examples/CMakeLists.txt delete mode 100644 appli/examples/ImageDijkstra.cxx delete mode 100644 appli/experiments/CMakeLists.txt delete mode 100644 appli/experiments/Hausdorff.cxx delete mode 100644 appli/experiments/Skeleton_00.cxx delete mode 100644 cmake/BaseConfig.cmake delete mode 100644 cmake/CMakeLists.txt delete mode 100644 cmake/Functions.cmake delete mode 100644 cmake/KitwareTools.cmake delete mode 100644 cmake/QtTools.cmake delete mode 100644 data/binary_test_2D_00.png delete mode 100644 data/ones_image.png delete mode 100644 data/test_mori_2D.png delete mode 100644 data/test_skeleton_2D.png delete mode 100644 data/workspaces/workspace_airwaysappli.wxml delete mode 100644 examples/CMakeLists.txt delete mode 100644 examples/FastMarching_00.cxx delete mode 100644 examples/MoriRegionGrow_00.cxx delete mode 100644 examples/RegionGrow_00.cxx delete mode 100644 examples/Skeleton_00.cxx delete mode 100644 lib/CMakeLists.txt delete mode 100644 lib/fpa/Base/Algorithm.h delete mode 100644 lib/fpa/Base/Algorithm.hxx delete mode 100644 lib/fpa/Base/Dijkstra.h delete mode 100644 lib/fpa/Base/Dijkstra.hxx delete mode 100644 lib/fpa/Base/Events.h delete mode 100644 lib/fpa/Base/FastMarching.h delete mode 100644 lib/fpa/Base/FastMarching.hxx delete mode 100644 lib/fpa/Base/Functors/GaussianModel.h delete mode 100644 lib/fpa/Base/Functors/GaussianModel.hxx delete mode 100644 lib/fpa/Base/Functors/Inverse.h delete mode 100644 lib/fpa/Base/Functors/Inverse.hxx delete mode 100644 lib/fpa/Base/Functors/RegionGrow/Base.h delete mode 100644 lib/fpa/Base/Functors/RegionGrow/Tautology.h delete mode 100644 lib/fpa/Base/Functors/VertexCostFunctionBase.h delete mode 100644 lib/fpa/Base/MinimumSpanningTree.h delete mode 100644 lib/fpa/Base/MinimumSpanningTree.hxx delete mode 100644 lib/fpa/Base/PriorityQueueAlgorithm.h delete mode 100644 lib/fpa/Base/PriorityQueueAlgorithm.hxx delete mode 100644 lib/fpa/Base/QueueAlgorithm.h delete mode 100644 lib/fpa/Base/QueueAlgorithm.hxx delete mode 100644 lib/fpa/Base/RegionGrow.h delete mode 100644 lib/fpa/Base/RegionGrow.hxx delete mode 100644 lib/fpa/Config.h delete mode 100644 lib/fpa/Image/Algorithm.h delete mode 100644 lib/fpa/Image/Algorithm.hxx delete mode 100644 lib/fpa/Image/Dijkstra.h delete mode 100644 lib/fpa/Image/Dijkstra.hxx delete mode 100644 lib/fpa/Image/EndPointsFilter.h delete mode 100644 lib/fpa/Image/EndPointsFilter.hxx delete mode 100644 lib/fpa/Image/FastMarching.h delete mode 100644 lib/fpa/Image/FastMarching.hxx delete mode 100644 lib/fpa/Image/Functors/Base.h delete mode 100644 lib/fpa/Image/Functors/RegionGrow/BinaryThreshold.h delete mode 100644 lib/fpa/Image/Functors/RegionGrow/BinaryThreshold.hxx delete mode 100644 lib/fpa/Image/Functors/SimpleNeighborhood.h delete mode 100644 lib/fpa/Image/Functors/SimpleNeighborhood.hxx delete mode 100644 lib/fpa/Image/Functors/VertexCost.h delete mode 100644 lib/fpa/Image/Functors/VertexCost.hxx delete mode 100644 lib/fpa/Image/MinimumSpanningTree.h delete mode 100644 lib/fpa/Image/MinimumSpanningTree.hxx delete mode 100644 lib/fpa/Image/MoriRegionGrow.h delete mode 100644 lib/fpa/Image/MoriRegionGrow.hxx delete mode 100644 lib/fpa/Image/MoriRegionGrowHelper.h delete mode 100644 lib/fpa/Image/MoriRegionGrowHelper.hxx delete mode 100644 lib/fpa/Image/RegionGrow.h delete mode 100644 lib/fpa/Image/RegionGrow.hxx delete mode 100644 lib/fpa/Image/SkeletonFilter.h delete mode 100644 lib/fpa/Image/SkeletonFilter.hxx delete mode 100644 lib/fpaInstances/BaseFilters.i delete mode 100644 lib/fpaInstances/CMakeLists.txt delete mode 100644 lib/fpaInstances/DataObjects.i delete mode 100644 lib/fpaInstances/ImageFilters.i delete mode 100644 lib/fpaInstances/ImageFunctors.i delete mode 100644 plugins/CMakeLists.txt delete mode 100644 plugins/DijkstraFunctors/DijkstraFunctors.i delete mode 100644 plugins/DijkstraFunctors/ExtractPathFromMinimumSpanningTree.cxx delete mode 100644 plugins/DijkstraFunctors/ExtractPathFromMinimumSpanningTree.h delete mode 100644 plugins/DijkstraFunctors/GaussianModelCost.cxx delete mode 100644 plugins/DijkstraFunctors/GaussianModelCost.h delete mode 100644 plugins/DijkstraFunctors/InvertCost.cxx delete mode 100644 plugins/DijkstraFunctors/InvertCost.h delete mode 100644 plugins/DijkstraFunctors/SimpleImageDijkstraCost.cxx delete mode 100644 plugins/DijkstraFunctors/SimpleImageDijkstraCost.h delete mode 100644 plugins/Experiments/InsertNoiseIntoPoints.cxx delete mode 100644 plugins/Experiments/InsertNoiseIntoPoints.h delete mode 100644 plugins/Experiments/SkeletonHausdorffDistance.cxx delete mode 100644 plugins/Experiments/SkeletonHausdorffDistance.h delete mode 100644 plugins/Functors/Functors.i delete mode 100644 plugins/Functors/Inverse.cxx delete mode 100644 plugins/Functors/Inverse.h delete mode 100644 plugins/ImageAlgorithms/BaseFilter.cxx delete mode 100644 plugins/ImageAlgorithms/BaseFilter.h delete mode 100644 plugins/ImageAlgorithms/Dijkstra.cxx delete mode 100644 plugins/ImageAlgorithms/Dijkstra.h delete mode 100644 plugins/ImageAlgorithms/ExtractPathFromMinimumSpanningTree.cxx delete mode 100644 plugins/ImageAlgorithms/ExtractPathFromMinimumSpanningTree.h delete mode 100644 plugins/ImageAlgorithms/FastMarching.cxx delete mode 100644 plugins/ImageAlgorithms/FastMarching.h delete mode 100644 plugins/ImageAlgorithms/ImageAlgorithms.i delete mode 100644 plugins/ImageAlgorithms/RegionGrow.cxx delete mode 100644 plugins/ImageAlgorithms/RegionGrow.h delete mode 100644 plugins/ImageFunctors/BinaryThreshold.cxx delete mode 100644 plugins/ImageFunctors/BinaryThreshold.h delete mode 100644 plugins/ImageFunctors/Tautology.cxx delete mode 100644 plugins/ImageFunctors/Tautology.h delete mode 100644 plugins/ImageFunctors/VertexCost.cxx delete mode 100644 plugins/ImageFunctors/VertexCost.h delete mode 100644 plugins/RegionGrowFunctors/BinaryThreshold.cxx delete mode 100644 plugins/RegionGrowFunctors/BinaryThreshold.h delete mode 100644 plugins/RegionGrowFunctors/RegionGrowFunctors.i diff --git a/CMakeLists.txt b/CMakeLists.txt index 4aa9686..369cba1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,10 +5,10 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.0) ## ======================== SET(prj_NAME FrontAlgorithms) -SET(prj_MAJOR_VERSION 0) -SET(prj_MINOR_VERSION 1) +SET(prj_MAJOR_VERSION 1) +SET(prj_MINOR_VERSION 0) SET(prj_RELEASE_VERSION 0) -SET(_subdirs lib plugins examples) +SET(_subdirs examples) # lib plugins) SET(_policies CMP0015 CMP0020 CMP0042) ## ========================== @@ -26,25 +26,22 @@ ENDFOREACH(_p) ## =========================== PROJECT(${prj_NAME}) -SET( - prj_VERSION - "${prj_MAJOR_VERSION}.${prj_MINOR_VERSION}.${prj_RELEASE_VERSION}" - ) +SET(prj_VERSION "${prj_MAJOR_VERSION}.${prj_MINOR_VERSION}.${prj_RELEASE_VERSION}") SET(prj_SHORT_VERSION "${prj_MAJOR_VERSION}") ## ===================================== ## == Functions, packages and options == ## ===================================== -INCLUDE(cmake/BaseConfig.cmake) -OPTION(USE_cpPlugins "Build cpPlugins-based code" OFF) -IF(USE_cpPlugins) - FIND_PACKAGE(cpPlugins) - MARK_AS_ADVANCED(CLEAR cpPlugins_DIR) -ENDIF(USE_cpPlugins) -INCLUDE(cmake/KitwareTools.cmake) -INCLUDE(cmake/QtTools.cmake) -INCLUDE(cmake/Functions.cmake) +#INCLUDE(cmake/BaseConfig.cmake) +#OPTION(USE_cpPlugins "Build cpPlugins-based code" OFF) +#IF(USE_cpPlugins) +# FIND_PACKAGE(cpPlugins) +# MARK_AS_ADVANCED(CLEAR cpPlugins_DIR) +#ENDIF(USE_cpPlugins) +#INCLUDE(cmake/KitwareTools.cmake) +#INCLUDE(cmake/QtTools.cmake) +#INCLUDE(cmake/Functions.cmake) ## =========================== ## == Build different parts == diff --git a/appli/CMakeLists.txt b/appli/CMakeLists.txt deleted file mode 100644 index 6380a79..0000000 --- a/appli/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -OPTION(BUILD_EXAMPLES "Build simple examples" OFF) -IF(BUILD_EXAMPLES) - SUBDIRS(examples) -ENDIF(BUILD_EXAMPLES) - -OPTION(BUILD_EXPERIMENTS "Build experiments" OFF) -IF(BUILD_EXPERIMENTS) - SUBDIRS(experiments) -ENDIF(BUILD_EXPERIMENTS) - -## eof - $RCSfile$ diff --git a/appli/examples/CMakeLists.txt b/appli/examples/CMakeLists.txt deleted file mode 100644 index 5d570b6..0000000 --- a/appli/examples/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -ADD_EXECUTABLE(fpa_examples_ImageDijkstra ImageDijkstra.cxx) -TARGET_LINK_LIBRARIES(fpa_examples_ImageDijkstra ${ITK_LIBRARIES} ${VTK_LIBRARIES}) - -## eof - $RCSfile$ diff --git a/appli/examples/ImageDijkstra.cxx b/appli/examples/ImageDijkstra.cxx deleted file mode 100644 index 2dede62..0000000 --- a/appli/examples/ImageDijkstra.cxx +++ /dev/null @@ -1,69 +0,0 @@ -#include -#include -#include - -#include -#include -#include -#include - -// ------------------------------------------------------------------------- -static const unsigned int VDim = 2; -typedef float TScalar; -typedef itk::Image< unsigned char, VDim > TInputImage; -typedef itk::Image< TScalar, VDim > TOutputImage; - -typedef itk::RandomImageSource< TInputImage > TImageSource; -typedef itk::ImageFileWriter< TOutputImage > TImageWriter; - -typedef fpa::Image::Functors::SimpleNeighborhood< itk::ImageBase< VDim > > TNeighFunction; -typedef fpa::Image::Functors::SimpleDijkstraCost< TInputImage, TScalar > TCostFunction; -typedef fpa::Base::Functors::Inverse< TScalar, TScalar > TCostConversionFunction; - -typedef fpa::Image::Dijkstra< TInputImage, TOutputImage > TFilter; - -// ------------------------------------------------------------------------- -int main( int argc, char* argv[] ) -{ - static const unsigned long SIZE = 100; - unsigned long size[] = { SIZE, SIZE }; - - unsigned int neigh_order = 2; - TInputImage::IndexType seed0, seed1; - - seed0.Fill( 0 ); - seed1.Fill( SIZE - 1 ); - - TImageSource::Pointer source = TImageSource::New( ); - source->SetSize( size ); - source->SetSpacing( 1 ); - source->Update( ); - TInputImage::Pointer input = source->GetOutput( ); - - TNeighFunction::Pointer neigh_function = TNeighFunction::New( ); - neigh_function->SetOrder( neigh_order ); - - TCostFunction::Pointer cost_function = TCostFunction::New( ); - - TCostConversionFunction::Pointer cost_conversion_function = - TCostConversionFunction::New( ); - - TFilter::Pointer filter = TFilter::New( ); - filter->SetInput( input ); - filter->SetNeighborhoodFunction( neigh_function ); - filter->SetCostFunction( cost_function ); - filter->SetCostConversionFunction( cost_conversion_function ); - filter->AddSeed( seed0, 0 ); - filter->AddSeed( seed1, 0 ); - filter->StopAtOneFrontOn( ); - filter->Update( ); - - TImageWriter::Pointer writer = TImageWriter::New( ); - writer->SetInput( filter->GetOutput( ) ); - writer->SetFileName( "dijkstra.mhd" ); - writer->Update( ); - - return( 0 ); -} - -// eof - $RCSfile$ diff --git a/appli/experiments/CMakeLists.txt b/appli/experiments/CMakeLists.txt deleted file mode 100644 index 65b5df1..0000000 --- a/appli/experiments/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -INCLUDE_DIRECTORIES( - ${PROJECT_SOURCE_DIR}/lib - ${PROJECT_BINARY_DIR}/lib - ) -ADD_EXECUTABLE(fpa_experiments_Skeleton_00 Skeleton_00.cxx) -TARGET_LINK_LIBRARIES(fpa_experiments_Skeleton_00 ${ITK_LIBRARIES} ${VTK_LIBRARIES}) - -ADD_EXECUTABLE(fpa_experiments_Hausdorff Hausdorff.cxx) -TARGET_LINK_LIBRARIES(fpa_experiments_Hausdorff ${ITK_LIBRARIES} ${VTK_LIBRARIES}) - -## eof - $RCSfile$ diff --git a/appli/experiments/Hausdorff.cxx b/appli/experiments/Hausdorff.cxx deleted file mode 100644 index dce01ef..0000000 --- a/appli/experiments/Hausdorff.cxx +++ /dev/null @@ -1,48 +0,0 @@ -#include -#include -#include - -typedef double TScalar; -typedef itk::Image< TScalar, 3 > TImage; -typedef itk::ImageFileReader< TImage > TReader; -typedef itk::HausdorffDistanceImageFilter< TImage, TImage > THausdorff; - -int main( int argc, char* argv[] ) -{ - if( argc < 3 ) - { - std::cerr - << "Usage: " << argv[ 0 ] - << " image1 image2" - << std::endl; - return( 1 ); - - } // fi - std::string image1_name = argv[ 1 ]; - std::string image2_name = argv[ 2 ]; - - TReader::Pointer reader1 = TReader::New( ); - reader1->SetFileName( image1_name ); - reader1->Update( ); - - TReader::Pointer reader2 = TReader::New( ); - reader2->SetFileName( image2_name ); - reader2->Update( ); - - THausdorff::Pointer hausdorff = THausdorff::New( ); - hausdorff->SetInput1( reader1->GetOutput( ) ); - hausdorff->SetInput2( reader2->GetOutput( ) ); - hausdorff->SetUseImageSpacing( true ); - hausdorff->Update( ); - - std::cout - << image1_name << " " - << image2_name << " " - << hausdorff->GetHausdorffDistance( ) << " " - << hausdorff->GetAverageHausdorffDistance( ) - << std::endl; - - return( 0 ); -} - -// eof - $RCSfile$ diff --git a/appli/experiments/Skeleton_00.cxx b/appli/experiments/Skeleton_00.cxx deleted file mode 100644 index 11b49f2..0000000 --- a/appli/experiments/Skeleton_00.cxx +++ /dev/null @@ -1,91 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -typedef double TScalar; -typedef itk::Image< TScalar, 3 > TImage; -typedef itk::MinimumMaximumImageCalculator< TImage > TMinMax; -typedef itk::SignedMaurerDistanceMapImageFilter< TImage, TImage > TDMap; -typedef fpa::Image::SkeletonFilter< TImage > TSkeletonFilter; -typedef TSkeletonFilter::TSkeleton TSkeleton; -typedef cpExtensions::Algorithms::SkeletonToImageFilter< TSkeleton, TImage > TSkeletonToImage; -typedef itk::ImageFileReader< TImage > TReader; -typedef itk::ImageFileWriter< TImage > TWriter; - -int main( int argc, char* argv[] ) -{ - if( argc < 4 ) - { - std::cerr - << "Usage: " << argv[ 0 ] - << " image prefix number_of_samples [seed_x seed_y seed_z]" - << std::endl; - return( 1 ); - - } // fi - std::string image_name = argv[ 1 ]; - - TReader::Pointer reader = TReader::New( ); - reader->SetFileName( image_name ); - reader->Update( ); - - TDMap::Pointer dmap = TDMap::New( ); - dmap->SetInput( reader->GetOutput( ) ); - dmap->InsideIsPositiveOn( ); - dmap->Update( ); - const TImage* image = dmap->GetOutput( ); - - std::string prefix = argv[ 2 ]; - std::istringstream str( argv[ 3 ] ); - unsigned int number_of_samples; - str >> number_of_samples; - TImage::IndexType seed; - if( argc < 7 ) - { - TMinMax::Pointer minmax = TMinMax::New( ); - minmax->SetImage( image ); - minmax->Compute( ); - seed = minmax->GetIndexOfMaximum( ); - } - else - { - std::istringstream str_x( argv[ 4 ] ); - std::istringstream str_y( argv[ 5 ] ); - std::istringstream str_z( argv[ 6 ] ); - TImage::PointType pnt; - str_x >> pnt[ 0 ]; - str_y >> pnt[ 1 ]; - str_z >> pnt[ 2 ]; - image->TransformPhysicalPointToIndex( pnt, seed ); - - } // fi - - for( unsigned int i = 0; i < number_of_samples; ++i ) - { - std::cout << i << std::endl; - TSkeletonFilter::Pointer skeleton = TSkeletonFilter::New( ); - skeleton->SetInput( image ); - skeleton->AddSeed( seed, 0 ); - skeleton->Update( ); - - TSkeletonToImage::Pointer sk2im = TSkeletonToImage::New( ); - sk2im->SetTemplateImage( image ); - sk2im->SetSkeleton( skeleton->GetSkeleton( ) ); - sk2im->SetOutsideValue( 0 ); - sk2im->SetInsideValue( 1 ); - sk2im->Update( ); - - TWriter::Pointer writer = TWriter::New( ); - writer->SetInput( sk2im->GetOutput( ) ); - writer->SetFileName( "skeleton.mhd" ); - writer->Update( ); - - } // rof - return( 0 ); -} - -// eof - $RCSfile$ diff --git a/cmake/BaseConfig.cmake b/cmake/BaseConfig.cmake deleted file mode 100644 index d177604..0000000 --- a/cmake/BaseConfig.cmake +++ /dev/null @@ -1,51 +0,0 @@ -## ======================================================================= -## == Force c++11 language version == -## == NOTE: It seems that by default on Visual Studio Compiler supports == -## == c++11, so it only need to be tested on other OS. == -## ======================================================================= - -IF(NOT MSVC) - INCLUDE(CheckCXXCompilerFlag) - CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) - IF(COMPILER_SUPPORTS_CXX11) - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") - ELSE(COMPILER_SUPPORTS_CXX11) - CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) - IF(COMPILER_SUPPORTS_CXX0X) - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") - ELSE(COMPILER_SUPPORTS_CXX0X) - MESSAGE( - FATAL_ERROR - "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support." - ) - ENDIF(COMPILER_SUPPORTS_CXX0X) - ENDIF(COMPILER_SUPPORTS_CXX11) -ENDIF(NOT MSVC) - -## =================================================== -## == Prepare header generator to build shared libs == -## =================================================== - -INCLUDE(GenerateExportHeader) - -## ================================================== -## == Do not allow to build inside the source tree == -## ================================================== - -IF(PROJECT_BINARY_DIR STREQUAL ${PROJECT_SOURCE_DIR}) - MESSAGE(FATAL_ERROR "Building in the source tree is not allowed.") -ENDIF(PROJECT_BINARY_DIR STREQUAL ${PROJECT_SOURCE_DIR}) - -## ================================================= -## == Where to put targets (executables and libs) == -## ================================================= - -SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}) -SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}) -MARK_AS_ADVANCED( - CMAKE_BACKWARDS_COMPATIBILITY - EXECUTABLE_OUTPUT_PATH - LIBRARY_OUTPUT_PATH - ) - -## eof - $RCSfile$ diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt deleted file mode 100644 index 5d4261d..0000000 --- a/cmake/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -## ===================== -## == Configure files == -## ===================== - -CONFIGURE_FILE( - FrontAlgorithmsConfig.cmake.in - ${PROJECT_BINARY_DIR}/FrontAlgorithmsConfig.cmake - @ONLY - ) - -## eof - $RCSfile$ diff --git a/cmake/Functions.cmake b/cmake/Functions.cmake deleted file mode 100644 index d755587..0000000 --- a/cmake/Functions.cmake +++ /dev/null @@ -1,328 +0,0 @@ -## ------------------------------------------------------------------------- -FUNCTION(NormPaths output_files) -SET(_out) -FOREACH(_f ${ARGN}) - SET(_d) - FILE(TO_CMAKE_PATH ${_f} _d) - LIST(APPEND _out ${_d}) -ENDFOREACH(_f) -SET(${output_files} "${_out}" PARENT_SCOPE) -ENDFUNCTION() - -## ------------------------------------------------------------------------- -FUNCTION(Wrap_Qt_CPP output_files) -SET(_out) -FOREACH(_f ${ARGN}) - IF(EXISTS ${_f}) - FILE(READ ${_f} _txt) - STRING(FIND "${_txt}" "Q_OBJECT" _pos) - IF(NOT ${_pos} EQUAL -1) - SET(_s) - QT4_WRAP_CPP(_s ${_f}) - SET(_out ${_out} ${_s}) - ENDIF(NOT ${_pos} EQUAL -1) - ENDIF(EXISTS ${_f}) -ENDFOREACH(_f) -SET(${output_files} "${_out}" PARENT_SCOPE) -ENDFUNCTION() - -## ------------------------------------------------------------------------- -FUNCTION(Wrap_Qt_UI output_files) -NormPaths(_source_dir ${PROJECT_SOURCE_DIR}) -NormPaths(_binary_dir ${PROJECT_BINARY_DIR}) -SET(_out) -FOREACH(_f ${ARGN}) - IF(EXISTS ${_f}) - GET_FILENAME_COMPONENT(_name ${_f} NAME_WE) - GET_FILENAME_COMPONENT(_dir ${_f} DIRECTORY) - SET(_base_dir ${_source_dir}) - STRING(FIND "${_dir}" "${_base_dir}" _pos) - IF(${_pos} EQUAL -1) - SET(_base_dir ${_binary_dir}) - STRING(FIND "${_dir}" "${_base_dir}" _pos) - ENDIF(${_pos} EQUAL -1) - IF(NOT ${_pos} EQUAL -1) - STRING(REPLACE "${_base_dir}/" "" _dir ${_dir}) - SET(_out_f ${_binary_dir}/${_dir}/ui_${_name}.h) - LIST(APPEND _out ${_out_f}) - ADD_CUSTOM_COMMAND( - OUTPUT ${_out_f} - COMMAND Qt4::uic - ARGS -o ${_out_f} ${_f} - MAIN_DEPENDENCY ${_f} VERBATIM - ) - ENDIF(NOT ${_pos} EQUAL -1) - ENDIF(EXISTS ${_f}) -ENDFOREACH(_f) -SET(${output_files} "${_out}" PARENT_SCOPE) -ENDFUNCTION() - -## ------------------------------------------------------------------------- -FUNCTION( - PrepareSourceFiles - lib_name - out_sources_list - out_headers_list - out_headers_paths - ) -SET(_config_extensions .c.in .cpp.in .cxx.in .h.in .hpp.in .hxx.in .ui.in) -SET(_sources_extensions .c .cpp .cxx) -SET(_headers_extensions .h .hpp .hxx) -SET(_qt_ui_extensions .ui) -SET(_demangler_extensions .d) -SET(_instances_extensions .i) - -## -- Configure inputs -SET(_all_files) -FOREACH(_file ${ARGN}) - GET_FILENAME_COMPONENT(_ext ${_file} EXT) - LIST(FIND _config_extensions ${_ext} _cfg) - IF(NOT ${_cfg} EQUAL -1) - STRING( - REPLACE - ${PROJECT_SOURCE_DIR} - ${PROJECT_BINARY_DIR} - _file_bin - ${_file} - ) - STRING(LENGTH ${_file_bin} _file_bin_len) - MATH(EXPR _file_bin_len "${_file_bin_len}-3") - STRING(SUBSTRING ${_file_bin} 0 ${_file_bin_len} _file_bin) - CONFIGURE_FILE(${_file} ${_file_bin} @ONLY) - LIST(APPEND _all_files ${_file_bin}) - ELSE(NOT ${_cfg} EQUAL -1) - LIST(APPEND _all_files ${_file}) - ENDIF(NOT ${_cfg} EQUAL -1) -ENDFOREACH(_file) - -## -- Separate files -SET(_srcs) -SET(_hdrs) -SET(_qts) -SET(_demanglers) -SET(_instances) -FOREACH(_file ${_all_files}) - GET_FILENAME_COMPONENT(_ext ${_file} EXT) - LIST(FIND _sources_extensions ${_ext} _src) - LIST(FIND _headers_extensions ${_ext} _hdr) - LIST(FIND _qt_ui_extensions ${_ext} _ui) - LIST(FIND _demangler_extensions ${_ext} _dem) - LIST(FIND _instances_extensions ${_ext} _ins) - IF(NOT ${_src} EQUAL -1) - LIST(APPEND _srcs ${_file}) - ENDIF(NOT ${_src} EQUAL -1) - IF(NOT ${_hdr} EQUAL -1) - LIST(APPEND _hdrs ${_file}) - ENDIF(NOT ${_hdr} EQUAL -1) - IF(NOT ${_ui} EQUAL -1) - LIST(APPEND _qts ${_file}) - ENDIF(NOT ${_ui} EQUAL -1) - IF(NOT ${_dem} EQUAL -1) - LIST(APPEND _demanglers ${_file}) - ENDIF(NOT ${_dem} EQUAL -1) - IF(NOT ${_ins} EQUAL -1) - LIST(APPEND _instances ${_file}) - ENDIF(NOT ${_ins} EQUAL -1) -ENDFOREACH(_file) - -# -- Prepare Qt4-based code -IF(Qt4_FOUND) - ## -- Guess what headers sould be qt-moc'ed - Wrap_Qt_CPP(_moc ${_hdrs}) - IF(_moc) - LIST(APPEND _srcs ${_moc}) - ENDIF(_moc) - - ## -- Guess what qt-ui's sould be qt-uic'ed - ## -- Wrap qt-ui headers: this is equivalent to QT4_WRAP_UI except to change - ## -- the output file - Wrap_Qt_UI(_qt_hdrs ${_qts}) - IF(_qt_hdrs) - LIST(APPEND _hdrs ${_qt_hdrs}) - ENDIF(_qt_hdrs) -ENDIF(Qt4_FOUND) - -## -- Create demanglers -FOREACH(_d ${_demanglers}) - STRING( - REPLACE - ${PROJECT_SOURCE_DIR} - ${PROJECT_BINARY_DIR} - _d_bin - ${_d} - ) - GET_FILENAME_COMPONENT(_d_path ${_d_bin} DIRECTORY) - GET_FILENAME_COMPONENT(_out_name ${_d_bin} NAME_WE) - SET(_d_out ${_d_path}/${_out_name}_Demanglers.h) - ADD_CUSTOM_COMMAND( - OUTPUT ${_d_out} - COMMAND ${CMAKE_COMMAND} -E make_directory ${_d_path} - COMMAND ${cpPlugins_bash_CreateDemanglers_APP} ${_d} ${_out_name} ${_d_out} - DEPENDS ${cpPlugins_bash_CreateDemanglers_APP} ${_d} - ) - LIST(APPEND _hdrs ${_d_out}) -ENDFOREACH(_d) - -## -- Create instances -FOREACH(_i ${_instances}) - STRING( - REPLACE - ${PROJECT_SOURCE_DIR} - ${PROJECT_BINARY_DIR} - _i_bin - ${_i} - ) - GET_FILENAME_COMPONENT(_i_path ${_i_bin} DIRECTORY) - GET_FILENAME_COMPONENT(_out_name ${_i} NAME_WE) - - ## -- Infere source code filenames - MATH(EXPR _last_range "${cpPlugins_NUMBER_OF_FILES}-1") - SET(_out_code) - FOREACH(_n RANGE 0 ${_last_range}) - LIST(APPEND _out_code ${_i_path}/${_out_name}_${_n}.cxx) - LIST(APPEND _srcs ${_i_path}/${_out_name}_${_n}.cxx) - ENDFOREACH(_n) - - ## -- Command to write source code - ADD_CUSTOM_COMMAND( - OUTPUT ${_out_code} - DEPENDS ${cpPlugins_bash_CreateInstances_APP} ${_i} - COMMAND ${CMAKE_COMMAND} -E make_directory ${_i_path} - COMMAND ${cpPlugins_bash_CreateInstances_APP} ${_i} ${lib_name} ${_i_path}/${_out_name} - ) -ENDFOREACH(_i) - -## -- Real compilation -SET(_hdrs_paths) -FOREACH(_hdr ${_hdrs}) - GET_FILENAME_COMPONENT(_path ${_hdr} DIRECTORY) - LIST(FIND _hdrs_paths ${_path} _path_idx) - IF(${_path_idx} EQUAL -1) - LIST(APPEND _hdrs_paths ${_path}) - ENDIF(${_path_idx} EQUAL -1) -ENDFOREACH(_hdr) - -SET(${out_sources_list} ${_srcs} PARENT_SCOPE) -SET(${out_headers_list} ${_hdrs} PARENT_SCOPE) -SET(${out_headers_paths} ${_hdrs_paths} PARENT_SCOPE) - -ENDFUNCTION() - -## ------------------------------------------------------------------------- -FUNCTION(cpPlugins_BuildLibrary lib_name lib_type) -# -- Detect all source files -SET(_all_files) -FOREACH(_c ${ARGN}) - GET_FILENAME_COMPONENT(_cname ${_c} ABSOLUTE) - SET(_files) - IF(IS_DIRECTORY ${_cname}) - FILE(GLOB_RECURSE _files "${_cname}/*") - ELSE(IS_DIRECTORY ${_cname}) - SET(_files ${_cname}) - ENDIF(IS_DIRECTORY ${_cname}) - LIST(APPEND _all_files ${_files}) -ENDFOREACH(_c ${ARGN}) - -## -- Prepare sources by types -PrepareSourceFiles(${lib_name} _srcs _hdrs _paths ${_all_files}) - -## -- Build library -IF(_srcs) - INCLUDE_DIRECTORIES( - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_BINARY_DIR} - ) - ADD_LIBRARY(${lib_name} ${lib_type} ${_srcs} ${_hdrs}) - GENERATE_EXPORT_HEADER( - ${lib_name} - BASE_NAME ${lib_name} - EXPORT_MACRO_NAME ${lib_name}_EXPORT - EXPORT_FILE_NAME ${lib_name}_Export.h - STATIC_DEFINE ${lib_name}_BUILT_AS_STATIC - ) -ENDIF(_srcs) - -ENDFUNCTION() - -## ------------------------------------------------------------------------- -FUNCTION(cpPlugins_BuildPluginsLibrary lib_name) -# -- Detect all source files -SET(_all_files) -FOREACH(_c ${ARGN}) - GET_FILENAME_COMPONENT(_cname ${_c} ABSOLUTE) - SET(_files) - IF(IS_DIRECTORY ${_cname}) - FILE(GLOB_RECURSE _files "${_cname}/*") - ELSE(IS_DIRECTORY ${_cname}) - SET(_files ${_cname}) - ENDIF(IS_DIRECTORY ${_cname}) - LIST(APPEND _all_files ${_files}) -ENDFOREACH(_c ${ARGN}) - -## -- Prepare sources by types -PrepareSourceFiles(${lib_name} _srcs _hdrs _paths ${_all_files}) - -## -- Check which headers need to be wrapped to build host code -SET(_hdrs_to_wrap) -FOREACH(_hdr ${_hdrs}) - IF(EXISTS ${_hdr}) - FILE(READ ${_hdr} _txt) - STRING(FIND "${_txt}" "cpPluginsObject" _res) - IF(NOT ${_res} EQUAL -1) - LIST(APPEND _hdrs_to_wrap ${_hdr}) - ENDIF(NOT ${_res} EQUAL -1) - ENDIF(EXISTS ${_hdr}) -ENDFOREACH(_hdr) - -## -- Wrap headers -IF(_hdrs_to_wrap) - SET(_host ${CMAKE_CURRENT_BINARY_DIR}/${lib_name}_host.cxx) - ADD_CUSTOM_COMMAND( - OUTPUT ${_host} - DEPENDS ${cpPlugins_bash_HostCreator_APP} ${_hdrs_to_wrap} - COMMAND ${cpPlugins_bash_HostCreator_APP} ${lib_name} ${_host} ${_hdrs_to_wrap} - ) - LIST(APPEND _all_files ${_host}) -ENDIF(_hdrs_to_wrap) - -cpPlugins_BuildLibrary(${lib_name} SHARED ${_all_files}) -ENDFUNCTION() - -## ------------------------------------------------------------------------- -FUNCTION(cpPlugins_BuildApplication app_name) -OPTION(BUILD_${app_name} "Build \"${app_name}\" application?" OFF) -IF(BUILD_${app_name}) - # -- Detect all source files - SET(_all_files) - FOREACH(_c ${ARGN}) - GET_FILENAME_COMPONENT(_cname ${_c} ABSOLUTE) - SET(_files) - IF(IS_DIRECTORY ${_cname}) - FILE(GLOB_RECURSE _files "${_cname}/*") - ELSE(IS_DIRECTORY ${_cname}) - SET(_files ${_cname}) - ENDIF(IS_DIRECTORY ${_cname}) - LIST(APPEND _all_files ${_files}) - ENDFOREACH(_c ${ARGN}) - - ## -- Prepare sources by types - PrepareSourceFiles(${app_name} _srcs _hdrs _paths ${_all_files}) - - ## -- Build library - IF(_srcs) - INCLUDE_DIRECTORIES( - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_BINARY_DIR} - ) - SET(_app_os_target) - IF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows") - SET(_app_os_target WIN32) - ELSEIF(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") - SET(_app_os_target MACOSX_BUNDLE) - ENDIF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows") - ADD_EXECUTABLE(${app_name} ${_app_os_target} ${_srcs} ${_hdrs}) - ENDIF(_srcs) -ENDIF(BUILD_${app_name}) -ENDFUNCTION() - -## eof - $RCSfile$ diff --git a/cmake/KitwareTools.cmake b/cmake/KitwareTools.cmake deleted file mode 100644 index b4493d2..0000000 --- a/cmake/KitwareTools.cmake +++ /dev/null @@ -1,19 +0,0 @@ -# ====================== -# == Find ITK and VTK == -# ====================== - -FIND_PACKAGE(ITK REQUIRED) -FIND_PACKAGE(VTK REQUIRED) - -INCLUDE(${ITK_USE_FILE}) -INCLUDE(${VTK_USE_FILE}) - -# =================================================== -# == Do not use itk-vtk glue --> problems ahead!!! == -# =================================================== - -IF(ITKVtkGlue_LOADED) - MESSAGE(FATAL_ERROR "ITKVtkGlue module is available. Please re-compile your ITK without it. It could lead to nasty compilation problems... Just waiting for Kitware to solve it.") -ENDIF(ITKVtkGlue_LOADED) - -## eof - $RCSfile$ diff --git a/cmake/QtTools.cmake b/cmake/QtTools.cmake deleted file mode 100644 index f4dd0cd..0000000 --- a/cmake/QtTools.cmake +++ /dev/null @@ -1,26 +0,0 @@ -## ================================================== -## == Find Qt4 and check if it was well configured == -## ================================================== - -IF(BUILD_QT4_COMPONENTS) - FIND_PACKAGE(Qt4 REQUIRED) - INCLUDE(${QT_USE_FILE}) - SET( - _modules - vtkGUISupportQt - ) - FOREACH(_m ${_modules}) - IF(NOT ${_m}_LOADED) - MESSAGE(FATAL_ERROR "${_m} module is required but not available.") - BREAK() - ENDIF(NOT ${_m}_LOADED) - ENDFOREACH(_m) - SET( - cpPlugins_Qt4_VTKWidget - QVTKWidget - CACHE STRING "Base Qt4-based vtkRenderWindow" - ) - MARK_AS_ADVANCED(CLEAR cpPlugins_Qt4_VTKWidget) -ENDIF(BUILD_QT4_COMPONENTS) - -## eof - $RCSfile$ diff --git a/data/binary_test_2D_00.png b/data/binary_test_2D_00.png deleted file mode 100644 index fbe9d39bd59189ecf7f8ef87e48abde2f3d01953..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5192 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 diff --git a/data/ones_image.png b/data/ones_image.png deleted file mode 100644 index f7afaab3a8241507fc085fd4450f6bfa393ef4db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1697 zcmeAS@N?(olHy`uVBq!ia0y~yU{(NO4xj+TKk3LVK#H@#BeIx*fm;}a85w5HkpK#^ zmw5WRvftxo=F>J^eIwQZC?uO15>euupPQSSR|4cRFgO>bCYGe8D3oWGWGJ|M`Ua%v zrLr?Hu!(!RIEGZ*dV6^zF9QR|VS`iu-M=%HvHfoG@MPPuh9yD3fJ1_Xhl!1`xxw*( zLV^GY6B2@`L{Wty!~iu9Nfm|=1Kd`)Dl9@Cm|{roh3Ui)Lh%(u6^0N@Gm={|gfN1` zfCE#gV>BR<6A>s7M*|X(sUTs2k^Fd=FoZBdZ8RVmN3%A#WQHdV%<{0A#4_?jG~?Ve VY>s=^oN@!z9iFa!F6*2UngGDBTyX#Z diff --git a/data/test_mori_2D.png b/data/test_mori_2D.png deleted file mode 100644 index 943e9f0f12a63150cc03a836d7738ae017670fcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69669 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%0AtAM0UI34k8fKrFX^P?(j?cdFqO_<8$)FU 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 JcNiY%e*o#7=kovn diff --git a/data/workspaces/workspace_airwaysappli.wxml b/data/workspaces/workspace_airwaysappli.wxml deleted file mode 100644 index 9b80164..0000000 --- a/data/workspaces/workspace_airwaysappli.wxml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt deleted file mode 100644 index e6d93b8..0000000 --- a/examples/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -OPTION(BUILD_Examples "Build simple examples?" OFF) - -IF(BUILD_Examples) - SET( - _examples - RegionGrow_00 - FastMarching_00 - MoriRegionGrow_00 - Skeleton_00 - ) - INCLUDE_DIRECTORIES( - ${PROJECT_SOURCE_DIR}/lib - ${PROJECT_BINARY_DIR}/lib - ) - FOREACH(_example ${_examples}) - ADD_EXECUTABLE(fpa_example_${_example} ${_example}.cxx) - TARGET_LINK_LIBRARIES(fpa_example_${_example} ${ITK_LIBRARIES} ${VTK_LIBRARIES}) - ENDFOREACH(_example) -ENDIF(BUILD_Examples) - -## eof - $RCSfile$ diff --git a/examples/FastMarching_00.cxx b/examples/FastMarching_00.cxx deleted file mode 100644 index 41ed61e..0000000 --- a/examples/FastMarching_00.cxx +++ /dev/null @@ -1,55 +0,0 @@ -#include -#include -#include - -// ------------------------------------------------------------------------- -typedef itk::Image< float, 2 > TImage; -typedef fpa::Image::FastMarching< TImage, TImage > TFilter; -typedef itk::ImageFileWriter< TImage > TWriter; - -// ------------------------------------------------------------------------- -int main( int argc, char* argv[] ) -{ - TImage::SizeType size; - size.Fill( 512 ); - - TImage::SpacingType spac; - spac[ 0 ] = 0.4; - spac[ 1 ] = 1.7; - - TImage::Pointer input = TImage::New( ); - input->SetRegions( size ); - input->SetSpacing( spac ); - input->Allocate( ); - input->FillBuffer( 1 ); - - TImage::RegionType region = input->GetLargestPossibleRegion( ); - TImage::PointType p0, p1, p2, p3, p4; - input->TransformIndexToPhysicalPoint( region.GetIndex( ), p0 ); - input->TransformIndexToPhysicalPoint( - region.GetIndex( ) + region.GetSize( ), p1 - ); - p2 = ( p0.GetVectorFromOrigin( ) + p1.GetVectorFromOrigin( ) ) * 0.5; - p3 = ( p0.GetVectorFromOrigin( ) + p1.GetVectorFromOrigin( ) ) * 0.25; - p4 = ( p0.GetVectorFromOrigin( ) + p1.GetVectorFromOrigin( ) ) * 0.75; - TImage::IndexType s0, s1, s2; - input->TransformPhysicalPointToIndex( p2, s0 ); - input->TransformPhysicalPointToIndex( p3, s1 ); - input->TransformPhysicalPointToIndex( p4, s2 ); - - TFilter::Pointer filter = TFilter::New( ); - filter->SetInput( input ); - filter->AddSeed( s0, 0 ); - filter->AddSeed( s1, 0 ); - filter->AddSeed( s2, 0 ); - filter->Update( ); - - TWriter::Pointer writer = TWriter::New( ); - writer->SetInput( filter->GetOutput( ) ); - writer->SetFileName( "FastMarching_00.mhd" ); - writer->Update( ); - - return( 0 ); -} - -// eof - $RCSfile$ diff --git a/examples/MoriRegionGrow_00.cxx b/examples/MoriRegionGrow_00.cxx deleted file mode 100644 index 45e7417..0000000 --- a/examples/MoriRegionGrow_00.cxx +++ /dev/null @@ -1,60 +0,0 @@ -#include -#include -#include -#include - -// ------------------------------------------------------------------------- -typedef itk::Image< unsigned char, 2 > TImage; -typedef itk::ImageFileReader< TImage > TReader; -typedef itk::ImageFileWriter< TImage > TWriter; -typedef fpa::Image::MoriRegionGrow< TImage, TImage > TFilter; -typedef itk::ImageFileWriter< TFilter::TAuxImage > TAuxWriter; - -// ------------------------------------------------------------------------- -int main( int argc, char* argv[] ) -{ - if( argc < 4 ) - { - std::cerr - << "Usage: " << argv[ 0 ] - << " input_filename output_filename output_aux_filename" << std::endl; - return( 1 ); - - } // fi - std::string in_fname = argv[ 1 ]; - std::string out_fname = argv[ 2 ]; - std::string out_aux_fname = argv[ 3 ]; - int seed_x = 111; - int seed_y = 91; - - TReader::Pointer reader = TReader::New( ); - reader->SetFileName( in_fname ); - - TImage::IndexType seed; - seed[ 0 ] = seed_x; - seed[ 1 ] = seed_y; - - TFilter::Pointer filter = TFilter::New( ); - filter->SetInput( reader->GetOutput( ) ); - filter->SetLower( 0 ); - filter->SetUpper( 255 ); - filter->SetStep( 1 ); - filter->SetInsideValue( 255 ); - filter->SetOutsideValue( 0 ); - filter->SetSeed( seed ); - - TWriter::Pointer writer = TWriter::New( ); - writer->SetInput( filter->GetOutput( ) ); - writer->SetFileName( out_fname ); - writer->Update( ); - - TAuxWriter::Pointer aux_writer = TAuxWriter::New( ); - aux_writer->SetInput( filter->GetAuxiliaryImage( ) ); - aux_writer->SetFileName( out_aux_fname ); - aux_writer->Update( ); - - - return( 0 ); -} - -// eof - $RCSfile$ diff --git a/examples/RegionGrow_00.cxx b/examples/RegionGrow_00.cxx deleted file mode 100644 index eab6d41..0000000 --- a/examples/RegionGrow_00.cxx +++ /dev/null @@ -1,100 +0,0 @@ -#include -#include -#include -#include - -// ------------------------------------------------------------------------- -typedef itk::Image< unsigned char, 2 > TImage; -typedef fpa::Image::RegionGrow< TImage, TImage > TFilter; -typedef itk::ImageFileWriter< TImage > TWriter; - -// ------------------------------------------------------------------------- -/** - */ -class MyObserver - : public itk::Command -{ -public: - typedef TFilter::TStartEvent TStartEvent; - typedef TFilter::TEndEvent TEndEvent; - typedef TFilter::TStartLoopEvent TStartLoopEvent; - typedef TFilter::TEndLoopEvent TEndLoopEvent; - typedef TFilter::TPushEvent TPushEvent; - typedef TFilter::TPopEvent TPopEvent; - typedef TFilter::TMarkEvent TMarkEvent; - -public: - itkNewMacro( MyObserver ); - -public: - virtual void Execute( - itk::Object* caller, const itk::EventObject& event - ) override - { - this->Execute( const_cast< const itk::Object* >( caller ), event ); - } - virtual void Execute( - const itk::Object* object, const itk::EventObject& event - ) override - { - if( TStartEvent( ).CheckEvent( &event ) ) - std::cout << "Start" << std::endl; - else if( TEndEvent( ).CheckEvent( &event ) ) - std::cout << "End" << std::endl; - else if( TStartLoopEvent( ).CheckEvent( &event ) ) - std::cout << "StartLoop" << std::endl; - else if( TEndLoopEvent( ).CheckEvent( &event ) ) - std::cout << "EndLoop" << std::endl; - else if( TMarkEvent( ).CheckEvent( &event ) ) - { - const TMarkEvent* mark = dynamic_cast< const TMarkEvent* >( &event ); - std::cout << "Mark: " << mark->Vertex << std::endl; - - } // fi - /* TODO - TPushEvent; - TPopEvent; - */ - } -}; - -// ------------------------------------------------------------------------- -int main( int argc, char* argv[] ) -{ - TImage::SizeType size; - size.Fill( 10 ); - - TImage::Pointer input = TImage::New( ); - input->SetRegions( size ); - input->Allocate( ); - input->FillBuffer( 0 ); - - TImage::RegionType region = input->GetLargestPossibleRegion( ); - TImage::PointType p0, p1, p2; - input->TransformIndexToPhysicalPoint( region.GetIndex( ), p0 ); - input->TransformIndexToPhysicalPoint( - region.GetIndex( ) + region.GetSize( ), p1 - ); - p2 = ( p0.GetVectorFromOrigin( ) + p1.GetVectorFromOrigin( ) ) * 0.5; - TImage::IndexType seed; - input->TransformPhysicalPointToIndex( p2, seed ); - - TFilter::Pointer filter = TFilter::New( ); - filter->SetInput( input ); - filter->SetInsideValue( 255 ); - filter->SetOutsideValue( 0 ); - filter->AddSeed( seed, filter->GetInsideValue( ) ); - - MyObserver::Pointer obs = MyObserver::New( ); - filter->AddObserver( itk::AnyEvent( ), obs ); - filter->Update( ); - - TWriter::Pointer writer = TWriter::New( ); - writer->SetInput( filter->GetOutput( ) ); - writer->SetFileName( "RegionGrow_00.png" ); - writer->Update( ); - - return( 0 ); -} - -// eof - $RCSfile$ diff --git a/examples/Skeleton_00.cxx b/examples/Skeleton_00.cxx deleted file mode 100644 index 9351c86..0000000 --- a/examples/Skeleton_00.cxx +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include -#include -#include -#include -#include - -// ------------------------------------------------------------------------- -typedef itk::Image< double, 2 > TImage; -typedef itk::ImageFileReader< TImage > TReader; -typedef itk::SignedMaurerDistanceMapImageFilter< TImage, TImage > TDMap; -typedef itk::MinimumMaximumImageCalculator< TImage > TMinMax; -typedef fpa::Image::SkeletonFilter< TImage > TFilter; -typedef TFilter::TSkeleton TSkeleton; -typedef cpExtensions::Algorithms::SkeletonWriter< TSkeleton > TWriter; - -// ------------------------------------------------------------------------- -int main( int argc, char* argv[] ) -{ - if( argc < 3 ) - { - std::cerr - << "Usage: " << argv[ 0 ] - << " input_filename output_filename" << std::endl; - return( 1 ); - - } // fi - std::string in_fname = argv[ 1 ]; - std::string out_fname = argv[ 2 ]; - - TReader::Pointer reader = TReader::New( ); - reader->SetFileName( in_fname ); - - TDMap::Pointer dmap = TDMap::New( ); - dmap->SetInput( reader->GetOutput( ) ); - dmap->InsideIsPositiveOn( ); - dmap->SquaredDistanceOff( ); - dmap->UseImageSpacingOn( ); - dmap->Update( ); - - TMinMax::Pointer minmax = TMinMax::New( ); - minmax->SetImage( dmap->GetOutput( ) ); - minmax->Compute( ); - - TFilter::Pointer filter = TFilter::New( ); - filter->SetInput( dmap->GetOutput( ) ); - filter->AddSeed( minmax->GetIndexOfMaximum( ), 0 ); - filter->Update( ); - - TWriter::Pointer writer = TWriter::New( ); - writer->SetInput( filter->GetSkeleton( ) ); - writer->SetFileName( out_fname ); - writer->Update( ); - - return( 0 ); -} - -// eof - $RCSfile$ diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt deleted file mode 100644 index 5afdc75..0000000 --- a/lib/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ - -## =================================== -## == Build instances for cpPlugins == -## =================================== - -SUBDIRS(fpaInstances) - -## eof - $RCSfile$ diff --git a/lib/fpa/Base/Algorithm.h b/lib/fpa/Base/Algorithm.h deleted file mode 100644 index 6625467..0000000 --- a/lib/fpa/Base/Algorithm.h +++ /dev/null @@ -1,150 +0,0 @@ -#ifndef __fpa__Base__Algorithm__h__ -#define __fpa__Base__Algorithm__h__ - -#include -#include -#include -#include -#include - -namespace fpa -{ - namespace Base - { - /** - */ - template< class _TFilter, class _TVertex, class _TOutput > - class Algorithm - : public _TFilter - { - public: - typedef Algorithm Self; - typedef _TFilter Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef _TVertex TVertex; - typedef _TOutput TOutput; - typedef unsigned long TFrontId; - - // Different functions - typedef std::vector< TVertex > TNeighborhood; - typedef itk::FunctionBase< TVertex, TNeighborhood > TNeighborhoodFunction; - typedef itk::FunctionBase< TOutput, TOutput > TConversionFunction; - typedef fpa::Base::Functors::VertexCostFunctionBase< TVertex, TOutput > TVertexFunction; - - // Minigraph to represent collisions - typedef std::pair< _TVertex, bool > TCollision; - typedef std::vector< TCollision > TCollisionsRow; - typedef std::vector< TCollisionsRow > TCollisions; - - protected: - struct _TQueueNode - { - TVertex Vertex; - TVertex Parent; - TOutput Result; - TFrontId FrontId; - _TQueueNode( ); - _TQueueNode( const TVertex& v ); - _TQueueNode( const TVertex& v, const _TQueueNode& n ); - }; - - public: - itkTypeMacro( Self, _TFilter ); - - fpa_Base_NewEvent( TStartEvent ); - fpa_Base_NewEvent( TEndEvent ); - fpa_Base_NewEvent( TStartLoopEvent ); - fpa_Base_NewEvent( TEndLoopEvent ); - fpa_Base_NewEventWithVertex( TPushEvent, TVertex ); - fpa_Base_NewEventWithVertex( TPopEvent, TVertex ); - fpa_Base_NewEventWithVertex( TMarkEvent, TVertex ); - - itkGetConstMacro( InitResult, _TOutput ); - itkSetMacro( InitResult, _TOutput ); - - itkBooleanMacro( StopAtOneFront ); - itkGetConstMacro( StopAtOneFront, bool ); - itkSetMacro( StopAtOneFront, bool ); - - itkGetObjectMacro( NeighborhoodFunction, TNeighborhoodFunction ); - itkGetObjectMacro( ConversionFunction, TConversionFunction ); - itkGetObjectMacro( VertexFunction, TVertexFunction ); - - itkGetConstObjectMacro( NeighborhoodFunction, TNeighborhoodFunction ); - itkGetConstObjectMacro( ConversionFunction, TConversionFunction ); - itkGetConstObjectMacro( VertexFunction, TVertexFunction ); - - itkSetObjectMacro( NeighborhoodFunction, TNeighborhoodFunction ); - itkSetObjectMacro( ConversionFunction, TConversionFunction ); - itkSetObjectMacro( VertexFunction, TVertexFunction ); - - public: - void ClearSeeds( ); - void AddSeed( const TVertex& seed, const TOutput& value ); - - protected: - Algorithm( ); - virtual ~Algorithm( ); - - virtual void GenerateData( ) override; - - // Particular methods - virtual bool _ContinueGenerateData( ); - virtual void _Loop( ); - - virtual void _BeforeGenerateData( ); - virtual void _AfterGenerateData( ); - virtual void _BeforeLoop( ); - virtual void _AfterLoop( ); - - virtual bool _ValidLoop( ) const; - virtual void _UpdateCollisions( const TVertex& a, const TVertex& b ); - - virtual _TOutput _GetInputValue( const _TQueueNode& v, const _TQueueNode& p ); - - virtual void _InitMarks( ) = 0; - virtual void _InitResults( const TOutput& init_value ) = 0; - virtual bool _IsMarked( const _TVertex& v ) const = 0; - virtual void _Mark( const _TQueueNode& n ) = 0; - virtual TFrontId _GetMark( const _TVertex& v ) const = 0; - virtual void _UpdateResult( const _TQueueNode& n ) = 0; - virtual TOutput _GetResult( const _TVertex& v ) const = 0; - virtual unsigned int _GetNumberOfDimensions( ) const = 0; - - virtual bool _UpdateValue( _TQueueNode& v, const _TQueueNode& p ) = 0; - virtual unsigned long _QueueSize( ) const = 0; - virtual void _QueueClear( ) = 0; - virtual void _QueuePush( const _TQueueNode& node ) = 0; - virtual _TQueueNode _QueuePop( ) = 0; - - private: - // Purposely not implemented. - Algorithm( const Self& other ); - Self& operator=( const Self& other ); - - protected: - _TOutput m_InitResult; - bool m_StopAtOneFront; - - typename TNeighborhoodFunction::Pointer m_NeighborhoodFunction; - typename TConversionFunction::Pointer m_ConversionFunction; - typename TVertexFunction::Pointer m_VertexFunction; - - std::vector< _TQueueNode > m_Seeds; - TCollisions m_Collisions; - unsigned int m_NumberOfFronts; - }; - - } // ecaseman - -} // ecaseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__Base__Algorithm__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Base/Algorithm.hxx b/lib/fpa/Base/Algorithm.hxx deleted file mode 100644 index c29ff03..0000000 --- a/lib/fpa/Base/Algorithm.hxx +++ /dev/null @@ -1,269 +0,0 @@ -#ifndef __fpa__Base__Algorithm__hxx__ -#define __fpa__Base__Algorithm__hxx__ - -#include - -// ------------------------------------------------------------------------- -template < class _TFilter, class _TVertex, class _TOutput > -fpa::Base::Algorithm< _TFilter, _TVertex, _TOutput >::_TQueueNode:: -_TQueueNode( ) -{ - this->Vertex.Fill( 0 ); - this->Parent.Fill( 0 ); - this->Result = _TOutput( 0 ); - this->FrontId = 0; -} - -// ------------------------------------------------------------------------- -template < class _TFilter, class _TVertex, class _TOutput > -fpa::Base::Algorithm< _TFilter, _TVertex, _TOutput >::_TQueueNode:: -_TQueueNode( const _TVertex& v ) -{ - this->Vertex = v; - this->Parent = v; - this->Result = _TOutput( 0 ); - this->FrontId = 0; -} - -// ------------------------------------------------------------------------- -template < class _TFilter, class _TVertex, class _TOutput > -fpa::Base::Algorithm< _TFilter, _TVertex, _TOutput >::_TQueueNode:: -_TQueueNode( const _TVertex& v, const _TQueueNode& n ) -{ - this->Vertex = v; - this->Parent = n.Vertex; - this->Result = n.Result; - this->FrontId = n.FrontId; -} - -// ------------------------------------------------------------------------- -template < class _TFilter, class _TVertex, class _TOutput > -void fpa::Base::Algorithm< _TFilter, _TVertex, _TOutput >:: -ClearSeeds( ) -{ - this->m_Seeds.clear( ); - this->Modified( ); -} - -// ------------------------------------------------------------------------- -template < class _TFilter, class _TVertex, class _TOutput > -void fpa::Base::Algorithm< _TFilter, _TVertex, _TOutput >:: -AddSeed( const _TVertex& seed, const TOutput& value ) -{ - _TQueueNode node( seed ); - node.FrontId = this->m_Seeds.size( ) + 1; - node.Result = value; - this->m_Seeds.push_back( node ); - this->Modified( ); -} - -// ------------------------------------------------------------------------- -template < class _TFilter, class _TVertex, class _TOutput > -fpa::Base::Algorithm< _TFilter, _TVertex, _TOutput >:: -Algorithm( ) - : Superclass( ), - m_InitResult( _TOutput( 0 ) ), - m_StopAtOneFront( false ) -{ -} - -// ------------------------------------------------------------------------- -template < class _TFilter, class _TVertex, class _TOutput > -fpa::Base::Algorithm< _TFilter, _TVertex, _TOutput >:: -~Algorithm( ) -{ -} - -// ------------------------------------------------------------------------- -template < class _TFilter, class _TVertex, class _TOutput > -void fpa::Base::Algorithm< _TFilter, _TVertex, _TOutput >:: -GenerateData( ) -{ - this->InvokeEvent( TStartEvent( ) ); - this->_BeforeGenerateData( ); - this->m_NumberOfFronts = this->m_Seeds.size( ); - if( this->m_NumberOfFronts > 0 ) - { - // Prepare collisions - TCollision coll( TVertex( ), false ); - TCollisionsRow row( this->m_NumberOfFronts, coll ); - this->m_Collisions.clear( ); - this->m_Collisions.resize( this->m_NumberOfFronts, row ); - - // Put seeds on queue - this->_QueueClear( ); - for( - auto nIt = this->m_Seeds.begin( ); - nIt != this->m_Seeds.end( ); - ++nIt - ) - this->_QueuePush( *nIt ); - - // Init marks and results - this->_InitMarks( ); - this->_InitResults( this->m_InitResult ); - - // Main loop - do - this->_Loop( ); - while( this->_ContinueGenerateData( ) ); - - } // fi - this->_AfterGenerateData( ); - this->InvokeEvent( TEndEvent( ) ); -} - -// ------------------------------------------------------------------------- -template < class _TFilter, class _TVertex, class _TOutput > -bool fpa::Base::Algorithm< _TFilter, _TVertex, _TOutput >:: -_ContinueGenerateData( ) -{ - return( false ); -} - -// ------------------------------------------------------------------------- -template < class _TFilter, class _TVertex, class _TOutput > -void fpa::Base::Algorithm< _TFilter, _TVertex, _TOutput >:: -_Loop( ) -{ - this->InvokeEvent( TStartLoopEvent( ) ); - this->_BeforeLoop( ); - while( this->_ValidLoop( ) ) - { - _TQueueNode node = this->_QueuePop( ); - this->InvokeEvent( TPopEvent( node.Vertex, node.FrontId ) ); - - // Process actual vertex - if( this->_IsMarked( node.Vertex ) ) - continue; - this->_Mark( node ); - this->_UpdateResult( node ); - this->InvokeEvent( TMarkEvent( node.Vertex, node.FrontId ) ); - - // Add neighbors to queue - TNeighborhood neighs = this->m_NeighborhoodFunction->Evaluate( node.Vertex ); - for( auto it = neighs.begin( ); it != neighs.end( ); ++it ) - { - if( !( this->_IsMarked( *it ) ) ) - { - _TQueueNode neigh( *it, node ); - if( this->_UpdateValue( neigh, node ) ) - { - this->_QueuePush( neigh ); - this->InvokeEvent( TPushEvent( node.Vertex, node.FrontId ) ); - - } // fi - } - else - this->_UpdateCollisions( node.Vertex, *it ); - - } // rof - - } // elihw - this->_AfterLoop( ); - this->InvokeEvent( TEndLoopEvent( ) ); -} - -// ------------------------------------------------------------------------- -template < class _TFilter, class _TVertex, class _TOutput > -void fpa::Base::Algorithm< _TFilter, _TVertex, _TOutput >:: -_BeforeGenerateData( ) -{ -} - -// ------------------------------------------------------------------------- -template < class _TFilter, class _TVertex, class _TOutput > -void fpa::Base::Algorithm< _TFilter, _TVertex, _TOutput >:: -_AfterGenerateData( ) -{ -} - -// ------------------------------------------------------------------------- -template < class _TFilter, class _TVertex, class _TOutput > -void fpa::Base::Algorithm< _TFilter, _TVertex, _TOutput >:: -_BeforeLoop( ) -{ -} - -// ------------------------------------------------------------------------- -template < class _TFilter, class _TVertex, class _TOutput > -void fpa::Base::Algorithm< _TFilter, _TVertex, _TOutput >:: -_AfterLoop( ) -{ -} - -// ------------------------------------------------------------------------- -template < class _TFilter, class _TVertex, class _TOutput > -bool fpa::Base::Algorithm< _TFilter, _TVertex, _TOutput >:: -_ValidLoop( ) const -{ - bool r = ( this->_QueueSize( ) > 0 ); - if( this->m_StopAtOneFront ) - r &= ( this->m_NumberOfFronts > 0 ); - return( r ); -} - -// ------------------------------------------------------------------------- -template < class _TFilter, class _TVertex, class _TOutput > -void fpa::Base::Algorithm< _TFilter, _TVertex, _TOutput >:: -_UpdateCollisions( const TVertex& a, const TVertex& b ) -{ - auto ma = this->_GetMark( a ); - auto mb = this->_GetMark( b ); - if( ma == mb || ma == 0 || mb == 0 ) - return; - - // Mark collision, if it is new - ma--; mb--; - bool ret = false; - bool exists = this->m_Collisions[ ma ][ mb ].second; - exists &= this->m_Collisions[ mb ][ ma ].second; - if( !exists ) - { - this->m_Collisions[ ma ][ mb ].first = a; - this->m_Collisions[ ma ][ mb ].second = true; - this->m_Collisions[ mb ][ ma ].first = b; - this->m_Collisions[ mb ][ ma ].second = true; - - // Update number of fronts - unsigned long N = this->m_Seeds.size( ); - unsigned long count = 0; - std::vector< bool > m( N, false ); - std::queue< unsigned long > q; - q.push( 0 ); - while( !q.empty( ) ) - { - unsigned long f = q.front( ); - q.pop( ); - - if( m[ f ] ) - continue; - m[ f ] = true; - count++; - - for( unsigned int n = 0; n < N; ++n ) - if( this->m_Collisions[ f ][ n ].second && !m[ n ] ) - q.push( n ); - - } // elihw - this->m_NumberOfFronts = N - count; - - } // fi -} - -// ------------------------------------------------------------------------- -template < class _TFilter, class _TVertex, class _TOutput > -_TOutput fpa::Base::Algorithm< _TFilter, _TVertex, _TOutput >:: -_GetInputValue( const _TQueueNode& v, const _TQueueNode& p ) -{ - _TOutput res = this->m_InitResult; - if( this->m_VertexFunction.IsNotNull( ) ) - res = this->m_VertexFunction->Evaluate( v.Vertex, p.Vertex ); - if( this->m_ConversionFunction.IsNotNull( ) ) - res = this->m_ConversionFunction->Evaluate( res ); - return( res ); -} - -#endif // __fpa__Base__Algorithm__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Base/Dijkstra.h b/lib/fpa/Base/Dijkstra.h deleted file mode 100644 index 08c704e..0000000 --- a/lib/fpa/Base/Dijkstra.h +++ /dev/null @@ -1,66 +0,0 @@ -#ifndef __fpa__Base__Dijkstra__h__ -#define __fpa__Base__Dijkstra__h__ - -#include - -namespace fpa -{ - namespace Base - { - /** - */ - template< class _TSuperclass, class _TMST > - class Dijkstra - : public fpa::Base::PriorityQueueAlgorithm< _TSuperclass > - { - public: - typedef Dijkstra Self; - typedef fpa::Base::PriorityQueueAlgorithm< _TSuperclass > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef _TMST TMST; - typedef typename Superclass::TOutput TOutput; - typedef typename Superclass::TVertex TVertex; - - protected: - typedef typename Superclass::_TQueueNode _TQueueNode; - - public: - itkTypeMacro( Dijkstra, Algorithm ); - - public: - _TMST* GetMinimumSpanningTree( ); - const _TMST* GetMinimumSpanningTree( ) const; - - protected: - Dijkstra( ); - virtual ~Dijkstra( ); - - virtual void _AfterGenerateData( ) override; - - virtual void _UpdateResult( const _TQueueNode& n ) override; - virtual bool _UpdateValue( - _TQueueNode& v, const _TQueueNode& p - ) override; - - private: - // Purposely not defined - Dijkstra( const Self& other ); - Self& operator=( const Self& other ); - - protected: - unsigned long m_MSTIndex; - }; - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__Base__Dijkstra__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Base/Dijkstra.hxx b/lib/fpa/Base/Dijkstra.hxx deleted file mode 100644 index df9c75e..0000000 --- a/lib/fpa/Base/Dijkstra.hxx +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef __fpa__Base__Dijkstra__hxx__ -#define __fpa__Base__Dijkstra__hxx__ - -#include -#include - -// ------------------------------------------------------------------------- -template< class _TSuperclass, class _TMST > -_TMST* fpa::Base::Dijkstra< _TSuperclass, _TMST >:: -GetMinimumSpanningTree( ) -{ - return( - dynamic_cast< _TMST* >( - this->itk::ProcessObject::GetOutput( this->m_MSTIndex ) - ) - ); -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass, class _TMST > -const _TMST* fpa::Base::Dijkstra< _TSuperclass, _TMST >:: -GetMinimumSpanningTree( ) const -{ - return( - dynamic_cast< const _TMST* >( - this->itk::ProcessObject::GetOutput( this->m_MSTIndex ) - ) - ); -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass, class _TMST > -fpa::Base::Dijkstra< _TSuperclass, _TMST >:: -Dijkstra( ) - : Superclass( ) -{ - this->m_InitResult = TOutput( 0 ); - this->m_MSTIndex = this->GetNumberOfRequiredOutputs( ); - this->SetNumberOfRequiredOutputs( this->m_MSTIndex + 1 ); - this->itk::ProcessObject::SetNthOutput( this->m_MSTIndex, _TMST::New( ) ); -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass, class _TMST > -fpa::Base::Dijkstra< _TSuperclass, _TMST >:: -~Dijkstra( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass, class _TMST > -void fpa::Base::Dijkstra< _TSuperclass, _TMST >:: -_AfterGenerateData( ) -{ - this->Superclass::_AfterGenerateData( ); - - auto mst = this->GetMinimumSpanningTree( ); - mst->ClearSeeds( ); - for( auto s = this->m_Seeds.begin( ); s != this->m_Seeds.end( ); ++s ) - mst->AddSeed( s->Vertex ); - mst->SetCollisions( this->m_Collisions ); -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass, class _TMST > -void fpa::Base::Dijkstra< _TSuperclass, _TMST >:: -_UpdateResult( const _TQueueNode& n ) -{ - this->Superclass::_UpdateResult( n ); - this->GetMinimumSpanningTree( )->SetParent( n.Vertex, n.Parent ); -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass, class _TMST > -bool fpa::Base::Dijkstra< _TSuperclass, _TMST >:: -_UpdateValue( _TQueueNode& v, const _TQueueNode& p ) -{ - v.Result = this->_GetInputValue( p.Vertex, v.Vertex ); - if( v.Result >= TOutput( 0 ) ) - { - v.Result += p.Result; - return( true ); - } - else - { - v.Result = this->m_InitResult; - return( false ); - - } // fi -} - -#endif // __fpa__Base__Dijkstra__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Base/Events.h b/lib/fpa/Base/Events.h deleted file mode 100644 index 17c5564..0000000 --- a/lib/fpa/Base/Events.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef __fpa__Base__Events__h__ -#define __fpa__Base__Events__h__ - -// ------------------------------------------------------------------------- -#define fpa_Base_NewEvent( name ) \ - class name \ - : public BaseEvent \ - { \ - public: \ - name( ) : BaseEvent( ) { } \ - virtual ~name( ) { } \ - const char* GetEventName( ) const \ - { return( "fpa::Base::##name" ); } \ - bool CheckEvent( const itk::EventObject* e ) const \ - { return( dynamic_cast< const name* >( e ) != NULL ); } \ - itk::EventObject* MakeObject( ) const \ - { return( new name( ) ); } \ - }; - -// ------------------------------------------------------------------------- -#define fpa_Base_NewEventWithVertex( name, type ) \ - class name \ - : public BaseEventWithVertex< type > \ - { \ - public: \ - name( ) : BaseEventWithVertex< type >( ) { } \ - name( const type& v, long fid ) \ - : BaseEventWithVertex< type >( v, fid ) { } \ - virtual ~name( ) { } \ - const char* GetEventName( ) const \ - { return( "fpa::Base::##name" ); } \ - bool CheckEvent( const itk::EventObject* e ) const \ - { return( dynamic_cast< const name* >( e ) != NULL ); } \ - itk::EventObject* MakeObject( ) const \ - { return( new name( ) ); } \ - }; - -namespace fpa -{ - namespace Base - { - /** - */ - class BaseEvent - : public itk::AnyEvent - { - public: - BaseEvent( ) - : itk::AnyEvent( ) - { } - virtual ~BaseEvent( ) - { } - const char* GetEventName( ) const - { return( "fpa::Base::BaseEvent" ); } - bool CheckEvent( const itk::EventObject* e ) const - { return( dynamic_cast< const BaseEvent* >( e ) != NULL ); } - itk::EventObject* MakeObject( ) const - { return( new BaseEvent( ) ); } - }; - - /** - */ - template< class _TVertex > - class BaseEventWithVertex - : public BaseEvent - { - public: - BaseEventWithVertex( ) - : BaseEvent( ) - { } - BaseEventWithVertex( const _TVertex& v, long fid ) - : BaseEvent( ), - Vertex( v ), - FrontId( fid ) - { } - virtual ~BaseEventWithVertex( ) - { } - const char* GetEventName( ) const - { return( "fpa::Base::BaseEventWithVertex" ); } - bool CheckEvent( const itk::EventObject* e ) const - { - return( - dynamic_cast< const BaseEventWithVertex< _TVertex >* >( e ) != NULL - ); - } - itk::EventObject* MakeObject( ) const - { return( new BaseEventWithVertex< _TVertex >( ) ); } - - public: - _TVertex Vertex; - long FrontId; - }; - - } // ecapseman - -} // ecapseman - -#endif // __fpa__Base__Events__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Base/FastMarching.h b/lib/fpa/Base/FastMarching.h deleted file mode 100644 index acea8e7..0000000 --- a/lib/fpa/Base/FastMarching.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef __fpa__Base__FastMarching__h__ -#define __fpa__Base__FastMarching__h__ - -#include - -namespace fpa -{ - namespace Base - { - /** - */ - template< class _TSuperclass > - class FastMarching - : public fpa::Base::PriorityQueueAlgorithm< _TSuperclass > - { - public: - typedef FastMarching Self; - typedef fpa::Base::PriorityQueueAlgorithm< _TSuperclass > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef typename Superclass::TFrontId TFrontId; - typedef typename Superclass::TOutput TOutput; - typedef typename Superclass::TVertex TVertex; - - typedef std::pair< TVertex, double > TFastMarchingNeighbor; - typedef std::vector< TFastMarchingNeighbor > TFastMarchingNeighborhood; - - protected: - typedef typename Superclass::_TQueueNode _TQueueNode; - - public: - itkTypeMacro( FastMarching, Algorithm ); - - protected: - FastMarching( ); - virtual ~FastMarching( ); - - virtual TFastMarchingNeighborhood _FastMarchingNeighbors( const TVertex& v ) const = 0; - - virtual bool _UpdateValue( _TQueueNode& v, const _TQueueNode& p ) override; - - private: - // Purposely not defined - FastMarching( const Self& other ); - Self& operator=( const Self& other ); - }; - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__Base__FastMarching__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Base/FastMarching.hxx b/lib/fpa/Base/FastMarching.hxx deleted file mode 100644 index 0fe1cb2..0000000 --- a/lib/fpa/Base/FastMarching.hxx +++ /dev/null @@ -1,82 +0,0 @@ -#ifndef __fpa__Base__FastMarching__hxx__ -#define __fpa__Base__FastMarching__hxx__ - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -fpa::Base::FastMarching< _TSuperclass >:: -FastMarching( ) - : Superclass( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -fpa::Base::FastMarching< _TSuperclass >:: -~FastMarching( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -bool fpa::Base::FastMarching< _TSuperclass >:: -_UpdateValue( _TQueueNode& v, const _TQueueNode& p ) -{ - // Compute quadratic coefficients - double a = double( 0 ); - double b = double( 0 ); - double c = double( 0 ); - TFastMarchingNeighborhood neighs = this->_FastMarchingNeighbors( v.Vertex ); - for( unsigned int i = 0; i < neighs.size( ); i += 2 ) - { - double tn = double( this->_GetResult( neighs[ i ].first ) ); - double tp = double( this->_GetResult( neighs[ i + 1 ].first ) ); - double dd = double( 0 ); - double td = this->m_InitResult; - if( tn < tp ) - { - td = tn; - dd = neighs[ i ].second; - } - else - { - td = tp; - dd = neighs[ i + 1 ].second; - - } // fi - - if( td < double( this->m_InitResult ) ) - { - dd = double( 1 ) / ( dd * dd ); - a += dd; - b += td * dd; - c += td * td * dd; - - } // fi - - } // rof - double F = double( this->_GetInputValue( v, p ) ); - c -= double( 1 ) / ( F * F ); - - // Solve quadratic equation - double d = ( b * b ) - ( a * c ); - if( d >= double( 0 ) ) - { - d = std::sqrt( d ); - b *= double( -1 ); - double s1 = std::fabs( ( b + d ) / a ); - double s2 = std::fabs( ( b - d ) / a ); - v.Result = TOutput( ( s2 < s1 )? s1: s2 ); - if( v.Result < this->_GetResult( v.Vertex ) ) - this->_UpdateResult( v ); - } - else - { - std::cout << std::endl << "-- FM --> " << v.Vertex << " " << d << std::endl; - std::exit( 1 ); - } - return( true ); -} - -#endif // __fpa__Base__FastMarching__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Base/Functors/GaussianModel.h b/lib/fpa/Base/Functors/GaussianModel.h deleted file mode 100644 index 8d32f51..0000000 --- a/lib/fpa/Base/Functors/GaussianModel.h +++ /dev/null @@ -1,82 +0,0 @@ -#ifndef __fpa__Base__Functors__GaussianModel__h__ -#define __fpa__Base__Functors__GaussianModel__h__ - -#include -#include -#include - -namespace fpa -{ - namespace Base - { - namespace Functors - { - /** - */ - template< class _TInput, class _TOutput > - class GaussianModel - : public itk::FunctionBase< _TInput, _TOutput > - { - public: - typedef GaussianModel Self; - typedef itk::FunctionBase< _TInput, _TOutput > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef _TInput TInput; - typedef _TOutput TOutput; - - // Model estimator - typedef - cpExtensions::Algorithms::IterativeGaussianModelEstimator< TOutput, 1 > - TModel; - - public: - itkNewMacro( Self ); - itkTypeMacro( GaussianModel, itk::FunctionBase ); - - /* TODO - itkGetConstMacro( SupportSize, unsigned int ); - itkGetConstMacro( MinimumCost, TOutput ); - itkGetObjectMacro( Model, TModel ); - itkGetConstObjectMacro( Model, TModel ); - itkSetMacro( SupportSize, unsigned int ); - itkSetMacro( MinimumCost, TOutput ); - */ - - public: - virtual TOutput Evaluate( const TInput& x ) const override; - - protected: - GaussianModel( ); - virtual ~GaussianModel( ); - - private: - // Purposely not implemented - GaussianModel( const Self& other ); - Self& operator=( const Self& other ); - - protected: - /* TODO - unsigned int m_SupportSize; - TOutput m_MinimumCost; - typename TModel::Pointer m_Model; - */ - mutable double m_S1; - mutable double m_S2; - mutable unsigned long m_N; - }; - - } // ecapseman - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__Base__Functors__GaussianModel__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Base/Functors/GaussianModel.hxx b/lib/fpa/Base/Functors/GaussianModel.hxx deleted file mode 100644 index 6a44ff8..0000000 --- a/lib/fpa/Base/Functors/GaussianModel.hxx +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef __fpa__Base__Functors__GaussianModel__hxx__ -#define __fpa__Base__Functors__GaussianModel__hxx__ - -// ------------------------------------------------------------------------- -template< class _TInput, class _TOutput > -typename fpa::Base::Functors::GaussianModel< _TInput, _TOutput >:: -TOutput fpa::Base::Functors::GaussianModel< _TInput, _TOutput >:: -Evaluate( const TInput& x ) const -{ - double v = double( x ); - double d = double( 0 ); - if( this->m_N > 1 ) - { - double N = double( this->m_N ); - double m = this->m_S1 / N; - double s = - ( this->m_S2 - ( ( this->m_S1 * this->m_S1 ) / N ) ) / - ( N - double( 1 ) ); - if( s > double( 0 ) ) - { - d = ( v - m ); - d *= d; - d /= s; - d = std::sqrt( d ); - if( d <= double( 1.5 ) ) // 2sigma - { - this->m_S1 += v; - this->m_S2 += v * v; - this->m_N += 1; - - } // fi - } - else - { - this->m_S1 += v; - this->m_S2 += v * v; - this->m_N += 1; - - } // fi - } - else - { - this->m_S1 += v; - this->m_S2 += v * v; - this->m_N += 1; - - } // fi - return( d ); - - /* TODO - TOutput r = TOutput( 0 ); - if( this->m_Model->GetNumberOfSamples( ) > this->m_SupportSize ) - { - r = this->m_Model->SquaredMahalanobis( TOutput( x ) ); - if( r <= TOutput( 1 ) ) - this->m_Model->AddSample( TOutput( x ) ); - } - else - { - this->m_Model->AddSample( TOutput( x ) ); - if( this->m_Model->GetNumberOfSamples( ) > 2 ) - r = this->m_Model->SquaredMahalanobis( TOutput( x ) ); - - } // fi - if( r < this->m_MinimumCost ) - return( this->m_MinimumCost ); - else - return( r ); - */ -} - -// ------------------------------------------------------------------------- -template< class _TInput, class _TOutput > -fpa::Base::Functors::GaussianModel< _TInput, _TOutput >:: -GaussianModel( ) - : Superclass( ) - /* TODO - , - m_SupportSize( 30 ), - m_MinimumCost( TOutput( 1e-10 ) ) - */ -{ - /* TODO - this->m_Model = TModel::New( ); - */ - this->m_S1 = double( 0 ); - this->m_S2 = double( 0 ); - this->m_N = 0; -} - -// ------------------------------------------------------------------------- -template< class _TInput, class _TOutput > -fpa::Base::Functors::GaussianModel< _TInput, _TOutput >:: -~GaussianModel( ) -{ -} - -#endif // __fpa__Base__Functors__GaussianModel__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Base/Functors/Inverse.h b/lib/fpa/Base/Functors/Inverse.h deleted file mode 100644 index af68022..0000000 --- a/lib/fpa/Base/Functors/Inverse.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef __fpa__Base__Functors__Inverse__h__ -#define __fpa__Base__Functors__Inverse__h__ - -#include -#include - -namespace fpa -{ - namespace Base - { - namespace Functors - { - /** - */ - template< class _TInput, class _TOutput > - class Inverse - : public itk::FunctionBase< _TInput, _TOutput > - { - public: - typedef Inverse Self; - typedef itk::FunctionBase< _TInput, _TOutput > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef _TInput TInput; - typedef _TOutput TOutput; - - public: - itkNewMacro( Self ); - itkTypeMacro( Inverse, itk::FunctionBase ); - - itkGetConstMacro( NegativeValue, _TOutput ); - itkSetMacro( NegativeValue, _TOutput ); - - public: - virtual TOutput Evaluate( const TInput& x ) const override; - - protected: - Inverse( ); - virtual ~Inverse( ); - - private: - // Purposely not implemented - Inverse( const Self& other ); - Self& operator=( const Self& other ); - - protected: - _TOutput m_NegativeValue; - }; - - } // ecapseman - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__Base__Functors__Inverse__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Base/Functors/Inverse.hxx b/lib/fpa/Base/Functors/Inverse.hxx deleted file mode 100644 index 4574cae..0000000 --- a/lib/fpa/Base/Functors/Inverse.hxx +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef __fpa__Base__Functors__Inverse__hxx__ -#define __fpa__Base__Functors__Inverse__hxx__ - -// ------------------------------------------------------------------------- -template< class _TInput, class _TOutput > -typename fpa::Base::Functors::Inverse< _TInput, _TOutput >:: -TOutput fpa::Base::Functors::Inverse< _TInput, _TOutput >:: -Evaluate( const TInput& x ) const -{ - TInput sign = TInput( ( x < TInput( 0 ) )? -1: 1 ); - TOutput y = TOutput( 1 ) / ( TOutput( 1 ) + TOutput( x * sign ) ); - if( sign < TInput( 0 ) ) - return( y * this->m_NegativeValue ); - else - return( y ); -} - -// ------------------------------------------------------------------------- -template< class _TInput, class _TOutput > -fpa::Base::Functors::Inverse< _TInput, _TOutput >:: -Inverse( ) - : Superclass( ), - m_NegativeValue( _TOutput( -1 ) ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TInput, class _TOutput > -fpa::Base::Functors::Inverse< _TInput, _TOutput >:: -~Inverse( ) -{ -} - -#endif // __fpa__Base__Functors__Inverse__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Base/Functors/RegionGrow/Base.h b/lib/fpa/Base/Functors/RegionGrow/Base.h deleted file mode 100644 index d2c37aa..0000000 --- a/lib/fpa/Base/Functors/RegionGrow/Base.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef __fpa__Base__Functors__RegionGrow__Base__h__ -#define __fpa__Base__Functors__RegionGrow__Base__h__ - -#include -#include -#include - -namespace fpa -{ - namespace Base - { - namespace Functors - { - namespace RegionGrow - { - /** - */ - template< class _TVertex, class _TOutput > - class Base - : public fpa::Base::Functors::VertexCostFunctionBase< _TVertex, _TOutput > - { - public: - typedef fpa::Base::Functors::VertexCostFunctionBase< _TVertex, _TOutput > Superclass; - typedef Base Self; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef _TVertex TVertex; - typedef _TOutput TOutput; - - public: - itkTypeMacro( Base, itk::Object ); - - itkGetConstMacro( InsideValue, _TOutput ); - itkGetConstMacro( OutsideValue, _TOutput ); - - itkSetMacro( InsideValue, _TOutput ); - itkSetMacro( OutsideValue, _TOutput ); - - public: - virtual TOutput Evaluate( const TVertex& a, const TVertex& b ) const = 0; - - protected: - Base( ) - : Superclass( ), - m_InsideValue( TOutput( 1 ) ), - m_OutsideValue( TOutput( 0 ) ) - { } - virtual ~Base( ) - { } - - private: - // Purposely not defined - Base( const Self& other ); - Self& operator=( const Self& other ); - - protected: - _TOutput m_InsideValue; - _TOutput m_OutsideValue; - }; - - } // ecapseman - - } // ecapseman - - } // ecapseman - -} // ecapseman - -#endif // __fpa__Base__Functors__RegionGrow__Base__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Base/Functors/RegionGrow/Tautology.h b/lib/fpa/Base/Functors/RegionGrow/Tautology.h deleted file mode 100644 index 11d016e..0000000 --- a/lib/fpa/Base/Functors/RegionGrow/Tautology.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef __fpa__Base__Functors__RegionGrow__Tautology__h__ -#define __fpa__Base__Functors__RegionGrow__Tautology__h__ - -#include - -namespace fpa -{ - namespace Base - { - namespace Functors - { - namespace RegionGrow - { - /** - */ - template< class _TVertex, class _TOutput > - class Tautology - : public Base< _TVertex, _TOutput > - { - public: - typedef Tautology Self; - typedef Base< _TVertex, _TOutput > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef typename Superclass::TOutput TOutput; - typedef typename Superclass::TVertex TVertex; - - public: - itkNewMacro( Self ); - itkTypeMacro( Tautology, Base ); - - public: - virtual TOutput Evaluate( const TVertex& a, const TVertex& b ) const override - { - return( this->m_InsideValue ); - } - - protected: - Tautology( ) - : Superclass( ) - { } - virtual ~Tautology( ) - { } - - private: - // Purposely not defined - Tautology( const Self& other ); - Self& operator=( const Self& other ); - }; - - } // ecapseman - - } // ecapseman - - } // ecapseman - -} // ecapseman - -#endif // __fpa__Base__Functors__RegionGrow__Tautology__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Base/Functors/VertexCostFunctionBase.h b/lib/fpa/Base/Functors/VertexCostFunctionBase.h deleted file mode 100644 index 12f5c24..0000000 --- a/lib/fpa/Base/Functors/VertexCostFunctionBase.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef __fpa__Base__Functors__VertexCostFunctionBase__h__ -#define __fpa__Base__Functors__VertexCostFunctionBase__h__ - -#include -#include - -namespace fpa -{ - namespace Base - { - namespace Functors - { - /** - */ - template< class _TVertex, class _TOutput > - class VertexCostFunctionBase - : public itk::Object - { - public: - typedef VertexCostFunctionBase Self; - typedef itk::Object Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef _TVertex TVertex; - typedef _TOutput TOutput; - - public: - itkTypeMacro( VertexCostFunctionBase, itk::Object ); - - public: - virtual TOutput Evaluate( const TVertex& a, const TVertex& b ) const = 0; - - protected: - VertexCostFunctionBase( ) - : Superclass( ) - { } - virtual ~VertexCostFunctionBase( ) - { } - - private: - // Purposely not defined - VertexCostFunctionBase( const Self& other ); - Self& operator=( const Self& other ); - }; - - } // ecapseman - - } // ecapseman - -} // ecapseman - -#endif // __fpa__Base__Functors__VertexCostFunctionBase__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Base/MinimumSpanningTree.h b/lib/fpa/Base/MinimumSpanningTree.h deleted file mode 100644 index 03940f1..0000000 --- a/lib/fpa/Base/MinimumSpanningTree.h +++ /dev/null @@ -1,80 +0,0 @@ -#ifndef __fpa__Base__MinimumSpanningTree__h__ -#define __fpa__Base__MinimumSpanningTree__h__ - -#include -#include -#include -#include - -namespace fpa -{ - namespace Base - { - /** - */ - template< class _TVertex, class _TPath, class _TSuperclass > - class MinimumSpanningTree - : public _TSuperclass - { - public: - typedef MinimumSpanningTree Self; - typedef _TSuperclass Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef _TVertex TVertex; - typedef _TPath TPath; - typedef std::pair< _TVertex, bool > TCollision; - typedef std::vector< TCollision > TCollisionsRow; - typedef std::vector< TCollisionsRow > TCollisions; - - protected: - typedef std::vector< unsigned long > _TRow; - typedef std::vector< _TRow > _TMatrix; - - public: - itkTypeMacro( MinimumSpanningTree, _TSuperclass ); - - public: - const TCollisions& GetCollisions( ) const; - void SetCollisions( const TCollisions& collisions ); - - void ClearSeeds( ); - void AddSeed( const _TVertex& seed ); - - virtual _TVertex GetParent( const _TVertex& v ) const = 0; - virtual void SetParent( const _TVertex& v, const _TVertex& p ) = 0; - - virtual void GetPath( - typename _TPath::Pointer& path, const _TVertex& a - ) const; - virtual void GetPath( - typename _TPath::Pointer& path, const _TVertex& a, const _TVertex& b - ) const; - - protected: - MinimumSpanningTree( ); - virtual ~MinimumSpanningTree( ); - - private: - // Purposely not defined - MinimumSpanningTree( const Self& other ); - Self& operator=( const Self& other ); - - protected: - TCollisions m_Collisions; - _TMatrix m_FrontPaths; - std::vector< _TVertex > m_Seeds; - }; - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__Base__MinimumSpanningTree__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Base/MinimumSpanningTree.hxx b/lib/fpa/Base/MinimumSpanningTree.hxx deleted file mode 100644 index e8ed6a2..0000000 --- a/lib/fpa/Base/MinimumSpanningTree.hxx +++ /dev/null @@ -1,244 +0,0 @@ -#ifndef __fpa__Base__MinimumSpanningTree__hxx__ -#define __fpa__Base__MinimumSpanningTree__hxx__ - -#include - -// ------------------------------------------------------------------------- -template< class _TVertex, class _TPath, class _TSuperclass > -const typename -fpa::Base::MinimumSpanningTree< _TVertex, _TPath, _TSuperclass >:: -TCollisions& -fpa::Base::MinimumSpanningTree< _TVertex, _TPath, _TSuperclass >:: -GetCollisions( ) const -{ - return( this->m_Collisions ); -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _TPath, class _TSuperclass > -void fpa::Base::MinimumSpanningTree< _TVertex, _TPath, _TSuperclass >:: -SetCollisions( const TCollisions& collisions ) -{ - static const unsigned long _inf = - std::numeric_limits< unsigned long >::max( ); - if( this->m_Collisions == collisions ) - return; - - this->m_Collisions = collisions; - - // Prepare a front graph - unsigned long N = this->m_Collisions.size( ); - _TMatrix dist( N, _TRow( N, _inf ) ); - this->m_FrontPaths = dist; - for( unsigned long i = 0; i < N; ++i ) - { - for( unsigned long j = 0; j < N; ++j ) - { - if( this->m_Collisions[ i ][ j ].second ) - { - dist[ i ][ j ] = 1; - dist[ j ][ i ] = 1; - this->m_FrontPaths[ i ][ j ] = j; - this->m_FrontPaths[ j ][ i ] = i; - - } // fi - - } // rof - dist[ i ][ i ] = 0; - this->m_FrontPaths[ i ][ i ] = i; - - } // rof - - // Use Floyd-Warshall to compute all possible paths between fronts - for( unsigned long k = 0; k < N; ++k ) - { - for( unsigned long i = 0; i < N; ++i ) - { - for( unsigned long j = 0; j < N; ++j ) - { - // WARNING: you don't want a numeric overflow!!! - unsigned long dik = dist[ i ][ k ]; - unsigned long dkj = dist[ k ][ j ]; - unsigned long sum = _inf; - if( dik < _inf && dkj < _inf ) - sum = dik + dkj; - - // Ok, continue Floyd-Warshall - if( sum < dist[ i ][ j ] ) - { - dist[ i ][ j ] = sum; - this->m_FrontPaths[ i ][ j ] = this->m_FrontPaths[ i ][ k ]; - - } // fi - - } // rof - - } // rof - - } // rof - this->Modified( ); -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _TPath, class _TSuperclass > -void fpa::Base::MinimumSpanningTree< _TVertex, _TPath, _TSuperclass >:: -ClearSeeds( ) -{ - this->m_Seeds.clear( ); - this->Modified( ); -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _TPath, class _TSuperclass > -void fpa::Base::MinimumSpanningTree< _TVertex, _TPath, _TSuperclass >:: -AddSeed( const _TVertex& seed ) -{ - this->m_Seeds.push_back( seed ); - this->Modified( ); -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _TPath, class _TSuperclass > -void fpa::Base::MinimumSpanningTree< _TVertex, _TPath, _TSuperclass >:: -GetPath( typename _TPath::Pointer& path, const _TVertex& a ) const -{ - std::vector< _TVertex > vertices; - _TVertex it = a; - _TVertex p = this->GetParent( it ); - while( it != p ) - { - vertices.push_back( it ); - it = p; - p = this->GetParent( it ); - - } // elihw - vertices.push_back( it ); - - if( path.IsNull( ) ) - path = _TPath::New( ); - for( auto v = vertices.begin( ); v != vertices.end( ); ++v ) - path->AddVertex( *v ); -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _TPath, class _TSuperclass > -void fpa::Base::MinimumSpanningTree< _TVertex, _TPath, _TSuperclass >:: -GetPath( - typename _TPath::Pointer& path, const _TVertex& a, const _TVertex& b - ) const -{ - static const unsigned long _inf = - std::numeric_limits< unsigned long >::max( ); - - if( path.IsNull( ) ) - path = _TPath::New( ); - typename _TPath::Pointer pa, pb; - this->GetPath( pa, a ); - this->GetPath( pb, b ); - if( pa->GetSize( ) > 0 && pb->GetSize( ) > 0 ) - { - // Find front identifiers - unsigned long ia = _inf, ib = _inf; - unsigned long N = this->m_Seeds.size( ); - for( unsigned long i = 0; i < N; ++i ) - { - if( this->m_Seeds[ i ] == pa->GetVertex( pa->GetSize( ) - 1 ) ) - ia = i; - if( this->m_Seeds[ i ] == pb->GetVertex( pb->GetSize( ) - 1 ) ) - ib = i; - - } // rof - - // Check if there is a front-jump between given seeds - if( ia != ib ) - { - // Compute front path - std::vector< long > fpath; - fpath.push_back( ia ); - while( ia != ib ) - { - ia = this->m_FrontPaths[ ia ][ ib ]; - fpath.push_back( ia ); - - } // elihw - - // Continue only if both fronts are connected - unsigned int N = fpath.size( ); - if( N > 0 ) - { - // First path: from start vertex to first collision - this->GetPath( - path, a, - this->m_Collisions[ fpath[ 0 ] ][ fpath[ 1 ] ].first - ); - - // Intermediary paths - for( unsigned int i = 1; i < N - 1; ++i ) - { - typename _TPath::Pointer ipath; - this->GetPath( - ipath, - this->m_Collisions[ fpath[ i ] ][ fpath[ i - 1 ] ].first, - this->m_Collisions[ fpath[ i ] ][ fpath[ i + 1 ] ].first - ); - for( long id = 0; id < ipath->GetSize( ); ++id ) - path->AddVertex( ipath->GetVertex( id ) ); - - } // rof - - // Final path: from last collision to end point - typename _TPath::Pointer lpath; - this->GetPath( - lpath, - this->m_Collisions[ fpath[ N - 1 ] ][ fpath[ N - 2 ] ].first, b - ); - for( long id = 0; id < lpath->GetSize( ); ++id ) - path->AddVertex( lpath->GetVertex( id ) ); - - } // fi - } - else - { - // Ignore common part: find common ancestor - long aIt = pa->GetSize( ) - 1; - long bIt = pb->GetSize( ) - 1; - bool cont = true; - while( aIt >= 0 && bIt >= 0 && cont ) - { - cont = ( pa->GetVertex( aIt ) == pb->GetVertex( bIt ) ); - aIt--; - bIt--; - - } // elihw - aIt++; - bIt++; - - // Glue both parts - for( long cIt = 0; cIt <= aIt; ++cIt ) - path->AddVertex( pa->GetVertex( cIt ) ); - for( ; bIt >= 0; --bIt ) - path->AddVertex( pb->GetVertex( bIt ) ); - - } // fi - - } // fi -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _TPath, class _TSuperclass > -fpa::Base::MinimumSpanningTree< _TVertex, _TPath, _TSuperclass >:: -MinimumSpanningTree( ) - : Superclass( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _TPath, class _TSuperclass > -fpa::Base::MinimumSpanningTree< _TVertex, _TPath, _TSuperclass >:: -~MinimumSpanningTree( ) -{ -} - -#endif // __fpa__Base__MinimumSpanningTree__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Base/PriorityQueueAlgorithm.h b/lib/fpa/Base/PriorityQueueAlgorithm.h deleted file mode 100644 index e34b823..0000000 --- a/lib/fpa/Base/PriorityQueueAlgorithm.h +++ /dev/null @@ -1,64 +0,0 @@ -#ifndef __fpa__Base__PriorityQueueAlgorithm__h__ -#define __fpa__Base__PriorityQueueAlgorithm__h__ - -#include - -namespace fpa -{ - namespace Base - { - /** - */ - template< class _TSuperclass > - class PriorityQueueAlgorithm - : public _TSuperclass - { - public: - typedef PriorityQueueAlgorithm Self; - typedef _TSuperclass Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - protected: - typedef typename Superclass::_TQueueNode _TQueueNode; - struct _TQueueNodeCompare - { - bool operator( )( const _TQueueNode& a, const _TQueueNode& b ) - { - return( b.Result < a.Result ); - } - }; - typedef std::vector< _TQueueNode > _TQueue; - - public: - itkTypeMacro( PriorityQueueAlgorithm, Algorithm ); - - protected: - PriorityQueueAlgorithm( ); - virtual ~PriorityQueueAlgorithm( ); - - virtual unsigned long _QueueSize( ) const override; - virtual void _QueueClear( ) override; - virtual void _QueuePush( const _TQueueNode& node ) override; - virtual _TQueueNode _QueuePop( ) override; - - private: - // Purposely not defined - PriorityQueueAlgorithm( const Self& other ); - Self& operator=( const Self& other ); - - protected: - _TQueue m_Queue; - }; - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__Base__PriorityQueueAlgorithm__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Base/PriorityQueueAlgorithm.hxx b/lib/fpa/Base/PriorityQueueAlgorithm.hxx deleted file mode 100644 index 11c1408..0000000 --- a/lib/fpa/Base/PriorityQueueAlgorithm.hxx +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef __fpa__Base__PriorityQueueAlgorithm__hxx__ -#define __fpa__Base__PriorityQueueAlgorithm__hxx__ - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -fpa::Base::PriorityQueueAlgorithm< _TSuperclass >:: -PriorityQueueAlgorithm( ) - : Superclass( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -fpa::Base::PriorityQueueAlgorithm< _TSuperclass >:: -~PriorityQueueAlgorithm( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -unsigned long fpa::Base::PriorityQueueAlgorithm< _TSuperclass >:: -_QueueSize( ) const -{ - return( this->m_Queue.size( ) ); -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -void fpa::Base::PriorityQueueAlgorithm< _TSuperclass >:: -_QueueClear( ) -{ - this->m_Queue.clear( ); -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -void fpa::Base::PriorityQueueAlgorithm< _TSuperclass >:: -_QueuePush( const _TQueueNode& node ) -{ - static _TQueueNodeCompare cmp; - this->m_Queue.push_back( node ); - std::push_heap( this->m_Queue.begin( ), this->m_Queue.end( ), cmp ); -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -typename fpa::Base::PriorityQueueAlgorithm< _TSuperclass >:: -_TQueueNode fpa::Base::PriorityQueueAlgorithm< _TSuperclass >:: -_QueuePop( ) -{ - static _TQueueNodeCompare cmp; - std::pop_heap( this->m_Queue.begin( ), this->m_Queue.end( ), cmp ); - _TQueueNode f = this->m_Queue.back( ); - this->m_Queue.pop_back( ); - return( f ); -} - -#endif // __fpa__Base__PriorityQueueAlgorithm__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Base/QueueAlgorithm.h b/lib/fpa/Base/QueueAlgorithm.h deleted file mode 100644 index dd077f7..0000000 --- a/lib/fpa/Base/QueueAlgorithm.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef __fpa__Base__QueueAlgorithm__h__ -#define __fpa__Base__QueueAlgorithm__h__ - -#include -#include -#include - -namespace fpa -{ - namespace Base - { - /** - */ - template< class _TSuperclass > - class QueueAlgorithm - : public _TSuperclass - { - public: - typedef QueueAlgorithm Self; - typedef _TSuperclass Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - protected: - typedef typename Superclass::_TQueueNode _TQueueNode; - typedef std::queue< _TQueueNode > _TQueue; - - public: - itkTypeMacro( QueueAlgorithm, _TSuperclass ); - - protected: - QueueAlgorithm( ); - virtual ~QueueAlgorithm( ); - - virtual unsigned long _QueueSize( ) const override; - virtual void _QueueClear( ) override; - virtual void _QueuePush( const _TQueueNode& node ) override; - virtual _TQueueNode _QueuePop( ) override; - - private: - // Purposely not defined - QueueAlgorithm( const Self& other ); - Self& operator=( const Self& other ); - - protected: - _TQueue m_Queue; - }; - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__Base__QueueAlgorithm__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Base/QueueAlgorithm.hxx b/lib/fpa/Base/QueueAlgorithm.hxx deleted file mode 100644 index db5b8bc..0000000 --- a/lib/fpa/Base/QueueAlgorithm.hxx +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef __fpa__Base__QueueAlgorithm__hxx__ -#define __fpa__Base__QueueAlgorithm__hxx__ - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -fpa::Base::QueueAlgorithm< _TSuperclass >:: -QueueAlgorithm( ) - : Superclass( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -fpa::Base::QueueAlgorithm< _TSuperclass >:: -~QueueAlgorithm( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -unsigned long fpa::Base::QueueAlgorithm< _TSuperclass >:: -_QueueSize( ) const -{ - return( this->m_Queue.size( ) ); -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -void fpa::Base::QueueAlgorithm< _TSuperclass >:: -_QueueClear( ) -{ - while( this->m_Queue.size( ) > 0 ) - this->m_Queue.pop( ); -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -void fpa::Base::QueueAlgorithm< _TSuperclass >:: -_QueuePush( const _TQueueNode& node ) -{ - this->m_Queue.push( node ); -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -typename fpa::Base::QueueAlgorithm< _TSuperclass >:: -_TQueueNode fpa::Base::QueueAlgorithm< _TSuperclass >:: -_QueuePop( ) -{ - _TQueueNode f = this->m_Queue.front( ); - this->m_Queue.pop( ); - return( f ); -} - -#endif // __fpa__Base__QueueAlgorithm__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Base/RegionGrow.h b/lib/fpa/Base/RegionGrow.h deleted file mode 100644 index 4790b85..0000000 --- a/lib/fpa/Base/RegionGrow.h +++ /dev/null @@ -1,79 +0,0 @@ -#ifndef __fpa__Base__RegionGrow__h__ -#define __fpa__Base__RegionGrow__h__ - -#include -#include -#include - -namespace fpa -{ - namespace Base - { - /** - */ - template< class _TSuperclass > - class RegionGrow - : public fpa::Base::QueueAlgorithm< _TSuperclass > - { - public: - typedef RegionGrow Self; - typedef fpa::Base::QueueAlgorithm< _TSuperclass > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef typename Superclass::TOutput TOutput; - typedef typename Superclass::TVertex TVertex; - typedef fpa::Base::Functors::RegionGrow::Base< TVertex, TOutput > TGrowFunction; - - protected: - typedef typename Superclass::_TQueueNode _TQueueNode; - - public: - itkTypeMacro( RegionGrow, Algorithm ); - - public: - TGrowFunction* GetGrowFunction( ); - const TGrowFunction* GetGrowFunction( ) const; - TOutput GetInsideValue( ) const; - TOutput GetOutsideValue( ) const; - - void SetGrowFunction( TGrowFunction* f ); - void SetInsideValue( const TOutput& v ); - void SetOutsideValue( const TOutput& v ); - - protected: - RegionGrow( ); - virtual ~RegionGrow( ); - - virtual bool _UpdateValue( - _TQueueNode& v, const _TQueueNode& p - ) override; - virtual TOutput _GetInputValue( const _TQueueNode& v, const _TQueueNode& p ) override - { - TOutput res = this->m_InitResult; - if( this->m_GrowFunction.IsNotNull( ) ) - res = this->m_GrowFunction->Evaluate( v.Vertex, p.Vertex ); - return( res ); - } - - - private: - // Purposely not defined - RegionGrow( const Self& other ); - Self& operator=( const Self& other ); - - protected: - typename TGrowFunction::Pointer m_GrowFunction; - }; - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__Base__RegionGrow__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Base/RegionGrow.hxx b/lib/fpa/Base/RegionGrow.hxx deleted file mode 100644 index c3cb9f3..0000000 --- a/lib/fpa/Base/RegionGrow.hxx +++ /dev/null @@ -1,128 +0,0 @@ -#ifndef __fpa__Base__RegionGrow__hxx__ -#define __fpa__Base__RegionGrow__hxx__ - -#include - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -typename fpa::Base::RegionGrow< _TSuperclass >:: -TGrowFunction* fpa::Base::RegionGrow< _TSuperclass >:: -GetGrowFunction( ) -{ - // TODO: return( dynamic_cast< TGrowFunction* >( this->GetVertexFunction( ) ) ); - return( this->m_GrowFunction ); -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -const typename fpa::Base::RegionGrow< _TSuperclass >:: -TGrowFunction* fpa::Base::RegionGrow< _TSuperclass >:: -GetGrowFunction( ) const -{ - /* TODO - return( - dynamic_cast< const TGrowFunction* >( this->GetVertexFunction( ) ) - ); - */ - return( this->m_GrowFunction ); -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -typename fpa::Base::RegionGrow< _TSuperclass >:: -TOutput fpa::Base::RegionGrow< _TSuperclass >:: -GetInsideValue( ) const -{ - const TGrowFunction* f = this->GetGrowFunction( ); - if( f != NULL ) - return( f->GetInsideValue( ) ); - else - return( this->m_InitResult ); -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -typename fpa::Base::RegionGrow< _TSuperclass >:: -TOutput fpa::Base::RegionGrow< _TSuperclass >:: -GetOutsideValue( ) const -{ - const TGrowFunction* f = this->GetGrowFunction( ); - if( f != NULL ) - return( f->GetOutsideValue( ) ); - else - return( this->m_InitResult ); -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -void fpa::Base::RegionGrow< _TSuperclass >:: -SetGrowFunction( TGrowFunction* f ) -{ - TGrowFunction* old_f = this->GetGrowFunction( ); - if( old_f != NULL ) - { - f->SetInsideValue( old_f->GetInsideValue( ) ); - f->SetOutsideValue( old_f->GetOutsideValue( ) ); - - } // fi - this->m_GrowFunction = f; -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -void fpa::Base::RegionGrow< _TSuperclass >:: -SetInsideValue( const TOutput& v ) -{ - TGrowFunction* f = this->GetGrowFunction( ); - if( f != NULL ) - { - f->SetInsideValue( v ); - this->Modified( ); - - } // fi -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -void fpa::Base::RegionGrow< _TSuperclass >:: -SetOutsideValue( const TOutput& v ) -{ - TGrowFunction* f = this->GetGrowFunction( ); - if( f != NULL ) - { - f->SetOutsideValue( v ); - this->Modified( ); - - } // fi -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -fpa::Base::RegionGrow< _TSuperclass >:: -RegionGrow( ) - : Superclass( ) -{ - typedef fpa::Base::Functors::RegionGrow::Tautology< TVertex, TOutput > _TFunc; - this->SetGrowFunction( _TFunc::New( ) ); - this->m_InitResult = this->GetGrowFunction( )->GetOutsideValue( ); -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -fpa::Base::RegionGrow< _TSuperclass >:: -~RegionGrow( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -bool fpa::Base::RegionGrow< _TSuperclass >:: -_UpdateValue( _TQueueNode& v, const _TQueueNode& p ) -{ - v.Result = this->_GetInputValue( v, p ); - return( v.Result == this->GetInsideValue( ) ); -} - -#endif // __fpa__Base__RegionGrow__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Config.h b/lib/fpa/Config.h deleted file mode 100644 index 9728f0b..0000000 --- a/lib/fpa/Config.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef __fpa__Config__h__ -#define __fpa__Config__h__ - -/* - * ========================================================================= - * Language related macros - * ========================================================================= - */ - -#endif // __fpa__Config__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/Algorithm.h b/lib/fpa/Image/Algorithm.h deleted file mode 100644 index 0105cc3..0000000 --- a/lib/fpa/Image/Algorithm.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef __fpa__Image__Algorithm__h__ -#define __fpa__Image__Algorithm__h__ - -#include -#include -#include -#include - -namespace fpa -{ - namespace Image - { - /** - */ - template< class _TInputImage, class _TOutputImage > - class Algorithm - : public fpa::Base::Algorithm< itk::ImageToImageFilter< _TInputImage, _TOutputImage >, typename _TInputImage::IndexType, typename _TOutputImage::PixelType > - { - public: - typedef itk::ImageToImageFilter< _TInputImage, _TOutputImage > TFilter; - typedef typename _TInputImage::IndexType TVertex; - typedef typename _TOutputImage::PixelType TOutput; - - typedef Algorithm Self; - typedef fpa::Base::Algorithm< TFilter, TVertex, TOutput > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef typename Superclass::TFrontId TFrontId; - typedef typename Superclass::TNeighborhood TNeighborhood; - - typedef fpa::Image::Functors::Base< itk::ImageBase< _TInputImage::ImageDimension >, typename Superclass::TNeighborhoodFunction > TNeighborhoodFunction; - typedef fpa::Image::Functors::Base< _TInputImage, typename Superclass::TVertexFunction > TVertexFunction; - - protected: - typedef typename Superclass::_TQueueNode _TQueueNode; - - public: - itkTypeMacro( fpa::Image::Algorithm, fpa::Base::Algorithm ); - - protected: - Algorithm( ); - virtual ~Algorithm( ); - - virtual void _BeforeGenerateData( ) override; - virtual void _InitMarks( ) override; - virtual void _InitResults( const TOutput& init_value ) override; - virtual bool _IsMarked( const TVertex& v ) const override; - virtual void _Mark( const _TQueueNode& n ) override; - virtual TFrontId _GetMark( const TVertex& v ) const override; - virtual void _UpdateResult( const _TQueueNode& n ) override; - virtual TOutput _GetResult( const TVertex& v ) const override; - virtual unsigned int _GetNumberOfDimensions( ) const override; - - private: - // Purposely not defined - Algorithm( const Self& other ); - Self& operator=( const Self& other ); - - protected: - unsigned int m_MarksIdx; - }; - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__Image__Algorithm__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/Algorithm.hxx b/lib/fpa/Image/Algorithm.hxx deleted file mode 100644 index 3c33e4e..0000000 --- a/lib/fpa/Image/Algorithm.hxx +++ /dev/null @@ -1,149 +0,0 @@ -#ifndef __fpa__Image__Algorithm__hxx__ -#define __fpa__Image__Algorithm__hxx__ - -// Send Piotr's code to Anna - -#include -#include - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: -Algorithm( ) - : Superclass( ) -{ - typedef fpa::Image::Functors::SimpleNeighborhood< _TInputImage::ImageDimension > _TNeigh; - typedef itk::Image< TFrontId, _TInputImage::ImageDimension > _TMarks; - - this->m_MarksIdx = this->GetNumberOfRequiredOutputs( ); - this->itk::ProcessObject::SetNumberOfRequiredOutputs( this->m_MarksIdx + 1 ); - typename _TMarks::Pointer marks = _TMarks::New( ); - this->SetNthOutput( this->m_MarksIdx, marks ); - - typename _TNeigh::Pointer neigh = _TNeigh::New( ); - this->SetNeighborhoodFunction( neigh ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: -~Algorithm( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -void fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: -_BeforeGenerateData( ) -{ - this->Superclass::_BeforeGenerateData( ); - this->AllocateOutputs( ); - - TNeighborhoodFunction* neighFunc = - dynamic_cast< TNeighborhoodFunction* >( - this->GetNeighborhoodFunction( ) - ); - if( neighFunc == NULL ) - itkExceptionMacro( << "NeighborhoodFunction not well defined." ); - neighFunc->SetImage( this->GetInput( ) ); - - TVertexFunction* vertexFunc = - dynamic_cast< TVertexFunction* >( - this->GetVertexFunction( ) - ); - if( vertexFunc != NULL ) - vertexFunc->SetImage( this->GetInput( ) ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -void fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: -_InitMarks( ) -{ - typedef itk::Image< TFrontId, _TInputImage::ImageDimension > _TMarks; - _TMarks* marks = - dynamic_cast< _TMarks* >( - this->itk::ProcessObject::GetOutput( this->m_MarksIdx ) - ); - marks->FillBuffer( 0 ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -void fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: -_InitResults( const TOutput& init_value ) -{ - this->GetOutput( )->FillBuffer( init_value ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -bool fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: -_IsMarked( const TVertex& v ) const -{ - typedef itk::Image< TFrontId, _TInputImage::ImageDimension > _TMarks; - const _TMarks* marks = - dynamic_cast< const _TMarks* >( - this->itk::ProcessObject::GetOutput( this->m_MarksIdx ) - ); - return( marks->GetPixel( v ) != 0 ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -void fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: -_Mark( const _TQueueNode& n ) -{ - typedef itk::Image< TFrontId, _TInputImage::ImageDimension > _TMarks; - _TMarks* marks = - dynamic_cast< _TMarks* >( - this->itk::ProcessObject::GetOutput( this->m_MarksIdx ) - ); - marks->SetPixel( n.Vertex, n.FrontId ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -typename fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: -TFrontId fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: -_GetMark( const TVertex& v ) const -{ - typedef itk::Image< TFrontId, _TInputImage::ImageDimension > _TMarks; - const _TMarks* marks = - dynamic_cast< const _TMarks* >( - this->itk::ProcessObject::GetOutput( this->m_MarksIdx ) - ); - return( marks->GetPixel( v ) ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -void fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: -_UpdateResult( const _TQueueNode& n ) -{ - this->GetOutput( )->SetPixel( n.Vertex, n.Result ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -typename fpa::Image::Algorithm< _TInputImage, _TOutputImage >::TOutput -fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: -_GetResult( const TVertex& v ) const -{ - if( this->GetOutput( )->GetLargestPossibleRegion( ).IsInside( v ) ) - return( this->GetOutput( )->GetPixel( v ) ); - else - return( this->m_InitResult ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -unsigned int fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: -_GetNumberOfDimensions( ) const -{ - return( _TInputImage::ImageDimension ); -} - -#endif // __fpa__Image__Algorithm__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/Dijkstra.h b/lib/fpa/Image/Dijkstra.h deleted file mode 100644 index 118cc27..0000000 --- a/lib/fpa/Image/Dijkstra.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef __fpa__Image__Dijkstra__h__ -#define __fpa__Image__Dijkstra__h__ - -#include -#include -#include -#include - -namespace fpa -{ - namespace Image - { - /** - */ - template< class _TInputImage, class _TOutputImage > - class Dijkstra - : public fpa::Base::Dijkstra< fpa::Image::Algorithm< _TInputImage, _TOutputImage >, fpa::Image::MinimumSpanningTree< _TInputImage::ImageDimension > > - { - public: - typedef Dijkstra Self; - typedef fpa::Image::Algorithm< _TInputImage, _TOutputImage > TAlgorithm; - typedef fpa::Image::MinimumSpanningTree< _TInputImage::ImageDimension > TMST; - typedef fpa::Base::Dijkstra< TAlgorithm, TMST > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef typename Superclass::TOutput TOutput; - typedef typename Superclass::TVertex TVertex; - - public: - itkNewMacro( Self ); - itkTypeMacro( fpa::Image::Dijkstra, fpa::Base::Dijkstra ); - - protected: - Dijkstra( ); - virtual ~Dijkstra( ); - - private: - // Purposely not defined - Dijkstra( const Self& other ); - Self& operator=( const Self& other ); - }; - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__Image__Dijkstra__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/Dijkstra.hxx b/lib/fpa/Image/Dijkstra.hxx deleted file mode 100644 index 1f21dc4..0000000 --- a/lib/fpa/Image/Dijkstra.hxx +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef __fpa__Image__Dijkstra__hxx__ -#define __fpa__Image__Dijkstra__hxx__ - -#include - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -fpa::Image::Dijkstra< _TInputImage, _TOutputImage >:: -Dijkstra( ) - : Superclass( ) -{ - typedef fpa::Image::Functors::VertexCost< _TInputImage, TOutput > _TCost; - typename _TCost::Pointer cost = _TCost::New( ); - this->SetVertexFunction( cost ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -fpa::Image::Dijkstra< _TInputImage, _TOutputImage >:: -~Dijkstra( ) -{ -} - -#endif // __fpa__Image__Dijkstra__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/EndPointsFilter.h b/lib/fpa/Image/EndPointsFilter.h deleted file mode 100644 index afbfb10..0000000 --- a/lib/fpa/Image/EndPointsFilter.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef __fpa__Image__EndPointsFilter__h__ -#define __fpa__Image__EndPointsFilter__h__ - -#include -#include - -namespace fpa -{ - namespace Image - { - /** - */ - template< class _TDistanceMap, class _TCostMap > - class EndPointsFilter - : public itk::Object - { - public: - typedef EndPointsFilter Self; - typedef itk::Object Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef _TDistanceMap TDistanceMap; - typedef _TCostMap TCostMap; - typedef typename TCostMap::IndexType TIndex; - typedef MinimumSpanningTree< TCostMap::ImageDimension > TMST; - - typedef itk::Functor::IndexLexicographicCompare< _TCostMap::ImageDimension > TIndexCompare; - typedef std::set< TIndex, TIndexCompare > TIndices; - - public: - itkNewMacro( Self ); - itkTypeMacro( fpa::Image::EndPointsFilter, itk::Object ); - - itkGetConstObjectMacro( DistanceMap, _TDistanceMap ); - itkGetConstObjectMacro( CostMap, _TCostMap ); - itkGetConstObjectMacro( MST, TMST ); - - itkSetConstObjectMacro( DistanceMap, _TDistanceMap ); - itkSetConstObjectMacro( CostMap, _TCostMap ); - itkSetConstObjectMacro( MST, TMST ); - - public: - const TIndices& GetBifurcations( ) const; - const TIndices& GetEndPoints( ) const; - - void Compute( ); - - protected: - EndPointsFilter( ); - virtual ~EndPointsFilter( ); - - private: - // Purposely not defined - EndPointsFilter( const Self& other ); - Self& operator=( const Self& other ); - - protected: - typename _TDistanceMap::ConstPointer m_DistanceMap; - typename _TCostMap::ConstPointer m_CostMap; - typename TMST::ConstPointer m_MST; - - TIndices m_Bifurcations; - TIndices m_EndPoints; - }; - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__Image__EndPointsFilter__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/EndPointsFilter.hxx b/lib/fpa/Image/EndPointsFilter.hxx deleted file mode 100644 index c2e1d1c..0000000 --- a/lib/fpa/Image/EndPointsFilter.hxx +++ /dev/null @@ -1,153 +0,0 @@ -#ifndef __fpa__Image__EndPointsFilter__hxx__ -#define __fpa__Image__EndPointsFilter__hxx__ - -#include -#include -#include -#include - -// ------------------------------------------------------------------------- -template< class _TDistanceMap, class _TCostMap > -const typename fpa::Image::EndPointsFilter< _TDistanceMap, _TCostMap >:: -TIndices& fpa::Image::EndPointsFilter< _TDistanceMap, _TCostMap >:: -GetBifurcations( ) const -{ - return( this->m_Bifurcations ); -} - -// ------------------------------------------------------------------------- -template< class _TDistanceMap, class _TCostMap > -const typename fpa::Image::EndPointsFilter< _TDistanceMap, _TCostMap >:: -TIndices& fpa::Image::EndPointsFilter< _TDistanceMap, _TCostMap >:: -GetEndPoints( ) const -{ - return( this->m_EndPoints ); -} - -// ------------------------------------------------------------------------- -template< class _TDistanceMap, class _TCostMap > -void fpa::Image::EndPointsFilter< _TDistanceMap, _TCostMap >:: -Compute( ) -{ - typedef itk::ImageRegionConstIteratorWithIndex< _TDistanceMap > _TDistMapIt; - typedef itk::ImageRegionConstIteratorWithIndex< _TCostMap > _TCostMapIt; - typedef std::multimap< double, TIndex, std::greater< double > > _TQueue; - typedef typename _TQueue::value_type _TQueueValue; - typedef itk::Image< unsigned char, _TCostMap::ImageDimension > _TMarks; - - // Some values - typename _TDistanceMap::RegionType region = - this->m_DistanceMap->GetRequestedRegion( ); - typename _TMarks::Pointer marks = _TMarks::New( ); - marks->SetLargestPossibleRegion( this->m_DistanceMap->GetLargestPossibleRegion( ) ); - marks->SetRequestedRegion( this->m_DistanceMap->GetRequestedRegion( ) ); - marks->SetBufferedRegion( this->m_DistanceMap->GetBufferedRegion( ) ); - marks->SetSpacing( this->m_DistanceMap->GetSpacing( ) ); - marks->SetOrigin( this->m_DistanceMap->GetOrigin( ) ); - marks->SetDirection( this->m_DistanceMap->GetDirection( ) ); - marks->Allocate( ); - marks->FillBuffer( 0 ); - - // Create queue - _TQueue queue; - _TDistMapIt dIt( this->m_DistanceMap, region ); - _TCostMapIt cIt( this->m_CostMap, region ); - dIt.GoToBegin( ); - cIt.GoToBegin( ); - for( ; !dIt.IsAtEnd( ) && !cIt.IsAtEnd( ); ++dIt, ++cIt ) - { - double d = double( dIt.Get( ) ); - if( d > 0 ) - { - double v = double( cIt.Get( ) ) / ( d * d ); - queue.insert( _TQueueValue( v, dIt.GetIndex( ) ) ); - - } // fi - - } // rof - - // BFS from maximum queue - while( queue.size( ) > 0 ) - { - // Get node - auto nIt = queue.begin( ); - auto n = *nIt; - queue.erase( nIt ); - - unsigned char m = marks->GetPixel( n.second ); - if( ( m & 0x01 ) == 0x01 ) - continue; - - // Mark it - m |= 0x01; - marks->SetPixel( n.second, m ); - this->m_EndPoints.insert( n.second ); - - // Get path - typename TMST::TPath::Pointer path; - this->m_MST->GetPath( path, n.second ); - for( unsigned long i = 0; i < path->GetSize( ); ++i ) - { - TIndex idx = path->GetVertex( path->GetSize( ) - 1 - i ); - typename _TCostMap::PointType cnt; - this->m_CostMap->TransformIndexToPhysicalPoint( idx, cnt ); - double d = double( this->m_DistanceMap->GetPixel( idx ) ); - d *= double( 2 ); - - // Mark sphere - std::queue< TIndex > q; - q.push( idx ); - while( q.size( ) > 0 ) - { - TIndex v = q.front( ); - q.pop( ); - unsigned char m = marks->GetPixel( v ); - if( ( m & 0x02 ) == 0x02 ) - continue; - m |= 0x03; - marks->SetPixel( v, m ); - - for( unsigned int x = 0; x < _TCostMap::ImageDimension; ++x ) - { - for( int y = -1; y <= 1; y += 2 ) - { - TIndex w = v; - w[ x ] += y; - if( region.IsInside( w ) ) - { - typename _TCostMap::PointType p; - this->m_CostMap->TransformIndexToPhysicalPoint( w, p ); - if( cnt.EuclideanDistanceTo( p ) <= d ) - q.push( w ); - - } // fi - - } // rof - - } // rof - - } // elihw - - } // rof - - } // elihw -} - -// ------------------------------------------------------------------------- -template< class _TDistanceMap, class _TCostMap > -fpa::Image::EndPointsFilter< _TDistanceMap, _TCostMap >:: -EndPointsFilter( ) - : Superclass( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TDistanceMap, class _TCostMap > -fpa::Image::EndPointsFilter< _TDistanceMap, _TCostMap >:: -~EndPointsFilter( ) -{ -} - -#endif // __fpa__Image__EndPointsFilter__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/FastMarching.h b/lib/fpa/Image/FastMarching.h deleted file mode 100644 index 2a4056f..0000000 --- a/lib/fpa/Image/FastMarching.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef __fpa__Image__FastMarching__h__ -#define __fpa__Image__FastMarching__h__ - -#include -#include - -namespace fpa -{ - namespace Image - { - /** - */ - template< class _TInputImage, class _TOutputImage > - class FastMarching - : public fpa::Base::FastMarching< fpa::Image::Algorithm< _TInputImage, _TOutputImage > > - { - public: - typedef FastMarching Self; - typedef fpa::Image::Algorithm< _TInputImage, _TOutputImage > TAlgorithm; - typedef fpa::Base::FastMarching< TAlgorithm > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef typename Superclass::TOutput TOutput; - typedef typename Superclass::TVertex TVertex; - typedef typename Superclass::TFastMarchingNeighbor TFastMarchingNeighbor; - typedef typename Superclass::TFastMarchingNeighborhood TFastMarchingNeighborhood; - - public: - itkNewMacro( Self ); - itkTypeMacro( fpa::Image::FastMarching, fpa::Base::FastMarching ); - - protected: - FastMarching( ); - virtual ~FastMarching( ); - - virtual TFastMarchingNeighborhood _FastMarchingNeighbors( const TVertex& v ) const override; - - private: - // Purposely not defined - FastMarching( const Self& other ); - Self& operator=( const Self& other ); - }; - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__Image__FastMarching__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/FastMarching.hxx b/lib/fpa/Image/FastMarching.hxx deleted file mode 100644 index fe75b21..0000000 --- a/lib/fpa/Image/FastMarching.hxx +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef __fpa__Image__FastMarching__hxx__ -#define __fpa__Image__FastMarching__hxx__ - -#include - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -fpa::Image::FastMarching< _TInputImage, _TOutputImage >:: -FastMarching( ) - : Superclass( ) -{ - typedef fpa::Image::Functors::VertexCost< _TInputImage, TOutput > _TCost; - typename _TCost::Pointer cost = _TCost::New( ); - this->SetVertexFunction( cost ); - this->m_InitResult = std::numeric_limits< TOutput >::max( ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -fpa::Image::FastMarching< _TInputImage, _TOutputImage >:: -~FastMarching( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -typename fpa::Image::FastMarching< _TInputImage, _TOutputImage >:: -TFastMarchingNeighborhood -fpa::Image::FastMarching< _TInputImage, _TOutputImage >:: -_FastMarchingNeighbors( const TVertex& v ) const -{ - TFastMarchingNeighborhood neighs; - typename _TInputImage::SpacingType spac = this->GetInput( )->GetSpacing( ); - for( unsigned int d = 0; d < _TInputImage::ImageDimension; ++d ) - { - for( int i = -1; i <= 1; i += 2 ) - { - TVertex n = v; - n[ d ] += i; - neighs.push_back( TFastMarchingNeighbor( n, spac[ d ] ) ); - - } // rof - - } // rof - return( neighs ); -} - -#endif // __fpa__Image__FastMarching__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/Functors/Base.h b/lib/fpa/Image/Functors/Base.h deleted file mode 100644 index 45bd846..0000000 --- a/lib/fpa/Image/Functors/Base.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef __fpa__Image__Functors__Base__h__ -#define __fpa__Image__Functors__Base__h__ - -#include -#include -#include - -namespace fpa -{ - namespace Image - { - namespace Functors - { - /** - */ - template< class _TImage, class _TSuperclass > - class Base - : public _TSuperclass - { - public: - typedef Base Self; - typedef _TSuperclass Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef _TImage TImage; - typedef itk::ImageBase< TImage::ImageDimension > TImageBase; - - public: - itkTypeMacro( Base, itk::FunctionBase ); - - itkGetConstObjectMacro( Image, TImage ); - itkSetConstObjectMacro( Image, TImage ); - - protected: - Base( ) : Superclass( ) { } - virtual ~Base( ) { } - - private: - // Purposely not implemented - Base( const Self& other ); - Self& operator=( const Self& other ); - - protected: - typename TImage::ConstPointer m_Image; - }; - - } // ecapseman - - } // ecapseman - -} // ecapseman - -#endif // __fpa__Image__Functors__Base__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/Functors/RegionGrow/BinaryThreshold.h b/lib/fpa/Image/Functors/RegionGrow/BinaryThreshold.h deleted file mode 100644 index 70ac8d0..0000000 --- a/lib/fpa/Image/Functors/RegionGrow/BinaryThreshold.h +++ /dev/null @@ -1,75 +0,0 @@ -#ifndef __fpa__Image__Functors__RegionGrow__BinaryThreshold__h__ -#define __fpa__Image__Functors__RegionGrow__BinaryThreshold__h__ - -#include -#include - -namespace fpa -{ - namespace Image - { - namespace Functors - { - namespace RegionGrow - { - /** - */ - template< class _TImage, class _TOutput > - class BinaryThreshold - : public fpa::Image::Functors::Base< _TImage, fpa::Base::Functors::RegionGrow::Base< typename _TImage::IndexType, _TOutput > > - { - public: - typedef _TImage TImage; - typedef _TOutput TOutput; - typedef typename TImage::IndexType TIndex; - typedef typename TImage::PixelType TPixel; - - typedef fpa::Base::Functors::RegionGrow::Base< TIndex, TOutput > TBase; - typedef fpa::Image::Functors::Base< TImage, TBase > Superclass; - typedef BinaryThreshold Self; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - public: - itkNewMacro( Self ); - itkTypeMacro( BinaryThreshold, Base ); - - itkGetConstMacro( Lower, TPixel ); - itkGetConstMacro( Upper, TPixel ); - itkSetMacro( Lower, TPixel ); - itkSetMacro( Upper, TPixel ); - - public: - virtual TOutput Evaluate( - const TIndex& a, const TIndex& b - ) const override; - - protected: - BinaryThreshold( ); - virtual ~BinaryThreshold( ); - - private: - // Purposely not implemented - BinaryThreshold( const Self& other ); - Self& operator=( const Self& other ); - - protected: - TPixel m_Lower; - TPixel m_Upper; - }; - - } // ecapseman - - } // ecapseman - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__Image__Functors__RegionGrow__BinaryThreshold__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/Functors/RegionGrow/BinaryThreshold.hxx b/lib/fpa/Image/Functors/RegionGrow/BinaryThreshold.hxx deleted file mode 100644 index 7f2b9dc..0000000 --- a/lib/fpa/Image/Functors/RegionGrow/BinaryThreshold.hxx +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef __fpa__Image__Functors__RegionGrow__BinaryThreshold__hxx__ -#define __fpa__Image__Functors__RegionGrow__BinaryThreshold__hxx__ - -#include - -// ------------------------------------------------------------------------- -template< class _TImage, class _TOutput > -_TOutput -fpa::Image::Functors::RegionGrow::BinaryThreshold< _TImage, _TOutput >:: -Evaluate( const TIndex& a, const TIndex& b ) const -{ - const _TImage* im = - dynamic_cast< const _TImage* >( this->m_Image.GetPointer( ) ); - if( im != NULL ) - { - TPixel v = im->GetPixel( b ); - return( - ( this->m_Lower < v && v < this->m_Upper )? - this->m_InsideValue: - this->m_OutsideValue - ); - } - else - return( this->m_OutsideValue ); -} - -// ------------------------------------------------------------------------- -template< class _TImage, class _TOutput > -fpa::Image::Functors::RegionGrow::BinaryThreshold< _TImage, _TOutput >:: -BinaryThreshold( ) - : Superclass( ) -{ - this->m_Upper = std::numeric_limits< TPixel >::max( ); - if( std::numeric_limits< TPixel >::is_integer ) - this->m_Lower = std::numeric_limits< TPixel >::min( ); - else - this->m_Lower = -this->m_Upper; -} - -// ------------------------------------------------------------------------- -template< class _TImage, class _TOutput > -fpa::Image::Functors::RegionGrow::BinaryThreshold< _TImage, _TOutput >:: -~BinaryThreshold( ) -{ -} - -#endif // __fpa__Image__Functors__RegionGrow__BinaryThreshold__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/Functors/SimpleNeighborhood.h b/lib/fpa/Image/Functors/SimpleNeighborhood.h deleted file mode 100644 index 0e4ebf7..0000000 --- a/lib/fpa/Image/Functors/SimpleNeighborhood.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef __fpa__Image__Functors__SimpleNeighborhood__h__ -#define __fpa__Image__Functors__SimpleNeighborhood__h__ - -#include -#include -#include -#include - -namespace fpa -{ - namespace Image - { - namespace Functors - { - /** - */ - template< unsigned int _VDim > - class SimpleNeighborhood - : public fpa::Image::Functors::Base< itk::ImageBase< _VDim >, itk::FunctionBase< itk::Index< _VDim >, std::vector< itk::Index< _VDim > > > > - { - public: - typedef itk::ImageBase< _VDim > TImage; - typedef typename TImage::IndexType TIndex; - typedef typename TIndex::OffsetType TOffset; - typedef std::vector< TIndex > TOutput; - typedef itk::FunctionBase< TIndex, TOutput > TBaseFunctor; - typedef fpa::Image::Functors::Base< TImage, TBaseFunctor > Superclass; - typedef SimpleNeighborhood Self; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - public: - itkNewMacro( Self ); - itkTypeMacro( SimpleNeighborhood, Base ); - - itkGetConstMacro( Order, unsigned int ); - itkSetMacro( Order, unsigned int ); - - public: - virtual TOutput Evaluate( const TIndex& center ) const override; - - protected: - SimpleNeighborhood( ); - virtual ~SimpleNeighborhood( ); - - void _1stCombination( ) const; - void _2ndCombination( ) const; - - private: - // Purposely not implemented - SimpleNeighborhood( const Self& other ); - Self& operator=( const Self& other ); - - protected: - unsigned int m_Order; - mutable std::vector< TOffset > m_Offsets; - }; - - } // ecapseman - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__Image__Functors__SimpleNeighborhood__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/Functors/SimpleNeighborhood.hxx b/lib/fpa/Image/Functors/SimpleNeighborhood.hxx deleted file mode 100644 index 172425d..0000000 --- a/lib/fpa/Image/Functors/SimpleNeighborhood.hxx +++ /dev/null @@ -1,113 +0,0 @@ -#ifndef __fpa__Image__Functors__SimpleNeighborhood__hxx__ -#define __fpa__Image__Functors__SimpleNeighborhood__hxx__ - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -typename fpa::Image::Functors::SimpleNeighborhood< _VDim >:: -TOutput fpa::Image::Functors::SimpleNeighborhood< _VDim >:: -Evaluate( const TIndex& center ) const -{ - if( this->m_Offsets.size( ) == 0 ) - { - if( this->m_Order == 1 ) - this->_1stCombination( ); - else - this->_2ndCombination( ); - - } // fi - - TOutput res; - typename TImage::RegionType reg = this->m_Image->GetRequestedRegion( ); - for( int i = 0; i < this->m_Offsets.size( ); ++i ) - { - TIndex idx = center + this->m_Offsets[ i ]; - if( reg.IsInside( idx ) && idx != center ) - res.push_back( idx ); - - } // rof - return( res ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -fpa::Image::Functors::SimpleNeighborhood< _VDim >:: -SimpleNeighborhood( ) - : Superclass( ), - m_Order( 1 ) -{ -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > - fpa::Image::Functors::SimpleNeighborhood< _VDim >:: -~SimpleNeighborhood( ) -{ -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -void fpa::Image::Functors::SimpleNeighborhood< _VDim >:: -_1stCombination( ) const -{ - for( int d = 0; d < TImage::ImageDimension; ++d ) - { - typename TIndex::OffsetType off; - off.Fill( 0 ); - for( int i = -1; i <= 1; i += 2 ) - { - off[ d ] = i; - this->m_Offsets.push_back( off ); - - } // rof - - } // rof -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -void fpa::Image::Functors::SimpleNeighborhood< _VDim >:: -_2ndCombination( ) const -{ - std::vector< std::vector< std::vector< int > > > M; - M.push_back( std::vector< std::vector< int > >( ) ); - - std::vector< int > base; - base.push_back( -1 ); - base.push_back( 0 ); - base.push_back( 1 ); - int dim = TImage::ImageDimension; - - M.push_back( std::vector< std::vector< int > >( ) ); - for( int j = 0; j < base.size( ); ++j ) - M[ 1 ].push_back( std::vector< int >( 1, base[ j ] ) ); - - for( int i = 2; i <= dim; ++i ) - { - M.push_back( std::vector< std::vector< int > >( ) ); - for( int j = 0; j < base.size( ); ++j ) - { - for( int k = 0; k < M[ i - 1 ].size( ); ++k ) - { - M[ i ].push_back( std::vector< int >( 1, base[ j ] ) ); - for( int l = 0; l < M[ i - 1 ][ k ].size( ); ++l ) - M[ i ].back( ).push_back( M[ i - 1 ][ k ][ l ] ); - - } // rof - - } // rof - - } // rof - - for( int i = 0; i < M[ dim ].size( ); ++i ) - { - TOffset off; - for( int j = 0; j < M[ dim ][ i ].size( ); ++j ) - off[ j ] = M[ dim ][ i ][ j ]; - this->m_Offsets.push_back( off ); - - } // rof -} - -#endif // __fpa__Image__Functors__SimpleNeighborhood__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/Functors/VertexCost.h b/lib/fpa/Image/Functors/VertexCost.h deleted file mode 100644 index a6f3e45..0000000 --- a/lib/fpa/Image/Functors/VertexCost.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef __fpa__Image__Functors__VertexCost__h__ -#define __fpa__Image__Functors__VertexCost__h__ - -#include -#include - -namespace fpa -{ - namespace Image - { - namespace Functors - { - /** - */ - template< class _TImage, class _TOutput > - class VertexCost - : public fpa::Image::Functors::Base< _TImage, fpa::Base::Functors::VertexCostFunctionBase< typename _TImage::IndexType, _TOutput > > - { - public: - typedef _TImage TImage; - typedef typename TImage::IndexType TIndex; - typedef _TOutput TOutput; - - typedef fpa::Base::Functors::VertexCostFunctionBase< TIndex, TOutput > TBaseFunctor; - typedef fpa::Image::Functors::Base< TImage, TBaseFunctor > Superclass; - typedef VertexCost Self; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - public: - itkNewMacro( Self ); - itkTypeMacro( VertexCost, Base ); - - itkBooleanMacro( UseImageSpacing ); - itkGetConstMacro( UseImageSpacing, bool ); - itkSetMacro( UseImageSpacing, bool ); - - public: - virtual TOutput Evaluate( - const TIndex& a, const TIndex& b - ) const override; - - protected: - VertexCost( ); - virtual ~VertexCost( ); - - private: - // Purposely not implemented - VertexCost( const Self& other ); - Self& operator=( const Self& other ); - - protected: - bool m_UseImageSpacing; - }; - - } // ecapseman - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__Image__Functors__VertexCost__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/Functors/VertexCost.hxx b/lib/fpa/Image/Functors/VertexCost.hxx deleted file mode 100644 index 3b59c52..0000000 --- a/lib/fpa/Image/Functors/VertexCost.hxx +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef __fpa__Image__Functors__VertexCost__hxx__ -#define __fpa__Image__Functors__VertexCost__hxx__ - -// ------------------------------------------------------------------------- -template< class _TImage, class _TOutput > -typename fpa::Image::Functors::VertexCost< _TImage, _TOutput >:: -TOutput fpa::Image::Functors::VertexCost< _TImage, _TOutput >:: -Evaluate( const TIndex& a, const TIndex& b ) const -{ - const _TImage* im = - dynamic_cast< const _TImage* >( this->m_Image.GetPointer( ) ); - TOutput coeff = TOutput( 1 ); - if( this->m_UseImageSpacing ) - { - typename _TImage::PointType pa, pb; - im->TransformIndexToPhysicalPoint( a, pa ); - im->TransformIndexToPhysicalPoint( b, pb ); - coeff = TOutput( pa.EuclideanDistanceTo( pb ) ); - - } // fi - return( TOutput( im->GetPixel( a ) ) * coeff ); -} - -// ------------------------------------------------------------------------- -template< class _TImage, class _TOutput > -fpa::Image::Functors::VertexCost< _TImage, _TOutput >:: -VertexCost( ) - : Superclass( ), - m_UseImageSpacing( false ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TImage, class _TOutput > -fpa::Image::Functors::VertexCost< _TImage, _TOutput >:: -~VertexCost( ) -{ -} - -#endif // __fpa__Image__Functors__VertexCost__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/MinimumSpanningTree.h b/lib/fpa/Image/MinimumSpanningTree.h deleted file mode 100644 index 7d3941d..0000000 --- a/lib/fpa/Image/MinimumSpanningTree.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef __fpa__Image__MinimumSpanningTree__h__ -#define __fpa__Image__MinimumSpanningTree__h__ - -#include -#include -#include - -namespace fpa -{ - namespace Image - { - /** - */ - template< unsigned int _VDim > - class MinimumSpanningTree - : public fpa::Base::MinimumSpanningTree< itk::Index< _VDim >, cpExtensions::DataStructures::PolyLineParametricPath< _VDim >, itk::Image< itk::Offset< _VDim >, _VDim > > - { - public: - typedef itk::Index< _VDim > TVertex; - typedef cpExtensions::DataStructures::PolyLineParametricPath< _VDim > TPath; - typedef itk::Offset< _VDim > TOffset; - typedef itk::Image< TOffset, _VDim > TImage; - typedef fpa::Base::MinimumSpanningTree< TVertex, TPath, TImage > Superclass; - typedef MinimumSpanningTree Self; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - public: - itkNewMacro( Self ); - itkTypeMacro( - fpa::Image::MinimumSpanningTree, fpa::Base::MinimumSpanningTree - ); - - public: - virtual TVertex GetParent( const TVertex& v ) const override; - virtual void SetParent( const TVertex& v, const TVertex& p ) override; - - virtual void GetPath( - typename TPath::Pointer& path, const TVertex& a - ) const override; - virtual void GetPath( - typename TPath::Pointer& path, const TVertex& a, const TVertex& b - ) const override; - - protected: - MinimumSpanningTree( ); - virtual ~MinimumSpanningTree( ); - - private: - // Purposely not defined - MinimumSpanningTree( const Self& other ); - Self& operator=( const Self& other ); - }; - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__Image__MinimumSpanningTree__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/MinimumSpanningTree.hxx b/lib/fpa/Image/MinimumSpanningTree.hxx deleted file mode 100644 index b99953b..0000000 --- a/lib/fpa/Image/MinimumSpanningTree.hxx +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef __fpa__Image__MinimumSpanningTree__hxx__ -#define __fpa__Image__MinimumSpanningTree__hxx__ - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -typename fpa::Image::MinimumSpanningTree< _VDim >:: -TVertex fpa::Image::MinimumSpanningTree< _VDim >:: -GetParent( const TVertex& v ) const -{ - TVertex p = v + this->GetPixel( v ); - return( p ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -void fpa::Image::MinimumSpanningTree< _VDim >:: -SetParent( const TVertex& v, const TVertex& p ) -{ - this->SetPixel( v, p - v ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -void fpa::Image::MinimumSpanningTree< _VDim >:: -GetPath( typename TPath::Pointer& path, const TVertex& a ) const -{ - if( path.GetPointer( ) == NULL ) - path = TPath::New( ); - path->SetReferenceImage( this ); - this->Superclass::GetPath( path, a ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -void fpa::Image::MinimumSpanningTree< _VDim >:: -GetPath( - typename TPath::Pointer& path, const TVertex& a, const TVertex& b - ) const -{ - if( path.GetPointer( ) == NULL ) - path = TPath::New( ); - path->SetReferenceImage( this ); - this->Superclass::GetPath( path, a, b ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -fpa::Image::MinimumSpanningTree< _VDim >:: -MinimumSpanningTree( ) - : Superclass( ) -{ -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -fpa::Image::MinimumSpanningTree< _VDim >:: -~MinimumSpanningTree( ) -{ -} - -#endif // __fpa__Image__MinimumSpanningTree__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/MoriRegionGrow.h b/lib/fpa/Image/MoriRegionGrow.h deleted file mode 100644 index 41c122e..0000000 --- a/lib/fpa/Image/MoriRegionGrow.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef __fpa__Image__MoriRegionGrow__h__ -#define __fpa__Image__MoriRegionGrow__h__ - -#include -#include -#include - -namespace fpa -{ - namespace Image - { - /** - */ - template< class _TInputImage, class _TOutputImage, class _TAuxPixel = unsigned short > - class MoriRegionGrow - : public itk::ImageToImageFilter< _TInputImage, _TOutputImage > - { - public: - typedef MoriRegionGrow Self; - typedef itk::ImageToImageFilter< _TInputImage, _TOutputImage > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef itk::Image< _TAuxPixel, _TInputImage::ImageDimension > TAuxImage; - typedef fpa::Image::MoriRegionGrowHelper< _TInputImage, TAuxImage > THelper; - typedef itk::BinaryThresholdImageFilter< TAuxImage, _TOutputImage > TThreshold; - - typedef typename _TInputImage::IndexType TIndex; - typedef typename _TInputImage::PixelType TInputPixel; - typedef typename _TOutputImage::PixelType TOutputPixel; - - public: - itkNewMacro( Self ); - itkTypeMacro( fpa::Image::MoriRegionGrow, itk::ImageToImageFilter ); - - itkGetConstMacro( Seed, TIndex ); - itkSetMacro( Seed, TIndex ); - - public: - TAuxImage* GetAuxiliaryImage( ); - const TAuxImage* GetAuxiliaryImage( ) const; - - TInputPixel GetLower( ) const; - TInputPixel GetUpper( ) const; - TInputPixel GetStep( ) const; - TOutputPixel GetInsideValue( ) const; - TOutputPixel GetOutsideValue( ) const; - - void SetLower( const TInputPixel& v ); - void SetUpper( const TInputPixel& v ); - void SetStep( const TInputPixel& v ); - void SetInsideValue( const TOutputPixel& v ); - void SetOutsideValue( const TOutputPixel& v ); - - - /* TODO - itkGetConstMacro( Lower, TPixel ); - itkGetConstMacro( Upper, TPixel ); - itkGetConstMacro( Step, TPixel ); - itkGetConstMacro( Sensitivity, double ); - itkSetMacro( Lower, TPixel ); - itkSetMacro( Upper, TPixel ); - itkSetMacro( Step, TPixel ); - itkSetMacro( Sensitivity, double ); - */ - - protected: - MoriRegionGrow( ); - virtual ~MoriRegionGrow( ); - - virtual void GenerateData( ) override; - - private: - // Purposely not defined - MoriRegionGrow( const Self& other ); - Self& operator=( const Self& other ); - - protected: - typename THelper::Pointer m_Helper; - typename TThreshold::Pointer m_Threshold; - TIndex m_Seed; - }; - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__Image__MoriRegionGrow__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/MoriRegionGrow.hxx b/lib/fpa/Image/MoriRegionGrow.hxx deleted file mode 100644 index 737bf1f..0000000 --- a/lib/fpa/Image/MoriRegionGrow.hxx +++ /dev/null @@ -1,162 +0,0 @@ -#ifndef __fpa__Image__MoriRegionGrow__hxx__ -#define __fpa__Image__MoriRegionGrow__hxx__ - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage, class _TAuxPixel > -typename -fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -TAuxImage* -fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -GetAuxiliaryImage( ) -{ - return( this->m_Helper->GetOutput( ) ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage, class _TAuxPixel > -const typename -fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -TAuxImage* -fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -GetAuxiliaryImage( ) const -{ - return( this->m_Helper->GetOutput( ) ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage, class _TAuxPixel > -typename -fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -TInputPixel -fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -GetLower( ) const -{ - return( this->m_Helper->GetLower( ) ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage, class _TAuxPixel > -typename -fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -TInputPixel -fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -GetUpper( ) const -{ - return( this->m_Helper->GetUpper( ) ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage, class _TAuxPixel > -typename -fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -TInputPixel -fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -GetStep( ) const -{ - return( this->m_Helper->GetStep( ) ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage, class _TAuxPixel > -typename -fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -TOutputPixel -fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -GetInsideValue( ) const -{ - return( this->m_Threshold->GetInsideValue( ) ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage, class _TAuxPixel > -typename -fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -TOutputPixel -fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -GetOutsideValue( ) const -{ - return( this->m_Threshold->GetInsideValue( ) ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage, class _TAuxPixel > -void fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -SetLower( const TInputPixel& v ) -{ - this->m_Helper->SetLower( v ); - this->Modified( ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage, class _TAuxPixel > -void fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -SetUpper( const TInputPixel& v ) -{ - this->m_Helper->SetUpper( v ); - this->Modified( ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage, class _TAuxPixel > -void fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -SetStep( const TInputPixel& v ) -{ - this->m_Helper->SetStep( v ); - this->Modified( ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage, class _TAuxPixel > -void fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -SetInsideValue( const TOutputPixel& v ) -{ - this->m_Threshold->SetInsideValue( v ); - this->Modified( ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage, class _TAuxPixel > -void fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -SetOutsideValue( const TOutputPixel& v ) -{ - this->m_Threshold->SetOutsideValue( v ); - this->Modified( ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage, class _TAuxPixel > -fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -MoriRegionGrow( ) - : Superclass( ) -{ - this->m_Helper = THelper::New( ); - this->m_Threshold = TThreshold::New( ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage, class _TAuxPixel > -fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -~MoriRegionGrow( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage, class _TAuxPixel > -void fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage, _TAuxPixel >:: -GenerateData( ) -{ - this->m_Helper->ClearSeeds( ); - this->m_Helper->AddSeed( this->m_Seed, 0 ); - this->m_Helper->SetInput( this->GetInput( ) ); - this->m_Helper->Update( ); - - this->m_Threshold->SetInput( this->m_Helper->GetOutput( ) ); - this->m_Threshold->SetLowerThreshold( std::numeric_limits< _TAuxPixel >::min( ) ); - this->m_Threshold->SetUpperThreshold( this->m_Helper->GetOptimumThreshold( ) ); - this->m_Threshold->Update( ); - this->GetOutput( )->Graft( this->m_Threshold->GetOutput( ) ); -} - -#endif // __fpa__Image__MoriRegionGrow__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/MoriRegionGrowHelper.h b/lib/fpa/Image/MoriRegionGrowHelper.h deleted file mode 100644 index 02f51b6..0000000 --- a/lib/fpa/Image/MoriRegionGrowHelper.h +++ /dev/null @@ -1,90 +0,0 @@ -#ifndef __fpa__Image__MoriRegionGrowHelper__h__ -#define __fpa__Image__MoriRegionGrowHelper__h__ - -#include -#include -#include -#include - -namespace fpa -{ - namespace Image - { - /** - */ - template< class _TInputImage, class _TOutputImage > - class MoriRegionGrowHelper - : public fpa::Image::RegionGrow< _TInputImage, _TOutputImage > - { - public: - typedef MoriRegionGrowHelper Self; - typedef fpa::Image::RegionGrow< _TInputImage, _TOutputImage > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef typename Superclass::TOutput TOutput; - typedef typename Superclass::TVertex TVertex; - typedef typename Superclass::TGrowFunction TGrowFunction; - typedef typename _TInputImage::PixelType TPixel; - typedef fpa::Image::Functors::RegionGrow::BinaryThreshold< _TInputImage, TOutput > TBinThresholdFunction; - - protected: - typedef typename Superclass::_TQueueNode _TQueueNode; - typedef typename Superclass::_TQueue _TQueue; - - typedef std::pair< TPixel, unsigned long > TCurveData; - typedef std::vector< TCurveData > TCurve; - - public: - itkNewMacro( Self ); - itkTypeMacro( fpa::Image::MoriRegionGrowHelper, fpa::Image::RegionGrow ); - - itkGetConstMacro( Lower, TPixel ); - itkGetConstMacro( Upper, TPixel ); - itkGetConstMacro( Step, TPixel ); - itkGetConstMacro( OptimumThreshold, typename _TOutputImage::PixelType ); - - itkSetMacro( Lower, TPixel ); - itkSetMacro( Upper, TPixel ); - itkSetMacro( Step, TPixel ); - - - protected: - MoriRegionGrowHelper( ); - virtual ~MoriRegionGrowHelper( ); - - virtual bool _ContinueGenerateData( ) override; - virtual void _BeforeGenerateData( ) override; - virtual void _AfterGenerateData( ) override; - virtual void _BeforeLoop( ) override; - virtual void _AfterLoop( ) override; - virtual bool _UpdateValue( _TQueueNode& v, const _TQueueNode& p ) override; - virtual void _UpdateResult( const _TQueueNode& n ) override; - - private: - // Purposely not defined - MoriRegionGrowHelper( const Self& other ); - Self& operator=( const Self& other ); - - protected: - TPixel m_Lower; - TPixel m_Upper; - TPixel m_Step; - typename _TOutputImage::PixelType m_OptimumThreshold; - - _TQueue m_NextQueue; - unsigned long m_ActualCount; - TCurve m_Curve; - }; - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__Image__MoriRegionGrowHelper__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/MoriRegionGrowHelper.hxx b/lib/fpa/Image/MoriRegionGrowHelper.hxx deleted file mode 100644 index 9dc1df3..0000000 --- a/lib/fpa/Image/MoriRegionGrowHelper.hxx +++ /dev/null @@ -1,144 +0,0 @@ -#ifndef __fpa__Image__MoriRegionGrowHelper__hxx__ -#define __fpa__Image__MoriRegionGrowHelper__hxx__ - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -fpa::Image::MoriRegionGrowHelper< _TInputImage, _TOutputImage >:: -MoriRegionGrowHelper( ) - : Superclass( ), - m_Step( TPixel( 1 ) ) -{ - this->m_Upper = std::numeric_limits< TPixel >::max( ); - if( std::numeric_limits< TPixel >::is_integer ) - this->m_Lower = std::numeric_limits< TPixel >::min( ); - else - this->m_Lower = -this->m_Upper; - typename TBinThresholdFunction::Pointer functor = - TBinThresholdFunction::New( ); - this->SetGrowFunction( functor ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -fpa::Image::MoriRegionGrowHelper< _TInputImage, _TOutputImage >:: -~MoriRegionGrowHelper( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -bool fpa::Image::MoriRegionGrowHelper< _TInputImage, _TOutputImage >:: -_ContinueGenerateData( ) -{ - TBinThresholdFunction* functor = - dynamic_cast< TBinThresholdFunction* >( this->GetGrowFunction( ) ); - TPixel u = functor->GetUpper( ); - - // Update flooding data - this->m_Curve.push_back( TCurveData( u, this->m_ActualCount ) ); - - // Update thresholds - if( u < this->m_Upper ) - { - u += this->m_Step; - if( u > this->m_Upper ) - u = this->m_Upper; - functor->SetUpper( u ); - this->m_Queue = this->m_NextQueue; - while( this->m_NextQueue.size( ) > 0 ) - this->m_NextQueue.pop( ); - return( true ); - } - else - return( false ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -void fpa::Image::MoriRegionGrowHelper< _TInputImage, _TOutputImage >:: -_BeforeGenerateData( ) -{ - this->Superclass::_BeforeGenerateData( ); - - while( this->m_NextQueue.size( ) > 0 ) - this->m_NextQueue.pop( ); - this->m_OptimumThreshold = ( typename _TOutputImage::PixelType )( 0 ); - this->m_ActualCount = 0; - this->m_Curve.clear( ); - TBinThresholdFunction* functor = - dynamic_cast< TBinThresholdFunction* >( this->GetGrowFunction( ) ); - functor->SetLower( this->m_Lower ); - functor->SetUpper( this->m_Lower + this->m_Step ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -void fpa::Image::MoriRegionGrowHelper< _TInputImage, _TOutputImage >:: -_AfterGenerateData( ) -{ - typedef typename _TOutputImage::PixelType _TOut; - - this->Superclass::_AfterGenerateData( ); - while( this->m_NextQueue.size( ) > 0 ) - this->m_NextQueue.pop( ); - - // Find optimum threshold by dicotomy - unsigned long l = 0; - unsigned long r = this->m_Curve.size( ) - 1; - while( ( r - l ) > 1 ) - { - unsigned long m = ( r + l ) >> 1; - double vm = double( this->m_Curve[ m ].second ); - double dl = vm - double( this->m_Curve[ l ].second ); - double dr = double( this->m_Curve[ r ].second ) - vm; - if( dl > dr ) - r = m; - else - l = m; - - } // elihw - this->m_OptimumThreshold = _TOut( ( r + l ) >> 1 ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -void fpa::Image::MoriRegionGrowHelper< _TInputImage, _TOutputImage >:: -_BeforeLoop( ) -{ - this->Superclass::_BeforeLoop( ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -void fpa::Image::MoriRegionGrowHelper< _TInputImage, _TOutputImage >:: -_AfterLoop( ) -{ - this->Superclass::_AfterLoop( ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -bool fpa::Image::MoriRegionGrowHelper< _TInputImage, _TOutputImage >:: -_UpdateValue( _TQueueNode& v, const _TQueueNode& p ) -{ - typedef typename _TOutputImage::PixelType _TOut; - - bool ret = this->Superclass::_UpdateValue( v, p ); - v.Result = _TOut( this->m_Curve.size( ) + 1 ); - if( !ret ) - this->m_NextQueue.push( v ); - return( ret ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -void fpa::Image::MoriRegionGrowHelper< _TInputImage, _TOutputImage >:: -_UpdateResult( const _TQueueNode& n ) -{ - this->Superclass::_UpdateResult( n ); - this->m_ActualCount += 1; -} - -#endif // __fpa__Image__MoriRegionGrowHelper__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/RegionGrow.h b/lib/fpa/Image/RegionGrow.h deleted file mode 100644 index dbc57f0..0000000 --- a/lib/fpa/Image/RegionGrow.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef __fpa__Image__RegionGrow__h__ -#define __fpa__Image__RegionGrow__h__ - -#include -#include - -namespace fpa -{ - namespace Image - { - /** - */ - template< class _TInputImage, class _TOutputImage > - class RegionGrow - : public fpa::Base::RegionGrow< fpa::Image::Algorithm< _TInputImage, _TOutputImage > > - { - public: - typedef fpa::Image::Algorithm< _TInputImage, _TOutputImage > TAlgorithm; - typedef RegionGrow Self; - typedef fpa::Base::RegionGrow< TAlgorithm > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef typename Superclass::TOutput TOutput; - typedef typename Superclass::TVertex TVertex; - - typedef fpa::Image::Functors::Base< _TInputImage, typename Superclass::TGrowFunction > TGrowFunction; - - public: - itkNewMacro( Self ); - itkTypeMacro( fpa::Image::RegionGrow, fpa::Base::RegionGrow ); - - protected: - RegionGrow( ); - virtual ~RegionGrow( ); - - virtual void _BeforeGenerateData( ) override; - - private: - // Purposely not defined - RegionGrow( const Self& other ); - Self& operator=( const Self& other ); - }; - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__Image__RegionGrow__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/RegionGrow.hxx b/lib/fpa/Image/RegionGrow.hxx deleted file mode 100644 index 326dc54..0000000 --- a/lib/fpa/Image/RegionGrow.hxx +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef __fpa__Image__RegionGrow__hxx__ -#define __fpa__Image__RegionGrow__hxx__ - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -fpa::Image::RegionGrow< _TInputImage, _TOutputImage >:: -RegionGrow( ) - : Superclass( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -fpa::Image::RegionGrow< _TInputImage, _TOutputImage >:: -~RegionGrow( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -void fpa::Image::RegionGrow< _TInputImage, _TOutputImage >:: -_BeforeGenerateData( ) -{ - this->Superclass::_BeforeGenerateData( ); - this->m_InitResult = this->GetOutsideValue( ); - TGrowFunction* grow = - dynamic_cast< TGrowFunction* >( this->GetGrowFunction( ) ); - if( grow != NULL ) - grow->SetImage( this->GetInput( ) ); -} - -#endif // __fpa__Image__RegionGrow__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/SkeletonFilter.h b/lib/fpa/Image/SkeletonFilter.h deleted file mode 100644 index 0fbb3d5..0000000 --- a/lib/fpa/Image/SkeletonFilter.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef __fpa__Image__SkeletonFilter__h__ -#define __fpa__Image__SkeletonFilter__h__ - -#include -#include -#include -#include -#include - -namespace fpa -{ - namespace Image - { - /** - */ - template< class _TImage > - class SkeletonFilter - : public Dijkstra< _TImage, _TImage > - { - public: - typedef SkeletonFilter Self; - typedef Dijkstra< _TImage, _TImage > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef _TImage TImage; - itkStaticConstMacro( - Dimension, unsigned int, TImage::ImageDimension - ); - - typedef typename Superclass::TMST TMST; - typedef typename TImage::IndexType TIndex; - typedef itk::Image< unsigned char, Self::Dimension > TMarks; - typedef cpExtensions::DataStructures::Skeleton< Self::Dimension > TSkeleton; - - protected: - typedef typename Superclass::_TQueueNode _TQueueNode; - typedef std::multimap< double, TIndex, std::greater< double > > _TSkeletonQueue; - typedef std::map< TIndex, TIndex, typename TIndex::LexicographicCompare > _TAdjacencies; - - public: - itkNewMacro( Self ); - itkTypeMacro( fpa::Image::SkeletonFilter, itk::Object ); - - public: - TSkeleton* GetSkeleton( ); - TMarks* GetMarks( ); - - protected: - SkeletonFilter( ); - virtual ~SkeletonFilter( ); - - virtual void _BeforeGenerateData( ) override; - virtual void _UpdateResult( const _TQueueNode& n ) override; - virtual void _AfterGenerateData( ) override; - - void _EndPoints( std::vector< TIndex >& end_points, _TAdjacencies& A ); - void _Skeleton( const std::vector< TIndex >& end_points, _TAdjacencies& A ); - void _MarkSphere( const TIndex& idx ); - - private: - // Purposely not defined - SkeletonFilter( const Self& other ); - Self& operator=( const Self& other ); - - protected: - _TSkeletonQueue m_SkeletonQueue; - - unsigned long m_SkeletonIdx; - unsigned long m_MarksIdx; - }; - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__Image__SkeletonFilter__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Image/SkeletonFilter.hxx b/lib/fpa/Image/SkeletonFilter.hxx deleted file mode 100644 index c60e13c..0000000 --- a/lib/fpa/Image/SkeletonFilter.hxx +++ /dev/null @@ -1,274 +0,0 @@ -#ifndef __fpa__Image__SkeletonFilter__hxx__ -#define __fpa__Image__SkeletonFilter__hxx__ - -#include -#include -#include - -// ------------------------------------------------------------------------- -#define fpa_Image_SkeletonFilter_OutputMacro( o_n, o_t ) \ - template< class _TImage > \ - typename fpa::Image::SkeletonFilter< _TImage >:: \ - o_t* fpa::Image::SkeletonFilter< _TImage >:: \ - Get##o_n( ) \ - { \ - return( \ - dynamic_cast< o_t* >( \ - this->itk::ProcessObject::GetOutput( this->m_##o_n##Idx ) \ - ) \ - ); \ - } - -fpa_Image_SkeletonFilter_OutputMacro( Skeleton, TSkeleton ); -fpa_Image_SkeletonFilter_OutputMacro( Marks, TMarks ); - -// ------------------------------------------------------------------------- -template< class _TImage > -fpa::Image::SkeletonFilter< _TImage >:: -SkeletonFilter( ) - : Superclass( ) -{ - typedef typename _TImage::PixelType _TPixel; - typedef fpa::Image::Functors::SimpleNeighborhood< _TImage::ImageDimension > _TNeighFunc; - typedef fpa::Base::Functors::Inverse< _TPixel, _TPixel > _TInvFunc; - - unsigned int nOutputs = this->GetNumberOfRequiredOutputs( ); - this->SetNumberOfRequiredOutputs( nOutputs + 2 ); - this->m_SkeletonIdx = nOutputs; - this->m_MarksIdx = nOutputs + 1; - - typename TSkeleton::Pointer skeleton = TSkeleton::New( ); - typename TMarks::Pointer marks = TMarks::New( ); - this->SetNthOutput( this->m_SkeletonIdx, skeleton.GetPointer( ) ); - this->SetNthOutput( this->m_MarksIdx, marks.GetPointer( ) ); - - typename _TNeighFunc::Pointer nfunc = _TNeighFunc::New( ); - nfunc->SetOrder( 2 ); - this->SetNeighborhoodFunction( nfunc ); - - typename _TInvFunc::Pointer ifunc = _TInvFunc::New( ); - this->SetConversionFunction( ifunc ); -} - -// ------------------------------------------------------------------------- -template< class _TImage > -fpa::Image::SkeletonFilter< _TImage >:: -~SkeletonFilter( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TImage > -void fpa::Image::SkeletonFilter< _TImage >:: -_BeforeGenerateData( ) -{ - this->Superclass::_BeforeGenerateData( ); - this->m_SkeletonQueue.clear( ); -} - -// ------------------------------------------------------------------------- -template< class _TImage > -void fpa::Image::SkeletonFilter< _TImage >:: -_UpdateResult( const _TQueueNode& n ) -{ - typedef typename _TSkeletonQueue::value_type _TSkeletonQueueValue; - - this->Superclass::_UpdateResult( n ); - double d = double( this->GetInput( )->GetPixel( n.Vertex ) ); - if( d >= double( 0 ) ) - { - // Update skeleton candidates - d += double( 1e-5 ); - double v = double( n.Result ) / ( d * d ); - this->m_SkeletonQueue.insert( _TSkeletonQueueValue( v, n.Vertex ) ); - - } // fi -} - -// ------------------------------------------------------------------------- -template< class _TImage > -void fpa::Image::SkeletonFilter< _TImage >:: -_AfterGenerateData( ) -{ - this->Superclass::_AfterGenerateData( ); - - _TAdjacencies A; - std::vector< TIndex > end_points; - this->_EndPoints( end_points, A ); - this->_Skeleton( end_points, A ); -} - -// ------------------------------------------------------------------------- -template< class _TImage > -void fpa::Image::SkeletonFilter< _TImage >:: -_EndPoints( std::vector< TIndex >& end_points, _TAdjacencies& A ) -{ - auto marks = this->GetMarks( ); - auto mst = this->GetMinimumSpanningTree( ); - auto spac = marks->GetSpacing( ); - - // Some values - marks->SetLargestPossibleRegion( mst->GetLargestPossibleRegion( ) ); - marks->SetRequestedRegion( mst->GetRequestedRegion( ) ); - marks->SetBufferedRegion( mst->GetBufferedRegion( ) ); - marks->SetSpacing( mst->GetSpacing( ) ); - marks->SetOrigin( mst->GetOrigin( ) ); - marks->SetDirection( mst->GetDirection( ) ); - marks->Allocate( ); - marks->FillBuffer( 0 ); - - // BFS from maximum queue - while( this->m_SkeletonQueue.size( ) > 0 ) - { - // Get node - auto nIt = this->m_SkeletonQueue.begin( ); - auto n = *nIt; - this->m_SkeletonQueue.erase( nIt ); - - // Mark it and update end-points - unsigned char m = marks->GetPixel( n.second ); - if( m != 0 ) - continue; - marks->SetPixel( n.second, 1 ); - end_points.push_back( n.second ); - - // Mark path - TIndex it = n.second; - TIndex p = mst->GetParent( it ); - while( it != p ) - { - this->_MarkSphere( it ); - it = p; - p = mst->GetParent( it ); - - } // elihw - this->_MarkSphere( it ); - A[ n.second ] = it; - - } // elihw -} - -// ------------------------------------------------------------------------- -template< class _TImage > -void fpa::Image::SkeletonFilter< _TImage >:: -_Skeleton( const std::vector< TIndex >& end_points, _TAdjacencies& A ) -{ - typedef itk::Image< unsigned long, Self::Dimension > _TTagsImage; - typedef typename TMST::TPath _TPath; - - auto mst = this->GetMinimumSpanningTree( ); - auto skeleton = this->GetSkeleton( ); - - // Tag branches - typename _TTagsImage::Pointer tags = _TTagsImage::New( ); - tags->SetLargestPossibleRegion( mst->GetLargestPossibleRegion( ) ); - tags->SetRequestedRegion( mst->GetRequestedRegion( ) ); - tags->SetBufferedRegion( mst->GetBufferedRegion( ) ); - tags->Allocate( ); - tags->FillBuffer( 0 ); - for( auto eIt = end_points.begin( ); eIt != end_points.end( ); ++eIt ) - { - TIndex it = *eIt; - TIndex p = mst->GetParent( it ); - while( it != p ) - { - tags->SetPixel( it, tags->GetPixel( it ) + 1 ); - it = p; - p = mst->GetParent( it ); - - } // elihw - tags->SetPixel( it, tags->GetPixel( it ) + 1 ); - - } // rof - - // Build paths (branches) - for( auto eIt = end_points.begin( ); eIt != end_points.end( ); ++eIt ) - { - TIndex it = *eIt; - TIndex p = mst->GetParent( it ); - TIndex sIdx = *eIt; - typename _TPath::Pointer path = _TPath::New( ); - path->SetReferenceImage( mst ); - while( it != p ) - { - if( tags->GetPixel( sIdx ) != tags->GetPixel( it ) ) - { - // Ok, a new branch has been added - path->AddVertex( it ); - skeleton->AddBranch( path ); - - // Update a new starting index - path = _TPath::New( ); - path->SetReferenceImage( mst ); - sIdx = it; - } - else - path->AddVertex( it ); - it = p; - p = mst->GetParent( it ); - - } // elihw - - // Finally, add last branch - path->AddVertex( it ); - skeleton->AddBranch( path ); - - } // rof -} - -// ------------------------------------------------------------------------- -template< class _TImage > -void fpa::Image::SkeletonFilter< _TImage >:: -_MarkSphere( const TIndex& idx ) -{ - typedef itk::ImageRegionIteratorWithIndex< TMarks > _TMarksIt; - - static const double _eps = std::sqrt( double( Self::Dimension + 1 ) ); - auto input = this->GetInput( ); - auto marks = this->GetMarks( ); - auto spac = input->GetSpacing( ); - auto region = input->GetRequestedRegion( ); - - typename _TImage::PointType cnt; - input->TransformIndexToPhysicalPoint( idx, cnt ); - double r = double( input->GetPixel( idx ) ) * _eps; - - TIndex i0, i1; - for( unsigned int d = 0; d < Self::Dimension; ++d ) - { - long off = long( std::ceil( r / double( spac[ d ] ) ) ); - if( off < 3 ) - off = 3; - i0[ d ] = idx[ d ] - off; - i1[ d ] = idx[ d ] + off; - - if( i0[ d ] < region.GetIndex( )[ d ] ) - i0[ d ] = region.GetIndex( )[ d ]; - - if( i1[ d ] >= region.GetIndex( )[ d ] + region.GetSize( )[ d ] ) - i1[ d ] = region.GetIndex( )[ d ] + region.GetSize( )[ d ] - 1; - - } // rof - - typename _TImage::SizeType size; - for( unsigned int d = 0; d < Self::Dimension; ++d ) - size[ d ] = i1[ d ] - i0[ d ] + 1; - - typename _TImage::RegionType neighRegion; - neighRegion.SetIndex( i0 ); - neighRegion.SetSize( size ); - - _TMarksIt mIt( marks, neighRegion ); - for( mIt.GoToBegin( ); !mIt.IsAtEnd( ); ++mIt ) - { - TIndex w = mIt.GetIndex( ); - typename _TImage::PointType p; - marks->TransformIndexToPhysicalPoint( w, p ); - mIt.Set( 1 ); - - } // rof -} - -#endif // __fpa__Image__SkeletonFilter__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpaInstances/BaseFilters.i b/lib/fpaInstances/BaseFilters.i deleted file mode 100644 index 0cc752f..0000000 --- a/lib/fpaInstances/BaseFilters.i +++ /dev/null @@ -1,12 +0,0 @@ -header #define ITK_MANUAL_INSTANTIATION - -*define i_scalars=#scalar_types# -*define o_scalars=#scalar_types# - -*tinclude fpa/Base/Algorithm:h|hxx -*tinclude fpa/Image/Algorithm:h|hxx - -*instances fpa::Base::Algorithm< itk::ImageToImageFilter< itk::Image< #i_scalars#, #pdims# >, itk::Image< #o_scalars#, #pdims# > >, itk::Index< #pdims# >, #o_scalars# > -*instances fpa::Image::Algorithm< itk::Image< #i_scalars#, #pdims# >, itk::Image< #o_scalars#, #pdims# > > - -** eof - $RCSfile$ diff --git a/lib/fpaInstances/CMakeLists.txt b/lib/fpaInstances/CMakeLists.txt deleted file mode 100644 index f7d1114..0000000 --- a/lib/fpaInstances/CMakeLists.txt +++ /dev/null @@ -1,40 +0,0 @@ -## =========================== -## == Compile each instance == -## =========================== -IF(USE_cpPlugins) - INCLUDE_DIRECTORIES( - ${PROJECT_SOURCE_DIR}/lib - ${PROJECT_BINARY_DIR}/lib - ) - SET(_pfx fpaInstaces) - SET(_instances - DataObjects - ImageFunctors - ImageFilters - ) - SET(_build_instances) - FOREACH(_i ${_instances}) - cpPlugins_BuildLibrary( - ${_pfx}${_i} SHARED ${CMAKE_CURRENT_SOURCE_DIR}/${_i}.i - ) - TARGET_LINK_LIBRARIES( - ${_pfx}${_i} - ${cpPlugins_AllInstances} ${ITK_LIBRARIES} ${VTK_LIBRARIES} - ) - LIST(APPEND _build_instances ${_pfx}${_i}) - ENDFOREACH(_i) - - TARGET_LINK_LIBRARIES( - ${_pfx}ImageFilters - ${_pfx}DataObjects - ${_pfx}ImageFunctors - cpPlugins_ITKUnaryFunctorFilters - ) - SET( - fpa_AllInstances - ${_build_instances} - CACHE INTERNAL "All valid instances." FORCE - ) -ENDIF(USE_cpPlugins) - -## eof - $RCSfile$ diff --git a/lib/fpaInstances/DataObjects.i b/lib/fpaInstances/DataObjects.i deleted file mode 100644 index 2cc585f..0000000 --- a/lib/fpaInstances/DataObjects.i +++ /dev/null @@ -1,9 +0,0 @@ -header #define ITK_MANUAL_INSTANTIATION - -tinclude fpa/Base/MinimumSpanningTree:h|hxx -tinclude fpa/Image/MinimumSpanningTree:h|hxx - -instances fpa::Base::MinimumSpanningTree< itk::Index< #pdims# >, cpExtensions::DataStructures::PolyLineParametricPath< #pdims# >, itk::Image< itk::Offset< #pdims# >, #pdims# > > -instances fpa::Image::MinimumSpanningTree< #pdims# > - -** eof - $RCSfile$ diff --git a/lib/fpaInstances/ImageFilters.i b/lib/fpaInstances/ImageFilters.i deleted file mode 100644 index e773c11..0000000 --- a/lib/fpaInstances/ImageFilters.i +++ /dev/null @@ -1,28 +0,0 @@ -header #define ITK_MANUAL_INSTANTIATION - -define all_inputs=#scalar_types# -define all_outputs=#scalar_types# -define all_int_types=#int_types#;#uint_types# - -tinclude fpa/Base/Algorithm:h|hxx -tinclude fpa/Image/Algorithm:h|hxx -tinclude fpa/Image/RegionGrow:h|hxx -tinclude fpa/Base/RegionGrow:h|hxx -tinclude fpa/Image/Dijkstra:h|hxx -tinclude fpa/Image/FastMarching:h|hxx - -cinclude fpa/Base/QueueAlgorithm.hxx -cinclude fpa/Base/PriorityQueueAlgorithm.hxx -cinclude fpa/Base/Dijkstra.hxx -cinclude fpa/Base/FastMarching.hxx - -instances fpa::Base::Algorithm< itk::ImageToImageFilter< itk::Image< #all_inputs#, #pdims# >, itk::Image< #all_outputs#, #pdims# > >, itk::Index< #pdims# >, #all_outputs# > -instances fpa::Image::Algorithm< itk::Image< #scalar_types#, #pdims# >, itk::Image< #all_int_types#, #pdims# > > - -instances fpa::Base::RegionGrow< fpa::Image::Algorithm< itk::Image< #scalar_types#, #pdims# >, itk::Image< #all_int_types#, #pdims# > > > -instances fpa::Image::RegionGrow< itk::Image< #scalar_types#, #pdims# >, itk::Image< #all_int_types#, #pdims# > > - -instances fpa::Image::Dijkstra< itk::Image< #scalar_types#, #pdims# >, itk::Image< #real_types#, #pdims# > > -instances fpa::Image::FastMarching< itk::Image< #scalar_types#, #pdims# >, itk::Image< #real_types#, #pdims# > > - -** eof - $RCSfile$ diff --git a/lib/fpaInstances/ImageFunctors.i b/lib/fpaInstances/ImageFunctors.i deleted file mode 100644 index e410091..0000000 --- a/lib/fpaInstances/ImageFunctors.i +++ /dev/null @@ -1,16 +0,0 @@ -header #define ITK_MANUAL_INSTANTIATION - -define all_int_types=#int_types#;#uint_types# -define i_scalar_types=#scalar_types# -define o_scalar_types=#scalar_types# - -tinclude fpa/Image/Functors/VertexCost:h|hxx -tinclude fpa/Image/Functors/SimpleNeighborhood:h|hxx -tinclude fpa/Image/Functors/RegionGrow/BinaryThreshold:h|hxx -cinclude itkImage.h - -instances fpa::Image::Functors::VertexCost< itk::Image< #i_scalar_types#, #pdims# >, #o_scalar_types# > -instances fpa::Image::Functors::SimpleNeighborhood< #pdims# > -instances fpa::Image::Functors::RegionGrow::BinaryThreshold< itk::Image< #scalar_types#, #pdims# >, #all_int_types# > - -** eof - $RCSfile$ diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt deleted file mode 100644 index 7a565b0..0000000 --- a/plugins/CMakeLists.txt +++ /dev/null @@ -1,57 +0,0 @@ -## ========================== -## == Build plugin library == -## ========================== - -IF(USE_cpPlugins) - INCLUDE_DIRECTORIES( - ${PROJECT_SOURCE_DIR}/lib - ${PROJECT_BINARY_DIR}/lib - ${PROJECT_SOURCE_DIR}/plugins - ${PROJECT_BINARY_DIR}/plugins - ) - - SET( - _dirs - Functors - ImageFunctors - ImageAlgorithms - # RegionGrowFunctors - # DijkstraFunctors - ) - - FOREACH(_d ${_dirs}) - cpPlugins_BuildPluginsLibrary( - fpaPlugins_${_d} ${CMAKE_CURRENT_SOURCE_DIR}/${_d} - ) - TARGET_LINK_LIBRARIES( - fpaPlugins_${_d} - cpPlugins cpPluginsDataObjects cpExtensions - ${fpa_AllInstances} - ) - ENDFOREACH(_d) - - -# OPTION(BUILD_ExperimentationPlugins "Build plugins for experimentation?" OFF) -# IF(BUILD_ExperimentationPlugins) -# LIST(APPEND _dirs Experiments) -# ENDIF(BUILD_ExperimentationPlugins) - -# FOREACH(_d ${_dirs}) -# cpPlugins_BuildPluginsLibrary( -# fpaPlugins${_d} ${CMAKE_CURRENT_SOURCE_DIR}/${_d} -# ) -# TARGET_LINK_LIBRARIES( -# fpaPlugins${_d} -# cpPlugins cpPluginsDataObjects cpExtensions -# ${fpa_AllInstances} -# ) -# ENDFOREACH(_d) -# TARGET_LINK_LIBRARIES( -# fpaPluginsImageAlgorithms -# cpPlugins_ITKUnaryFunctorFilters -# fpaPluginsRegionGrowFunctors -# fpaPluginsDijkstraFunctors -# ) -ENDIF(USE_cpPlugins) - -## eof - $RCSfile$ diff --git a/plugins/DijkstraFunctors/DijkstraFunctors.i b/plugins/DijkstraFunctors/DijkstraFunctors.i deleted file mode 100644 index b251418..0000000 --- a/plugins/DijkstraFunctors/DijkstraFunctors.i +++ /dev/null @@ -1,12 +0,0 @@ -header #define ITK_MANUAL_INSTANTIATION - -define i_reals=#real_types# -define o_reals=#real_types# -tinclude fpa/Base/Functors/Inverse:h|hxx -tinclude fpa/Base/Functors/GaussianModel:h|hxx - -instances fpa::Base::Functors::Inverse< #i_reals#, #o_reals# > -instances fpa::Base::Functors::GaussianModel< #i_reals#, #o_reals# > - - -** eof - $RCSfile$ diff --git a/plugins/DijkstraFunctors/ExtractPathFromMinimumSpanningTree.cxx b/plugins/DijkstraFunctors/ExtractPathFromMinimumSpanningTree.cxx deleted file mode 100644 index 1aa6d48..0000000 --- a/plugins/DijkstraFunctors/ExtractPathFromMinimumSpanningTree.cxx +++ /dev/null @@ -1,80 +0,0 @@ -#include -#include -#include -#include -#include - -// ------------------------------------------------------------------------- -fpaPluginsDijkstraFunctors::ExtractPathFromMinimumSpanningTree:: -ExtractPathFromMinimumSpanningTree( ) - : Superclass( ) -{ - typedef cpPlugins::Pipeline::DataObject _TData; - typedef cpInstances::DataObjects::Image _TMST; - typedef cpInstances::DataObjects::PolyLineParametricPath _TPath; - - this->_ConfigureInput< _TMST >( "MST", true, false ); - this->_ConfigureInput< _TData >( "Seeds", true, false ); - this->_ConfigureOutput< _TPath >( "Output" ); -} - -// ------------------------------------------------------------------------- -fpaPluginsDijkstraFunctors::ExtractPathFromMinimumSpanningTree:: -~ExtractPathFromMinimumSpanningTree( ) -{ -} - -// ------------------------------------------------------------------------- -void fpaPluginsDijkstraFunctors::ExtractPathFromMinimumSpanningTree:: -_GenerateData( ) -{ - typedef fpa::Image::MinimumSpanningTree< 2 > _TMST2; - typedef fpa::Image::MinimumSpanningTree< 3 > _TMST3; - - auto mst2 = this->GetInputData< _TMST2 >( "MST" ); - auto mst3 = this->GetInputData< _TMST3 >( "MST" ); - if ( mst2 != NULL ) this->_GD0( mst2 ); - else if( mst3 != NULL ) this->_GD0( mst3 ); - else this->_Error( "Invalid input spanning tree." ); -} - -// ------------------------------------------------------------------------- -template< class _TMST > -void fpaPluginsDijkstraFunctors::ExtractPathFromMinimumSpanningTree:: -_GD0( _TMST* mst ) -{ - typedef typename _TMST::IndexType _TIndex; - typedef typename _TMST::TPath _TPath; - - // Get seeds - std::vector< _TIndex > seeds; - auto points = this->GetInputData< vtkPolyData >( "Seeds" ); - if( points != NULL ) - { - if( points->GetNumberOfPoints( ) < 2 ) - this->_Error( "Not enough seeds (<2)." ); - - typename _TMST::PointType pnt; - typename _TMST::IndexType idx; - unsigned int dim = - ( _TMST::ImageDimension < 3 )? _TMST::ImageDimension: 3; - for( unsigned int i = 0; i < 2; ++i ) - { - double buf[ 3 ]; - points->GetPoint( i, buf ); - pnt.Fill( 0 ); - for( unsigned int d = 0; d < dim; ++d ) - pnt[ d ] = buf[ d ]; - if( mst->TransformPhysicalPointToIndex( pnt, idx ) ) - seeds.push_back( idx ); - - } // rof - - } // fi - - typename _TPath::Pointer path; - mst->GetPath( path, seeds[ 0 ], seeds[ 1 ] ); - this->GetOutput( "Output" )->SetITK( path ); -} - -// eof - $RCSfile$ diff --git a/plugins/DijkstraFunctors/ExtractPathFromMinimumSpanningTree.h b/plugins/DijkstraFunctors/ExtractPathFromMinimumSpanningTree.h deleted file mode 100644 index f98e959..0000000 --- a/plugins/DijkstraFunctors/ExtractPathFromMinimumSpanningTree.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef __fpaPluginsDijkstraFunctors__ExtractPathFromMinimumSpanningTree__h__ -#define __fpaPluginsDijkstraFunctors__ExtractPathFromMinimumSpanningTree__h__ - -#include -#include - -namespace fpaPluginsDijkstraFunctors -{ - /** - */ - class fpaPluginsDijkstraFunctors_EXPORT ExtractPathFromMinimumSpanningTree - : public cpPlugins::Pipeline::ProcessObject - { - cpPluginsObject( - ExtractPathFromMinimumSpanningTree, - cpPlugins::Pipeline::ProcessObject, - fpaDijkstraFunctors - ); - - protected: - template< class _TMST > - inline void _GD0( _TMST* mst ); - }; - -} // ecapseman - -#endif // __fpaPluginsDijkstraFunctors__ExtractPathFromMinimumSpanningTree__h__ - -// eof - $RCSfile$ diff --git a/plugins/DijkstraFunctors/GaussianModelCost.cxx b/plugins/DijkstraFunctors/GaussianModelCost.cxx deleted file mode 100644 index 0b62621..0000000 --- a/plugins/DijkstraFunctors/GaussianModelCost.cxx +++ /dev/null @@ -1,54 +0,0 @@ -#include -#include - -#include - -// ------------------------------------------------------------------------- -fpaPluginsDijkstraFunctors::GaussianModelCost:: -GaussianModelCost( ) - : Superclass( ) -{ - typedef cpPlugins::Pipeline::DataObject _TData; - this->_ConfigureOutput< _TData >( "Output" ); - - std::vector< std::string > choices; - choices.push_back( "float" ); - choices.push_back( "double" ); - this->m_Parameters.ConfigureAsChoices( "ResultType", choices ); - this->m_Parameters.SetSelectedChoice( "ResultType", "float" ); -} - -// ------------------------------------------------------------------------- -fpaPluginsDijkstraFunctors::GaussianModelCost:: -~GaussianModelCost( ) -{ -} - -// ------------------------------------------------------------------------- -void fpaPluginsDijkstraFunctors::GaussianModelCost:: -_GenerateData( ) -{ - auto rtype = this->m_Parameters.GetSelectedChoice( "ResultType" ); - if ( rtype == "float" ) this->_GD0< float >( ); - else if( rtype == "double" ) this->_GD0< double >( ); -} - -// ------------------------------------------------------------------------- -template< class _TOutput > -void fpaPluginsDijkstraFunctors::GaussianModelCost:: -_GD0( ) -{ - typedef fpa::Base::Functors::GaussianModel< _TOutput, _TOutput > _TFunctor; - - auto out = this->GetOutput( "Output" ); - auto f = out->GetITK< _TFunctor >( ); - if( f == NULL ) - { - typename _TFunctor::Pointer ptr_f = _TFunctor::New( ); - f = ptr_f.GetPointer( ); - out->SetITK( f ); - - } // fi -} - -// eof - $RCSfile$ diff --git a/plugins/DijkstraFunctors/GaussianModelCost.h b/plugins/DijkstraFunctors/GaussianModelCost.h deleted file mode 100644 index 8a204ab..0000000 --- a/plugins/DijkstraFunctors/GaussianModelCost.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef __fpa__Plugins__GaussianModelCost__h__ -#define __fpa__Plugins__GaussianModelCost__h__ - -#include -#include - -namespace fpaPluginsDijkstraFunctors -{ - /** - */ - class fpaPluginsDijkstraFunctors_EXPORT GaussianModelCost - : public cpPlugins::Pipeline::ProcessObject - { - cpPluginsObject( - GaussianModelCost, - cpPlugins::Pipeline::ProcessObject, - fpaDijkstraFunctors - ); - - protected: - template< class _TOutput > - inline void _GD0( ); - }; - -} // ecapseman - -#endif // __fpa__Plugins__GaussianModelCost__h__ - -// eof - $RCSfile$ diff --git a/plugins/DijkstraFunctors/InvertCost.cxx b/plugins/DijkstraFunctors/InvertCost.cxx deleted file mode 100644 index f5a1338..0000000 --- a/plugins/DijkstraFunctors/InvertCost.cxx +++ /dev/null @@ -1,56 +0,0 @@ -#include -#include - -#include - -// ------------------------------------------------------------------------- -fpaPluginsDijkstraFunctors::InvertCost:: -InvertCost( ) - : Superclass( ) -{ - typedef cpPlugins::Pipeline::DataObject _TData; - this->_ConfigureOutput< _TData >( "Output" ); - - std::vector< std::string > choices; - choices.push_back( "float" ); - choices.push_back( "double" ); - this->m_Parameters.ConfigureAsChoices( "ResultType", choices ); - this->m_Parameters.ConfigureAsReal( "NegativeValue", -1 ); - this->m_Parameters.SetSelectedChoice( "ResultType", "float" ); -} - -// ------------------------------------------------------------------------- -fpaPluginsDijkstraFunctors::InvertCost:: -~InvertCost( ) -{ -} - -// ------------------------------------------------------------------------- -void fpaPluginsDijkstraFunctors::InvertCost:: -_GenerateData( ) -{ - auto rtype = this->m_Parameters.GetSelectedChoice( "ResultType" ); - if ( rtype == "float" ) this->_GD0< float >( ); - else if( rtype == "double" ) this->_GD0< double >( ); -} - -// ------------------------------------------------------------------------- -template< class _TOutput > -void fpaPluginsDijkstraFunctors::InvertCost:: -_GD0( ) -{ - typedef fpa::Base::Functors::Inverse< _TOutput, _TOutput > _TFunctor; - - auto out = this->GetOutput( "Output" ); - auto f = out->GetITK< _TFunctor >( ); - if( f == NULL ) - { - typename _TFunctor::Pointer ptr_f = _TFunctor::New( ); - f = ptr_f.GetPointer( ); - out->SetITK( f ); - - } // fi - f->SetNegativeValue( this->m_Parameters.GetReal( "NegativeValue" ) ); -} - -// eof - $RCSfile$ diff --git a/plugins/DijkstraFunctors/InvertCost.h b/plugins/DijkstraFunctors/InvertCost.h deleted file mode 100644 index c45c732..0000000 --- a/plugins/DijkstraFunctors/InvertCost.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef __fpa__Plugins__InvertCost__h__ -#define __fpa__Plugins__InvertCost__h__ - -#include -#include - -namespace fpaPluginsDijkstraFunctors -{ - /** - */ - class fpaPluginsDijkstraFunctors_EXPORT InvertCost - : public cpPlugins::Pipeline::ProcessObject - { - cpPluginsObject( - InvertCost, - cpPlugins::Pipeline::ProcessObject, - fpaDijkstraFunctors - ); - - protected: - template< class _TOutput > - inline void _GD0( ); - }; - -} // ecapseman - -#endif // __fpa__Plugins__InvertCost__h__ - -// eof - $RCSfile$ diff --git a/plugins/DijkstraFunctors/SimpleImageDijkstraCost.cxx b/plugins/DijkstraFunctors/SimpleImageDijkstraCost.cxx deleted file mode 100644 index a053e86..0000000 --- a/plugins/DijkstraFunctors/SimpleImageDijkstraCost.cxx +++ /dev/null @@ -1,74 +0,0 @@ -#include -#include - -#include - -// TODO: #include - -// ------------------------------------------------------------------------- -fpaPluginsDijkstraFunctors::SimpleImageDijkstraCost:: -SimpleImageDijkstraCost( ) - : Superclass( ) -{ - typedef cpPlugins::Pipeline::DataObject _TData; - typedef cpInstances::DataObjects::Image _TImage; - - this->_ConfigureInput< _TImage >( "Input", true, false ); - this->_ConfigureOutput< _TData >( "Output" ); - - std::vector< std::string > choices; - choices.push_back( "float" ); - choices.push_back( "double" ); - this->m_Parameters.ConfigureAsChoices( "ResultType", choices ); - this->m_Parameters.SetSelectedChoice( "ResultType", "float" ); - this->m_Parameters.ConfigureAsBool( "UseImageSpacing", false ); -} - -// ------------------------------------------------------------------------- -fpaPluginsDijkstraFunctors::SimpleImageDijkstraCost:: -~SimpleImageDijkstraCost( ) -{ -} - -// ------------------------------------------------------------------------- -void fpaPluginsDijkstraFunctors::SimpleImageDijkstraCost:: -_GenerateData( ) -{ - auto o = this->GetInputData( "Input" ); - cpPlugins_Demangle_Image_ScalarPixels_AllDims_1( o, _GD0 ) - this->_Error( "Invalid input image." ); -} - -// ------------------------------------------------------------------------- -template< class _TImage > -void fpaPluginsDijkstraFunctors::SimpleImageDijkstraCost:: -_GD0( _TImage* image ) -{ - auto rtype = this->m_Parameters.GetSelectedChoice( "ResultType" ); - if ( rtype == "float" ) this->_GD1< _TImage, float >( image ); - else if( rtype == "double" ) this->_GD1< _TImage, double >( image ); -} - -// ------------------------------------------------------------------------- -template< class _TImage, class _TOutput > -void fpaPluginsDijkstraFunctors::SimpleImageDijkstraCost:: -_GD1( _TImage* image ) -{ - /* TODO - typedef - fpa::Image::Functors::SimpleDijkstraCost< _TImage, _TOutput > - _TFunctor; - auto out = this->GetOutput( "Output" ); - auto f = out->GetITK< _TFunctor >( ); - if( f == NULL ) - { - typename _TFunctor::Pointer ptr_f = _TFunctor::New( ); - f = ptr_f.GetPointer( ); - out->SetITK( f ); - - } // fi - f->SetUseImageSpacing( this->m_Parameters.GetBool( "UseImageSpacing" ) ); - */ -} - -// eof - $RCSfile$ diff --git a/plugins/DijkstraFunctors/SimpleImageDijkstraCost.h b/plugins/DijkstraFunctors/SimpleImageDijkstraCost.h deleted file mode 100644 index e1ff8e4..0000000 --- a/plugins/DijkstraFunctors/SimpleImageDijkstraCost.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef __fpa__Plugins__SimpleImageDijkstraCost__h__ -#define __fpa__Plugins__SimpleImageDijkstraCost__h__ - -#include -#include - -namespace fpaPluginsDijkstraFunctors -{ - /** - */ - class fpaPluginsDijkstraFunctors_EXPORT SimpleImageDijkstraCost - : public cpPlugins::Pipeline::ProcessObject - { - cpPluginsObject( - SimpleImageDijkstraCost, - cpPlugins::Pipeline::ProcessObject, - fpaDijkstraFunctors - ); - - protected: - template< class _TImage > - inline void _GD0( _TImage* image ); - - template< class _TImage, class _TOutput > - inline void _GD1( _TImage* image ); - }; - -} // ecapseman - -#endif // __fpa__Plugins__SimpleImageDijkstraCost__h__ - -// eof - $RCSfile$ diff --git a/plugins/Experiments/InsertNoiseIntoPoints.cxx b/plugins/Experiments/InsertNoiseIntoPoints.cxx deleted file mode 100644 index 0b98400..0000000 --- a/plugins/Experiments/InsertNoiseIntoPoints.cxx +++ /dev/null @@ -1,76 +0,0 @@ -#include -#include -#include - -#include -#include -#include - -// ------------------------------------------------------------------------- -fpaPluginsExperiments::InsertNoiseIntoPoints:: -InsertNoiseIntoPoints( ) - : Superclass( ) -{ - typedef cpInstances::DataObjects::Image _TImage; - typedef cpInstances::DataObjects::Mesh _TMesh; - - this->_ConfigureInput< _TMesh >( "Seeds", true, false ); - this->_ConfigureInput< _TImage >( "DistanceMap", true, false ); - this->_ConfigureOutput< _TMesh >( "Output" ); - this->m_Parameters.ConfigureAsBool( "InsertNoise", false ); - - // Create output data - auto out = this->_CreateVTK< vtkPolyData >( ); - out->SetPoints( vtkSmartPointer< vtkPoints >::New( ) ); - out->SetVerts( vtkSmartPointer< vtkCellArray >::New( ) ); - out->SetLines( vtkSmartPointer< vtkCellArray >::New( ) ); - out->SetPolys( vtkSmartPointer< vtkCellArray >::New( ) ); - out->SetStrips( vtkSmartPointer< vtkCellArray >::New( ) ); - this->GetOutput( "Output" )->SetVTK( out ); -} - -// ------------------------------------------------------------------------- -fpaPluginsExperiments::InsertNoiseIntoPoints:: -~InsertNoiseIntoPoints( ) -{ -} - -// ------------------------------------------------------------------------- -void fpaPluginsExperiments::InsertNoiseIntoPoints:: -_GenerateData( ) -{ - auto dmap = this->GetInputData< vtkImageData >( "DistanceMap" ); - auto seeds = this->GetInputData< vtkPolyData >( "Seeds" ); - auto out = this->GetOutputData< vtkPolyData >( "Output" ); - - typedef std::uniform_real_distribution< double > _TDist; - std::random_device rd; - std::mt19937 gen( rd( ) ); - for( int i = 0; i < seeds->GetNumberOfPoints( ); ++i ) - { - double buf[ 3 ], pcoords[ 3 ]; - seeds->GetPoint( i, buf ); - - if( this->m_Parameters.GetBool( "InsertNoise" ) ) - { - int ijk[ 3 ]; - dmap->ComputeStructuredCoordinates( buf, ijk, pcoords ); - double radius = - dmap->GetScalarComponentAsDouble( ijk[ 0 ], ijk[ 1 ], ijk[ 2 ], 0 ); - double rad_dis = _TDist( 1e-2, radius * 0.9 )( gen ); - double the_dis = _TDist( 0, 3.14159265359 )( gen ); - double phi_dis = _TDist( 0, 6.28318530718 )( gen ); - buf[ 0 ] += rad_dis * std::sin( the_dis ) * std::cos( phi_dis ); - buf[ 1 ] += rad_dis * std::sin( the_dis ) * std::sin( phi_dis ); - buf[ 2 ] += rad_dis * std::cos( the_dis ); - - } // fi - out->GetPoints( )->InsertNextPoint( buf ); - out->GetVerts( )->InsertNextCell( 1 ); - out->GetVerts( )->InsertCellPoint( i ); - out->Modified( ); - - } // rof -} - -// eof - $RCSfile$ diff --git a/plugins/Experiments/InsertNoiseIntoPoints.h b/plugins/Experiments/InsertNoiseIntoPoints.h deleted file mode 100644 index 2b33086..0000000 --- a/plugins/Experiments/InsertNoiseIntoPoints.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef __fpaPluginsExperiments__InsertNoiseIntoPoints__h__ -#define __fpaPluginsExperiments__InsertNoiseIntoPoints__h__ - -#include -#include - -namespace fpaPluginsExperiments -{ - /** - */ - class fpaPluginsExperiments_EXPORT InsertNoiseIntoPoints - : public cpPlugins::Pipeline::ProcessObject - { - cpPluginsObject( - InsertNoiseIntoPoints, - cpPlugins::Pipeline::ProcessObject, - fpaExperiments - ); - }; - -} // ecapseman - -#endif // __fpaPluginsExperiments__InsertNoiseIntoPoints__h__ - -// eof - $RCSfile$ diff --git a/plugins/Experiments/SkeletonHausdorffDistance.cxx b/plugins/Experiments/SkeletonHausdorffDistance.cxx deleted file mode 100644 index af6fe76..0000000 --- a/plugins/Experiments/SkeletonHausdorffDistance.cxx +++ /dev/null @@ -1,136 +0,0 @@ -#include -#include -#include -#include -#include - -#include -#include - -// ------------------------------------------------------------------------- -fpaPluginsExperiments::SkeletonHausdorffDistance:: -SkeletonHausdorffDistance( ) - : Superclass( ) -{ - this->_ConfigureInput< cpInstances::DataObjects::Image >( "DistanceMap", true, false ); - this->_ConfigureInput< cpInstances::DataObjects::Mesh >( "Seeds", true, false ); - this->_ConfigureInput< cpInstances::DataObjects::Skeleton >( "Skeleton1", true, false ); - this->_ConfigureInput< cpInstances::DataObjects::Skeleton >( "Skeleton2", true, false ); -} - -// ------------------------------------------------------------------------- -fpaPluginsExperiments::SkeletonHausdorffDistance:: -~SkeletonHausdorffDistance( ) -{ -} - -// ------------------------------------------------------------------------- -void fpaPluginsExperiments::SkeletonHausdorffDistance:: -_GenerateData( ) -{ - typedef cpExtensions::DataStructures::Skeleton< 3 > _TSkeleton; - - auto dmap = this->GetInputData< vtkImageData >( "DistanceMap" ); - auto seeds = this->GetInputData< vtkPolyData >( "Seeds" ); - auto sk1 = this->GetInputData< _TSkeleton >( "Skeleton1" ); - auto sk2 = this->GetInputData< _TSkeleton >( "Skeleton2" ); - - double buf[ 3 ], pcoords[ 3 ]; - seeds->GetPoint( 0, buf ); - int ijk[ 3 ]; - dmap->ComputeStructuredCoordinates( buf, ijk, pcoords ); - double radius = - dmap->GetScalarComponentAsDouble( ijk[ 0 ], ijk[ 1 ], ijk[ 2 ], 0 ); - - double d1 = this->_Distance( sk1, sk2, NULL, 0 ); - double d2 = this->_Distance( sk1, sk2, buf, radius ); - - std::cout - << std::endl - << "-------------------------------" << std::endl - << "D1 : " << d1 << std::endl - << "D2 : " << d2 << std::endl - << "Radius: " << radius << std::endl - << "Seed : " << buf[ 0 ] << " " << buf[ 1 ] << " " << buf[ 2 ] << std::endl - << "-------------------------------" << std::endl; -} - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -double fpaPluginsExperiments::SkeletonHausdorffDistance:: -_Distance( _TSkeleton* sk1, _TSkeleton* sk2, double* center, double radius ) -{ - auto lst1 = this->_PointList( sk1, center, radius ); - auto lst2 = this->_PointList( sk2, center, radius ); - double dist = -std::numeric_limits< double >::max( ); - typename _TSkeleton::TPath::TPoint point; - for( auto p1 : lst1 ) - { - double ldist = std::numeric_limits< double >::max( ); - typename _TSkeleton::TPath::TPoint lpoint; - for( auto p2 : lst2 ) - { - double d = p1.EuclideanDistanceTo( p2 ); - if( d < ldist ) - { - ldist = d; - lpoint = p2; - - } // fi - - } // rof - if( ldist > dist ) - { - dist = ldist; - point = lpoint; - - } // fi - - } // rof - return( dist ); -} - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -std::vector< typename _TSkeleton::TPath::TPoint > -fpaPluginsExperiments::SkeletonHausdorffDistance:: -_PointList( _TSkeleton* sk, double* center, double radius ) -{ - typename _TSkeleton::TPath::TPoint p_center; - if( center != NULL ) - for( unsigned int d = 0; d < _TSkeleton::Dimension; ++d ) - p_center[ d ] = center[ d ]; - - std::vector< typename _TSkeleton::TPath::TPoint > lst; - auto mIt = sk->BeginEdgesRows( ); - for( ; mIt != sk->EndEdgesRows( ); ++mIt ) - { - auto rIt = mIt->second.begin( ); - for( ; rIt != mIt->second.end( ); ++rIt ) - { - auto eIt = rIt->second.begin( ); - for( ; eIt != rIt->second.end( ); ++eIt ) - { - auto path = *eIt; - for( unsigned int i = 0; i < path->GetSize( ); ++i ) - { - auto p = path->GetPoint( i ); - if( center != NULL ) - { - if( p_center.EuclideanDistanceTo( p ) > radius ) - lst.push_back( p ); - } - else - lst.push_back( p ); - - } // rof - - } // rof - - } // rof - - } // rof - return( lst ); -} - -// eof - $RCSfile$ diff --git a/plugins/Experiments/SkeletonHausdorffDistance.h b/plugins/Experiments/SkeletonHausdorffDistance.h deleted file mode 100644 index 7ac8820..0000000 --- a/plugins/Experiments/SkeletonHausdorffDistance.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef __fpaPluginsExperiments__SkeletonHausdorffDistance__h__ -#define __fpaPluginsExperiments__SkeletonHausdorffDistance__h__ - -#include -#include - -namespace fpaPluginsExperiments -{ - /** - */ - class fpaPluginsExperiments_EXPORT SkeletonHausdorffDistance - : public cpPlugins::Pipeline::ProcessObject - { - cpPluginsObject( - SkeletonHausdorffDistance, - cpPlugins::Pipeline::ProcessObject, - fpaExperiments - ); - - protected: - template< class _TSkeleton > - inline double _Distance( - _TSkeleton* sk1, _TSkeleton* sk2, - double* center, - double radius - ); - - template< class _TSkeleton > - inline std::vector< typename _TSkeleton::TPath::TPoint > _PointList( - _TSkeleton* sk, - double* center, - double radius - ); - }; - -} // ecapseman - -#endif // __fpaPluginsExperiments__SkeletonHausdorffDistance__h__ - -// eof - $RCSfile$ diff --git a/plugins/Functors/Functors.i b/plugins/Functors/Functors.i deleted file mode 100644 index c12aa36..0000000 --- a/plugins/Functors/Functors.i +++ /dev/null @@ -1,6 +0,0 @@ - -tinclude fpa/Base/Functors/Inverse:h|hxx - -instances fpa::Base::Functors::Inverse< #scalar_types#, #real_types# > - -** eof - $RCSfile$ diff --git a/plugins/Functors/Inverse.cxx b/plugins/Functors/Inverse.cxx deleted file mode 100644 index 1786d38..0000000 --- a/plugins/Functors/Inverse.cxx +++ /dev/null @@ -1,89 +0,0 @@ -#include "Inverse.h" - -#include - -#include -#include - -// ------------------------------------------------------------------------- -void fpaPlugins_Functors::Inverse:: -Instantiate( itk::LightObject* filter ) -{ - auto itk_filter = dynamic_cast< itk::ProcessObject* >( filter ); - if( itk_filter != NULL ) - { - auto inputs = itk_filter->GetInputs( ); - if( inputs.size( ) > 0 ) - { - cpPlugins_Demangle_Image_ScalarPixels_AllDims_2( - inputs[ 0 ].GetPointer( ), _GD0, itk_filter - ) - this->_Error( "Invalid input data." ); - } - else - this->_Error( "Not enough inputs." ); - } - else - this->_Error( "Invalid instantiation filter." ); -} - -// ------------------------------------------------------------------------- -fpaPlugins_Functors::Inverse:: -Inverse( ) - : Superclass( ) -{ - this->_ConfigureOutput< cpPlugins::Pipeline::DataObject >( "Functor" ); - this->m_Parameters.ConfigureAsReal( "NegativeValue", -1 ); - this->GetOutput( "Functor" )->SetITK( this ); -} - -// ------------------------------------------------------------------------- -fpaPlugins_Functors::Inverse:: -~Inverse( ) -{ -} - -// ------------------------------------------------------------------------- -void fpaPlugins_Functors::Inverse:: -_GenerateData( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TInput > -void fpaPlugins_Functors::Inverse:: -_GD0( _TInput* input, itk::ProcessObject* filter ) -{ - auto outputs = filter->GetOutputs( ); - if( outputs.size( ) > 0 ) - { - cpPlugins_Demangle_Image_RealPixels_3( - outputs[ 0 ].GetPointer( ), _GD1, _TInput::ImageDimension, input, filter - ) - this->_Error( "Invalid output data." ); - } - else - this->_Error( "Not enough outputs." ); -} - -// ------------------------------------------------------------------------- -template< class _TInput, class _TOutput > -void fpaPlugins_Functors::Inverse:: -_GD1( _TOutput* output, _TInput* input, itk::ProcessObject* filter ) -{ - typedef typename _TInput::PixelType _TIValue; - typedef typename _TOutput::PixelType _TOValue; - typedef fpa::Base::Functors::Inverse< _TIValue, _TOValue > _TFunctor; - - auto f = dynamic_cast< _TFunctor* >( this->m_Functor.GetPointer( ) ); - if( f == NULL ) - { - typename _TFunctor::Pointer ptr_f = _TFunctor::New( ); - f = ptr_f.GetPointer( ); - this->m_Functor = f; - - } // fi - f->SetNegativeValue( this->m_Parameters.GetReal( "NegativeValue" ) ); -} - -// eof - $RCSfile$ diff --git a/plugins/Functors/Inverse.h b/plugins/Functors/Inverse.h deleted file mode 100644 index 634eeaf..0000000 --- a/plugins/Functors/Inverse.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef __fpaPlugins_Functors__Inverse__h__ -#define __fpaPlugins_Functors__Inverse__h__ - -#include -#include -#include - -namespace fpaPlugins_Functors -{ - /** - */ - class fpaPlugins_Functors_EXPORT Inverse - : public cpPlugins::Pipeline::Functor - { - cpPluginsObject( Inverse, cpPlugins::Pipeline::Functor, fpaFunctors ); - - public: - virtual void Instantiate( itk::LightObject* filter ) override; - - protected: - template< class _TInput > - inline void _GD0( _TInput* input, itk::ProcessObject* filter ); - - template< class _TInput, class _TOutput > - inline void _GD1( _TOutput* output, _TInput* input, itk::ProcessObject* filter ); - }; - -} // ecapseman - -#endif // __fpaPlugins_Functors__Inverse__h__ - -// eof - $RCSfile$ diff --git a/plugins/ImageAlgorithms/BaseFilter.cxx b/plugins/ImageAlgorithms/BaseFilter.cxx deleted file mode 100644 index 00393b4..0000000 --- a/plugins/ImageAlgorithms/BaseFilter.cxx +++ /dev/null @@ -1,27 +0,0 @@ -#include "BaseFilter.h" -#include - -// ------------------------------------------------------------------------- -fpaPlugins_ImageAlgorithms::BaseFilter:: -BaseFilter( ) - : Superclass( ) -{ - typedef cpPlugins::Pipeline::DataObject _TData; - typedef cpInstances::DataObjects::Image _TImage; - - this->_ConfigureInput< _TImage >( "Input", true, false ); - this->_ConfigureInput< _TData >( "Seeds", true, false ); - this->_ConfigureOutput< _TImage >( "Output" ); - - this->m_Parameters.ConfigureAsUint( "NeighborhoodOrder", 1 ); - this->m_Parameters.ConfigureAsBool( "VisualDebug", false ); - this->m_Parameters.ConfigureAsBool( "StopAtOneFront", false ); -} - -// ------------------------------------------------------------------------- -fpaPlugins_ImageAlgorithms::BaseFilter:: -~BaseFilter( ) -{ -} - -// eof - $RCSfile$ diff --git a/plugins/ImageAlgorithms/BaseFilter.h b/plugins/ImageAlgorithms/BaseFilter.h deleted file mode 100644 index b03abaa..0000000 --- a/plugins/ImageAlgorithms/BaseFilter.h +++ /dev/null @@ -1,98 +0,0 @@ -#ifndef __fpaPlugins_ImageAlgorithms__BaseFilter__h__ -#define __fpaPlugins_ImageAlgorithms__BaseFilter__h__ - -#include - -#include -#include - -namespace fpaPlugins_ImageAlgorithms -{ - /** - */ - class fpaPlugins_ImageAlgorithms_EXPORT BaseFilter - : public cpPlugins::Pipeline::ProcessObject - { - public: - typedef BaseFilter Self; - typedef cpPlugins::Pipeline::ProcessObject Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - public: - itkTypeMacro( BaseFilter, cpPlugins::Pipeline::ProcessObject ); - cpPlugins_Id_Macro( BaseFilter, fpaImageAlgorithm ); - - protected: - BaseFilter( ); - virtual ~BaseFilter( ); - - template< class _TFilter, class _TImage > - inline void _ConfigureFilter( - _TFilter* filter, _TImage* image, - std::vector< typename _TImage::IndexType >& seeds - ); - - private: - // Purposely not implemented. - BaseFilter( const Self& other ); - Self& operator=( const Self& other ); - }; - -} // ecapseman - -// ------------------------------------------------------------------------- -#define ITK_MANUAL_INSTANTIATION -#include - -// ------------------------------------------------------------------------- -template< class _TFilter, class _TImage > -void fpaPlugins_ImageAlgorithms::BaseFilter:: -_ConfigureFilter( - _TFilter* filter, _TImage* image, - std::vector< typename _TImage::IndexType >& seeds - ) -{ - typedef typename _TFilter::TNeighborhoodFunction _TNeighborhood; - typedef - fpa::Image::Functors::SimpleNeighborhood< _TImage::ImageDimension > - _TSimpleNeigh; - - // Simple configuration - filter->SetInput( image ); - filter->SetStopAtOneFront( this->m_Parameters.GetBool( "StopAtOneFront" ) ); - - // Neighborhood function - typename _TSimpleNeigh::Pointer sfunc = _TSimpleNeigh::New( ); - sfunc->SetOrder( this->m_Parameters.GetUint( "NeighborhoodOrder" ) ); - filter->SetNeighborhoodFunction( sfunc ); - - // Assign seeds - seeds.clear( ); - auto pnt_seeds = this->GetInputData< vtkPolyData >( "Seeds" ); - if( pnt_seeds != NULL ) - { - typename _TImage::PointType pnt; - typename _TImage::IndexType idx; - unsigned int dim = - ( _TImage::ImageDimension < 3 )? _TImage::ImageDimension: 3; - - for( int i = 0; i < pnt_seeds->GetNumberOfPoints( ); ++i ) - { - double buf[ 3 ]; - pnt_seeds->GetPoint( i, buf ); - pnt.Fill( 0 ); - for( unsigned int d = 0; d < dim; ++d ) - pnt[ d ] = buf[ d ]; - - if( image->TransformPhysicalPointToIndex( pnt, idx ) ) - seeds.push_back( idx ); - - } // rof - - } // fi -} - -#endif // __fpaPlugins_ImageAlgorithms__BaseFilter__h__ - -// eof - $RCSfile$ diff --git a/plugins/ImageAlgorithms/Dijkstra.cxx b/plugins/ImageAlgorithms/Dijkstra.cxx deleted file mode 100644 index 33e2ab4..0000000 --- a/plugins/ImageAlgorithms/Dijkstra.cxx +++ /dev/null @@ -1,99 +0,0 @@ -#include "Dijkstra.h" -#include -#include - -#include - -// ------------------------------------------------------------------------- -fpaPlugins_ImageAlgorithms::Dijkstra:: -Dijkstra( ) - : Superclass( ) -{ - typedef cpPlugins::Pipeline::DataObject _TFunctor; - typedef cpInstances::DataObjects::Image _TMST; - - this->_ConfigureInput< _TFunctor >( "VertexFunction", false, false ); - this->_ConfigureInput< _TFunctor >( "ConversionFunction", false, false ); - this->_ConfigureOutput< _TMST >( "MST" ); - - std::vector< std::string > choices; - choices.push_back( "float" ); - choices.push_back( "double" ); - this->m_Parameters.ConfigureAsChoices( "ResultType", choices ); - this->m_Parameters.SetSelectedChoice( "ResultType", "float" ); -} - -// ------------------------------------------------------------------------- -fpaPlugins_ImageAlgorithms::Dijkstra:: -~Dijkstra( ) -{ -} - -// ------------------------------------------------------------------------- -void fpaPlugins_ImageAlgorithms::Dijkstra:: -_GenerateData( ) -{ - auto o = this->GetInputData( "Input" ); - cpPlugins_Demangle_Image_ScalarPixels_AllDims_1( o, _GD0 ) - this->_Error( "Invalid input image." ); -} - -// ------------------------------------------------------------------------- -template< class _TImage > -void fpaPlugins_ImageAlgorithms::Dijkstra:: -_GD0( _TImage* image ) -{ - typedef itk::Image< float, _TImage::ImageDimension > _TFloat; - typedef itk::Image< double, _TImage::ImageDimension > _TDouble; - - auto rtype = this->m_Parameters.GetSelectedChoice( "ResultType" ); - if ( rtype == "float" ) this->_GD1< _TImage, _TFloat >( image ); - else if( rtype == "double" ) this->_GD1< _TImage, _TDouble >( image ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -void fpaPlugins_ImageAlgorithms::Dijkstra:: -_GD1( _TInputImage* image ) -{ - typedef cpPlugins::Pipeline::Functor _TFunctor; - typedef fpa::Image::Dijkstra< _TInputImage, _TOutputImage > _TFilter; - typedef typename _TFilter::TConversionFunction _TConversionFunction; - typedef typename _TFilter::TVertexFunction _TVertexFunction; - - // Create filter - auto filter = this->_CreateITK< _TFilter >( ); - std::vector< typename _TInputImage::IndexType > seeds; - this->_ConfigureFilter( filter, image, seeds ); - - // Instantiate functors - auto cost_conversion = this->GetInputData< _TFunctor >( "ConversionFunction" ); - if( cost_conversion != NULL ) - { - cost_conversion->Instantiate( filter ); - auto cost_conversion_functor = cost_conversion->GetFunctor< _TConversionFunction >( ); - if( cost_conversion_functor != NULL ) - filter->SetConversionFunction( cost_conversion_functor ); - - } // fi - - auto vertex = this->GetInputData< _TFunctor >( "VertexFunction" ); - if( vertex != NULL ) - { - vertex->Instantiate( filter ); - auto vertex_functor = vertex->GetFunctor< _TVertexFunction >( ); - if( vertex_functor != NULL ) - filter->SetVertexFunction( vertex_functor ); - - } // fi - - // Finish filter's configuration - filter->ClearSeeds( ); - for( auto seed : seeds ) - filter->AddSeed( seed, ( typename _TOutputImage::PixelType )( 0 ) ); - filter->Update( ); - this->GetOutput( "Output" )->SetITK( filter->GetOutput( ) ); - this->GetOutput( "MST" )->SetITK( filter->GetMinimumSpanningTree( ) ); -} - -// eof - $RCSfile$ diff --git a/plugins/ImageAlgorithms/Dijkstra.h b/plugins/ImageAlgorithms/Dijkstra.h deleted file mode 100644 index 5482e8d..0000000 --- a/plugins/ImageAlgorithms/Dijkstra.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef __fpaPlugins_ImageAlgorithms__Dijkstra__h__ -#define __fpaPlugins_ImageAlgorithms__Dijkstra__h__ - -#include - -namespace fpaPlugins_ImageAlgorithms -{ - /** - */ - class fpaPlugins_ImageAlgorithms_EXPORT Dijkstra - : public BaseFilter - { - cpPluginsObject( Dijkstra, BaseFilter, fpaImageAlgorithms ); - - protected: - template< class _TImage > - inline void _GD0( _TImage* image ); - - template< class _TInputImage, class _TOutputImage > - inline void _GD1( _TInputImage* image ); - }; - -} // ecapseman - -#endif // __fpaPlugins_ImageAlgorithms__Dijkstra__h__ - -// eof - $RCSfile$ diff --git a/plugins/ImageAlgorithms/ExtractPathFromMinimumSpanningTree.cxx b/plugins/ImageAlgorithms/ExtractPathFromMinimumSpanningTree.cxx deleted file mode 100644 index 664929b..0000000 --- a/plugins/ImageAlgorithms/ExtractPathFromMinimumSpanningTree.cxx +++ /dev/null @@ -1,80 +0,0 @@ -#include "ExtractPathFromMinimumSpanningTree.h" -#include -#include -#include -#include - -// ------------------------------------------------------------------------- -fpaPlugins_ImageAlgorithms::ExtractPathFromMinimumSpanningTree:: -ExtractPathFromMinimumSpanningTree( ) - : Superclass( ) -{ - typedef cpPlugins::Pipeline::DataObject _TData; - typedef cpInstances::DataObjects::Image _TMST; - typedef cpInstances::DataObjects::PolyLineParametricPath _TPath; - - this->_ConfigureInput< _TMST >( "MST", true, false ); - this->_ConfigureInput< _TData >( "Seeds", true, false ); - this->_ConfigureOutput< _TPath >( "Output" ); -} - -// ------------------------------------------------------------------------- -fpaPlugins_ImageAlgorithms::ExtractPathFromMinimumSpanningTree:: -~ExtractPathFromMinimumSpanningTree( ) -{ -} - -// ------------------------------------------------------------------------- -void fpaPlugins_ImageAlgorithms::ExtractPathFromMinimumSpanningTree:: -_GenerateData( ) -{ - typedef fpa::Image::MinimumSpanningTree< 2 > _TMST2; - typedef fpa::Image::MinimumSpanningTree< 3 > _TMST3; - - auto mst2 = this->GetInputData< _TMST2 >( "MST" ); - auto mst3 = this->GetInputData< _TMST3 >( "MST" ); - if ( mst2 != NULL ) this->_GD0( mst2 ); - else if( mst3 != NULL ) this->_GD0( mst3 ); - else this->_Error( "Invalid input spanning tree." ); -} - -// ------------------------------------------------------------------------- -template< class _TMST > -void fpaPlugins_ImageAlgorithms::ExtractPathFromMinimumSpanningTree:: -_GD0( _TMST* mst ) -{ - typedef typename _TMST::IndexType _TIndex; - typedef typename _TMST::TPath _TPath; - - // Get seeds - std::vector< _TIndex > seeds; - auto points = this->GetInputData< vtkPolyData >( "Seeds" ); - if( points != NULL ) - { - if( points->GetNumberOfPoints( ) < 2 ) - this->_Error( "Not enough seeds (<2)." ); - - typename _TMST::PointType pnt; - typename _TMST::IndexType idx; - unsigned int dim = - ( _TMST::ImageDimension < 3 )? _TMST::ImageDimension: 3; - for( unsigned int i = 0; i < 2; ++i ) - { - double buf[ 3 ]; - points->GetPoint( i, buf ); - pnt.Fill( 0 ); - for( unsigned int d = 0; d < dim; ++d ) - pnt[ d ] = buf[ d ]; - if( mst->TransformPhysicalPointToIndex( pnt, idx ) ) - seeds.push_back( idx ); - - } // rof - - } // fi - - typename _TPath::Pointer path; - mst->GetPath( path, seeds[ 0 ], seeds[ 1 ] ); - this->GetOutput( "Output" )->SetITK( path ); -} - -// eof - $RCSfile$ diff --git a/plugins/ImageAlgorithms/ExtractPathFromMinimumSpanningTree.h b/plugins/ImageAlgorithms/ExtractPathFromMinimumSpanningTree.h deleted file mode 100644 index a331457..0000000 --- a/plugins/ImageAlgorithms/ExtractPathFromMinimumSpanningTree.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef __fpaPlugins_ImageAlgorithms__ExtractPathFromMinimumSpanningTree__h__ -#define __fpaPlugins_ImageAlgorithms__ExtractPathFromMinimumSpanningTree__h__ - -#include -#include - -namespace fpaPlugins_ImageAlgorithms -{ - /** - */ - class fpaPlugins_ImageAlgorithms_EXPORT ExtractPathFromMinimumSpanningTree - : public cpPlugins::Pipeline::ProcessObject - { - cpPluginsObject( - ExtractPathFromMinimumSpanningTree, - cpPlugins::Pipeline::ProcessObject, - fpaImageAlgorithms - ); - - protected: - template< class _TMST > - inline void _GD0( _TMST* mst ); - }; - -} // ecapseman - -#endif // __fpaPlugins_ImageAlgorithms__ExtractPathFromMinimumSpanningTree__h__ - -// eof - $RCSfile$ diff --git a/plugins/ImageAlgorithms/FastMarching.cxx b/plugins/ImageAlgorithms/FastMarching.cxx deleted file mode 100644 index 355c882..0000000 --- a/plugins/ImageAlgorithms/FastMarching.cxx +++ /dev/null @@ -1,96 +0,0 @@ -#include "FastMarching.h" -#include -#include - -#include - -// ------------------------------------------------------------------------- -fpaPlugins_ImageAlgorithms::FastMarching:: -FastMarching( ) - : Superclass( ) -{ - typedef cpPlugins::Pipeline::DataObject _TFunctor; - - this->_ConfigureInput< _TFunctor >( "VertexFunction", false, false ); - this->_ConfigureInput< _TFunctor >( "ConversionFunction", false, false ); - - std::vector< std::string > choices; - choices.push_back( "float" ); - choices.push_back( "double" ); - this->m_Parameters.ConfigureAsChoices( "ResultType", choices ); - this->m_Parameters.SetSelectedChoice( "ResultType", "float" ); -} - -// ------------------------------------------------------------------------- -fpaPlugins_ImageAlgorithms::FastMarching:: -~FastMarching( ) -{ -} - -// ------------------------------------------------------------------------- -void fpaPlugins_ImageAlgorithms::FastMarching:: -_GenerateData( ) -{ - auto o = this->GetInputData( "Input" ); - cpPlugins_Demangle_Image_ScalarPixels_AllDims_1( o, _GD0 ) - this->_Error( "Invalid input image." ); -} - -// ------------------------------------------------------------------------- -template< class _TImage > -void fpaPlugins_ImageAlgorithms::FastMarching:: -_GD0( _TImage* image ) -{ - typedef itk::Image< float, _TImage::ImageDimension > _TFloat; - typedef itk::Image< double, _TImage::ImageDimension > _TDouble; - - auto rtype = this->m_Parameters.GetSelectedChoice( "ResultType" ); - if ( rtype == "float" ) this->_GD1< _TImage, _TFloat >( image ); - else if( rtype == "double" ) this->_GD1< _TImage, _TDouble >( image ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputImage > -void fpaPlugins_ImageAlgorithms::FastMarching:: -_GD1( _TInputImage* image ) -{ - typedef cpPlugins::Pipeline::Functor _TFunctor; - typedef fpa::Image::FastMarching< _TInputImage, _TOutputImage > _TFilter; - typedef typename _TFilter::TConversionFunction _TConversionFunction; - typedef typename _TFilter::TVertexFunction _TVertexFunction; - - // Create filter - auto filter = this->_CreateITK< _TFilter >( ); - std::vector< typename _TInputImage::IndexType > seeds; - this->_ConfigureFilter( filter, image, seeds ); - - // Instantiate functors - auto cost_conversion = this->GetInputData< _TFunctor >( "ConversionFunction" ); - if( cost_conversion != NULL ) - { - cost_conversion->Instantiate( filter ); - auto cost_conversion_functor = cost_conversion->GetFunctor< _TConversionFunction >( ); - if( cost_conversion_functor != NULL ) - filter->SetConversionFunction( cost_conversion_functor ); - - } // fi - - auto vertex = this->GetInputData< _TFunctor >( "VertexFunction" ); - if( vertex != NULL ) - { - vertex->Instantiate( filter ); - auto vertex_functor = vertex->GetFunctor< _TVertexFunction >( ); - if( vertex_functor != NULL ) - filter->SetVertexFunction( vertex_functor ); - - } // fi - - // Finish filter's configuration - filter->ClearSeeds( ); - for( auto seed : seeds ) - filter->AddSeed( seed, ( typename _TOutputImage::PixelType )( 0 ) ); - filter->Update( ); - this->GetOutput( "Output" )->SetITK( filter->GetOutput( ) ); -} - -// eof - $RCSfile$ diff --git a/plugins/ImageAlgorithms/FastMarching.h b/plugins/ImageAlgorithms/FastMarching.h deleted file mode 100644 index 2bd6207..0000000 --- a/plugins/ImageAlgorithms/FastMarching.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef __fpaPlugins_ImageAlgorithms__FastMarching__h__ -#define __fpaPlugins_ImageAlgorithms__FastMarching__h__ - -#include - -namespace fpaPlugins_ImageAlgorithms -{ - /** - */ - class fpaPlugins_ImageAlgorithms_EXPORT FastMarching - : public BaseFilter - { - cpPluginsObject( FastMarching, BaseFilter, fpaImageAlgorithms ); - - protected: - template< class _TImage > - inline void _GD0( _TImage* image ); - - template< class _TInputImage, class _TOutputImage > - inline void _GD1( _TInputImage* image ); - }; - -} // ecapseman - -#endif // __fpaPlugins_ImageAlgorithms__FastMarching__h__ - -// eof - $RCSfile$ diff --git a/plugins/ImageAlgorithms/ImageAlgorithms.i b/plugins/ImageAlgorithms/ImageAlgorithms.i deleted file mode 100644 index a805d13..0000000 --- a/plugins/ImageAlgorithms/ImageAlgorithms.i +++ /dev/null @@ -1,50 +0,0 @@ -header #define ITK_MANUAL_INSTANTIATION - -*tinclude fpa/Image/Functors/SimpleNeighborhood:h|hxx -*instances fpa::Image::Functors::SimpleNeighborhood< itk::Image< #scalar_types#, #pdims# > > - -*cinclude fpa/Base/RegionGrow.hxx -*define all_int_types=#int_types#;#uint_types# -*tinclude fpa/Image/RegionGrow:h|hxx -*tinclude fpa/Image/MoriRegionGrowHelper:h|hxx -*tinclude fpa/Image/MoriRegionGrow:h|hxx -*instances fpa::Image::RegionGrow< itk::Image< #scalar_types#, #pdims# >, itk::Image< #all_int_types#, #pdims# > > -*instances fpa::Image::MoriRegionGrowHelper< itk::Image< #scalar_types#, #pdims# >, itk::Image< #all_int_types#, #pdims# > > -*instances fpa::Image::MoriRegionGrow< itk::Image< #scalar_types#, #pdims# >, itk::Image< #all_int_types#, #pdims# > > - -*cinclude fpa/Base/Dijkstra.hxx -*tinclude fpa/Image/Dijkstra:h|hxx -*instances fpa::Image::Dijkstra< itk::Image< #scalar_types#, #pdims# >, itk::Image< #real_types#, #pdims# > > - -*tinclude fpa/Image/SkeletonFilter:h|hxx -*instances fpa::Image::SkeletonFilter< itk::Image< #real_types#, #pdims# > > - - - -*define i_real=#real_types# -*define o_real=#real_types# - -*tinclude fpa/Image/Functors/SimpleDijkstraCost:h|hxx -*tinclude fpa/Base/Functors/Inverse:h|hxx -*tinclude fpa/Base/Functors/GaussianModel:h|hxx -*tinclude fpa/Image/Dijkstra:h|hxx -*tinclude fpa/Image/SkeletonFilter:h|hxx -*tinclude fpa/Image/Functors/RegionGrowBinaryThreshold:h|hxx - -*cinclude itkImage.h -*cinclude itkSimpleDataObjectDecorator.hxx -*cinclude fpa/Base/Dijkstra.hxx - -*instances fpa::Image::Functors::SimpleNeighborhood< itk::Image< #scalar_pixels#, #process_dims# > > -*instances fpa::Image::Functors::SimpleDijkstraCost< itk::Image< #scalar_pixels#, #process_dims# >, #real_types# > -*instances fpa::Image::Functors::RegionGrowBinaryThreshold< itk::Image< #scalar_pixels#, #process_dims# > > - -*instances fpa::Base::Functors::Inverse< #i_real#, #o_real# > -*instances fpa::Base::Functors::GaussianModel< #i_real#, #o_real# > - -*instances fpa::Image::Dijkstra< itk::Image< #scalar_pixels#, #process_dims# >, itk::Image< #real_types#, #process_dims# > > -*instances fpa::Image::RegionGrow< itk::Image< #scalar_pixels#, #process_dims# >, itk::Image< #int_types#, #process_dims# > > -*instances fpa::Image::RegionGrow< itk::Image< #scalar_pixels#, #process_dims# >, itk::Image< #uint_types#, #process_dims# > > -*instances fpa::Image::SkeletonFilter< itk::Image< #real_types#, #process_dims# > > - -** eof - $RCSfile$ diff --git a/plugins/ImageAlgorithms/RegionGrow.cxx b/plugins/ImageAlgorithms/RegionGrow.cxx deleted file mode 100644 index bd0fc74..0000000 --- a/plugins/ImageAlgorithms/RegionGrow.cxx +++ /dev/null @@ -1,87 +0,0 @@ -#include "RegionGrow.h" -#include -#include - -#include - -// ------------------------------------------------------------------------- -fpaPlugins_ImageAlgorithms::RegionGrow:: -RegionGrow( ) - : Superclass( ) -{ - typedef cpPlugins::Pipeline::DataObject _TFunctor; - typedef cpInstances::DataObjects::Image _TMST; - - this->_ConfigureInput< _TFunctor >( "GrowFunction", true, false ); - this->m_Parameters.ConfigureAsInt( "InsideValue", 1 ); - this->m_Parameters.ConfigureAsInt( "OutsideValue", 0 ); - this->m_Parameters.ConfigureAsIntTypesChoices( "ResultType" ); -} - -// ------------------------------------------------------------------------- -fpaPlugins_ImageAlgorithms::RegionGrow:: -~RegionGrow( ) -{ -} - -// ------------------------------------------------------------------------- -void fpaPlugins_ImageAlgorithms::RegionGrow:: -_GenerateData( ) -{ - auto o = this->GetInputData( "Input" ); - cpPlugins_Demangle_Image_ScalarPixels_AllDims_1( o, _GD0 ) - this->_Error( "Invalid input image." ); -} - -// ------------------------------------------------------------------------- -template< class _TImage > -void fpaPlugins_ImageAlgorithms::RegionGrow:: -_GD0( _TImage* image ) -{ - auto rtype = this->m_Parameters.GetSelectedChoice( "ResultType" ); - if( rtype == "char" ) this->_GD1< _TImage, char >( image ); - else if( rtype == "uchar" ) this->_GD1< _TImage, unsigned char >( image ); - else if( rtype == "short" ) this->_GD1< _TImage, short >( image ); - else if( rtype == "ushort" ) this->_GD1< _TImage, unsigned short >( image ); - else if( rtype == "int" ) this->_GD1< _TImage, int >( image ); - else if( rtype == "uint" ) this->_GD1< _TImage, unsigned int >( image ); - else if( rtype == "long" ) this->_GD1< _TImage, long >( image ); - else if( rtype == "ulong" ) this->_GD1< _TImage, unsigned long >( image ); - else this->_GD1< _TImage, char >( image ); -} - -// ------------------------------------------------------------------------- -template< class _TInputImage, class _TOutputPixel > -void fpaPlugins_ImageAlgorithms::RegionGrow:: -_GD1( _TInputImage* image ) -{ - typedef cpPlugins::Pipeline::Functor _TFunctor; - typedef itk::Image< _TOutputPixel, _TInputImage::ImageDimension > _TOutputImage; - typedef fpa::Image::RegionGrow< _TInputImage, _TOutputImage > _TFilter; - typedef typename _TFilter::TGrowFunction _TGrowFunction; - - // Create filter - auto filter = this->_CreateITK< _TFilter >( ); - std::vector< typename _TInputImage::IndexType > seeds; - this->_ConfigureFilter( filter, image, seeds ); - - // Instantiate functors - auto growfunc = this->GetInputData< _TFunctor >( "GrowFunction" ); - if( growfunc != NULL ) - { - growfunc->Instantiate( filter ); - auto growfunc_functor = growfunc->GetFunctor< _TGrowFunction >( ); - if( growfunc_functor != NULL ) - filter->SetGrowFunction( growfunc_functor ); - - } // fi - - // Finish filter's configuration - filter->ClearSeeds( ); - for( auto seed : seeds ) - filter->AddSeed( seed, ( typename _TOutputImage::PixelType )( 0 ) ); - filter->Update( ); - this->GetOutput( "Output" )->SetITK( filter->GetOutput( ) ); -} - -// eof - $RCSfile$ diff --git a/plugins/ImageAlgorithms/RegionGrow.h b/plugins/ImageAlgorithms/RegionGrow.h deleted file mode 100644 index c9e59a7..0000000 --- a/plugins/ImageAlgorithms/RegionGrow.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef __fpaPlugins_ImageAlgorithms__RegionGrow__h__ -#define __fpaPlugins_ImageAlgorithms__RegionGrow__h__ - -#include - -namespace fpaPlugins_ImageAlgorithms -{ - /** - */ - class fpaPlugins_ImageAlgorithms_EXPORT RegionGrow - : public BaseFilter - { - cpPluginsObject( RegionGrow, BaseFilter, fpaImageAlgorithms ); - - protected: - template< class _TImage > - inline void _GD0( _TImage* image ); - - template< class _TInputImage, class _TOutputPixel > - inline void _GD1( _TInputImage* image ); - }; - -} // ecapseman - -#endif // __fpaPlugins_ImageAlgorithms__RegionGrow__h__ - -// eof - $RCSfile$ diff --git a/plugins/ImageFunctors/BinaryThreshold.cxx b/plugins/ImageFunctors/BinaryThreshold.cxx deleted file mode 100644 index 4d4589e..0000000 --- a/plugins/ImageFunctors/BinaryThreshold.cxx +++ /dev/null @@ -1,90 +0,0 @@ -#include "BinaryThreshold.h" - -#include - -#include -#include - -// ------------------------------------------------------------------------- -void fpaPlugins_ImageFunctors::BinaryThreshold:: -Instantiate( itk::LightObject* filter ) -{ - auto itk_filter = dynamic_cast< itk::ProcessObject* >( filter ); - if( itk_filter != NULL ) - { - auto inputs = itk_filter->GetInputs( ); - if( inputs.size( ) > 0 ) - { - cpPlugins_Demangle_Image_ScalarPixels_AllDims_2( - inputs[ 0 ].GetPointer( ), _GD0, itk_filter - ) - this->_Error( "Invalid input data." ); - } - else - this->_Error( "Not enough inputs." ); - } - else - this->_Error( "Invalid instantiation filter." ); -} - -// ------------------------------------------------------------------------- -fpaPlugins_ImageFunctors::BinaryThreshold:: -BinaryThreshold( ) - : Superclass( ) -{ - this->_ConfigureOutput< cpPlugins::Pipeline::DataObject >( "Functor" ); - this->GetOutput( "Functor" )->SetITK( this ); - this->m_Parameters.ConfigureAsReal( "Lower", 0 ); - this->m_Parameters.ConfigureAsReal( "Upper", 1 ); -} - -// ------------------------------------------------------------------------- -fpaPlugins_ImageFunctors::BinaryThreshold:: -~BinaryThreshold( ) -{ -} - -// ------------------------------------------------------------------------- -void fpaPlugins_ImageFunctors::BinaryThreshold:: -_GenerateData( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TInput > -void fpaPlugins_ImageFunctors::BinaryThreshold:: -_GD0( _TInput* input, itk::ProcessObject* filter ) -{ - auto outputs = filter->GetOutputs( ); - if( outputs.size( ) > 0 ) - { - cpPlugins_Demangle_Image_IntPixels_3( - outputs[ 0 ].GetPointer( ), _GD1, _TInput::ImageDimension, input, filter - ) - this->_Error( "Invalid output data." ); - } - else - this->_Error( "Not enough outputs." ); -} - -// ------------------------------------------------------------------------- -template< class _TInput, class _TOutput > -void fpaPlugins_ImageFunctors::BinaryThreshold:: -_GD1( _TOutput* output, _TInput* input, itk::ProcessObject* filter ) -{ - typedef typename _TOutput::PixelType _TValue; - typedef fpa::Image::Functors::RegionGrow::BinaryThreshold< _TInput, _TValue > _TFunctor; - - auto f = dynamic_cast< _TFunctor* >( this->m_Functor.GetPointer( ) ); - if( f == NULL ) - { - typename _TFunctor::Pointer ptr_f = _TFunctor::New( ); - f = ptr_f.GetPointer( ); - this->m_Functor = f; - - } // fi - f->SetLower( this->m_Parameters.GetReal( "Lower" ) ); - f->SetUpper( this->m_Parameters.GetReal( "Upper" ) ); -} - -// eof - $RCSfile$ diff --git a/plugins/ImageFunctors/BinaryThreshold.h b/plugins/ImageFunctors/BinaryThreshold.h deleted file mode 100644 index 73cdad1..0000000 --- a/plugins/ImageFunctors/BinaryThreshold.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef __fpaPlugins_ImageFunctors__BinaryThreshold__h__ -#define __fpaPlugins_ImageFunctors__BinaryThreshold__h__ - -#include -#include -#include - -namespace fpaPlugins_ImageFunctors -{ - /** - */ - class fpaPlugins_ImageFunctors_EXPORT BinaryThreshold - : public cpPlugins::Pipeline::Functor - { - cpPluginsObject( BinaryThreshold, cpPlugins::Pipeline::Functor, fpaImageFunctors ); - - public: - virtual void Instantiate( itk::LightObject* filter ) override; - - protected: - template< class _TInput > - inline void _GD0( _TInput* input, itk::ProcessObject* filter ); - - template< class _TInput, class _TOutput > - inline void _GD1( _TOutput* output, _TInput* input, itk::ProcessObject* filter ); - }; - -} // ecapseman - -#endif // __fpaPlugins_ImageFunctors__BinaryThreshold__h__ - -// eof - $RCSfile$ diff --git a/plugins/ImageFunctors/Tautology.cxx b/plugins/ImageFunctors/Tautology.cxx deleted file mode 100644 index 6763602..0000000 --- a/plugins/ImageFunctors/Tautology.cxx +++ /dev/null @@ -1,87 +0,0 @@ -#include "Tautology.h" - -#include - -#include -#include - -// ------------------------------------------------------------------------- -void fpaPlugins_ImageFunctors::Tautology:: -Instantiate( itk::LightObject* filter ) -{ - auto itk_filter = dynamic_cast< itk::ProcessObject* >( filter ); - if( itk_filter != NULL ) - { - auto inputs = itk_filter->GetInputs( ); - if( inputs.size( ) > 0 ) - { - cpPlugins_Demangle_Image_ScalarPixels_AllDims_2( - inputs[ 0 ].GetPointer( ), _GD0, itk_filter - ) - this->_Error( "Invalid input data." ); - } - else - this->_Error( "Not enough inputs." ); - } - else - this->_Error( "Invalid instantiation filter." ); -} - -// ------------------------------------------------------------------------- -fpaPlugins_ImageFunctors::Tautology:: -Tautology( ) - : Superclass( ) -{ - this->_ConfigureOutput< cpPlugins::Pipeline::DataObject >( "Functor" ); - this->GetOutput( "Functor" )->SetITK( this ); -} - -// ------------------------------------------------------------------------- -fpaPlugins_ImageFunctors::Tautology:: -~Tautology( ) -{ -} - -// ------------------------------------------------------------------------- -void fpaPlugins_ImageFunctors::Tautology:: -_GenerateData( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TInput > -void fpaPlugins_ImageFunctors::Tautology:: -_GD0( _TInput* input, itk::ProcessObject* filter ) -{ - auto outputs = filter->GetOutputs( ); - if( outputs.size( ) > 0 ) - { - cpPlugins_Demangle_Image_IntPixels_3( - outputs[ 0 ].GetPointer( ), _GD1, _TInput::ImageDimension, input, filter - ) - this->_Error( "Invalid output data." ); - } - else - this->_Error( "Not enough outputs." ); -} - -// ------------------------------------------------------------------------- -template< class _TInput, class _TOutput > -void fpaPlugins_ImageFunctors::Tautology:: -_GD1( _TOutput* output, _TInput* input, itk::ProcessObject* filter ) -{ - typedef typename _TInput::IndexType _TVertex; - typedef typename _TOutput::PixelType _TValue; - typedef fpa::Base::Functors::RegionGrow::Tautology< _TVertex, _TValue > _TFunctor; - - auto f = dynamic_cast< _TFunctor* >( this->m_Functor.GetPointer( ) ); - if( f == NULL ) - { - typename _TFunctor::Pointer ptr_f = _TFunctor::New( ); - f = ptr_f.GetPointer( ); - this->m_Functor = f; - - } // fi -} - -// eof - $RCSfile$ diff --git a/plugins/ImageFunctors/Tautology.h b/plugins/ImageFunctors/Tautology.h deleted file mode 100644 index 1a846c1..0000000 --- a/plugins/ImageFunctors/Tautology.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef __fpaPlugins_ImageFunctors__Tautology__h__ -#define __fpaPlugins_ImageFunctors__Tautology__h__ - -#include -#include -#include - -namespace fpaPlugins_ImageFunctors -{ - /** - */ - class fpaPlugins_ImageFunctors_EXPORT Tautology - : public cpPlugins::Pipeline::Functor - { - cpPluginsObject( Tautology, cpPlugins::Pipeline::Functor, fpaImageFunctors ); - - public: - virtual void Instantiate( itk::LightObject* filter ) override; - - protected: - template< class _TInput > - inline void _GD0( _TInput* input, itk::ProcessObject* filter ); - - template< class _TInput, class _TOutput > - inline void _GD1( _TOutput* output, _TInput* input, itk::ProcessObject* filter ); - }; - -} // ecapseman - -#endif // __fpaPlugins_ImageFunctors__Tautology__h__ - -// eof - $RCSfile$ diff --git a/plugins/ImageFunctors/VertexCost.cxx b/plugins/ImageFunctors/VertexCost.cxx deleted file mode 100644 index 222cdb5..0000000 --- a/plugins/ImageFunctors/VertexCost.cxx +++ /dev/null @@ -1,89 +0,0 @@ -#include "VertexCost.h" - -#include - -#include -#include - -// ------------------------------------------------------------------------- -void fpaPlugins_ImageFunctors::VertexCost:: -Instantiate( itk::LightObject* filter ) -{ - auto itk_filter = dynamic_cast< itk::ProcessObject* >( filter ); - if( itk_filter != NULL ) - { - auto inputs = itk_filter->GetInputs( ); - if( inputs.size( ) > 0 ) - { - cpPlugins_Demangle_Image_ScalarPixels_AllDims_2( - inputs[ 0 ].GetPointer( ), _GD0, itk_filter - ) - this->_Error( "Invalid input data." ); - } - else - this->_Error( "Not enough inputs." ); - } - else - this->_Error( "Invalid instantiation filter." ); -} - -// ------------------------------------------------------------------------- -fpaPlugins_ImageFunctors::VertexCost:: -VertexCost( ) - : Superclass( ) -{ - this->_ConfigureOutput< cpPlugins::Pipeline::DataObject >( "Functor" ); - this->m_Parameters.ConfigureAsBool( "UseImageSpacing", false ); - this->GetOutput( "Functor" )->SetITK( this ); -} - -// ------------------------------------------------------------------------- -fpaPlugins_ImageFunctors::VertexCost:: -~VertexCost( ) -{ -} - -// ------------------------------------------------------------------------- -void fpaPlugins_ImageFunctors::VertexCost:: -_GenerateData( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TInput > -void fpaPlugins_ImageFunctors::VertexCost:: -_GD0( _TInput* input, itk::ProcessObject* filter ) -{ - auto outputs = filter->GetOutputs( ); - if( outputs.size( ) > 0 ) - { - cpPlugins_Demangle_Image_ScalarPixels_3( - outputs[ 0 ].GetPointer( ), _GD1, _TInput::ImageDimension, input, filter - ) - this->_Error( "Invalid output data." ); - } - else - this->_Error( "Not enough outputs." ); -} - -// ------------------------------------------------------------------------- -template< class _TInput, class _TOutput > -void fpaPlugins_ImageFunctors::VertexCost:: -_GD1( _TOutput* output, _TInput* input, itk::ProcessObject* filter ) -{ - typedef typename _TInput::PixelType _TIValue; - typedef typename _TOutput::PixelType _TOValue; - typedef fpa::Image::Functors::VertexCost< _TInput, _TOValue > _TFunctor; - - auto f = dynamic_cast< _TFunctor* >( this->m_Functor.GetPointer( ) ); - if( f == NULL ) - { - typename _TFunctor::Pointer ptr_f = _TFunctor::New( ); - f = ptr_f.GetPointer( ); - this->m_Functor = f; - - } // fi - f->SetUseImageSpacing( this->m_Parameters.GetReal( "UseImageSpacing" ) ); -} - -// eof - $RCSfile$ diff --git a/plugins/ImageFunctors/VertexCost.h b/plugins/ImageFunctors/VertexCost.h deleted file mode 100644 index 7a0bc14..0000000 --- a/plugins/ImageFunctors/VertexCost.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef __fpaPlugins_ImageFunctors__VertexCost__h__ -#define __fpaPlugins_ImageFunctors__VertexCost__h__ - -#include -#include -#include - -namespace fpaPlugins_ImageFunctors -{ - /** - */ - class fpaPlugins_ImageFunctors_EXPORT VertexCost - : public cpPlugins::Pipeline::Functor - { - cpPluginsObject( VertexCost, cpPlugins::Pipeline::Functor, fpaImageFunctors ); - - public: - virtual void Instantiate( itk::LightObject* filter ) override; - - protected: - template< class _TInput > - inline void _GD0( _TInput* input, itk::ProcessObject* filter ); - - template< class _TInput, class _TOutput > - inline void _GD1( _TOutput* output, _TInput* input, itk::ProcessObject* filter ); - }; - -} // ecapseman - -#endif // __fpaPlugins_ImageFunctors__VertexCost__h__ - -// eof - $RCSfile$ diff --git a/plugins/RegionGrowFunctors/BinaryThreshold.cxx b/plugins/RegionGrowFunctors/BinaryThreshold.cxx deleted file mode 100644 index 3a4da31..0000000 --- a/plugins/RegionGrowFunctors/BinaryThreshold.cxx +++ /dev/null @@ -1,125 +0,0 @@ -#include -#include - -#include -#include -#include - -// ------------------------------------------------------------------------- -fpaPluginsRegionGrowFunctors::BinaryThreshold:: -BinaryThreshold( ) - : Superclass( ) -{ - typedef cpPlugins::Pipeline::DataObject _TData; - typedef cpInstances::DataObjects::Image _TImage; - - this->_ConfigureInput< _TImage >( "Input", true, false ); - this->_ConfigureInput< _TData >( "Seeds", false, false ); - this->_ConfigureOutput< _TData >( "Output" ); - - this->m_Parameters.ConfigureAsUint( "Radius", 1 ); - this->m_Parameters.ConfigureAsReal( "Lower", 0 ); - this->m_Parameters.ConfigureAsReal( "Upper", 0 ); -} - -// ------------------------------------------------------------------------- -fpaPluginsRegionGrowFunctors::BinaryThreshold:: -~BinaryThreshold( ) -{ -} - -// ------------------------------------------------------------------------- -void fpaPluginsRegionGrowFunctors::BinaryThreshold:: -_GenerateData( ) -{ - auto o = this->GetInputData( "Input" ); - cpPlugins_Demangle_Image_ScalarPixels_AllDims_1( o, _GD0 ) - this->_Error( "Invalid input image." ); -} - -// ------------------------------------------------------------------------- -template< class _TImage > -void fpaPluginsRegionGrowFunctors::BinaryThreshold:: -_GD0( _TImage* image ) -{ - /* TODO - typedef itk::ConstNeighborhoodIterator< _TImage > _TInIt; - typedef - fpa::Image::Functors::RegionGrow::BinaryThreshold< _TImage > - _TFunctor; - auto out = this->GetOutput( "Output" ); - auto f = out->GetITK< _TFunctor >( ); - if( f == NULL ) - { - typename _TFunctor::Pointer ptr_f = _TFunctor::New( ); - f = ptr_f.GetPointer( ); - out->SetITK( f ); - - } // fi - - // Compute thresholds from seeds - auto seeds = this->GetInputData< vtkPolyData >( "Seeds" ); - if( seeds != NULL ) - { - std::vector< typename _TImage::IndexType > indices; - typename _TImage::PointType pnt; - typename _TImage::IndexType idx; - unsigned int dim = - ( _TImage::ImageDimension < 3 )? _TImage::ImageDimension: 3; - - for( int i = 0; i < seeds->GetNumberOfPoints( ); ++i ) - { - double buf[ 3 ]; - seeds->GetPoint( i, buf ); - pnt.Fill( 0 ); - for( unsigned int d = 0; d < dim; ++d ) - pnt[ d ] = buf[ d ]; - if( image->TransformPhysicalPointToIndex( pnt, idx ) ) - indices.push_back( idx ); - - } // rof - - typename _TImage::SizeType r; - r.Fill( this->m_Parameters.GetUint( "Radius" ) ); - - _TInIt iIt( r, image, image->GetRequestedRegion( ) ); - double v_s1 = double( 0 ); - double v_s2 = double( 0 ); - double v_n = double( 0 ); - double v_min = std::numeric_limits< double >::max( ); - double v_max = -v_min; - for( auto idxIt = indices.begin( ); idxIt != indices.end( ); ++idxIt ) - { - iIt.SetLocation( *idxIt ); - for( unsigned int i = 0; i < iIt.Size( ); ++i ) - { - double v = double( iIt.GetPixel( i ) ); - v_s1 += v; - v_s2 += v * v; - v_n += double( 1 ); - v_min = ( v < v_min )? v: v_min; - v_max = ( v_max < v )? v: v_max; - - } // rof - - } // rof - double m = v_s1 / v_n; - double s = ( v_s2 - ( ( v_s1 * v_s1 ) / v_n ) ) / ( v_n - double( 1 ) ); - s = std::sqrt( s ); - v_min = m - s; - v_max = m + s; - f->SetLower( v_min ); - f->SetUpper( v_max ); - this->m_Parameters.SetReal( "Lower", f->GetLower( ) ); - this->m_Parameters.SetReal( "Upper", f->GetUpper( ) ); - } - else - { - f->SetLower( this->m_Parameters.GetReal( "Lower" ) ); - f->SetUpper( this->m_Parameters.GetReal( "Upper" ) ); - - } // fi - */ -} - -// eof - $RCSfile$ diff --git a/plugins/RegionGrowFunctors/BinaryThreshold.h b/plugins/RegionGrowFunctors/BinaryThreshold.h deleted file mode 100644 index cc5a814..0000000 --- a/plugins/RegionGrowFunctors/BinaryThreshold.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef __fpaPluginsRegionGrowFunctors__BinaryThreshold__h__ -#define __fpaPluginsRegionGrowFunctors__BinaryThreshold__h__ - -#include -#include - -namespace fpaPluginsRegionGrowFunctors -{ - /** - */ - class fpaPluginsRegionGrowFunctors_EXPORT BinaryThreshold - : public cpPlugins::Pipeline::ProcessObject - { - cpPluginsObject( - BinaryThreshold, - cpPlugins::Pipeline::ProcessObject, - fpaRegionGrowFunctors - ); - - protected: - template< class _TImage > - inline void _GD0( _TImage* image ); - }; - -} // ecapseman - -#endif // __fpaPluginsRegionGrowFunctors__BinaryThreshold__h__ - -// eof - $RCSfile$ diff --git a/plugins/RegionGrowFunctors/RegionGrowFunctors.i b/plugins/RegionGrowFunctors/RegionGrowFunctors.i deleted file mode 100644 index 8279950..0000000 --- a/plugins/RegionGrowFunctors/RegionGrowFunctors.i +++ /dev/null @@ -1,7 +0,0 @@ -header #define ITK_MANUAL_INSTANTIATION - -cinclude itkImage.h -tinclude fpa/Image/Functors/RegionGrow/BinaryThreshold:h|hxx -** instances fpa::Image::Functors::RegionGrow::BinaryThreshold< itk::Image< #scalar_types#, #pdims# > > - -** eof - $RCSfile$ -- 2.45.0