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 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

)-uEh$K3! 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%0AtAM0UI34k8fKr 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 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.47.1