+++ /dev/null
-CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
-INCLUDE(cmake/fpa_Policies.cmake)
-
-## ==================
-## == Project name ==
-## ==================
-
-PROJECT(FrontAlgorithms)
-SET(prj_MAJ_VER "0")
-SET(prj_MIN_VER "1")
-SET(prj_REL_VER "0")
-SET(prj_VER "${prj_MAJ_VER}.${prj_MIN_VER}.${prj_REL_VER}")
-SET(prj_sVER "${prj_MAJ_VER}")
-
-## =====================
-## == Main dependency ==
-## =====================
-
-FIND_PACKAGE(cpPlugins REQUIRED)
-
-## =============
-## == Options ==
-## =============
-
-OPTION(BUILD_PLUGINS "Build plugins" ON)
-OPTION(BUILD_TempAirwaysAppli "Build temporary appli" OFF)
-
-## =========================
-## == Include directories ==
-## =========================
-
-INCLUDE_DIRECTORIES(
- ${PROJECT_SOURCE_DIR}
- ${PROJECT_BINARY_DIR}
- ${PROJECT_SOURCE_DIR}/lib
- ${PROJECT_BINARY_DIR}/lib
- ${PROJECT_SOURCE_DIR}/lib/fpa_Instances
- ${PROJECT_BINARY_DIR}/lib/fpa_Instances
- ${PROJECT_SOURCE_DIR}/plugins
- ${PROJECT_BINARY_DIR}/plugins
- )
-
-## =============================
-## == Subdirs containing code ==
-## =============================
-
-SUBDIRS(
- cmake
- lib
- plugins
- appli
- )
-
-## eof - $RCSfile$
+++ /dev/null
-@description
- The project uses CMake as compilation helper. It should compile on the three
- major box flavors (linux, windows, mac). However, as of december 2014, it
- has only been tested on linux Fedora 20 and Ubuntu 14.04.
-
-@prerequisites
- 1. CMake (>=2.8.12.2)
-
- 3. Insight Toolkit -ITK- (>=4.6.0)
- 3.1 Required cmake flags:
- BUILD_SHARED_LIBS:BOOL=ON
- 3.2 [OPTIONAL] If USE_VTK=ON
- Module_ITKVtkGlue:BOOL=ON
-
- 4. [OPTIONAL] Visualization Toolkit -VTK- (>=6.1.0)
- 4.1 Required cmake flags:
- BUILD_SHARED_LIBS:BOOL=ON
-
- 5. [OPTIONAL] cpPlugins (>=0.0.1)
- 5.1 Required cmake flags:
- BUILD_SHARED_LIBS:BOOL=ON
-
-@cmake_flags
- BUILD_EXAMPLES:BOOL
- Build example applications? (most of them are command line)
- CMAKE_BUILD_TYPE:STRING
- Debug/Release?
- CMAKE_INSTALL_PREFIX:STRING
- Where to put installation products? (in windows this option has no use)
-
-## eof - $RCSfile$
+++ /dev/null
-
-@project
- FrontAlgorithms: Generic implementation of front propagation algorithms
- with some extra features
-
-@version
- 0.0.1 (2014-12-31)
-
-@authors
- Maciej ORKISZ (maciej.orkisz@creatis.insa-lyon.fr)
- Leonardo FLOREZ-VALENCIA (florez-l@javeriana.edu.co)
- <Who else?>
-
-@description
- <Write a fancy description and some historical notes>
-
-@license
- <What do we put here?>
-
-
-## eof - $RCSfile$
+++ /dev/null
-
-IF(BUILD_TempAirwaysAppli)
- SUBDIRS(
- TempAirwaysAppli
- )
-ENDIF(BUILD_TempAirwaysAppli)
-
-## eof - $RCSfile$
+++ /dev/null
-
-## Find Boost
-FIND_PACKAGE(Boost REQUIRED system filesystem program_options)
-INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
-
-INCLUDE_DIRECTORIES(
- ${PROJECT_SOURCE_DIR}/lib/Airways/MathLib
- ${PROJECT_SOURCE_DIR}/lib/Airways/AirwaysLib
- ${PROJECT_BINARY_DIR}/lib/Airways/MathLib
- ${PROJECT_BINARY_DIR}/lib/Airways/AirwaysLib
- )
-ADD_EXECUTABLE(TempAirwaysAppli TempAirwaysAppli.cxx)
-TARGET_LINK_LIBRARIES(
- TempAirwaysAppli
- ${Boost_LIBRARIES} TempAirwaysAppli_AirwaysLib
- cpPlugins
- ${fpa_LIBRARIES}
- )
-
-## eof - $RCSfile$
+++ /dev/null
-#include <iostream>
-#include <cstdlib>
-#include <sstream>
-
-#include <boost/filesystem.hpp>
-#include <boost/program_options.hpp>
-
-#include "vec3.h"
-#include "airwaysTree.h"
-
-#include <cpPlugins/Interface.h>
-#include <cpPlugins/Workspace.h>
-
-using namespace airways;
-namespace po = boost::program_options;
-
-namespace
-{
- const size_t ERROR_IN_COMMAND_LINE = 1;
- const size_t SUCCESS = 0;
- const size_t ERROR_UNHANDLED_EXCEPTION = 2;
-} // namespace
-
-typedef std::vector< AirwaysTree > AirwaysVector;
-
-// Auxiliar struct to save info for execution.
-typedef void* TImagePointer;
-struct TreeInfo{
-
- TreeInfo( )
- {
- this->myWorkspace = new cpPlugins::Workspace( );
- }
- ~TreeInfo( )
- {
- /*
- if( this->IsMyWorkspace )
- delete this->myWorkspace;
- */
- }
-
- void CastImage( )
- {
- try
- {
- this->myWorkspace->Execute( "cast" );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr << "Error: " << err << std::endl;
- std::exit( 1 );
-
- } // yrt
- this->Image =
- this->myWorkspace->GetFilter( "cast" )->GetOutputData( "Output" )->
- GetITK< TInputImage >( );
- }
-
- TInputImage::Pointer Image;
- cpPlugins::Workspace* myWorkspace;
- bool IsMyWorkspace;
- Vec3 seed;
- std::string folderpath_pigResults;
- std::string pig_name;
- std::string image_name;
-
-};
-// Constants
-unsigned char red[3] = { 255, 0, 0 };
-unsigned char green[3] = { 0, 255, 0 };
-unsigned char blue[3] = { 0, 0, 255 };
-unsigned char yellow[3]= { 255, 255, 0 };
-unsigned char purple[3]= { 255, 0, 255 };
-unsigned char cyan[3]= { 0, 255, 255 };
-
-cpPlugins::Interface myPlugins;
-
-// -------------------------------------------------------------------------
-void Load_cpPlugins( const std::string& plugins );
-void CreateResultDirectory(AirwaysTree tree);
-void DrawVTKLinesFromTree(AirwaysTree& tree, const std::string filename, bool common);
-AirwaysTree& CreateAirwaysTreeFromSegmentation(Vec3 seed, TInputImage* input_image, cpPlugins::Workspace& ws );
-vector<TreeInfo> ReadInputFile(const char* filename);
-void printCommonTreeBetweenTwoTrees(AirwaysTree tree_A, AirwaysTree tree_B, std::vector< std::pair< std::pair<Node*, Node*>, std::pair<Node*, Node*> > > vector_pair_edges_A_to_B, unsigned int Q, unsigned int F);
-void printMatchingResultToFile(AirwaysTree tree_A, AirwaysTree tree_B, std::map< unsigned int, std::vector<Node*> > map_A_to_B, std::map< unsigned int, std::vector<Node*> > map_B_to_A, unsigned int Q, unsigned int F);
-void createLinesAndPointsForVTK(const Node* node, vtkSmartPointer<vtkPoints>& pts,vtkSmartPointer<vtkCellArray>& lines, vtkSmartPointer<vtkUnsignedCharArray>& colors, bool common, bool isRoot);
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- Load_cpPlugins( "./plugins.cfg" );
-
- try
- {
- // Define and parse the program options
- po::options_description desc("Options");
- desc.add_options()("use_file", po::value<std::string>(), "Adds the filepath containing the file to be used in creaAirwaysTree -- Mandatory")
- ("build_trees","Creates trees from a given filepath (arg) and stores it in a .vtk file")
- ("subtree_levels", po::value<int>(),"Get a subtree(s) by levels - result: a vtk and reconstructed img .mhd")
- ("subtree_length", po::value<float>(),"Get a subtree(s) by length - result: a vtk and reconstructed img .mhd")
- ("subtree_diameter", po::value<float>(),"Get a subtree(s) by diameter - result: a vtk and reconstructed img .mhd")
- ("compare_trees", "Compare the trees given in the input file or the subtrees using an option - result: a vtk and reconstructed img .mhd");
- //TODO: Fix image segmentation. ("segment_images", "Creates a binary image corresponding to the segmentation of of a given original image (arg) and seed (arg), saves it to a .mhd file and uses it for subsequent operations")
- po::variables_map vm;
- try
- {
- std::string fileName;
- vector<TreeInfo> treeInfoVector;
- AirwaysVector aVector;
- TImagePointer segmentationImage;
- Vec3 seed;
- po::store(po::parse_command_line(argc, argv, desc), vm); // can throw
- if (vm.count("use_file"))
- {
- fileName = vm["use_file"].as<std::string>();
- treeInfoVector = ReadInputFile(fileName.c_str());
- }
-
- if(vm.count("segment_images"))
- {
- }
-
- // Build trees option
- if (vm.count("build_trees"))
- {
- for(unsigned int i = 0; i < treeInfoVector.size(); ++ i){
- TreeInfo info = treeInfoVector[i];
- try
- {
- info.myWorkspace->PrintExecutionOn( );
- info.myWorkspace->Execute( "eb" );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr << "Error: " << err << std::endl;
- std::exit( 1 );
-
- } // fi
- info.CastImage( );
- AirwaysTree tree = CreateAirwaysTreeFromSegmentation( info.seed, info.Image, *(info.myWorkspace ));
- tree.SetResultPath(info.folderpath_pigResults);
- tree.SetImageName(info.image_name);
- aVector.push_back(tree);
- }
- for (unsigned int i = 0; i < aVector.size(); ++i)
- {
- CreateResultDirectory(aVector[i]);
- std::string fullPath = aVector[i].GetResultPath() + "/" + aVector[i].GetImageName() + ".vtk";
- DrawVTKLinesFromTree(aVector[i], fullPath, false);
-
- } //for
- } //if
-
- // Subtree levels option
- if (vm.count("subtree_levels"))
- {
- } //if
- else if (vm.count("subtree_length"))
- {
- } //if
- else if (vm.count("subtree_diameter"))
- {
- } //if
-
- if (vm.count("compare_trees"))
- {
- std::cout << "Option: Compare trees" << std::endl;
- /**
- * this piece of code only test in the case of two trees, so it can be replaced
- * to a code which does a cascade
- */
-
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- //CODIGO DE COMPARACIÓN DE ARBOLES
- //std::cout << "Comparing trees ..." << std::endl;
- //aVector[0].CompareTrees(aVector[1]);
- //std::cout << "Comparing trees ... OK" << std::endl;
-
- std::cout << "Tree A ... " << std::endl;
- //aVector[0].printNodeAndChildrenIds();
- std::cout << "Tree A ... OK" << std::endl;
-
- std::cout << "Tree B ... " << std::endl;
- //aVector[1].printNodeAndChildrenIds();
- std::cout << "Tree B ... OK" << std::endl;
-
- std::cout << "Comparing trees Orkisz-Morales..." << std::endl;
- // Vectors to save the common and uncommon nodes
- vec_nodes commonA;
- vec_nodes commonB;
- vec_nodes nonCommonA;
- vec_nodes nonCommonB;
- std::map< unsigned int, std::vector<Node*> > map_A_to_B;
- std::map< unsigned int, std::vector<Node*> > map_B_to_A;
- std::vector< std::pair< std::pair<Node*, Node*>, std::pair<Node*, Node*> > > vector_pair_edges_A_to_B;
-
- // Input parameter for comparison
- unsigned int Q = 1; // Corresponds to the depth to select "fathers" nodes
- unsigned int F = 1; // Correspond to the depth to select "family" nodes
- std::cout << "Q = " << Q << std::endl;
- std::cout << "F = " << F << std::endl;
-
- clock_t before_compare = clock();
- aVector[0].CompareTreesOrkiszMorales(aVector[1], Q, F, commonA, commonB, nonCommonA, nonCommonB, map_A_to_B, map_B_to_A, vector_pair_edges_A_to_B);
- clock_t after_compare = clock();
- double compare_time = double(after_compare - before_compare) / CLOCKS_PER_SEC;
- std::cout << "Matching time: " << compare_time << std::endl;
-
- // Print the common tree with common edges
- printCommonTreeBetweenTwoTrees(aVector[0], aVector[1], vector_pair_edges_A_to_B, Q, F);
- printMatchingResultToFile(aVector[0], aVector[1], map_A_to_B, map_B_to_A, Q, F);
- //printSeparatedCommonTrees(aVector[0], aVector[1], vector_pair_edges_A_to_B, Q, F);
- //reconstructAndSaveCommonTrees(aVector[0], aVector[1], vector_pair_edges_A_to_B, Q, F);
-
- // Print all the maps that have more that two connections
- std::cout << "Printing multiple relation A to B. Total relations: " << map_A_to_B.size() << std::endl;
- for(std::map< unsigned int, std::vector<Node*> >::iterator it_map_A_to_B = map_A_to_B.begin(); it_map_A_to_B != map_A_to_B.end(); ++it_map_A_to_B)
- {
- if((*it_map_A_to_B).second.size() > 1)
- {
- std::cout << "Multiple relation A to B with size:" << (*it_map_A_to_B).second.size() << ", from Id:" << (*it_map_A_to_B).first << std::endl;
- for(std::vector<Node*>::iterator it_node = (*it_map_A_to_B).second.begin(); it_node != (*it_map_A_to_B).second.end(); ++it_node)
- {
- std::cout << "Id: " << (*it_node)->GetId() << std::endl;
- }
- }
- }
- std::cout << "Printing multiple relation A to B ... OK" << std::endl;
-
- std::cout << "Printing multiple relation B to A. Total relations: " << map_B_to_A.size() << std::endl;
- for(std::map< unsigned int, std::vector<Node*> >::iterator it_map_B_to_A = map_B_to_A.begin(); it_map_B_to_A != map_B_to_A.end(); ++it_map_B_to_A)
- {
- if((*it_map_B_to_A).second.size() > 1)
- {
- std::cout << "Multiple relation B to A with size:" << (*it_map_B_to_A).second.size() << ", from Id:" << (*it_map_B_to_A).first << std::endl;
- for(std::vector<Node*>::iterator it_node = (*it_map_B_to_A).second.begin(); it_node != (*it_map_B_to_A).second.end(); ++it_node)
- {
- std::cout << "Id: " << (*it_node)->GetId() << std::endl;
- }
- }
- }
- std::cout << "Printing multiple relation B to A ... OK" << std::endl;
-
- // Mark only the common nodes
- aVector[0].UnMarkAll();
- aVector[1].UnMarkAll();
-
- // --------------------------------------
- // ------ Get common paths marked -------
- // --------------------------------------
-
- /*
- std::string path_folder = "/run/media/alfredo/Data/Pulmones/results/airwaysGraphs/comparisonResutls/probes/";
- std::string suffix_vtk = ".vtk";
- std::string name_tree = "TreeA_dP2P";
- int iteration = 1;
- for(vec_nodes::iterator it_A = commonA.begin(); it_A != commonA.end(); ++it_A)
- {
- aVector[0].MarkPathFromNodeToNode(aVector[0].GetRoot(), (*it_A));
-
- std::stringstream filepath_actualIteration;
- filepath_actualIteration << path_folder << name_tree << "__" << iteration << "_idA_" << (*it_A)->GetId() << suffix_vtk;
-
- DrawVTKLinesFromTree(aVector[0], filepath_actualIteration.str(), true);
- ++iteration;
- }
-
- iteration = 1;
- name_tree = "TreeB_dP2P";
- for(vec_nodes::iterator it_B = commonB.begin(); it_B != commonB.end(); ++it_B)
- {
- aVector[1].MarkPathFromNodeToNode(aVector[1].GetRoot(), (*it_B));
-
- std::stringstream filepath_actualIteration;
- filepath_actualIteration << path_folder << name_tree << "__" << iteration << "_idB_" << (*it_B)->GetId() << suffix_vtk;
-
- DrawVTKLinesFromTree(aVector[1], filepath_actualIteration.str(), true);
- ++iteration;
- }
- */
-
- // --------------------------------------
- // --------------------------------------
-
- /*
- //XXXXXXXXXXXXXXXXXXXXXXXXXXXX
- //1. PRINT EACH NODE OF EACH TREE AND SAVE IT USING AS NAME ITS ID
-
- // Tree A
- for(int i = 2; i < aVector[0].GetWeight(); ++i)
- {
- //std::cout << "Writing idA: " << i << std::endl;
- AirwaysTree* tree_id = aVector[0].GetSingleDetachedTreeNodeById(i);
- //std::cout << "Got id: " << i << ", numberOfNodes: " << tree_id->GetWeight() << std::endl;
- if(tree_id)
- {
- std::stringstream filepath_actualIteration;
- filepath_actualIteration << aVector[0].GetResultPath() << "/" << aVector[0].GetImageName() << "_id_" << i << suffix_vtk;
- DrawVTKLinesFromTree(*tree_id, filepath_actualIteration.str(), false);
- delete(tree_id);
- }
- else
- std::cout << "Tree NULL" << std::endl;
- }
-
- // Tree B
- for(int i = 2; i < aVector[1].GetWeight(); ++i)
- {
- //std::cout << "Writing idA: " << i << std::endl;
- AirwaysTree* tree_id = aVector[1].GetSingleDetachedTreeNodeById(i);
- //std::cout << "Got id: " << i << ", numberOfNodes: " << tree_id->GetWeight() << std::endl;
- if(tree_id)
- {
- std::stringstream filepath_actualIteration;
- filepath_actualIteration << aVector[1].GetResultPath() << "/" << aVector[1].GetImageName() << "_id_" << i << suffix_vtk;
- DrawVTKLinesFromTree(*tree_id, filepath_actualIteration.str(), false);
- delete(tree_id);
- }
- else
- std::cout << "Tree NULL" << std::endl;
- }
-
- std::cout << "Comparing trees Orkisz-Morales... OK" << std::endl;
-
- */
-
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- /*// AMP
- aVector[0].SubIsomorphism(aVector[1]);
-
- std::cout << "Flag after SubIsomorphism" << std::endl;
- std::string fullPathA = aVector[0].GetResultPath() + "/" + aVector[0].GetImageName() + "_CMP.vtk";
- std::string fullPathB = aVector[1].GetResultPath() + "/" + aVector[1].GetImageName() + "_CMP.vtk";
- DrawVTKLinesFromTree(aVector[0], fullPathA, true);
- DrawVTKLinesFromTree(aVector[1], fullPathB, true);
-
- std::cout << "Flag after write vtk" << std::endl;
- TInputImage::Pointer imgA, imgB;
- aVector[0].ImageReconstruction(imgA);
- std::cout << "Flag after Reconstruction A" << std::endl;
-
- aVector[1].ImageReconstruction(imgB);
- std::cout << "Flag after Reconstruction B" << std::endl;
-
- std::string fullPathA_mhd = aVector[0].GetResultPath() + "/" + aVector[0].GetImageName() + "_CMP.vtk";
- std::string fullPathB_mhd = aVector[1].GetResultPath() + "/" + aVector[1].GetImageName() + "_CMP.vtk";
- WriteImage(imgA, fullPathA_mhd);
- WriteImage(imgB, fullPathB_mhd);
-
- //AMP*/
- }
- po::notify(vm); // throws on error, so do after help in case
- }
- catch (std::exception& e)
- {
- std::cerr << "Unhandled Exception reached the top of main: " << e.what() << ", application will now exit" << std::endl;
- return ERROR_UNHANDLED_EXCEPTION;
- } // yrt
- }
- catch (std::exception& e)
- {
- std::cerr << "Unhandled Exception reached the top of main: " << e.what() << ", application will now exit" << std::endl;
- return ERROR_UNHANDLED_EXCEPTION;
- } // yrt
- return( 0 );
-}
-
-// -------------------------------------------------------------------------
-void Load_cpPlugins( const std::string& plugins )
-{
- myPlugins.LoadConfiguration( plugins );
-}
-
-// -------------------------------------------------------------------------
-void CreateResultDirectory(AirwaysTree tree)
-{
- boost::filesystem::path dir(tree.GetResultPath());
- if (boost::filesystem::create_directories(dir))
- {
- std::cout << "FolderName = " << tree.GetResultPath() << " has been created" << std::endl;
- } //if
- else
- std::cout << "FolderName = " << tree.GetResultPath() << " already exists" << std::endl;
-}
-
-// -------------------------------------------------------------------------
-void DrawVTKLinesFromTree(AirwaysTree& tree, const std::string filepath, bool common)
-{
- // Create the array of points, lines, and colors
- vtkSmartPointer<vtkPoints> pts = vtkSmartPointer<vtkPoints>::New();
- vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
- vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
- colors->SetNumberOfComponents(3);
- colors->SetName("Colors");
-
- //vtk sphere for sources
- //vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
- //Vec3 root = tree.GetRoot()->GetCoords();
- //sphereSource->SetCenter(root[0], root[1], root[2]);
- //sphereSource->SetRadius(1);
- //UndirectedGraph
-
- srand(time(NULL));
- unsigned int id = 1;
-
- // Create and fill the points, lines, and color vectors
- //CalculateVTKLinesFromEdges(tree.GetRoot(), 0, id, pts, lines, colors, common);
- pts->SetNumberOfPoints(tree.GetWeight()+1);
- createLinesAndPointsForVTK(tree.GetRoot(), pts, lines, colors, common, true);
-
- // Create the polydata
- vtkSmartPointer<vtkPolyData> linesPolyData = vtkSmartPointer<vtkPolyData>::New();
-
- // Set the points, lines, and colors
- linesPolyData->SetPoints(pts);
- linesPolyData->SetLines(lines);
- linesPolyData->GetCellData()->SetScalars(colors);
-
- // Write the file
- vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();
- writer->SetFileName(filepath.c_str());
-
-#if VTK_MAJOR_VERSION <= 5
- writer->SetInput(linesPolyData);
-#else
- writer->SetInputData(linesPolyData);
-#endif
- writer->Write();
-
- //The following code is to test the vtk polydata and visualize it
- /* // Visualize
- vtkSmartPointer<vtkPolyDataMapper> mapper =
- vtkSmartPointer<vtkPolyDataMapper>::New();
- #if VTK_MAJOR_VERSION <= 5
- mapper->SetInput(linesPolyData);
- #else
- mapper->SetInputData(linesPolyData);
- #endif
- vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
- actor->SetMapper(mapper);
-
- //sphere
- vtkSmartPointer<vtkPolyDataMapper> mapperSphere = vtkSmartPointer<
- vtkPolyDataMapper>::New();
- mapperSphere->SetInputConnection(sphereSource->GetOutputPort());
-
- vtkSmartPointer<vtkActor> actorSphere = vtkSmartPointer<vtkActor>::New();
- actorSphere->SetMapper(mapperSphere);
- //end sphere
-
- vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
- vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<
- vtkRenderWindow>::New();
- renderWindow->AddRenderer(renderer);
- vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
- vtkSmartPointer<vtkRenderWindowInteractor>::New();
- renderWindowInteractor->SetRenderWindow(renderWindow);
- renderer->AddActor(actorSphere);
- renderer->AddActor(actor);
-
- renderWindow->Render();
- renderWindowInteractor->Start();*/
-}
-
-// -------------------------------------------------------------------------
-#include <fpa/Base/ImageSkeleton.h>
-#include <fpa/Image/MinimumSpanningTree.h>
-#include <cpExtensions/DataStructures/ImageIndexesContainer.h>
-#include <itkImage.h>
-#include <queue>
-
-template< class TImage, class TVertex >
-Node* FAVertexToNode( TVertex vertex, TImage* image )
-{
- //The FrontAlgorithms Vertex is an TImageType::IndexType
- typename TImage::PointType point;
- image->TransformIndexToPhysicalPoint( vertex, point );
- Vec3 alfPoint(point[0],point[1],point[2]);
- return new Node(alfPoint);
-}
-
-AirwaysTree& ConvertFilterToAirwaysTree( TInputImage* input_image, cpPlugins::Workspace& ws )
-{
- typedef
- fpa::Base::ImageSkeleton< fpa::Image::MinimumSpanningTree< 3 > >
- TFASkeleton;
- typedef TFASkeleton::TVertex TVertexFA;
- typedef TFASkeleton::TVertexCmp TVertexCompareFA;
- typedef cpExtensions::DataStructures::ImageIndexesContainer< 3 > TVerticesFA;
-
- typedef Node TVertexAirways;
- typedef Edge TEdgeAirways;
- typedef pair_posVox_rad TSkelePoint;
- typedef vec_pair_posVox_rad TSkelePoints;
- typedef std::map< TVertexFA, TVertexAirways*, TVertexCompareFA > VertexMap;
- VertexMap vertexMap;
- std::time_t start,end;
- std::time(&start);
- std::cout << "Starting conversion " << std::endl;
-
- auto w_filter = ws.GetFilter( "eb" );
- auto distance_map =
- ws.GetFilter( "dmap" )->GetOutputData( "Output" )->
- GetITK< itk::Image< float, 3 > >( );
- auto sk =
- w_filter->GetOutputData( "Skeleton" )->GetITK< TFASkeleton >( );
- const auto& branches = sk->Get( );
- auto seed0 =
- ws.GetFilter( "seed" )->GetOutputData( "Output" )->
- GetITK< TVerticesFA >( )->Get( )[ 0 ];
-
- std::queue< TVertexFA > q;
- // TODO: std::set< TVertexFA, TVertexCompareFA > marks;
- q.push( seed0 );
- while( !q.empty( ) )
- {
- auto sVertex = q.front( );
- q.pop( );
- auto sIt = branches.find( sVertex );
- /* TODO
- if( marks.find( sVertex ) != marks.end( ) )
- {
- std::cout << "MARK!!!!! : " << sVertex << std::endl;
- }
- marks.insert( sVertex );
- */
-
- // End node... do nothing
- if( sIt == branches.end( ) )
- continue;
-
- // Create source node
- auto srcIt = vertexMap.find( sVertex );
- if( srcIt == vertexMap.end( ) )
- srcIt = vertexMap.insert(
- VertexMap::value_type(
- sVertex, FAVertexToNode( sVertex, input_image )
- )
- ).first;
-
- // TODO: std::cout << sVertex << " " << " " << sLevel << " " << seed0 << std::endl;
- // Create destination nodes
- for( auto eIt = sIt->second.begin( ); eIt != sIt->second.end( ); ++eIt )
- {
- auto dstIt = vertexMap.find( eIt->first );
- if( dstIt == vertexMap.end( ) )
- dstIt = vertexMap.insert(
- VertexMap::value_type(
- eIt->first, FAVertexToNode( eIt->first, input_image )
- )
- ).first;
-
- // Connect in the acyclic graph
- dstIt->second->SetFather( srcIt->second );
- srcIt->second->AddChild( dstIt->second );
-
- // Create detailed edge
- TEdgeAirways* edge = new Edge( );
- edge->SetSource( srcIt->second );
- edge->SetTarget( dstIt->second );
- auto path = eIt->second->GetVertexList( );
- for( unsigned int pIt = 0; pIt < path->Size( ); ++pIt )
- {
- itk::ImageBase< 3 >::PointType pnt;
- auto cidx = path->GetElement( pIt );
- input_image->TransformContinuousIndexToPhysicalPoint( cidx, pnt );
- TVertexFA idx;
- input_image->TransformPhysicalPointToIndex( pnt, idx );
- Vec3 coords = FAVertexToNode( idx, input_image )->GetCoords( );
- pair_posVox_rad skPair( coords, distance_map->GetPixel( idx ) );
- edge->AddSkeletonPairInfo( skPair );
-
- } // rof
-
- // Finish association
- dstIt->second->SetEdge( edge );
-
- // Put it as next candidate
- q.push( eIt->first );
-
- } // rof
-
- } // elihw
-
- AirwaysTree* tree =
- new AirwaysTree( input_image, NULL, vertexMap[ seed0 ], false );
- std::time(&end);
- std::cout << "Finished conversion. New AlfTree has weight: "<<tree->GetWeight()<<". Takes "<<(end-start)<<" s." << std::endl;
- return *tree;
-}
-
-// -------------------------------------------------------------------------
-AirwaysTree& CreateAirwaysTreeFromSegmentation(Vec3 seed, TInputImage* input_image, cpPlugins::Workspace& ws )
-{
- return( ConvertFilterToAirwaysTree( input_image, ws ) );
-}
-
-// -------------------------------------------------------------------------
-vector<TreeInfo> ReadInputFile(const char* filename)
-{
- // Variables
- std::ifstream infile(filename);
- std::string line;
- std::string folderpath_allResults;
- vector<TreeInfo> vectorInfo;
- // Parse the file
- bool firstLine = false;
-
- while (std::getline(infile, line))
- {
- // First line contains the output folder
- std::istringstream iss(line);
- if (!firstLine)
- {
- if (!(iss >> folderpath_allResults))
- {
- std::cout << "no file" << std::endl;
- return vectorInfo;
- } //if
- firstLine = true;
- } //if
- // Other lines, not the first one, contain the information for the airways to be created
- else
- {
- TreeInfo treeInfo;
- float point_trachea[3];
- std::string filepath_airwayImage, name_pig, name_image;
- if (!(iss >> point_trachea[0] >> point_trachea[1] >> point_trachea[2] >> filepath_airwayImage >> name_pig >> name_image))
- {
- std::cout << "There is no tree information in the file." << std::endl;
- break;
- } //if
- else
- {
- // Print information
- std::cout << "Point trachea:[" << point_trachea[0] << "," << point_trachea[1] << "," << point_trachea[2] << "]" << std::endl;
- }
-
- //Save info.
-
- //Save seed info.
- Vec3 seed(point_trachea[0], point_trachea[1], point_trachea[2]); //real coords seed
- treeInfo.seed = seed;
- // Create the outputs
- treeInfo.folderpath_pigResults = folderpath_allResults + "/" + name_pig + "/";
- treeInfo.pig_name = name_pig;
- treeInfo.image_name = name_image;
- // Read the image
- /*
- treeInfo.image = ReadImage<TInputImage>(filepath_airwayImage);
- */
- // Execute first pipeline's part
- std::stringstream seed_stream;
- seed_stream
- << point_trachea[0] << " "
- << point_trachea[1] << " "
- << point_trachea[2];
-
- treeInfo.myWorkspace->SetInterface( &myPlugins );
- std::string err = treeInfo.myWorkspace->LoadWorkspace( "./workspace_airwaysappli.wxml" );
- if( err != "" )
- {
- std::cerr << "Error: " << err << std::endl;
- std::exit( 1 );
-
- } // fi
- treeInfo.myWorkspace->SetParameter( "FileNames@reader", filepath_airwayImage );
- treeInfo.myWorkspace->SetParameter( "Text@seed", seed_stream.str( ) );
- vectorInfo.push_back(treeInfo);
-
- } //else
- } //while
- return vectorInfo;
-}
-
-// -------------------------------------------------------------------------
-void printCommonTreeBetweenTwoTrees(AirwaysTree tree_A, AirwaysTree tree_B, std::vector< std::pair< std::pair<Node*, Node*>, std::pair<Node*, Node*> > > vector_pair_edges_A_to_B, unsigned int Q, unsigned int F)
-{
- std::cout << "printCommonTreeBetweenTwoTrees, edges:" << vector_pair_edges_A_to_B.size() << std::endl;
-
- // Vtk points, cell array, and colors
- vtkSmartPointer<vtkPoints> points_common = vtkSmartPointer<vtkPoints>::New();
- vtkSmartPointer<vtkCellArray> lines_common = vtkSmartPointer<vtkCellArray>::New();
- vtkSmartPointer<vtkUnsignedCharArray> colors_common = vtkSmartPointer<vtkUnsignedCharArray>::New();
- colors_common->SetNumberOfComponents(3);
- colors_common->SetName("Colors");
-
- // Add all the points
- // 0 - 1000 points for tree A and from 1001 for tree B
- points_common->SetNumberOfPoints(1000 + tree_B.GetWeight() + 100);
-
- // Add points for tree A
- vec_nodes vector_nodesA = tree_A.GetNodes();
- for(vec_nodes::iterator it_nodesA = vector_nodesA.begin(); it_nodesA != vector_nodesA.end(); ++it_nodesA)
- {
- points_common->SetPoint((*it_nodesA)->GetId(),(*it_nodesA)->GetCoords().GetVec3());
- }
-
- // Add points for tree B
- vec_nodes vector_nodesB = tree_B.GetNodes();
- for(vec_nodes::iterator it_nodesB = vector_nodesB.begin(); it_nodesB != vector_nodesB.end(); ++it_nodesB)
- {
- points_common->SetPoint((*it_nodesB)->GetId()+1000,(*it_nodesB)->GetCoords().GetVec3());
- }
-
- // Add the edges for both trees
- std::vector< std::pair< std::pair<Node*, Node*>, std::pair<Node*, Node*> > >::iterator it_edges = vector_pair_edges_A_to_B.begin();
- int number_pairs = 0;
- for(; it_edges != vector_pair_edges_A_to_B.end(); ++it_edges)
- {
- std::cout << "Pair:" << number_pairs << std::endl;
- std::pair<Node*, Node*> edge_A = (*it_edges).first;
- std::pair<Node*, Node*> edge_B = (*it_edges).second;
-
- vec_nodes path_A;
- edge_A.first->GetPathToNode(edge_A.second, path_A);
-
- vec_nodes path_B;
- edge_B.first->GetPathToNode(edge_B.second, path_B);
-
- // Set color to be used
- int numColor = number_pairs % 6;
- unsigned char color[3];
- color[0] = green[0];
- color[1] = green[1];
- color[2] = green[2];
- if(numColor == 1)
- {
- color[0] = red[0];
- color[1] = red[1];
- color[2] = red[2];
- }
- else if(numColor == 2)
- {
- color[0] = blue[0];
- color[1] = blue[1];
- color[2] = blue[2];
- }
- else if(numColor == 3)
- {
- color[0] = yellow[0];
- color[1] = yellow[1];
- color[2] = yellow[2];
- }
- else if(numColor == 4)
- {
- color[0] = purple[0];
- color[1] = purple[1];
- color[2] = purple[2];
- }
- else if(numColor == 5)
- {
- color[0] = cyan[0];
- color[1] = cyan[1];
- color[2] = cyan[2];
- }
-
- number_pairs++;
-
- // Trace line A
- //if(path_A.size() > 0 && number_pairs < 50)
- if( path_A.size() )
- {
- vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
- lines_common->InsertNextCell(path_A.size());
- int id_point = 0;
- for(vec_nodes::iterator it_pathA = path_A.begin(); it_pathA != path_A.end(); ++it_pathA)
- {
- lines_common->InsertCellPoint((*it_pathA)->GetId());
- //line->GetPointIds()->SetId( id_point, (*it_pathA)->GetId() );
- //id_point++;
- }
- //lines_common->InsertNextCell(line);
- colors_common->InsertNextTupleValue(color);
- }
- else
- {
- std::cout << "No path A" << std::endl;
- }
-
-
- // Trace line B
- //if(path_B.size() > 0 && number_pairs < 50)
- if( path_B.size() )
- {
- vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
- lines_common->InsertNextCell(path_B.size());
- int id_point = 0;
- for(vec_nodes::iterator it_pathB = path_B.begin(); it_pathB != path_B.end(); ++it_pathB)
- {
- lines_common->InsertCellPoint((*it_pathB)->GetId()+1000);
- //line->GetPointIds()->SetId( id_point, (*it_pathB)->GetId()+1000 );
- id_point++;
- }
- //lines_common->InsertNextCell(line);
- colors_common->InsertNextTupleValue(color);
- }
- else
- {
- std::cout << "No path B" << std::endl;
- }
- }
-
- // Save the polydata
- // Create the polydata
- vtkSmartPointer<vtkPolyData> linesPolyData = vtkSmartPointer<vtkPolyData>::New();
-
- // Set the points, lines, and colors
- linesPolyData->SetPoints(points_common);
- linesPolyData->SetLines(lines_common);
- linesPolyData->GetCellData()->SetScalars(colors_common);
-
- // ------------------------------------------------
- // Write the vtk file
-
- // Create the pathfile to save
- std::stringstream filepath_actualIteration;
- filepath_actualIteration << tree_A.GetResultPath() << "/" << tree_A.GetImageName() << "_" << tree_B.GetImageName() << "_Q_" << Q << "_F_" << F << ".vtk";
- std::cout << "File to save:" << filepath_actualIteration.str() << std::endl;
-
- // Create the writer
- vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();
- writer->SetFileName(filepath_actualIteration.str().c_str());
-
- // Set input and write
-#if VTK_MAJOR_VERSION <= 5
- writer->SetInput(linesPolyData);
-#else
- writer->SetInputData(linesPolyData);
-#endif
- writer->Write();
-
-
-
- // ***************************************
- // Save the links in a file
- // *******
-
- // Create the outputfile
- std::stringstream filepath_evaluation;
- filepath_evaluation << tree_A.GetResultPath() << "/" << tree_A.GetImageName() << "_" << tree_B.GetImageName() << "_Q_" << Q << "_F_" << F << ".csv";
-
- std::ofstream file(filepath_evaluation.str().c_str());
- if(file.is_open())
- {
- // Save the header
- //file << "Node_" << tree_A.GetImageName() << " " << "Node_" << tree_B.GetImageName()<< "\n";
- file << "TreeName "
- "idLocalN1 idLocalN2 "
- "Node1x Node1y Node1z "
- "Node2x Node2y Node2z "
- "idGlobalN1 "
- "idMatch" << std::endl;
-
-
- std::vector< std::pair< std::pair<Node*, Node*>, std::pair<Node*, Node*> > >::iterator it_edges = vector_pair_edges_A_to_B.begin();
- for(; it_edges != vector_pair_edges_A_to_B.end(); ++it_edges)
- {
-
- std::pair<Node*, Node*> edge_A = (*it_edges).first;
- std::pair<Node*, Node*> edge_B = (*it_edges).second;
-
- //file << edge_A.second->GetId() << " " << edge_B.second->GetId()+1000 << "\n";
- Vec3 coord_EndNodeA = edge_A.second->GetCoords();
- Vec3 coord_EndNodeB = edge_B.second->GetCoords();
- file << tree_A.GetImageName() << " " <<
- edge_A.second->GetId() << " " << edge_B.second->GetId()+1000 << " " <<
- coord_EndNodeA[0] << " " << coord_EndNodeA[1] << " " << coord_EndNodeA[2] << " " <<
- coord_EndNodeB[0] << " " << coord_EndNodeB[1] << " " << coord_EndNodeB[2] << " " <<
- tree_A.GetImageName() << coord_EndNodeA[0] << coord_EndNodeA[1] << coord_EndNodeA[2] << " " <<
- tree_B.GetImageName() << coord_EndNodeB[0] << coord_EndNodeB[1] << coord_EndNodeB[2] <<"\n";
-
- file << tree_B.GetImageName() << " " <<
- edge_B.second->GetId()+1000 << " " << edge_A.second->GetId() << " " <<
- coord_EndNodeB[0] << " " << coord_EndNodeB[1] << " " << coord_EndNodeB[2] << " " <<
- coord_EndNodeA[0] << " " << coord_EndNodeA[1] << " " << coord_EndNodeA[2] << " " <<
- tree_B.GetImageName() << coord_EndNodeB[0] << coord_EndNodeB[1] << coord_EndNodeB[2] << " " <<
- tree_A.GetImageName() << coord_EndNodeA[0] << coord_EndNodeA[1] << coord_EndNodeA[2] << "\n";
- }
- }
-
- file.close();
- // *******
- // ***************************************
-
-
-
-
- std::cout << "printCommonTreeBetweenTwoTrees ... OK" << std::endl;
-}
-
-// -------------------------------------------------------------------------
-void printMatchingResultToFile(AirwaysTree tree_A, AirwaysTree tree_B, std::map< unsigned int, std::vector<Node*> > map_A_to_B, std::map< unsigned int, std::vector<Node*> > map_B_to_A, unsigned int Q, unsigned int F)
-{
- std::cout << "Printing matching result ... " << std::endl;
-
- // Variables and types
- typedef std::map< unsigned int, vec_nodes > map_id_node;
-
- // Create the outputfile
- std::stringstream filepath_evaluation;
- filepath_evaluation << tree_A.GetResultPath() << "/" << tree_A.GetImageName() << "_" << tree_B.GetImageName() << "_Q_" << Q << "_F_" << F << "_matching.csv";
-
- std::ofstream file(filepath_evaluation.str().c_str());
- if(file.is_open())
- {
- // Save the header
- file << "TreeName idLocalN1 idLocalN2 "
- "Node1x Node1y Node1z "
- "Node2x Node2y Node2z "
- "idGlobalN1 "
- "idMatch "
- "typeMatch_match_1_nonmatch_0 "
- "depth "
- "leaf"<< std::endl;
-
- // ---------------
- // From A to B
-
- // Save the match or non-match for each node from A to B
- for(int id_a=1; id_a <= tree_A.GetWeight( ); ++id_a)
- {
- // Get the actual node in tree A
- Node* node_a = tree_A.GetNodeById( id_a );
- Vec3 coords_a = node_a->GetCoords();
- unsigned int depth_a = tree_A.GetDepthById(id_a);
- bool leaf_a = node_a->IsLeaf();
-
- // Check if the node was matched
- map_id_node::iterator it_a2b = map_A_to_B.find( id_a );
- if( it_a2b != map_A_to_B.end( ) )
- {
- // Get the correspoding matching nodes and print them
- vec_nodes nodes_B = (*it_a2b).second;
-
- vec_nodes::iterator it_nodes_b = nodes_B.begin( );
- for( ; it_nodes_b != nodes_B.end( ); ++it_nodes_b)
- {
- Vec3 coords_b = (*it_nodes_b)->GetCoords();
-
- file << tree_A.GetImageName() << " " << id_a << " " << (*it_nodes_b)->GetId()+1000 << " "
- << coords_a[0] << " " << coords_a[1] << " " << coords_a[2] << " "
- << coords_b[0] << " " << coords_b[1] << " " << coords_b[2] << " "
- << tree_A.GetImageName() << coords_a[0] << coords_a[1] << coords_a[2] << " "
- << tree_A.GetImageName() << coords_a[0] << coords_a[1] << coords_a[2] << coords_b[0] << coords_b[1] << coords_b[2] << " "
- << "1" << " "
- << depth_a << " "
- << leaf_a << "\n";
- }
- }
- else
- {
- file << tree_A.GetImageName() << " " << id_a << " " << "0" << " "
- << coords_a[0] << " " << coords_a[1] << " " << coords_a[2] << " "
- << "0" << " " << "0" << " " << "0" << " "
- << tree_A.GetImageName() << coords_a[0] << coords_a[1] << coords_a[2] << " "
- << tree_A.GetImageName() << coords_a[0] << coords_a[1] << coords_a[2] << "0" << "0" << "0" << " "
- << "0" << " "
- << depth_a << " "
- << leaf_a << "\n";
- }
- }
-
- // ---------------
- // From B to A
-
- // Save the match or non-match for each node from A to B
- for(int id_b=1; id_b <= tree_B.GetWeight( ); ++id_b)
- {
- // Get the actual node in tree B
- Node* node_b = tree_B.GetNodeById( id_b );
- Vec3 coords_b = node_b->GetCoords();
- unsigned int depth_b = tree_B.GetDepthById(id_b);
- bool leaf_b = node_b->IsLeaf();
-
- // Check if the node was matched
- map_id_node::iterator it_b2a = map_B_to_A.find( id_b );
- if( it_b2a != map_B_to_A.end( ) )
- {
- // Get the correspoding matching nodes and print them
- vec_nodes nodes_A = (*it_b2a).second;
-
- vec_nodes::iterator it_nodes_a = nodes_A.begin( );
- for( ; it_nodes_a != nodes_A.end( ); ++it_nodes_a)
- {
- Vec3 coords_a = (*it_nodes_a)->GetCoords();
-
- file << tree_B.GetImageName() << " " << id_b+1000 << " " << (*it_nodes_a)->GetId() << " "
- << coords_b[0] << " " << coords_b[1] << " " << coords_b[2] << " "
- << coords_a[0] << " " << coords_a[1] << " " << coords_a[2] << " "
- << tree_B.GetImageName() << coords_b[0] << coords_b[1] << coords_b[2] << " "
- << tree_B.GetImageName() << coords_b[0] << coords_b[1] << coords_b[2] << coords_a[0] << coords_a[1] << coords_a[2] << " "
- << "1" << " "
- << depth_b << " "
- << leaf_b << "\n";
- }
- }
- else
- {
- file << tree_B.GetImageName() << " " << id_b+1000 << " " << "0" << " "
- << coords_b[0] << " " << coords_b[1] << " " << coords_b[2] << " "
- << "0" << " " << "0" << " " << "0" << " "
- << tree_B.GetImageName() << coords_b[0] << coords_b[1] << coords_b[2] << " "
- << tree_B.GetImageName() << coords_b[0] << coords_b[1] << coords_b[2] << "0" << "0" << "0" << " "
- << "0" << " "
- << depth_b << " "
- << leaf_b << "\n";
- }//esle
- }//rof
- }//fi
-
- file.close(); // Close the file
-
- std::cout << "Printing matching result DONE" << std::endl;
-}
-
-// -------------------------------------------------------------------------
-void createLinesAndPointsForVTK(const Node* node, vtkSmartPointer<vtkPoints>& pts,vtkSmartPointer<vtkCellArray>& lines, vtkSmartPointer<vtkUnsignedCharArray>& colors, bool common, bool isRoot)
-{
- // Insert the actual point/node
- //vtkIdType id_father = idNonRoot;
- //if(isRoot)
- //id_father = pts->InsertNextPoint(node->GetCoords().GetVec3());
- vtkIdType id_father = node->GetId();
- if(isRoot)
- pts->SetPoint(id_father,node->GetCoords().GetVec3());
-
- // Iterate over the children
- const vec_nodes children = node->GetChildren();
- for (vec_nodes::const_iterator it_child = children.begin(); it_child != children.end(); ++it_child)
- {
- if (!(*it_child)->IsMarked() && common)
- continue;
-
- //vtkIdType id_son = pts->InsertNextPoint((*it_child)->GetCoords().GetVec3());
- vtkIdType id_son = (*it_child)->GetId();
- pts->SetPoint(id_son,(*it_child)->GetCoords().GetVec3());
-
- // Set color to be used
- int numColor = (*it_child)->GetLevel() % 4;
- if(numColor == 0)
- colors->InsertNextTupleValue(green);
- else if(numColor == 1)
- colors->InsertNextTupleValue(red);
- else if(numColor == 2)
- colors->InsertNextTupleValue(red);
- else
- colors->InsertNextTupleValue(red);
-
- // Add the line
- vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
- line->GetPointIds()->SetId(0, id_father);
- line->GetPointIds()->SetId(1, id_son);
- lines->InsertNextCell(line);
-
- createLinesAndPointsForVTK(*it_child, pts, lines, colors, common, false);
- } //for
-}
-
-// eof - $RCSfile$
+++ /dev/null
-SET(
- SIMPLE_EXAMPLES
- example_Image_Dijkstra_EndPointDetection_WithoutVTK
- )
-FOREACH(EX ${SIMPLE_EXAMPLES})
- ADD_EXECUTABLE(${EX} ${EX}.cxx)
- TARGET_LINK_LIBRARIES(${EX} FrontAlgorithms)
-ENDFOREACH(EX)
-
-SET(
- SIMPLE_VTK_EXAMPLES
- example_Image_RegionGrow_AllPixels
- example_Image_RegionGrow_AllRGBPixels
- example_Image_RegionGrow_ConnectedPixels
- example_Image_RegionGrow_ConnectedRGBPixels
- example_Image_Dijkstra_AbsoluteDifferenceCost
- example_Image_Dijkstra_EndPointDetection
- # example_Image_RegionGrow_GaussianModelEstimation
- # example_Image_IncrementalRegionGrow_Thresholds
- # example_Image_Dijkstra_CostFromInput
- # example_Image_Dijkstra_CostFromRGBInput
- # example_Image_Dijkstra_DanielssonCost
- # example_Image_Dijkstra_DanielssonCost_TwoSeedsPath
- # example_Image_Dijkstra_LabelSkeleton
- # example_ShowSkeleton
- # example_CircleOfWillis
- )
-FOREACH(EX ${SIMPLE_VTK_EXAMPLES})
- ADD_EXECUTABLE(${EX} ${EX}.cxx)
- TARGET_LINK_LIBRARIES(
- ${EX} FrontAlgorithms
- )
-ENDFOREACH(EX)
-
-## eof - $RCSfile$
+++ /dev/null
-#include <ctime>
-#include <iostream>
-#include <string>
-
-#include <itkImage.h>
-#include <itkImageFileReader.h>
-#include <itkImageFileWriter.h>
-#include <itkInvertIntensityImageFilter.h>
-#include <itkMinimumMaximumImageCalculator.h>
-#include <itkDanielssonDistanceMapImageFilter.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 3;
-typedef unsigned char TPixel;
-typedef float TScalar;
-typedef itk::Image< TPixel, Dim > TImage;
-typedef itk::Image< TScalar, Dim > TScalarImage;
-typedef itk::ImageFileReader< TImage > TImageReader;
-typedef itk::ImageFileWriter< TScalarImage > TImageWriter;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 3 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " input_image output_image"
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- std::string output_image_fn = argv[ 2 ];
-
- // Read image
- TImageReader::Pointer input_image_reader = TImageReader::New( );
- input_image_reader->SetFileName( input_image_fn );
- try
- {
- input_image_reader->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr << "Error caught: " << err << std::endl;
- return( 1 );
-
- } // yrt
-
- // Invert intensity
- typedef itk::MinimumMaximumImageCalculator< TImage > TMinMax;
- TMinMax::Pointer minmax = TMinMax::New( );
- minmax->SetImage( input_image_reader->GetOutput( ) );
- minmax->Compute( );
-
- typedef itk::InvertIntensityImageFilter< TImage > TInvert;
- TInvert::Pointer invert = TInvert::New( );
- invert->SetInput( input_image_reader->GetOutput( ) );
- invert->SetMaximum( minmax->GetMaximum( ) );
-
- typedef itk::DanielssonDistanceMapImageFilter< TImage, TScalarImage > TDistance;
- TDistance::Pointer distance = TDistance::New( );
- distance->SetInput( invert->GetOutput( ) );
- distance->InputIsBinaryOn( );
- distance->SquaredDistanceOn( );
- std::clock_t start = std::clock( );
- distance->Update( );
- std::clock_t end = std::clock( );
- double seconds = double( end - start ) / double( CLOCKS_PER_SEC );
- std::cout << "Distance map time = " << seconds << std::endl;
-
- TImageWriter::Pointer writer = TImageWriter::New( );
- writer->SetInput( distance->GetOutput( ) );
- writer->SetFileName( output_image_fn );
- writer->Update( );
-
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <iostream>
-#include <fstream>
-#include <limits>
-#include <string>
-
-#include <itkImage.h>
-#include <itkImageToVTKImageFilter.h>
-#include <itkImageFileReader.h>
-
-#include <vtkCellArray.h>
-#include <vtkFloatArray.h>
-#include <vtkPointData.h>
-#include <vtkPoints.h>
-#include <vtkPolyData.h>
-#include <vtkSmartPointer.h>
-
-#include <fpa/VTK/ImageMPR.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dimension = 3;
-typedef short TPixel;
-
-typedef itk::Image< TPixel, Dimension > TImage;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 3 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " input_image input_seeds"
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- std::string input_seeds_fn = argv[ 2 ];
-
- // Read image
- itk::ImageFileReader< TImage >::Pointer input_image_reader =
- itk::ImageFileReader< TImage >::New( );
- input_image_reader->SetFileName( input_image_fn );
- try
- {
- input_image_reader->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr << "Error caugth: " << err << std::endl;
- return( 1 );
-
- } // yrt
- TImage::ConstPointer input_image = input_image_reader->GetOutput( );
- itk::ImageToVTKImageFilter< TImage >::Pointer input_image_vtk =
- itk::ImageToVTKImageFilter< TImage >::New( );
- input_image_vtk->SetInput( input_image );
- input_image_vtk->Update( );
-
- // Read seeds
- std::ifstream input_seeds_fs( input_seeds_fn.c_str( ) );
- if( !input_seeds_fs )
- {
- std::cerr
- << "Error opening file \"" << input_seeds_fn << "\"" << std::endl;
- return( 1 );
-
- } // fi
-
- // Read seed points
- std::string str_val;
- unsigned int number_of_points;
- input_seeds_fs >> str_val >> number_of_points;
- input_seeds_fs >> str_val; // X
- input_seeds_fs >> str_val; // Y
- input_seeds_fs >> str_val; // Z
- input_seeds_fs >> str_val; // value
- input_seeds_fs >> str_val; // Label
-
- vtkSmartPointer< vtkPoints > input_seeds_points =
- vtkSmartPointer< vtkPoints >::New( );
- vtkSmartPointer< vtkCellArray > input_seeds_cells =
- vtkSmartPointer< vtkCellArray >::New( );
- vtkSmartPointer< vtkFloatArray > input_seeds_ids =
- vtkSmartPointer< vtkFloatArray >::New( );
-
- input_seeds_ids->SetNumberOfComponents( 1 );
- input_seeds_ids->SetNumberOfTuples( number_of_points );
-
- double min_value = std::numeric_limits< double >::max( );
- double max_value = double( 0 );
- for( unsigned int i = 0; i < number_of_points; ++i )
- {
- unsigned int x, y, z;
- double value;
- input_seeds_fs >> x >> y >> z >> value >> str_val;
-
- min_value = ( value < min_value )? value: min_value;
- max_value = ( value > max_value )? value: max_value;
-
- TImage::IndexType idx;
- idx[ 0 ] = x;
- idx[ 1 ] = y;
- idx[ 2 ] = z;
- TImage::PointType pnt;
- input_image->TransformIndexToPhysicalPoint( idx, pnt );
-
- input_seeds_points->InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
- input_seeds_cells->InsertNextCell( 1 );
- input_seeds_cells->InsertCellPoint( i );
- input_seeds_ids->SetTuple1(
- i, double( i ) / double( number_of_points - 1 )
- );
-
-
- } // rof
- input_seeds_fs.close( );
-
- vtkSmartPointer< vtkPolyData > input_seeds =
- vtkSmartPointer< vtkPolyData >::New( );
- input_seeds->SetPoints( input_seeds_points );
- input_seeds->SetVerts( input_seeds_cells );
- input_seeds->GetPointData( )->SetScalars( input_seeds_ids );
-
- // Show input image and let some interaction
- fpa::VTK::ImageMPR view;
- view.SetBackground( 0.3, 0.2, 0.8 );
- view.SetSize( 600, 600 );
- view.SetImage( input_image_vtk->GetOutput( ) );
- view.SetWindowLevel(
- max_value - min_value,
- ( min_value + max_value ) / double( 2 )
- );
- view.AddPolyData( input_seeds );
- view.Render( );
- view.Start( );
-
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <ctime>
-#include <iostream>
-#include <string>
-
-#include <itkImage.h>
-#include <itkImageFileReader.h>
-#include <itkImageFileWriter.h>
-#include <itkHausdorffDistanceImageFilter.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 3;
-typedef unsigned short TPixel;
-typedef float TScalar;
-typedef itk::Image< TPixel, Dim > TImage;
-typedef itk::ImageFileReader< TImage > TImageReader;
-typedef itk::HausdorffDistanceImageFilter< TImage, TImage > TDistance;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 3 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " first_image second_image"
- << std::endl;
- return( 1 );
-
- } // fi
- std::string first_image_fn = argv[ 1 ];
- std::string second_image_fn = argv[ 2 ];
-
- // Read image
- TImageReader::Pointer first_image_reader = TImageReader::New( );
- TImageReader::Pointer second_image_reader = TImageReader::New( );
- first_image_reader->SetFileName( first_image_fn );
- second_image_reader->SetFileName( second_image_fn );
- try
- {
- first_image_reader->Update( );
- second_image_reader->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr << "Error caught: " << err << std::endl;
- return( 1 );
-
- } // yrt
-
- TDistance::Pointer distance = TDistance::New( );
- distance->SetInput1( first_image_reader->GetOutput( ) );
- distance->SetInput2( second_image_reader->GetOutput( ) );
- distance->Update( );
- std::cout << "Hausdorff distance = " << distance->GetHausdorffDistance( ) << std::endl;
-
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <iostream>
-#include <itkImage.h>
-
-#include <fpa/Image/Dijkstra.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 2;
-typedef unsigned char TPixel;
-typedef double TCost;
-typedef itk::Image< TPixel, Dim > TImage;
-
-typedef fpa::Image::Dijkstra< TImage, TCost > TFrontAlgorithm;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- // Create a dummy image
- TImage::SizeType imageSize;
- imageSize.Fill( 100 );
-
- TImage::SpacingType imageSpacing;
- imageSpacing.Fill( 1 );
-
- TImage::Pointer image = TImage::New( );
- image->SetRegions( imageSize );
- image->SetSpacing( imageSpacing );
- image->Allocate( );
- image->FillBuffer( TPixel( 1 ) );
-
- // Seed
- TImage::IndexType seed;
- seed.Fill( 50 );
-
- // Configure algorithm
- TFrontAlgorithm::Pointer algorithm = TFrontAlgorithm::New( );
- algorithm->AddSeed( seed, TCost( 0 ) );
- algorithm->SetInput( image );
- algorithm->SetNeighborhoodOrder( 1 );
- algorithm->Update( );
-
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <cmath>
-#include <iostream>
-#include <limits>
-#include <string>
-
-#include <itkImage.h>
-#include <itkImageFileReader.h>
-#include <itkImageToVTKImageFilter.h>
-#include <itkMinimumMaximumImageCalculator.h>
-#include <itkInvertIntensityImageFilter.h>
-#include <itkDanielssonDistanceMapImageFilter.h>
-#include <itkUnaryFunctorImageFilter.h>
-
-#include <vtkImageActor.h>
-#include <vtkInteractorStyleImage.h>
-#include <vtkPointHandleRepresentation3D.h>
-#include <vtkProperty.h>
-#include <vtkRenderer.h>
-#include <vtkRenderWindow.h>
-#include <vtkRenderWindowInteractor.h>
-#include <vtkSeedRepresentation.h>
-#include <vtkSeedWidget.h>
-#include <vtkSmartPointer.h>
-
-#include <fpa/Image/Dijkstra.h>
-#include <fpa/VTK/Image2DObserver.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 2;
-typedef unsigned char TPixel;
-typedef double TScalar;
-typedef itk::Image< TPixel, Dim > TImage;
-typedef itk::Image< TScalar, Dim > TScalarImage;
-typedef itk::ImageToVTKImageFilter< TImage > TVTKImage;
-
-typedef itk::ImageFileReader< TImage > TImageReader;
-typedef fpa::Image::Dijkstra< TScalarImage, TScalar > TFrontAlgorithm;
-
-typedef
-fpa::VTK::Image2DObserver< TFrontAlgorithm, vtkRenderWindow >
-TObserver;
-
-// -------------------------------------------------------------------------
-class InvertPixelFunctor
-{
-public:
- InvertPixelFunctor( )
- { }
- virtual ~InvertPixelFunctor( )
- { }
- bool operator!=( const InvertPixelFunctor& other ) const
- { return( false ); }
- bool operator==( const InvertPixelFunctor& other ) const
- { return( !( *this != other ) ); }
- inline TScalar operator()( const TScalar& A ) const
- {
- return( TScalar( 1 ) / std::pow( TScalar( 1 ) + A, TScalar( 4 ) ) );
- }
-};
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 3 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " input_image neighborhood_order [stop_at_one_front]"
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- unsigned int neighborhood_order = std::atoi( argv[ 2 ] );
- bool stop_at_one_front = false;
- if( 3 < argc )
- stop_at_one_front = ( std::atoi( argv[ 3 ] ) == 1 );
-
- // Read image
- TImageReader::Pointer input_image_reader = TImageReader::New( );
- input_image_reader->SetFileName( input_image_fn );
- try
- {
- input_image_reader->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr << "Error caught: " << err << std::endl;
- return( 1 );
-
- } // yrt
- TImage::ConstPointer input_image = input_image_reader->GetOutput( );
-
- TVTKImage::Pointer vtk_image = TVTKImage::New( );
- vtk_image->SetInput( input_image );
- vtk_image->Update( );
-
- // VTK visualization
- vtkSmartPointer< vtkImageActor > actor =
- vtkSmartPointer< vtkImageActor >::New( );
- actor->SetInputData( vtk_image->GetOutput( ) );
-
- vtkSmartPointer< vtkRenderer > renderer =
- vtkSmartPointer< vtkRenderer >::New( );
- renderer->SetBackground( 0.1, 0.2, 0.7 );
- renderer->AddActor( actor );
- vtkSmartPointer< vtkRenderWindow > window =
- vtkSmartPointer< vtkRenderWindow >::New( );
- window->SetSize( 800, 800 );
- window->AddRenderer( renderer );
-
- // VTK interaction
- vtkSmartPointer< vtkInteractorStyleImage > imageStyle =
- vtkSmartPointer< vtkInteractorStyleImage >::New( );
- vtkSmartPointer< vtkRenderWindowInteractor > interactor =
- vtkSmartPointer< vtkRenderWindowInteractor >::New( );
- interactor->SetInteractorStyle( imageStyle );
- window->SetInteractor( interactor );
- window->Render( );
-
- // Create the widget and its representation
- vtkSmartPointer< vtkPointHandleRepresentation3D > handle =
- vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
- handle->GetProperty( )->SetColor( 1, 0, 0 );
- vtkSmartPointer< vtkSeedRepresentation > rep =
- vtkSmartPointer< vtkSeedRepresentation >::New( );
- rep->SetHandleRepresentation( handle );
-
- vtkSmartPointer< vtkSeedWidget > widget =
- vtkSmartPointer< vtkSeedWidget >::New( );
- widget->SetInteractor( interactor );
- widget->SetRepresentation( rep );
-
- // Let some interaction
- interactor->Initialize( );
- window->Render( );
- widget->On( );
- interactor->Start( );
-
- // Compute cost map
- typedef itk::MinimumMaximumImageCalculator< TImage > TMinMax;
- typedef itk::InvertIntensityImageFilter< TImage > TInvert;
- typedef itk::DanielssonDistanceMapImageFilter< TImage, TScalarImage > TDanielsson;
- typedef itk::UnaryFunctorImageFilter< TScalarImage, TScalarImage, InvertPixelFunctor > TInvertFunctor;
-
- TMinMax::Pointer input_image_min_max = TMinMax::New( );
- input_image_min_max->SetImage( input_image );
- input_image_min_max->Compute( );
-
- TInvert::Pointer invert = TInvert::New( );
- invert->SetInput( input_image );
- invert->SetMaximum( input_image_min_max->GetMaximum( ) );
-
- TDanielsson::Pointer danielsson = TDanielsson::New( );
- danielsson->SetInput( invert->GetOutput( ) );
- danielsson->InputIsBinaryOn( );
- danielsson->SquaredDistanceOff( );
- danielsson->UseImageSpacingOn( );
-
- TInvertFunctor::Pointer invert_pixels = TInvertFunctor::New( );
- invert_pixels->SetInput( danielsson->GetOutput( ) );
- invert_pixels->Update( );
-
- // Configure observer
- TObserver::Pointer obs = TObserver::New( );
- obs->SetImage( invert_pixels->GetOutput( ), window );
-
- // Configure algorithm
- TFrontAlgorithm::Pointer algorithm = TFrontAlgorithm::New( );
- for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ )
- {
- double pos[ 3 ];
- rep->GetSeedWorldPosition( s, pos );
-
- TImage::PointType pnt;
- pnt[ 0 ] = pos[ 0 ];
- pnt[ 1 ] = pos[ 1 ];
-
- TImage::IndexType idx;
- if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
- {
- algorithm->AddSeed( idx, 0 );
- std::cout << " Seed --> " << idx << std::endl;
-
- } // fi
-
- } // rof
- algorithm->AddObserver( itk::AnyEvent( ), obs );
- algorithm->ThrowEventsOn( );
- algorithm->SetInput( invert_pixels->GetOutput( ) );
- algorithm->SetNeighborhoodOrder( neighborhood_order );
- algorithm->SetStopAtOneFront( stop_at_one_front );
- algorithm->Update( );
-
- // One last interaction
- window->Render( );
- interactor->Start( );
-
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <iostream>
-#include <limits>
-#include <string>
-
-#include <itkImage.h>
-#include <itkImageFileReader.h>
-#include <itkRGBAPixel.h>
-#include <itkSignedDanielssonDistanceMapImageFilter.h>
-#include <itkImageToVTKImageFilter.h>
-
-#include <vtkImageActor.h>
-#include <vtkInteractorStyleImage.h>
-#include <vtkPointHandleRepresentation3D.h>
-#include <vtkProperty.h>
-#include <vtkRenderer.h>
-#include <vtkRenderWindow.h>
-#include <vtkRenderWindowInteractor.h>
-#include <vtkSeedRepresentation.h>
-#include <vtkSeedWidget.h>
-#include <vtkSmartPointer.h>
-
-#include <fpa/Image/Dijkstra.h>
-#include <fpa/Base/Functors/InvertCostFunction.h>
-#include <fpa/Base/TreeExtractor.h>
-#include <fpa/VTK/Image2DObserver.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 2;
-typedef unsigned char TPixel;
-typedef itk::RGBAPixel< TPixel > TRGBAPixel;
-typedef double TScalar;
-typedef itk::Image< TPixel, Dim > TImage;
-typedef itk::Image< TScalar, Dim > TDistanceMap;
-typedef itk::Image< TRGBAPixel, Dim > TRGBAImage;
-typedef itk::ImageToVTKImageFilter< TImage > TVTKImage;
-typedef itk::ImageToVTKImageFilter< TRGBAImage > TVTKRGBAImage;
-
-typedef itk::ImageFileReader< TImage > TImageReader;
-typedef
-itk::SignedDanielssonDistanceMapImageFilter< TImage, TDistanceMap >
-TDistanceFilter;
-
-typedef fpa::Image::Dijkstra< TDistanceMap, TScalar > TFrontAlgorithm;
-typedef fpa::Base::TreeExtractor< TFrontAlgorithm > TExtractor;
-typedef fpa::Base::Functors::InvertCostFunction< TScalar > TScalarFunction;
-
-typedef
-fpa::VTK::Image2DObserver< TExtractor, vtkRenderWindow >
-TObserver;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 2 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " input_image [stop_at_one_front]" << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- bool stop_at_one_front = false;
- if( 2 < argc )
- stop_at_one_front = ( std::atoi( argv[ 2 ] ) == 1 );
-
- // Read image
- TImageReader::Pointer input_image_reader = TImageReader::New( );
- input_image_reader->SetFileName( input_image_fn );
- try
- {
- input_image_reader->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr << "Error caught: " << err << std::endl;
- return( 1 );
-
- } // yrt
-
- TDistanceFilter::Pointer dist_filter = TDistanceFilter::New( );
- dist_filter->SetInput( input_image_reader->GetOutput( ) );
- dist_filter->InsideIsPositiveOn( );
- dist_filter->SquaredDistanceOff( );
- dist_filter->Update( );
-
- TImage::ConstPointer input_image = input_image_reader->GetOutput( );
-
- TVTKImage::Pointer vtk_image = TVTKImage::New( );
- vtk_image->SetInput( input_image );
- vtk_image->Update( );
-
- // VTK visualization
- vtkSmartPointer< vtkImageActor > actor =
- vtkSmartPointer< vtkImageActor >::New( );
- actor->SetInputData( vtk_image->GetOutput( ) );
-
- vtkSmartPointer< vtkRenderer > renderer =
- vtkSmartPointer< vtkRenderer >::New( );
- renderer->SetBackground( 0.1, 0.2, 0.7 );
- renderer->AddActor( actor );
- vtkSmartPointer< vtkRenderWindow > window =
- vtkSmartPointer< vtkRenderWindow >::New( );
- window->SetSize( 800, 800 );
- window->AddRenderer( renderer );
-
- // VTK interaction
- vtkSmartPointer< vtkInteractorStyleImage > imageStyle =
- vtkSmartPointer< vtkInteractorStyleImage >::New( );
- vtkSmartPointer< vtkRenderWindowInteractor > interactor =
- vtkSmartPointer< vtkRenderWindowInteractor >::New( );
- interactor->SetInteractorStyle( imageStyle );
- window->SetInteractor( interactor );
- window->Render( );
-
- // Create the widget and its representation
- vtkSmartPointer< vtkPointHandleRepresentation3D > handle =
- vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
- handle->GetProperty( )->SetColor( 1, 0, 0 );
- vtkSmartPointer< vtkSeedRepresentation > rep =
- vtkSmartPointer< vtkSeedRepresentation >::New( );
- rep->SetHandleRepresentation( handle );
-
- vtkSmartPointer< vtkSeedWidget > widget =
- vtkSmartPointer< vtkSeedWidget >::New( );
- widget->SetInteractor( interactor );
- widget->SetRepresentation( rep );
-
- // Let some interaction
- interactor->Initialize( );
- window->Render( );
- widget->On( );
- interactor->Start( );
-
- // Configure observer
- TObserver::Pointer obs = TObserver::New( );
- obs->SetImage( dist_filter->GetOutput( ), window );
-
- // Configure membership function
- TScalarFunction::Pointer cost_function = TScalarFunction::New( );
-
- // Configure algorithm
- TExtractor::Pointer algorithm = TExtractor::New( );
- for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ )
- {
- double pos[ 3 ];
- rep->GetSeedWorldPosition( s, pos );
-
- TImage::PointType pnt;
- pnt[ 0 ] = pos[ 0 ];
- pnt[ 1 ] = pos[ 1 ];
-
- TImage::IndexType idx;
- if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
- {
- algorithm->AddSeed( idx, 0 );
- if( s == 0 )
- algorithm->SetRoot( idx );
- else
- algorithm->AddLeaf( idx );
-
- } // fi
-
- } // rof
- algorithm->AddObserver( itk::AnyEvent( ), obs );
- algorithm->ThrowEventsOn( );
- algorithm->SetInput( dist_filter->GetOutput( ) );
- algorithm->SetNeighborhoodOrder( 1 );
- algorithm->SetStopAtOneFront( stop_at_one_front );
- algorithm->SetCostConversion( cost_function );
- algorithm->Update( );
-
- // Create image with tree
- TPixel transparent_color[] = { 0, 0, 0, 0 };
- TPixel solid_color[] = { 255, 255, 0, 255 };
- TRGBAImage::Pointer tree_image = TRGBAImage::New( );
- tree_image->CopyInformation( input_image );
- tree_image->SetRequestedRegionToLargestPossibleRegion( );
- tree_image->SetBufferedRegion( tree_image->GetRequestedRegion( ) );
- tree_image->Allocate( );
- tree_image->FillBuffer( TRGBAPixel( transparent_color ) );
-
- const TExtractor::TTree& tree = algorithm->GetTree( );
- TExtractor::TTree::const_iterator tIt = tree.begin( );
- for( ; tIt != tree.end( ); ++tIt )
- tree_image->SetPixel( tIt->first, TRGBAPixel( solid_color ) );
-
- TVTKRGBAImage::Pointer vtk_tree_image = TVTKRGBAImage::New( );
- vtk_tree_image->SetInput( tree_image );
- vtk_tree_image->Update( );
-
- vtkSmartPointer< vtkImageActor > tree_actor =
- vtkSmartPointer< vtkImageActor >::New( );
- tree_actor->SetInputData( vtk_tree_image->GetOutput( ) );
-
- renderer->AddActor( tree_actor );
- window->Render( );
-
- // One last interaction
- interactor->Start( );
-
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <cmath>
-#include <ctime>
-#include <deque>
-#include <fstream>
-#include <iostream>
-#include <iomanip>
-#include <limits>
-#include <map>
-#include <string>
-
-#include <itkConstNeighborhoodIterator.h>
-#include <itkNeighborhoodIterator.h>
-#include <itkDanielssonDistanceMapImageFilter.h>
-#include <itkImage.h>
-#include <itkImageFileReader.h>
-#include <itkImageFileWriter.h>
-#include <itkImageToVTKImageFilter.h>
-
-#include <itkMinimumMaximumImageCalculator.h>
-#include <itkInvertIntensityImageFilter.h>
-
-#include <vtkPoints.h>
-#include <vtkCellArray.h>
-#include <vtkFloatArray.h>
-#include <vtkPolyData.h>
-#include <vtkPolyDataWriter.h>
-#include <vtkSmartPointer.h>
-#include <vtkImageMarchingCubes.h>
-#include <vtkLookupTable.h>
-
-#include <fpa/Image/DijkstraWithSphereBacktracking.h>
-#include <fpa/VTK/ImageMPR.h>
-#include <fpa/VTK/Image3DObserver.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 3;
-typedef float TPixel;
-typedef float TScalar;
-typedef itk::Image< TPixel, Dim > TImage;
-typedef itk::ImageToVTKImageFilter< TImage > TVTKImage;
-
-typedef itk::ImageFileReader< TImage > TImageReader;
-typedef itk::ImageFileWriter< TImage > TImageWriter;
-typedef fpa::Image::DijkstraWithSphereBacktracking< TImage, TScalar > TDijkstra;
-
-typedef fpa::VTK::ImageMPR TMPR;
-typedef fpa::VTK::Image3DObserver< TDijkstra, vtkRenderWindow > TDijkstraObs;
-
-struct TBranch
-{
- double Length;
- TImage::PointType::VectorType V1;
- TImage::PointType::VectorType V2;
-
- bool operator<( const TBranch& other ) const
- {
- return( other.Length < this->Length );
- }
-};
-typedef std::multiset< TBranch > TBranches;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 8 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " input_image x y z output_image output_imagej output_vtk"
- << " visual_debug"
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- TImage::PointType seed_pnt;
- seed_pnt[ 0 ] = std::atof( argv[ 2 ] );
- seed_pnt[ 1 ] = std::atof( argv[ 3 ] );
- seed_pnt[ 2 ] = std::atof( argv[ 4 ] );
- std::string output_image_fn = argv[ 5 ];
- std::string output_imagej_fn = argv[ 6 ];
- std::string output_vtk_fn = argv[ 7 ];
- bool visual_debug = false;
- if( argc > 8 )
- visual_debug = ( std::atoi( argv[ 8 ] ) == 1 );
-
- // Read image
- TImageReader::Pointer input_image_reader = TImageReader::New( );
- input_image_reader->SetFileName( input_image_fn );
- try
- {
- input_image_reader->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr << "Error caught: " << err << std::endl;
- return( 1 );
-
- } // yrt
- TImage::ConstPointer input_image = input_image_reader->GetOutput( );
-
- // Show image
- TVTKImage::Pointer vtk_image = TVTKImage::New( );
- vtk_image->SetInput( input_image );
- vtk_image->Update( );
-
- TMPR view;
- view.SetBackground( 0.3, 0.2, 0.8 );
- view.SetSize( 800, 800 );
- view.SetImage( vtk_image->GetOutput( ) );
-
- /* TODO
- vtkSmartPointer< vtkImageMarchingCubes > mc =
- vtkSmartPointer< vtkImageMarchingCubes >::New( );
- mc->SetInputData( vtk_image->GetOutput( ) );
- mc->SetValue( 0, 1e-2 );
- mc->Update( );
- view.AddPolyData( mc->GetOutput( ), 1, 1, 1, 0.4 );
- */
-
- // Allow some interaction
- view.Render( );
- if( visual_debug )
- view.Start( );
-
- TImage::IndexType seed_idx;
- input_image->TransformPhysicalPointToIndex( seed_pnt, seed_idx );
- /* TODO
- std::cout << seed_idx << " " << seed_pnt << std::endl;
- seed_idx[ 0 ] = 256;
- seed_idx[ 1 ] = 313;
- seed_idx[ 2 ] = 381;
- */
-
- // Extract paths
- TDijkstra::Pointer paths = TDijkstra::New( );
- paths->AddSeed( seed_idx, TScalar( 0 ) );
- paths->SetInput( input_image );
- paths->SetNeighborhoodOrder( 2 );
-
- if( visual_debug )
- {
- // Configure observer
- TDijkstraObs::Pointer obs = TDijkstraObs::New( );
- obs->SetRenderWindow( view.GetWindow( ) );
- paths->AddObserver( itk::AnyEvent( ), obs );
- paths->ThrowEventsOn( );
- }
- else
- paths->ThrowEventsOff( );
- std::clock_t start = std::clock( );
- paths->Update( );
- std::clock_t end = std::clock( );
- double seconds = double( end - start ) / double( CLOCKS_PER_SEC );
- std::cout << "Paths extraction time = " << seconds << std::endl;
-
- // Create polydata
- vtkSmartPointer< vtkPoints > points =
- vtkSmartPointer< vtkPoints >::New( );
- vtkSmartPointer< vtkCellArray > cells =
- vtkSmartPointer< vtkCellArray >::New( );
- vtkSmartPointer< vtkFloatArray > scalars =
- vtkSmartPointer< vtkFloatArray >::New( );
-
- TDijkstra::TMarkImage::Pointer new_marks = TDijkstra::TMarkImage::New( );
- new_marks->SetLargestPossibleRegion( input_image->GetLargestPossibleRegion( ) );
- new_marks->SetRequestedRegion( input_image->GetRequestedRegion( ) );
- new_marks->SetBufferedRegion( input_image->GetBufferedRegion( ) );
- new_marks->SetOrigin( input_image->GetOrigin( ) );
- new_marks->SetSpacing( input_image->GetSpacing( ) );
- new_marks->SetDirection( input_image->GetDirection( ) );
- new_marks->Allocate( );
- new_marks->FillBuffer( 0 );
-
- const TDijkstra::TMarkImage* marks = paths->GetOutputMarkImage( );
- TDijkstra::TMark max_mark = paths->GetNumberOfBranches( );
- const TDijkstra::TVertices& endpoints = paths->GetEndPoints( );
- const TDijkstra::TVertices& bifurcations = paths->GetBifurcationPoints( );
- const TDijkstra::TTree& tree = paths->GetFullTree( );
- const TDijkstra::TTree& reduced_tree = paths->GetReducedTree( );
- TDijkstra::TVertices::const_iterator epIt = endpoints.begin( );
-
- TBranches branches;
- TImage::PointType ori = input_image->GetOrigin( );
-
- TDijkstra::TTree::const_iterator rIt = reduced_tree.begin( );
- for( ; rIt != reduced_tree.end( ); ++rIt )
- {
- TDijkstra::TTree::const_iterator tIt = tree.find( rIt->first );
-
- // Prepare branch "a la ImageJ"
- TBranch branch;
- TImage::PointType p1, p2;
- input_image->TransformIndexToPhysicalPoint( rIt->second.first, p1 );
- input_image->TransformIndexToPhysicalPoint( rIt->first, p2 );
- branch.V1 = p1 - ori;
- branch.V2 = p2 - ori;
- branch.Length = double( 0 );
-
- double pd =
- ( double( tIt->second.second ) - double( 1 ) ) /
- ( double( max_mark ) - double( 1 ) );
- bool start = true;
- TImage::PointType prev;
- do
- {
- TDijkstra::TVertex idx = tIt->first;
- new_marks->SetPixel( idx, 255 );
- TImage::PointType pnt;
- input_image->TransformIndexToPhysicalPoint( idx, pnt );
- points->InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
- scalars->InsertNextTuple1( pd );
- if( !start )
- {
- cells->InsertNextCell( 2 );
- cells->InsertCellPoint( points->GetNumberOfPoints( ) - 2 );
- cells->InsertCellPoint( points->GetNumberOfPoints( ) - 1 );
- branch.Length += prev.EuclideanDistanceTo( pnt );
-
- } // fi
- start = false;
- prev = pnt;
- tIt = tree.find( tIt->second.first );
-
- } while( tIt->first != rIt->second.first );
-
- // Last point
- TDijkstra::TVertex idx = tIt->first;
- new_marks->SetPixel( idx, 255 );
- TImage::PointType pnt;
- input_image->TransformIndexToPhysicalPoint( idx, pnt );
- points->InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
- scalars->InsertNextTuple1( pd );
- if( !start )
- {
- cells->InsertNextCell( 2 );
- cells->InsertCellPoint( points->GetNumberOfPoints( ) - 2 );
- cells->InsertCellPoint( points->GetNumberOfPoints( ) - 1 );
- branch.Length += prev.EuclideanDistanceTo( pnt );
-
- } // fi
- branches.insert( branch );
-
- } // rof
-
- std::ofstream bout( output_imagej_fn.c_str( ) );
- if( !bout )
- {
- std::cerr << "Error: could not open " << output_imagej_fn << std::endl;
- return( 1 );
-
- } // fi
- int i = 1;
- for( TBranches::const_iterator bIt = branches.begin( ); bIt != branches.end( ); ++bIt, ++i )
- {
- bout
- << std::setiosflags( std::ios::fixed) << std::setprecision( 3 )
- << i << "\t1.000\t"
- << bIt->Length << "\t"
- << bIt->V1[ 0 ] << "\t"
- << bIt->V1[ 1 ] << "\t"
- << bIt->V1[ 2 ] << "\t"
- << bIt->V2[ 0 ] << "\t"
- << bIt->V2[ 1 ] << "\t"
- << bIt->V2[ 2 ] << "\t"
- << ( bIt->V2 - bIt->V1 ).GetNorm( )
- << std::endl;
-
- } // rof
- bout.close( );
-
- vtkSmartPointer< vtkPolyData > vtk_tree =
- vtkSmartPointer< vtkPolyData >::New( );
- vtk_tree->SetPoints( points );
- vtk_tree->SetLines( cells );
- vtk_tree->GetPointData( )->SetScalars( scalars );
-
- view.AddPolyData( vtk_tree );
- view.Render( );
- if( visual_debug )
- view.Start( );
-
- vtkSmartPointer< vtkPolyDataWriter > writer =
- vtkSmartPointer< vtkPolyDataWriter >::New( );
- writer->SetInputData( vtk_tree );
- writer->SetFileName( output_vtk_fn.c_str( ) );
- writer->Update( );
-
- itk::ImageFileWriter< TDijkstra::TMarkImage >::Pointer marks_writer =
- itk::ImageFileWriter< TDijkstra::TMarkImage >::New( );
- marks_writer->SetInput( new_marks );
- marks_writer->SetFileName( output_image_fn );
- marks_writer->Update( );
-
- TImageWriter::Pointer dijkstra_writer =
- TImageWriter::New( );
- dijkstra_writer->SetInput( paths->GetOutput( ) );
- dijkstra_writer->SetFileName( "dijkstra.mhd" );
- dijkstra_writer->Update( );
-
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <iostream>
-#include <itkImage.h>
-
-#include <fpa/Image/FastMarching.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 2;
-typedef unsigned char TPixel;
-typedef double TCost;
-typedef itk::Image< TPixel, Dim > TImage;
-
-typedef fpa::Image::FastMarching< TImage, TCost > TFrontAlgorithm;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- // Create a dummy image
- TImage::SizeType imageSize;
- imageSize.Fill( 100 );
-
- TImage::SpacingType imageSpacing;
- imageSpacing.Fill( 1 );
-
- TImage::Pointer image = TImage::New( );
- image->SetRegions( imageSize );
- image->SetSpacing( imageSpacing );
- image->Allocate( );
- image->FillBuffer( TPixel( 1 ) );
-
- // Seed
- TImage::IndexType seed;
- seed.Fill( 50 );
-
- // Configure algorithm
- TFrontAlgorithm::Pointer algorithm = TFrontAlgorithm::New( );
- algorithm->AddSeed( seed, TCost( 0 ) );
- algorithm->SetInput( image );
- algorithm->SetNeighborhoodOrder( 1 );
- algorithm->Update( );
-
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <iostream>
-#include <limits>
-#include <string>
-
-#include <itkImage.h>
-#include <itkImageFileReader.h>
-#include <itkImageToVTKImageFilter.h>
-
-#include <vtkImageActor.h>
-#include <vtkInteractorStyleImage.h>
-#include <vtkPointHandleRepresentation3D.h>
-#include <vtkProperty.h>
-#include <vtkRenderer.h>
-#include <vtkRenderWindow.h>
-#include <vtkRenderWindowInteractor.h>
-#include <vtkSeedRepresentation.h>
-#include <vtkSeedWidget.h>
-#include <vtkSmartPointer.h>
-
-#include <fpa/Image/FastMarching.h>
-#include <fpa/VTK/Image2DObserver.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 2;
-typedef unsigned char TPixel;
-typedef double TScalar;
-typedef itk::Image< TPixel, Dim > TImage;
-typedef itk::ImageToVTKImageFilter< TImage > TVTKImage;
-
-typedef itk::ImageFileReader< TImage > TImageReader;
-typedef fpa::Image::FastMarching< TImage, TScalar > TFrontAlgorithm;
-
-typedef
-fpa::VTK::Image2DObserver< TFrontAlgorithm, vtkRenderWindow >
-TObserver;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 2 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " input_image [stop_at_one_front]" << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- bool stop_at_one_front = false;
- if( 2 < argc )
- stop_at_one_front = ( std::atoi( argv[ 2 ] ) == 1 );
-
- // Read image
- TImageReader::Pointer input_image_reader = TImageReader::New( );
- input_image_reader->SetFileName( input_image_fn );
- try
- {
- input_image_reader->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr << "Error caught: " << err << std::endl;
- return( 1 );
-
- } // yrt
- TImage::ConstPointer input_image = input_image_reader->GetOutput( );
-
- TVTKImage::Pointer vtk_image = TVTKImage::New( );
- vtk_image->SetInput( input_image );
- vtk_image->Update( );
-
- // VTK visualization
- vtkSmartPointer< vtkImageActor > actor =
- vtkSmartPointer< vtkImageActor >::New( );
- actor->SetInputData( vtk_image->GetOutput( ) );
-
- vtkSmartPointer< vtkRenderer > renderer =
- vtkSmartPointer< vtkRenderer >::New( );
- renderer->SetBackground( 0.1, 0.2, 0.7 );
- renderer->AddActor( actor );
- vtkSmartPointer< vtkRenderWindow > window =
- vtkSmartPointer< vtkRenderWindow >::New( );
- window->SetSize( 800, 800 );
- window->AddRenderer( renderer );
-
- // VTK interaction
- vtkSmartPointer< vtkInteractorStyleImage > imageStyle =
- vtkSmartPointer< vtkInteractorStyleImage >::New( );
- vtkSmartPointer< vtkRenderWindowInteractor > interactor =
- vtkSmartPointer< vtkRenderWindowInteractor >::New( );
- interactor->SetInteractorStyle( imageStyle );
- window->SetInteractor( interactor );
- window->Render( );
-
- // Create the widget and its representation
- vtkSmartPointer< vtkPointHandleRepresentation3D > handle =
- vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
- handle->GetProperty( )->SetColor( 1, 0, 0 );
- vtkSmartPointer< vtkSeedRepresentation > rep =
- vtkSmartPointer< vtkSeedRepresentation >::New( );
- rep->SetHandleRepresentation( handle );
-
- vtkSmartPointer< vtkSeedWidget > widget =
- vtkSmartPointer< vtkSeedWidget >::New( );
- widget->SetInteractor( interactor );
- widget->SetRepresentation( rep );
-
- // Let some interaction
- interactor->Initialize( );
- window->Render( );
- widget->On( );
- interactor->Start( );
-
- // Configure observer
- TObserver::Pointer obs = TObserver::New( );
- obs->SetImage( input_image, window );
-
- // Configure algorithm
- TFrontAlgorithm::Pointer algorithm = TFrontAlgorithm::New( );
- for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ )
- {
- double pos[ 3 ];
- rep->GetSeedWorldPosition( s, pos );
-
- TImage::PointType pnt;
- pnt[ 0 ] = pos[ 0 ];
- pnt[ 1 ] = pos[ 1 ];
-
- TImage::IndexType idx;
- if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
- {
- algorithm->AddSeed( idx, 0 );
- std::cout << " Seed --> " << idx << std::endl;
-
- } // fi
-
- } // rof
- algorithm->AddObserver( itk::AnyEvent( ), obs );
- algorithm->ThrowEventsOn( );
- algorithm->SetInput( input_image );
- algorithm->SetNeighborhoodOrder( 1 );
- algorithm->SetStopAtOneFront( stop_at_one_front );
- algorithm->Update( );
-
- // One last interaction
- window->Render( );
- interactor->Start( );
-
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <iostream>
-#include <itkImage.h>
-
-#include <fpa/Image/RegionGrow.h>
-#include <fpa/Image/Functors/RegionGrowAllBelongsFunction.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 2;
-typedef unsigned char TPixel;
-typedef itk::Image< TPixel, Dim > TImage;
-
-typedef fpa::Image::RegionGrow< TImage > TFrontAlgorithm;
-typedef
-fpa::Image::Functors::RegionGrowAllBelongsFunction< TImage >
-TMembershipFunction;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- // Create a dummy image
- TImage::SizeType imageSize;
- imageSize.Fill( 10 );
-
- TImage::SpacingType imageSpacing;
- imageSpacing.Fill( 1 );
-
- TImage::Pointer image = TImage::New( );
- image->SetRegions( imageSize );
- image->SetSpacing( imageSpacing );
- image->Allocate( );
- image->FillBuffer( TPixel( 1 ) );
-
- // Seed
- TImage::IndexType seed;
- seed.Fill( 5 );
-
- // Configure membership function
- TMembershipFunction::Pointer membership = TMembershipFunction::New( );
-
- // Configure algorithm
- TFrontAlgorithm::Pointer algorithm = TFrontAlgorithm::New( );
- algorithm->AddSeed( seed, 0 );
- algorithm->SetInput( image );
- algorithm->SetNeighborhoodOrder( 1 );
- algorithm->SetMembershipFunction( membership );
- algorithm->Update( );
-
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <iostream>
-#include <limits>
-#include <string>
-
-#include <itkImage.h>
-#include <itkImageFileReader.h>
-#include <itkSignedDanielssonDistanceMapImageFilter.h>
-#include <itkImageToVTKImageFilter.h>
-
-#include <vtkImageActor.h>
-#include <vtkInteractorStyleImage.h>
-#include <vtkPointHandleRepresentation3D.h>
-#include <vtkProperty.h>
-#include <vtkRenderer.h>
-#include <vtkRenderWindow.h>
-#include <vtkRenderWindowInteractor.h>
-#include <vtkSeedRepresentation.h>
-#include <vtkSeedWidget.h>
-#include <vtkSmartPointer.h>
-
-#include <fpa/Image/RegionGrow.h>
-#include <fpa/Image/Functors/RegionGrowThresholdFunction.h>
-#include <fpa/VTK/Image2DObserver.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 2;
-typedef unsigned char TPixel;
-typedef double TScalar;
-typedef itk::Image< TPixel, Dim > TImage;
-typedef itk::ImageToVTKImageFilter< TImage > TVTKImage;
-
-typedef itk::ImageFileReader< TImage > TImageReader;
-typedef fpa::Image::RegionGrow< TImage > TFrontAlgorithm;
-
-typedef
-fpa::Image::Functors::RegionGrowThresholdFunction< TImage >
-TMembershipFunction;
-
-typedef
-fpa::VTK::Image2DObserver< TFrontAlgorithm, vtkRenderWindow >
-TObserver;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 4 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " input_image lower_threshold upper_threshold" << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- TPixel lower_threshold = TPixel( std::atof( argv[ 2 ] ) );
- TPixel upper_threshold = TPixel( std::atof( argv[ 3 ] ) );
-
- // Read image
- TImageReader::Pointer input_image_reader = TImageReader::New( );
- input_image_reader->SetFileName( input_image_fn );
- try
- {
- input_image_reader->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr << "Error caught: " << err << std::endl;
- return( 1 );
-
- } // yrt
- TImage::ConstPointer input_image = input_image_reader->GetOutput( );
-
- TVTKImage::Pointer vtk_image = TVTKImage::New( );
- vtk_image->SetInput( input_image );
- vtk_image->Update( );
-
- // VTK visualization
- vtkSmartPointer< vtkImageActor > actor =
- vtkSmartPointer< vtkImageActor >::New( );
- actor->SetInputData( vtk_image->GetOutput( ) );
-
- vtkSmartPointer< vtkRenderer > renderer =
- vtkSmartPointer< vtkRenderer >::New( );
- renderer->SetBackground( 0.1, 0.2, 0.7 );
- renderer->AddActor( actor );
- vtkSmartPointer< vtkRenderWindow > window =
- vtkSmartPointer< vtkRenderWindow >::New( );
- window->SetSize( 800, 800 );
- window->AddRenderer( renderer );
-
- // VTK interaction
- vtkSmartPointer< vtkInteractorStyleImage > imageStyle =
- vtkSmartPointer< vtkInteractorStyleImage >::New( );
- vtkSmartPointer< vtkRenderWindowInteractor > interactor =
- vtkSmartPointer< vtkRenderWindowInteractor >::New( );
- interactor->SetInteractorStyle( imageStyle );
- window->SetInteractor( interactor );
- window->Render( );
-
- // Create the widget and its representation
- vtkSmartPointer< vtkPointHandleRepresentation3D > handle =
- vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
- handle->GetProperty( )->SetColor( 1, 0, 0 );
- vtkSmartPointer< vtkSeedRepresentation > rep =
- vtkSmartPointer< vtkSeedRepresentation >::New( );
- rep->SetHandleRepresentation( handle );
-
- vtkSmartPointer< vtkSeedWidget > widget =
- vtkSmartPointer< vtkSeedWidget >::New( );
- widget->SetInteractor( interactor );
- widget->SetRepresentation( rep );
-
- // Let some interaction
- interactor->Initialize( );
- window->Render( );
- widget->On( );
- interactor->Start( );
-
- // Configure observer
- TObserver::Pointer obs = TObserver::New( );
- obs->SetImage( input_image, window );
-
- // Configure membership function
- TMembershipFunction::Pointer membership = TMembershipFunction::New( );
- membership->SetLowerThreshold( lower_threshold );
- membership->SetUpperThreshold( upper_threshold );
-
- // Configure algorithm
- TFrontAlgorithm::Pointer algorithm = TFrontAlgorithm::New( );
- for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ )
- {
- double pos[ 3 ];
- rep->GetSeedWorldPosition( s, pos );
-
- TImage::PointType pnt;
- pnt[ 0 ] = TScalar( pos[ 0 ] );
- pnt[ 1 ] = TScalar( pos[ 1 ] );
-
- TImage::IndexType idx;
- if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
- algorithm->AddSeed( idx, 0 );
-
- } // rof
- algorithm->AddObserver( itk::AnyEvent( ), obs );
- algorithm->ThrowEventsOn( );
- algorithm->SetInput( input_image );
- algorithm->SetNeighborhoodOrder( 1 );
- algorithm->SetMembershipFunction( membership );
- algorithm->Update( );
-
- // One last interaction
- interactor->Start( );
-
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <ctime>
-#include <iostream>
-#include <limits>
-#include <set>
-#include <string>
-
-#include <itkImage.h>
-#include <itkImageFileReader.h>
-#include <itkImageFileWriter.h>
-#include <itkImageToVTKImageFilter.h>
-
-#include <vtkImageActor.h>
-#include <vtkImageMarchingCubes.h>
-#include <vtkProperty.h>
-#include <vtkRenderer.h>
-#include <vtkRenderWindow.h>
-#include <vtkRenderWindowInteractor.h>
-#include <vtkSmartPointer.h>
-#include <vtkSphereSource.h>
-
-#include <fpa/Image/RegionGrowWithMultipleThresholds.h>
-#include <fpa/VTK/ImageMPR.h>
-#include <fpa/VTK/Image3DObserver.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 3;
-typedef short TPixel;
-typedef double TScalar;
-typedef itk::Image< TPixel, Dim > TImage;
-typedef itk::ImageToVTKImageFilter< TImage > TVTKImage;
-
-typedef itk::ImageFileReader< TImage > TImageReader;
-typedef itk::ImageFileWriter< TImage > TImageWriter;
-
-typedef
-fpa::Image::RegionGrowWithMultipleThresholds< TImage >
-TFrontAlgorithm;
-typedef
-fpa::VTK::Image3DObserver< TFrontAlgorithm, vtkRenderWindow >
-TObserver;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 6 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " input_image thr_0 thr_1 step output_image"
- << " visual_debug"
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- TPixel thr_0 = TPixel( std::atof( argv[ 2 ] ) );
- TPixel thr_1 = TPixel( std::atof( argv[ 3 ] ) );
- unsigned int step = std::atoi( argv[ 4 ] );
- std::string output_image_fn = argv[ 5 ];
- bool visual_debug = false;
- if( argc > 6 )
- visual_debug = ( std::atoi( argv[ 6 ] ) == 1 );
-
- // Read image
- TImageReader::Pointer input_image_reader = TImageReader::New( );
- input_image_reader->SetFileName( input_image_fn );
- try
- {
- input_image_reader->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr << "Error caught: " << err << std::endl;
- return( 1 );
-
- } // yrt
- TImage::ConstPointer input_image = input_image_reader->GetOutput( );
- TImage::SpacingType spac = input_image->GetSpacing( );
- double min_spac = spac[ 0 ];
- for( unsigned int d = 1; d < Dim; d++ )
- min_spac = ( spac[ d ] < min_spac )? spac[ d ]: min_spac;
-
- TVTKImage::Pointer vtk_image = TVTKImage::New( );
- vtk_image->SetInput( input_image );
- vtk_image->Update( );
-
- fpa::VTK::ImageMPR view;
- view.SetBackground( 0.3, 0.2, 0.8 );
- view.SetSize( 800, 800 );
- view.SetImage( vtk_image->GetOutput( ) );
-
- // Wait for a seed to be given
- while( view.GetNumberOfSeeds( ) == 0 )
- view.Start( );
-
- // Convert seed
- double seed[ 3 ];
- view.GetSeed( 0, seed );
- TImage::PointType seed_pnt;
- seed_pnt[ 0 ] = seed[ 0 ];
- seed_pnt[ 1 ] = seed[ 1 ];
- seed_pnt[ 2 ] = seed[ 2 ];
- TImage::IndexType seed_idx;
- input_image->TransformPhysicalPointToIndex( seed_pnt, seed_idx );
-
- // Configure algorithm
- TFrontAlgorithm::Pointer algorithm = TFrontAlgorithm::New( );
- algorithm->AddThresholds( thr_0, thr_1, step );
- algorithm->AddSeed( seed_idx, 0 );
- algorithm->SetInput( input_image );
- algorithm->SetNeighborhoodOrder( 1 );
- algorithm->SetDifferenceThreshold( double( 3 ) );
- algorithm->SetInsideValue( 0 );
- algorithm->SetOutsideValue( 1 );
-
- if( visual_debug )
- {
- // Configure observer
- TObserver::Pointer obs = TObserver::New( );
- obs->SetRenderWindow( view.GetWindow( ) );
- algorithm->AddObserver( itk::AnyEvent( ), obs );
- algorithm->ThrowEventsOn( );
- }
- else
- algorithm->ThrowEventsOff( );
-
- std::clock_t start = std::clock( );
- algorithm->Update( );
- std::clock_t end = std::clock( );
- double seconds = double( end - start ) / double( CLOCKS_PER_SEC );
- std::cout << "Execution time = " << seconds << std::endl;
-
- // Show result
- TVTKImage::Pointer output_image_vtk = TVTKImage::New( );
- output_image_vtk->SetInput( algorithm->GetOutput( ) );
- output_image_vtk->Update( );
-
- vtkSmartPointer< vtkImageMarchingCubes > mc =
- vtkSmartPointer< vtkImageMarchingCubes >::New( );
- mc->SetInputData( output_image_vtk->GetOutput( ) );
- mc->SetValue(
- 0,
- double( algorithm->GetInsideValue( ) ) * double( 0.95 )
- );
- mc->Update( );
-
- // Let some interaction and close program
- view.AddPolyData( mc->GetOutput( ), 0.1, 0.6, 0.8, 0.5 );
- view.Start( );
-
- // Write resulting image
- TImageWriter::Pointer output_image_writer = TImageWriter::New( );
- output_image_writer->SetInput( algorithm->GetOutput( ) );
- output_image_writer->SetFileName( output_image_fn );
- try
- {
- output_image_writer->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr << "Error caught: " << err << std::endl;
- return( 1 );
-
- } // yrt
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <ctime>
-#include <iostream>
-#include <string>
-
-#include <itkConstNeighborhoodIterator.h>
-#include <itkDanielssonDistanceMapImageFilter.h>
-#include <itkImage.h>
-#include <itkImageFileReader.h>
-#include <itkImageFileWriter.h>
-#include <itkImageToVTKImageFilter.h>
-
-#include <vtkImageMarchingCubes.h>
-
-#include <fpa/Image/RegionGrowWithMultipleThresholds.h>
-#include <fpa/Image/DijkstraWithSphereBacktracking.h>
-#include <fpa/VTK/ImageMPR.h>
-#include <fpa/VTK/Image3DObserver.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 3;
-typedef short TPixel;
-typedef float TScalar;
-typedef itk::Image< TPixel, Dim > TImage;
-typedef itk::Image< TScalar, Dim > TDistanceMap;
-typedef itk::ImageToVTKImageFilter< TImage > TVTKImage;
-typedef itk::ImageToVTKImageFilter< TDistanceMap > TVTKDistanceMap;
-
-typedef itk::ImageFileReader< TImage > TImageReader;
-typedef itk::ImageFileWriter< TImage > TImageWriter;
-typedef itk::ImageFileWriter< TDistanceMap > TDistanceMapWriter;
-typedef fpa::Image::RegionGrowWithMultipleThresholds< TImage > TSegmentor;
-typedef
-itk::DanielssonDistanceMapImageFilter< TImage, TDistanceMap >
-TDistanceFilter;
-typedef
-fpa::Image::DijkstraWithSphereBacktracking< TDistanceMap, TScalar >
-TDijkstra;
-
-typedef fpa::VTK::ImageMPR TMPR;
-typedef fpa::VTK::Image3DObserver< TSegmentor, vtkRenderWindow > TSegmentorObs;
-typedef fpa::VTK::Image3DObserver< TDijkstra, vtkRenderWindow > TDijkstraObs;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 8 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " input_image thr_0 thr_1 step"
- << " output_segmentation output_distancemap output_dijkstra"
- << " visual_debug"
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- TPixel thr_0 = TPixel( std::atof( argv[ 2 ] ) );
- TPixel thr_1 = TPixel( std::atof( argv[ 3 ] ) );
- unsigned int step = std::atoi( argv[ 4 ] );
- std::string output_segmentation_fn = argv[ 5 ];
- std::string output_distancemap_fn = argv[ 6 ];
- std::string output_dijkstra_fn = argv[ 7 ];
- bool visual_debug = false;
- if( argc > 8 )
- visual_debug = ( std::atoi( argv[ 8 ] ) == 1 );
-
- // Read image
- TImageReader::Pointer input_image_reader = TImageReader::New( );
- input_image_reader->SetFileName( input_image_fn );
- try
- {
- input_image_reader->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr << "Error caught: " << err << std::endl;
- return( 1 );
-
- } // yrt
- TImage::ConstPointer input_image = input_image_reader->GetOutput( );
-
- // Show image
- TVTKImage::Pointer vtk_image = TVTKImage::New( );
- vtk_image->SetInput( input_image );
- vtk_image->Update( );
-
- TMPR view;
- view.SetBackground( 0.3, 0.2, 0.8 );
- view.SetSize( 800, 800 );
- view.SetImage( vtk_image->GetOutput( ) );
-
- // Wait for a seed to be given
- while( view.GetNumberOfSeeds( ) == 0 )
- view.Start( );
-
- // Get seed from user
- double seed[ 3 ];
- view.GetSeed( 0, seed );
- TImage::PointType seed_pnt;
- seed_pnt[ 0 ] = seed[ 0 ];
- seed_pnt[ 1 ] = seed[ 1 ];
- seed_pnt[ 2 ] = seed[ 2 ];
- TImage::IndexType seed_idx;
- input_image->TransformPhysicalPointToIndex( seed_pnt, seed_idx );
-
- // Segment input image
- TSegmentor::Pointer segmentor = TSegmentor::New( );
- segmentor->AddThresholds( thr_0, thr_1, step );
- segmentor->AddSeed( seed_idx, 0 );
- segmentor->SetInput( input_image );
- segmentor->SetNeighborhoodOrder( 1 );
- segmentor->SetDifferenceThreshold( double( 3 ) );
- segmentor->SetInsideValue( TPixel( 0 ) ); // WARNING: This is to optimize
- segmentor->SetOutsideValue( TPixel( 1 ) ); // distance map calculation
- if( visual_debug )
- {
- // Configure observer
- TSegmentorObs::Pointer obs = TSegmentorObs::New( );
- obs->SetRenderWindow( view.GetWindow( ) );
- segmentor->AddObserver( itk::AnyEvent( ), obs );
- segmentor->ThrowEventsOn( );
- }
- else
- segmentor->ThrowEventsOff( );
- std::clock_t start = std::clock( );
- segmentor->Update( );
- std::clock_t end = std::clock( );
- double seconds = double( end - start ) / double( CLOCKS_PER_SEC );
- std::cout << "Segmentation time = " << seconds << std::endl;
-
- // Extract distance map
- TDistanceFilter::Pointer distanceMap = TDistanceFilter::New( );
- distanceMap->SetInput( segmentor->GetOutput( ) );
- distanceMap->InputIsBinaryOn( );
- distanceMap->SquaredDistanceOn( );
- distanceMap->UseImageSpacingOn( );
- start = std::clock( );
- distanceMap->Update( );
- end = std::clock( );
- seconds = double( end - start ) / double( CLOCKS_PER_SEC );
- std::cout << "Distance map time = " << seconds << std::endl;
-
- TVTKDistanceMap::Pointer vtk_distanceMap = TVTKDistanceMap::New( );
- vtk_distanceMap->SetInput( distanceMap->GetOutput( ) );
- vtk_distanceMap->Update( );
-
- vtkSmartPointer< vtkImageMarchingCubes > mc =
- vtkSmartPointer< vtkImageMarchingCubes >::New( );
- mc->SetInputData( vtk_distanceMap->GetOutput( ) );
- mc->SetValue( 0, 1e-2 );
- mc->Update( );
- view.AddPolyData( mc->GetOutput( ), 1, 1, 1, 0.4 );
- view.Render( );
-
- // Extract paths
- TDijkstra::Pointer paths = TDijkstra::New( );
- paths->AddSeed( segmentor->GetSeed( 0 ), TScalar( 0 ) );
- paths->SetInput( distanceMap->GetOutput( ) );
- paths->SetNeighborhoodOrder( 2 );
-
- if( visual_debug )
- {
- // Configure observer
- TDijkstraObs::Pointer obs = TDijkstraObs::New( );
- obs->SetRenderWindow( view.GetWindow( ) );
- paths->AddObserver( itk::AnyEvent( ), obs );
- paths->ThrowEventsOn( );
- }
- else
- paths->ThrowEventsOff( );
- start = std::clock( );
- paths->Update( );
- end = std::clock( );
- seconds = double( end - start ) / double( CLOCKS_PER_SEC );
- std::cout << "Paths extraction time = " << seconds << std::endl;
-
- std::cout << "Final seed: " << paths->GetSeed( 0 ) << std::endl;
-
- // Create polydata
- vtkSmartPointer< vtkPoints > points =
- vtkSmartPointer< vtkPoints >::New( );
- vtkSmartPointer< vtkCellArray > cells =
- vtkSmartPointer< vtkCellArray >::New( );
- vtkSmartPointer< vtkFloatArray > scalars =
- vtkSmartPointer< vtkFloatArray >::New( );
-
- const TDijkstra::TVertices& endpoints = paths->GetEndPoints( );
- const TDijkstra::TTree& tree = paths->GetFullTree( );
- TDijkstra::TVertices::const_iterator epIt = endpoints.begin( );
- for( unsigned int epId = 0; epIt != endpoints.end( ); ++epIt, ++epId )
- {
- double pd = double( epId ) / double( endpoints.size( ) - 1 );
-
- TDijkstra::TVertex idx = *epIt;
- do
- {
- TImage::PointType pnt;
- input_image->TransformIndexToPhysicalPoint( idx, pnt );
-
- points->InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
- scalars->InsertNextTuple1( pd );
- if( idx != *epIt )
- {
- cells->InsertNextCell( 2 );
- cells->InsertCellPoint( points->GetNumberOfPoints( ) - 2 );
- cells->InsertCellPoint( points->GetNumberOfPoints( ) - 1 );
-
- } // fi
- idx = tree.find( idx )->second.first;
-
- } while( idx != tree.find( idx )->second.first );
-
- } // rof
-
- vtkSmartPointer< vtkPolyData > vtk_tree =
- vtkSmartPointer< vtkPolyData >::New( );
- vtk_tree->SetPoints( points );
- vtk_tree->SetLines( cells );
- vtk_tree->GetPointData( )->SetScalars( scalars );
-
- view.AddPolyData( vtk_tree );
- view.Render( );
- view.Start( );
-
- itk::ImageFileWriter< TImage >::Pointer segmentation_writer =
- itk::ImageFileWriter< TImage >::New( );
- segmentation_writer->SetInput( segmentor->GetOutput( ) );
- segmentation_writer->SetFileName( output_segmentation_fn );
-
- itk::ImageFileWriter< TDistanceMap >::Pointer dmap_writer =
- itk::ImageFileWriter< TDistanceMap >::New( );
- dmap_writer->SetInput( distanceMap->GetOutput( ) );
- dmap_writer->SetFileName( output_distancemap_fn );
-
- itk::ImageFileWriter< TDistanceMap >::Pointer dijk_writer =
- itk::ImageFileWriter< TDistanceMap >::New( );
- dijk_writer->SetInput( paths->GetOutput( ) );
- dijk_writer->SetFileName( output_dijkstra_fn );
-
- try
- {
- segmentation_writer->Update( );
- dmap_writer->Update( );
- dijk_writer->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr << "Error caught: " << err << std::endl;
- return( -1 );
-
- } // yrt
-
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <cstdlib>
-#include <iostream>
-#include <fstream>
-#include <limits>
-#include <string>
-#include <vector>
-
-#include <itkImage.h>
-#include <itkImageToVTKImageFilter.h>
-
-#include <itkImageFileReader.h>
-#include <itkImageFileWriter.h>
-
-#include <vtkCamera.h>
-#include <vtkImageActor.h>
-#include <vtkInteractorStyleImage.h>
-#include <vtkPointHandleRepresentation3D.h>
-#include <vtkProperty.h>
-#include <vtkRenderer.h>
-#include <vtkRenderWindow.h>
-#include <vtkRenderWindowInteractor.h>
-#include <vtkSeedRepresentation.h>
-#include <vtkSeedWidget.h>
-#include <vtkSmartPointer.h>
-
-#include <fpa/Image/Dijkstra.h>
-#include <fpa/Image/Functors/ImageAbsoluteDifferenceCostFunction.h>
-#include <fpa/VTK/ImageMPR.h>
-#include <fpa/VTK/Image3DObserver.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 3;
-typedef float TInputPixel;
-typedef float TOutputPixel;
-
-typedef itk::Image< TInputPixel, Dim > TInputImage;
-typedef itk::Image< TOutputPixel, Dim > TOutputImage;
-typedef itk::ImageToVTKImageFilter< TInputImage > TVTKInputImage;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 8 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " input_image input_seeds output_image"
- << " neighborhood_order stop_at_one_front"
- << " init_seed end_seed"
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- std::string input_seeds_fn = argv[ 2 ];
- std::string output_image_fn = argv[ 3 ];
- unsigned int neighborhood_order = std::atoi( argv[ 4 ] );
- bool stop_at_one_front = ( std::atoi( argv[ 5 ] ) != 0 );
- unsigned int init_seed = std::atoi( argv[ 6 ] );
- unsigned int end_seed = std::atoi( argv[ 7 ] );
-
- // Read image
- itk::ImageFileReader< TInputImage >::Pointer input_image_reader =
- itk::ImageFileReader< TInputImage >::New( );
- input_image_reader->SetFileName( input_image_fn );
- try
- {
- input_image_reader->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr
- << "Error while reading image from " << input_image_fn << ": "
- << err << std::endl;
- return( 1 );
-
- } // yrt
- TInputImage::ConstPointer input_image = input_image_reader->GetOutput( );
- TVTKInputImage::Pointer vtk_input_image = TVTKInputImage::New( );
- vtk_input_image->SetInput( input_image );
- vtk_input_image->Update( );
-
- // Show input image and let some interaction
- fpa::VTK::ImageMPR view;
- view.SetBackground( 0.3, 0.2, 0.8 );
- view.SetSize( 600, 600 );
- view.SetImage( vtk_input_image->GetOutput( ) );
-
- // Allow some interaction
- view.Render( );
- view.Start( );
-
- // Prepare region grow filter and cost function
- typedef fpa::Image::Dijkstra< TInputImage, TOutputImage > TFilter;
- typedef fpa::Image::Functors::
- ImageAbsoluteDifferenceCostFunction< TFilter::TInputImage, TFilter::TResult >
- TCost;
-
- TCost::Pointer cost = TCost::New( );
-
- TFilter::Pointer filter = TFilter::New( );
- filter->SetInput( input_image );
- filter->SetCostFunction( cost );
- filter->SetConversionFunction( NULL );
- filter->SetNeighborhoodOrder( neighborhood_order );
- filter->SetStopAtOneFront( stop_at_one_front );
-
- // Get user-given seeds
- std::ifstream input_seeds_str( input_seeds_fn.c_str( ) );
- if( !input_seeds_str )
- {
- std::cerr << "Error opening \"" << input_seeds_fn << "\"" << std::endl;
- return( 1 );
-
- } // fi
-
- unsigned int nSeeds;
- input_seeds_str >> nSeeds;
- std::vector< TInputImage::IndexType > input_seeds;
- for( unsigned int s = 0; s < nSeeds; s++ )
- {
- TInputImage::IndexType idx;
- input_seeds_str >> idx[ 0 ] >> idx[ 1 ] >> idx[ 2 ];
- input_seeds.push_back( idx );
-
- } // rof
- input_seeds_str.close( );
-
- filter->AddSeed( input_seeds[ init_seed ], 0 );
- filter->AddSeed( input_seeds[ end_seed ], 0 );
-
- // Prepare graphical debugger
- typedef fpa::VTK::Image3DObserver< TFilter, vtkRenderWindow > TDebugger;
- TDebugger::Pointer debugger = TDebugger::New( );
- debugger->SetRenderWindow( view.GetWindow( ) );
- debugger->SetRenderPercentage( 0.0001 );
- filter->AddObserver( itk::AnyEvent( ), debugger );
- filter->ThrowEventsOn( );
-
- // Go!
- filter->Update( );
-
- // Save final total cost map
- itk::ImageFileWriter< TOutputImage >::Pointer output_image_writer =
- itk::ImageFileWriter< TOutputImage >::New( );
- output_image_writer->SetFileName( output_image_fn );
- output_image_writer->SetInput( filter->GetOutput( ) );
- try
- {
- output_image_writer->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr
- << "Error while writing image to " << output_image_fn << ": "
- << err << std::endl;
- return( 1 );
-
- } // yrt
-
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <cstdlib>
-#include <iostream>
-#include <limits>
-#include <string>
-
-#include <itkImage.h>
-#include <itkImageToVTKImageFilter.h>
-
-#include <itkImageFileReader.h>
-#include <itkImageFileWriter.h>
-
-#include <vtkCamera.h>
-#include <vtkImageActor.h>
-#include <vtkInteractorStyleImage.h>
-#include <vtkPointHandleRepresentation3D.h>
-#include <vtkProperty.h>
-#include <vtkRenderer.h>
-#include <vtkRenderWindow.h>
-#include <vtkRenderWindowInteractor.h>
-#include <vtkSeedRepresentation.h>
-#include <vtkSeedWidget.h>
-#include <vtkSmartPointer.h>
-
-#include <fpa/Image/Dijkstra.h>
-#include <fpa/VTK/Image2DObserver.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 2;
-typedef unsigned char TInputPixel;
-typedef float TOutputPixel;
-
-typedef itk::Image< TInputPixel, Dim > TInputImage;
-typedef itk::Image< TOutputPixel, Dim > TOutputImage;
-typedef itk::ImageToVTKImageFilter< TInputImage > TVTKInputImage;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 5 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " input_image output_image neighborhood_order stop_at_one_front"
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- std::string output_image_fn = argv[ 2 ];
- unsigned int neighborhood_order = std::atoi( argv[ 3 ] );
- bool stop_at_one_front = ( std::atoi( argv[ 4 ] ) != 0 );
-
- // Read image
- itk::ImageFileReader< TInputImage >::Pointer input_image_reader =
- itk::ImageFileReader< TInputImage >::New( );
- input_image_reader->SetFileName( input_image_fn );
- try
- {
- input_image_reader->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr
- << "Error while reading image from " << input_image_fn << ": "
- << err << std::endl;
- return( 1 );
-
- } // yrt
- TInputImage::ConstPointer input_image = input_image_reader->GetOutput( );
- TVTKInputImage::Pointer vtk_input_image = TVTKInputImage::New( );
- vtk_input_image->SetInput( input_image );
- vtk_input_image->Update( );
-
- // VTK visualization
- vtkSmartPointer< vtkImageActor > actor =
- vtkSmartPointer< vtkImageActor >::New( );
- actor->SetInputData( vtk_input_image->GetOutput( ) );
-
- vtkSmartPointer< vtkRenderer > renderer =
- vtkSmartPointer< vtkRenderer >::New( );
- renderer->SetBackground( 0.1, 0.2, 0.7 );
- renderer->AddActor( actor );
- vtkSmartPointer< vtkRenderWindow > window =
- vtkSmartPointer< vtkRenderWindow >::New( );
- window->SetSize( 800, 800 );
- window->AddRenderer( renderer );
-
- // Correct camera due to the loaded image
- vtkCamera* camera = renderer->GetActiveCamera( );
- camera->SetViewUp( 0, -1, 0 );
- camera->SetPosition( 0, 0, -1 );
- camera->SetFocalPoint( 0, 0, 0 );
-
- // VTK interaction
- vtkSmartPointer< vtkInteractorStyleImage > imageStyle =
- vtkSmartPointer< vtkInteractorStyleImage >::New( );
- vtkSmartPointer< vtkRenderWindowInteractor > interactor =
- vtkSmartPointer< vtkRenderWindowInteractor >::New( );
- interactor->SetInteractorStyle( imageStyle );
- window->SetInteractor( interactor );
-
- // Create the widget and its representation
- vtkSmartPointer< vtkPointHandleRepresentation3D > handle =
- vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
- handle->GetProperty( )->SetColor( 1, 0, 0 );
- vtkSmartPointer< vtkSeedRepresentation > rep =
- vtkSmartPointer< vtkSeedRepresentation >::New( );
- rep->SetHandleRepresentation( handle );
-
- vtkSmartPointer< vtkSeedWidget > widget =
- vtkSmartPointer< vtkSeedWidget >::New( );
- widget->SetInteractor( interactor );
- widget->SetRepresentation( rep );
-
- // Let some interaction
- interactor->Initialize( );
- renderer->ResetCamera( );
- window->Render( );
- widget->On( );
- interactor->Start( );
-
- // Prepare region grow filter
- typedef fpa::Image::Dijkstra< TInputImage, TOutputImage > TFilter;
- TFilter::Pointer filter = TFilter::New( );
- filter->SetInput( input_image );
- filter->SetNeighborhoodOrder( neighborhood_order );
- filter->SetStopAtOneFront( stop_at_one_front );
-
- // Get user-given seeds
- for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ )
- {
- double pos[ 3 ];
- rep->GetSeedWorldPosition( s, pos );
-
- TInputImage::PointType pnt;
- pnt[ 0 ] = TInputImage::PointType::ValueType( pos[ 0 ] );
- pnt[ 1 ] = TInputImage::PointType::ValueType( pos[ 1 ] );
-
- TInputImage::IndexType idx;
- if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
- filter->AddSeed( idx, 0 );
-
- } // rof
-
- // Prepare graphical debugger
- typedef fpa::VTK::Image2DObserver< TFilter, vtkRenderWindow > TDebugger;
- TDebugger::Pointer debugger = TDebugger::New( );
- debugger->SetRenderWindow( window );
- debugger->SetRenderPercentage( 0.001 );
- filter->AddObserver( itk::AnyEvent( ), debugger );
- filter->ThrowEventsOn( );
-
- // Go!
- filter->Update( );
-
- // Save final total cost map
- itk::ImageFileWriter< TOutputImage >::Pointer output_image_writer =
- itk::ImageFileWriter< TOutputImage >::New( );
- output_image_writer->SetFileName( output_image_fn );
- output_image_writer->SetInput( filter->GetOutput( ) );
- try
- {
- output_image_writer->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr
- << "Error while writing image to " << output_image_fn << ": "
- << err << std::endl;
- return( 1 );
-
- } // yrt
-
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <cstdlib>
-#include <iostream>
-#include <limits>
-#include <string>
-
-#include <itkImage.h>
-#include <itkImageToVTKImageFilter.h>
-#include <itkRGBPixel.h>
-
-#include <itkImageFileReader.h>
-#include <itkImageFileWriter.h>
-
-#include <vtkCamera.h>
-#include <vtkImageActor.h>
-#include <vtkInteractorStyleImage.h>
-#include <vtkPointHandleRepresentation3D.h>
-#include <vtkProperty.h>
-#include <vtkRenderer.h>
-#include <vtkRenderWindow.h>
-#include <vtkRenderWindowInteractor.h>
-#include <vtkSeedRepresentation.h>
-#include <vtkSeedWidget.h>
-#include <vtkSmartPointer.h>
-
-#include <fpa/Image/Dijkstra.h>
-#include <fpa/VTK/Image2DObserver.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 2;
-typedef itk::RGBPixel< unsigned char > TInputPixel;
-typedef float TOutputPixel;
-
-typedef itk::Image< TInputPixel, Dim > TInputImage;
-typedef itk::Image< TOutputPixel, Dim > TOutputImage;
-typedef itk::ImageToVTKImageFilter< TInputImage > TVTKInputImage;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 5 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " input_image output_image neighborhood_order stop_at_one_front"
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- std::string output_image_fn = argv[ 2 ];
- unsigned int neighborhood_order = std::atoi( argv[ 3 ] );
- bool stop_at_one_front = ( std::atoi( argv[ 4 ] ) != 0 );
-
- // Read image
- itk::ImageFileReader< TInputImage >::Pointer input_image_reader =
- itk::ImageFileReader< TInputImage >::New( );
- input_image_reader->SetFileName( input_image_fn );
- try
- {
- input_image_reader->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr
- << "Error while reading image from " << input_image_fn << ": "
- << err << std::endl;
- return( 1 );
-
- } // yrt
- TInputImage::ConstPointer input_image = input_image_reader->GetOutput( );
- TVTKInputImage::Pointer vtk_input_image = TVTKInputImage::New( );
- vtk_input_image->SetInput( input_image );
- vtk_input_image->Update( );
-
- // VTK visualization
- vtkSmartPointer< vtkImageActor > actor =
- vtkSmartPointer< vtkImageActor >::New( );
- actor->SetInputData( vtk_input_image->GetOutput( ) );
-
- vtkSmartPointer< vtkRenderer > renderer =
- vtkSmartPointer< vtkRenderer >::New( );
- renderer->SetBackground( 0.1, 0.2, 0.7 );
- renderer->AddActor( actor );
- vtkSmartPointer< vtkRenderWindow > window =
- vtkSmartPointer< vtkRenderWindow >::New( );
- window->SetSize( 800, 800 );
- window->AddRenderer( renderer );
-
- // Correct camera due to the loaded image
- vtkCamera* camera = renderer->GetActiveCamera( );
- camera->SetViewUp( 0, -1, 0 );
- camera->SetPosition( 0, 0, -1 );
- camera->SetFocalPoint( 0, 0, 0 );
-
- // VTK interaction
- vtkSmartPointer< vtkInteractorStyleImage > imageStyle =
- vtkSmartPointer< vtkInteractorStyleImage >::New( );
- vtkSmartPointer< vtkRenderWindowInteractor > interactor =
- vtkSmartPointer< vtkRenderWindowInteractor >::New( );
- interactor->SetInteractorStyle( imageStyle );
- window->SetInteractor( interactor );
-
- // Create the widget and its representation
- vtkSmartPointer< vtkPointHandleRepresentation3D > handle =
- vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
- handle->GetProperty( )->SetColor( 1, 0, 0 );
- vtkSmartPointer< vtkSeedRepresentation > rep =
- vtkSmartPointer< vtkSeedRepresentation >::New( );
- rep->SetHandleRepresentation( handle );
-
- vtkSmartPointer< vtkSeedWidget > widget =
- vtkSmartPointer< vtkSeedWidget >::New( );
- widget->SetInteractor( interactor );
- widget->SetRepresentation( rep );
-
- // Let some interaction
- interactor->Initialize( );
- renderer->ResetCamera( );
- window->Render( );
- widget->On( );
- interactor->Start( );
-
- // Prepare region grow filter
- typedef fpa::Image::Dijkstra< TInputImage, TOutputImage > TFilter;
- TFilter::Pointer filter = TFilter::New( );
- filter->SetInput( input_image );
- filter->SetNeighborhoodOrder( neighborhood_order );
- filter->SetStopAtOneFront( stop_at_one_front );
-
- // Get user-given seeds
- for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ )
- {
- double pos[ 3 ];
- rep->GetSeedWorldPosition( s, pos );
-
- TInputImage::PointType pnt;
- pnt[ 0 ] = TInputImage::PointType::ValueType( pos[ 0 ] );
- pnt[ 1 ] = TInputImage::PointType::ValueType( pos[ 1 ] );
-
- TInputImage::IndexType idx;
- if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
- filter->AddSeed( idx, 0 );
-
- } // rof
-
- // Prepare graphical debugger
- typedef fpa::VTK::Image2DObserver< TFilter, vtkRenderWindow > TDebugger;
- TDebugger::Pointer debugger = TDebugger::New( );
- debugger->SetRenderWindow( window );
- debugger->SetRenderPercentage( 0.001 );
- filter->AddObserver( itk::AnyEvent( ), debugger );
- filter->ThrowEventsOn( );
-
- // Go!
- filter->Update( );
-
- // Save final total cost map
- itk::ImageFileWriter< TOutputImage >::Pointer output_image_writer =
- itk::ImageFileWriter< TOutputImage >::New( );
- output_image_writer->SetFileName( output_image_fn );
- output_image_writer->SetInput( filter->GetOutput( ) );
- try
- {
- output_image_writer->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr
- << "Error while writing image to " << output_image_fn << ": "
- << err << std::endl;
- return( 1 );
-
- } // yrt
-
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <cstdlib>
-#include <iostream>
-#include <limits>
-#include <string>
-
-#include <itkImage.h>
-#include <itkImageToVTKImageFilter.h>
-
-#include <itkImageFileReader.h>
-#include <itkMinimumMaximumImageCalculator.h>
-#include <itkInvertIntensityImageFilter.h>
-#include <itkDanielssonDistanceMapImageFilter.h>
-#include <itkImageFileWriter.h>
-
-#include <vtkCamera.h>
-#include <vtkImageActor.h>
-#include <vtkInteractorStyleImage.h>
-#include <vtkPointHandleRepresentation3D.h>
-#include <vtkProperty.h>
-#include <vtkRenderer.h>
-#include <vtkRenderWindow.h>
-#include <vtkRenderWindowInteractor.h>
-#include <vtkSeedRepresentation.h>
-#include <vtkSeedWidget.h>
-#include <vtkSmartPointer.h>
-
-#include <fpa/Image/Dijkstra.h>
-#include <fpa/Base/Functors/InvertCostFunction.h>
-#include <fpa/VTK/Image2DObserver.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 2;
-typedef unsigned char TInputPixel;
-typedef float TOutputPixel;
-
-typedef itk::Image< TInputPixel, Dim > TInputImage;
-typedef itk::Image< TOutputPixel, Dim > TOutputImage;
-typedef itk::ImageToVTKImageFilter< TInputImage > TVTKInputImage;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 5 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " input_image output_image neighborhood_order stop_at_one_front"
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- std::string output_image_fn = argv[ 2 ];
- unsigned int neighborhood_order = std::atoi( argv[ 3 ] );
- bool stop_at_one_front = ( std::atoi( argv[ 4 ] ) != 0 );
-
- // Read image
- itk::ImageFileReader< TInputImage >::Pointer input_image_reader =
- itk::ImageFileReader< TInputImage >::New( );
- input_image_reader->SetFileName( input_image_fn );
- try
- {
- input_image_reader->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr
- << "Error while reading image from " << input_image_fn << ": "
- << err << std::endl;
- return( 1 );
-
- } // yrt
- TInputImage::ConstPointer input_image = input_image_reader->GetOutput( );
- TVTKInputImage::Pointer vtk_input_image = TVTKInputImage::New( );
- vtk_input_image->SetInput( input_image );
- vtk_input_image->Update( );
-
- // VTK visualization
- vtkSmartPointer< vtkImageActor > actor =
- vtkSmartPointer< vtkImageActor >::New( );
- actor->SetInputData( vtk_input_image->GetOutput( ) );
-
- vtkSmartPointer< vtkRenderer > renderer =
- vtkSmartPointer< vtkRenderer >::New( );
- renderer->SetBackground( 0.1, 0.2, 0.7 );
- renderer->AddActor( actor );
- vtkSmartPointer< vtkRenderWindow > window =
- vtkSmartPointer< vtkRenderWindow >::New( );
- window->SetSize( 800, 800 );
- window->AddRenderer( renderer );
-
- // Correct camera due to the loaded image
- vtkCamera* camera = renderer->GetActiveCamera( );
- camera->SetViewUp( 0, -1, 0 );
- camera->SetPosition( 0, 0, -1 );
- camera->SetFocalPoint( 0, 0, 0 );
-
- // VTK interaction
- vtkSmartPointer< vtkInteractorStyleImage > imageStyle =
- vtkSmartPointer< vtkInteractorStyleImage >::New( );
- vtkSmartPointer< vtkRenderWindowInteractor > interactor =
- vtkSmartPointer< vtkRenderWindowInteractor >::New( );
- interactor->SetInteractorStyle( imageStyle );
- window->SetInteractor( interactor );
-
- // Create the widget and its representation
- vtkSmartPointer< vtkPointHandleRepresentation3D > handle =
- vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
- handle->GetProperty( )->SetColor( 1, 0, 0 );
- vtkSmartPointer< vtkSeedRepresentation > rep =
- vtkSmartPointer< vtkSeedRepresentation >::New( );
- rep->SetHandleRepresentation( handle );
-
- vtkSmartPointer< vtkSeedWidget > widget =
- vtkSmartPointer< vtkSeedWidget >::New( );
- widget->SetInteractor( interactor );
- widget->SetRepresentation( rep );
-
- // Let some interaction
- interactor->Initialize( );
- renderer->ResetCamera( );
- window->Render( );
- widget->On( );
- interactor->Start( );
-
- // Invert input image
- itk::MinimumMaximumImageCalculator< TInputImage >::Pointer minmax =
- itk::MinimumMaximumImageCalculator< TInputImage >::New( );
- minmax->SetImage( input_image );
- minmax->Compute( );
-
- itk::InvertIntensityImageFilter< TInputImage >::Pointer invert =
- itk::InvertIntensityImageFilter< TInputImage >::New( );
- invert->SetInput( input_image );
- invert->SetMaximum( minmax->GetMaximum( ) );
-
- itk::DanielssonDistanceMapImageFilter< TInputImage, TOutputImage >::Pointer dmap =
- itk::DanielssonDistanceMapImageFilter< TInputImage, TOutputImage >::New( );
- dmap->SetInput( invert->GetOutput( ) );
- dmap->InputIsBinaryOn( );
- dmap->SquaredDistanceOn( );
- dmap->UseImageSpacingOn( );
- dmap->Update( );
-
- typedef fpa::Base::Functors::InvertCostFunction< TOutputPixel > TFunction;
- TFunction::Pointer function = TFunction::New( );
-
- // Prepare region grow filter
- typedef fpa::Image::Dijkstra< TOutputImage, TOutputImage > TFilter;
- TFilter::Pointer filter = TFilter::New( );
- filter->SetInput( dmap->GetOutput( ) );
- filter->SetConversionFunction( function );
- filter->SetNeighborhoodOrder( neighborhood_order );
- filter->SetStopAtOneFront( stop_at_one_front );
-
- // Get user-given seeds
- for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ )
- {
- double pos[ 3 ];
- rep->GetSeedWorldPosition( s, pos );
-
- TInputImage::PointType pnt;
- pnt[ 0 ] = TInputImage::PointType::ValueType( pos[ 0 ] );
- pnt[ 1 ] = TInputImage::PointType::ValueType( pos[ 1 ] );
-
- TInputImage::IndexType idx;
- if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
- filter->AddSeed( idx, 0 );
-
- } // rof
-
- // Prepare graphical debugger
- typedef fpa::VTK::Image2DObserver< TFilter, vtkRenderWindow > TDebugger;
- TDebugger::Pointer debugger = TDebugger::New( );
- debugger->SetRenderWindow( window );
- debugger->SetRenderPercentage( 0.001 );
- filter->AddObserver( itk::AnyEvent( ), debugger );
- filter->ThrowEventsOn( );
-
- // Go!
- filter->Update( );
-
- // Save final total cost map
- itk::ImageFileWriter< TOutputImage >::Pointer output_image_writer =
- itk::ImageFileWriter< TOutputImage >::New( );
- output_image_writer->SetFileName( output_image_fn );
- output_image_writer->SetInput( filter->GetOutput( ) );
- try
- {
- output_image_writer->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr
- << "Error while writing image to " << output_image_fn << ": "
- << err << std::endl;
- return( 1 );
-
- } // yrt
-
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <cstdlib>
-#include <iostream>
-#include <limits>
-#include <string>
-
-#include <itkImage.h>
-#include <itkRGBAPixel.h>
-#include <itkImageToVTKImageFilter.h>
-
-#include <itkImageFileReader.h>
-#include <itkMinimumMaximumImageCalculator.h>
-#include <itkInvertIntensityImageFilter.h>
-#include <itkDanielssonDistanceMapImageFilter.h>
-#include <itkImageFileWriter.h>
-
-#include <vtkCamera.h>
-#include <vtkImageActor.h>
-#include <vtkInteractorStyleImage.h>
-#include <vtkPointHandleRepresentation3D.h>
-#include <vtkProperty.h>
-#include <vtkRenderer.h>
-#include <vtkRenderWindow.h>
-#include <vtkRenderWindowInteractor.h>
-#include <vtkSeedRepresentation.h>
-#include <vtkSeedWidget.h>
-#include <vtkSmartPointer.h>
-
-#include <fpa/Image/Dijkstra.h>
-#include <fpa/Base/Functors/InvertCostFunction.h>
-#include <fpa/VTK/Image2DObserver.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 2;
-typedef unsigned char TInputPixel;
-typedef float TOutputPixel;
-
-typedef itk::Image< TInputPixel, Dim > TInputImage;
-typedef itk::Image< TOutputPixel, Dim > TOutputImage;
-typedef itk::ImageToVTKImageFilter< TInputImage > TVTKInputImage;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 5 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " input_image output_image neighborhood_order stop_at_one_front"
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- std::string output_image_fn = argv[ 2 ];
- unsigned int neighborhood_order = std::atoi( argv[ 3 ] );
- bool stop_at_one_front = ( std::atoi( argv[ 4 ] ) != 0 );
-
- // Read image
- itk::ImageFileReader< TInputImage >::Pointer input_image_reader =
- itk::ImageFileReader< TInputImage >::New( );
- input_image_reader->SetFileName( input_image_fn );
- try
- {
- input_image_reader->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr
- << "Error while reading image from " << input_image_fn << ": "
- << err << std::endl;
- return( 1 );
-
- } // yrt
- TInputImage::ConstPointer input_image = input_image_reader->GetOutput( );
- TVTKInputImage::Pointer vtk_input_image = TVTKInputImage::New( );
- vtk_input_image->SetInput( input_image );
- vtk_input_image->Update( );
-
- // VTK visualization
- vtkSmartPointer< vtkImageActor > actor =
- vtkSmartPointer< vtkImageActor >::New( );
- actor->SetInputData( vtk_input_image->GetOutput( ) );
-
- vtkSmartPointer< vtkRenderer > renderer =
- vtkSmartPointer< vtkRenderer >::New( );
- renderer->SetBackground( 0.1, 0.2, 0.7 );
- renderer->AddActor( actor );
- vtkSmartPointer< vtkRenderWindow > window =
- vtkSmartPointer< vtkRenderWindow >::New( );
- window->SetSize( 800, 800 );
- window->AddRenderer( renderer );
-
- // Correct camera due to the loaded image
- vtkCamera* camera = renderer->GetActiveCamera( );
- camera->SetViewUp( 0, -1, 0 );
- camera->SetPosition( 0, 0, -1 );
- camera->SetFocalPoint( 0, 0, 0 );
-
- // VTK interaction
- vtkSmartPointer< vtkInteractorStyleImage > imageStyle =
- vtkSmartPointer< vtkInteractorStyleImage >::New( );
- vtkSmartPointer< vtkRenderWindowInteractor > interactor =
- vtkSmartPointer< vtkRenderWindowInteractor >::New( );
- interactor->SetInteractorStyle( imageStyle );
- window->SetInteractor( interactor );
-
- // Create the widget and its representation
- vtkSmartPointer< vtkPointHandleRepresentation3D > handle =
- vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
- handle->GetProperty( )->SetColor( 1, 0, 0 );
- vtkSmartPointer< vtkSeedRepresentation > rep =
- vtkSmartPointer< vtkSeedRepresentation >::New( );
- rep->SetHandleRepresentation( handle );
-
- vtkSmartPointer< vtkSeedWidget > widget =
- vtkSmartPointer< vtkSeedWidget >::New( );
- widget->SetInteractor( interactor );
- widget->SetRepresentation( rep );
-
- // Let some interaction
- interactor->Initialize( );
- renderer->ResetCamera( );
- window->Render( );
- widget->On( );
- interactor->Start( );
-
- // Invert input image
- itk::MinimumMaximumImageCalculator< TInputImage >::Pointer minmax =
- itk::MinimumMaximumImageCalculator< TInputImage >::New( );
- minmax->SetImage( input_image );
- minmax->Compute( );
-
- itk::InvertIntensityImageFilter< TInputImage >::Pointer invert =
- itk::InvertIntensityImageFilter< TInputImage >::New( );
- invert->SetInput( input_image );
- invert->SetMaximum( minmax->GetMaximum( ) );
-
- itk::DanielssonDistanceMapImageFilter< TInputImage, TOutputImage >::Pointer dmap =
- itk::DanielssonDistanceMapImageFilter< TInputImage, TOutputImage >::New( );
- dmap->SetInput( invert->GetOutput( ) );
- dmap->InputIsBinaryOn( );
- dmap->SquaredDistanceOn( );
- dmap->UseImageSpacingOn( );
- dmap->Update( );
-
- typedef fpa::Base::Functors::InvertCostFunction< TOutputPixel > TFunction;
- TFunction::Pointer function = TFunction::New( );
-
- // Prepare region grow filter
- typedef fpa::Image::Dijkstra< TOutputImage, TOutputImage > TFilter;
- TFilter::Pointer filter = TFilter::New( );
- filter->SetInput( dmap->GetOutput( ) );
- filter->SetConversionFunction( function );
- filter->SetNeighborhoodOrder( neighborhood_order );
- filter->SetStopAtOneFront( stop_at_one_front );
-
- // Get user-given seeds
- for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ )
- {
- double pos[ 3 ];
- rep->GetSeedWorldPosition( s, pos );
-
- TInputImage::PointType pnt;
- pnt[ 0 ] = TInputImage::PointType::ValueType( pos[ 0 ] );
- pnt[ 1 ] = TInputImage::PointType::ValueType( pos[ 1 ] );
-
- TInputImage::IndexType idx;
- if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
- filter->AddSeed( idx, 0 );
-
- } // rof
-
- // Prepare graphical debugger
- typedef fpa::VTK::Image2DObserver< TFilter, vtkRenderWindow > TDebugger;
- TDebugger::Pointer debugger = TDebugger::New( );
- debugger->SetRenderWindow( window );
- debugger->SetRenderPercentage( 0.001 );
- filter->AddObserver( itk::AnyEvent( ), debugger );
- filter->ThrowEventsOn( );
-
- // Go!
- filter->Update( );
-
- // Save final total cost map
- itk::ImageFileWriter< TOutputImage >::Pointer output_image_writer =
- itk::ImageFileWriter< TOutputImage >::New( );
- output_image_writer->SetFileName( output_image_fn );
- output_image_writer->SetInput( filter->GetOutput( ) );
- try
- {
- output_image_writer->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr
- << "Error while writing image to " << output_image_fn << ": "
- << err << std::endl;
- return( 1 );
-
- } // yrt
-
- // Draw the path between the two seeds
- if( filter->GetNumberOfSeeds( ) > 1 )
- {
- TInputImage::IndexType a = filter->GetSeed( 0 );
- TInputImage::IndexType b =
- filter->GetSeed( filter->GetNumberOfSeeds( ) - 1 );
-
- std::vector< TInputImage::IndexType > path;
- filter->GetMinimumSpanningTree( )->GetPath( path, a, b );
-
- typedef itk::Image< itk::RGBAPixel< unsigned char >, Dim > TColorImage;
- TColorImage::Pointer path_image = TColorImage::New( );
- path_image->SetLargestPossibleRegion(
- input_image->GetLargestPossibleRegion( )
- );
- path_image->SetRequestedRegion( input_image->GetRequestedRegion( ) );
- path_image->SetBufferedRegion( input_image->GetBufferedRegion( ) );
- path_image->SetSpacing( input_image->GetSpacing( ) );
- path_image->SetOrigin( input_image->GetOrigin( ) );
- path_image->SetDirection( input_image->GetDirection( ) );
- path_image->Allocate( );
-
- unsigned char background[ 4 ] = { 0, 0, 0, 0 };
- unsigned char color[ 4 ] = { 255, 0, 0, 255 };
- path_image->FillBuffer( itk::RGBAPixel< unsigned char >( background ) );
-
- for( unsigned int pId = 0; pId < path.size( ); ++pId )
- path_image->SetPixel(
- path[ pId ], itk::RGBAPixel< unsigned char >( color )
- );
-
- itk::ImageToVTKImageFilter< TColorImage >::Pointer vtk_path_image =
- itk::ImageToVTKImageFilter< TColorImage >::New( );
- vtk_path_image->SetInput( path_image );
- vtk_path_image->Update( );
-
- vtkSmartPointer< vtkImageActor > path_image_actor =
- vtkSmartPointer< vtkImageActor >::New( );
- path_image_actor->SetInputData( vtk_path_image->GetOutput( ) );
- renderer->AddActor( path_image_actor );
-
- // More interaction
- window->Render( );
- widget->Off( );
- interactor->Start( );
-
- } // fi
-
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <cstdlib>
-#include <ctime>
-#include <iostream>
-#include <limits>
-#include <string>
-
-#include <itkImage.h>
-#include <itkImageToVTKImageFilter.h>
-
-#include <itkSignedMaurerDistanceMapImageFilter.h>
-
-#include <vtkOutlineSource.h>
-
-#include <fpa/Base/Functors/InvertCostFunction.h>
-#include <fpa/Image/DijkstraWithEndPointDetection.h>
-#include <fpa/VTK/Image3DObserver.h>
-#include <fpa/IO/MinimumSpanningTreeWriter.h>
-#include <fpa/IO/UniqueValuesContainerWriter.h>
-#include <fpa/IO/MatrixValuesContainerWriter.h>
-#include <fpa/VTK/UniqueVerticesToPolyDataFilter.h>
-
-#include "fpa_Utility.h"
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 3;
-typedef unsigned char TPixel;
-typedef float TScalar;
-typedef itk::Image< TPixel, Dim > TImage;
-typedef itk::Image< TScalar, Dim > TScalarImage;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 7 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ] << std::endl
- << "\tinput_image" << std::endl
- << "\toutput_labels" << std::endl
- << "\toutput_minimum_spanning_tree" << std::endl
- << "\toutput_endpoints" << std::endl
- << "\toutput_bifurcations" << std::endl
- << "\toutput_branches" << std::endl
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- std::string output_labels_fn = argv[ 2 ];
- std::string output_minimum_spanning_tree_fn = argv[ 3 ];
- std::string output_endpoints_fn = argv[ 4 ];
- std::string output_bifurcations_fn = argv[ 5 ];
- std::string output_branches_fn = argv[ 6 ];
-
- // Read image
- TImage::Pointer input_image;
- std::string err = fpa_Utility::ReadImage( input_image, input_image_fn );
- if( err != "" )
- {
- std::cerr << err << std::endl;
- return( 1 );
-
- } // fi
-
- // Show image and wait for, at least, one seed
- itk::ImageToVTKImageFilter< TImage >::Pointer vtk_input_image =
- itk::ImageToVTKImageFilter< TImage >::New( );
- vtk_input_image->SetInput( input_image );
- vtk_input_image->Update( );
-
- vtkSmartPointer<vtkOutlineSource> outline =
- vtkSmartPointer<vtkOutlineSource>::New();
- outline->SetBounds(vtk_input_image->GetOutput( )->GetBounds());
-
- vtkSmartPointer<vtkPolyDataMapper> mapper =
- vtkSmartPointer<vtkPolyDataMapper>::New( );
- mapper->SetInputConnection( outline->GetOutputPort( ) );
-
- vtkSmartPointer<vtkActor> actor =
- vtkSmartPointer<vtkActor>::New( );
- actor->SetMapper( mapper );
- vtkSmartPointer<vtkRenderer> aRenderer =
- vtkSmartPointer<vtkRenderer>::New();
- vtkSmartPointer<vtkRenderWindow> renWin =
- vtkSmartPointer<vtkRenderWindow>::New();
- renWin->AddRenderer(aRenderer);
-
- vtkSmartPointer<vtkRenderWindowInteractor> iren =
- vtkSmartPointer<vtkRenderWindowInteractor>::New();
- iren->SetRenderWindow(renWin);
-
- aRenderer->AddActor( actor );
-iren->Initialize();
- iren->Start();
-
- /*
- fpa_Utility::Viewer2DWithSeeds viewer;
- viewer.SetImage( vtk_input_image->GetOutput( ) );
- while( viewer.GetNumberOfSeeds( ) == 0 )
- viewer.Start( );
- */
-
- // Compute squared distance map
- itk::SignedMaurerDistanceMapImageFilter< TImage, TScalarImage >::Pointer
- dmap =
- itk::SignedMaurerDistanceMapImageFilter< TImage, TScalarImage >::New( );
- dmap->SetInput( input_image );
- dmap->SetBackgroundValue( TPixel( 0 ) );
- dmap->InsideIsPositiveOn( );
- dmap->SquaredDistanceOn( );
- dmap->UseImageSpacingOn( );
-
- std::time_t start, end;
- std::time( &start );
- dmap->Update( );
- std::time( &end );
- std::cout
- << "Distance map time = "
- << std::difftime( end, start )
- << "s." << std::endl;
-
- // Prepare cost conversion function
- typedef fpa::Base::Functors::InvertCostFunction< TScalar > TCostFunction;
- TCostFunction::Pointer cost_f = TCostFunction::New( );
-
- // Prepare Dijkstra filter
- typedef fpa::Image::
- DijkstraWithEndPointDetection< TScalarImage, TScalarImage > TFilter;
- TFilter::Pointer filter = TFilter::New( );
- filter->SetInput( dmap->GetOutput( ) );
- filter->SetConversionFunction( cost_f );
- filter->SetNeighborhoodOrder( 2 );
- filter->StopAtOneFrontOff( );
-
- // Associate seed
- TImage::PointType pnt;
- TImage::IndexType idx;
- /*
- viewer.GetSeed( pnt, 0 );
- */
- pnt[ 0 ] = 0.879066;
- pnt[ 1 ] = -109.36591;
- pnt[ 2 ] = 1942.480988;
-
- if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
- filter->AddSeed( idx, 0 );
-
- // Prepare graphical debugger
- typedef fpa::VTK::Image3DObserver< TFilter, vtkRenderWindow > TDebugger;
- TDebugger::Pointer debugger = TDebugger::New( );
- debugger->SetRenderWindow( renWin );
- debugger->SetRenderPercentage( 0.0001 );
- filter->AddObserver( itk::AnyEvent( ), debugger );
- filter->ThrowEventsOn( );
-
- // Go!
- std::time( &start );
- filter->Update( );
- std::time( &end );
- std::cout
- << "Extraction time = "
- << std::difftime( end, start )
- << "s." << std::endl;
-
- // Create new actors
- typedef vtkSmartPointer< fpa::VTK::UniqueVerticesToPolyDataFilter< TFilter::TUniqueVertices, TFilter::TInputImage > > TVertices2PD;
-
- TVertices2PD endpoints2pd = TVertices2PD::New( );
- endpoints2pd->SetInput( filter->GetEndPoints( ) );
- endpoints2pd->SetImage( filter->GetInput( ) );
- endpoints2pd->Update( );
-
- vtkSmartPointer< vtkPolyDataMapper > endpoints_mapper =
- vtkSmartPointer< vtkPolyDataMapper >::New( );
- endpoints_mapper->SetInputConnection( endpoints2pd->GetOutputPort( ) );
-
- vtkSmartPointer< vtkActor > endpoints_actor =
- vtkSmartPointer< vtkActor >::New( );
- endpoints_actor->SetMapper( endpoints_mapper );
- endpoints_actor->GetProperty( )->SetColor( 0, 1, 0 );
- endpoints_actor->GetProperty( )->SetPointSize( 5 );
- aRenderer->AddActor( endpoints_actor );
-
- TVertices2PD bifurcations2pd = TVertices2PD::New( );
- bifurcations2pd->SetInput( filter->GetBifurcations( ) );
- bifurcations2pd->SetImage( filter->GetInput( ) );
- bifurcations2pd->Update( );
-
- vtkSmartPointer< vtkPolyDataMapper > bifurcations_mapper =
- vtkSmartPointer< vtkPolyDataMapper >::New( );
- bifurcations_mapper->SetInputConnection( bifurcations2pd->GetOutputPort( ) );
-
- vtkSmartPointer< vtkActor > bifurcations_actor =
- vtkSmartPointer< vtkActor >::New( );
- bifurcations_actor->SetMapper( bifurcations_mapper );
- bifurcations_actor->GetProperty( )->SetColor( 1, 0, 0 );
- bifurcations_actor->GetProperty( )->SetPointSize( 5 );
- aRenderer->AddActor( bifurcations_actor );
-
- // Some more interaction and finish
-iren->Initialize();
- iren->Start();
-
- // Save results
- err = fpa_Utility::SaveImage( filter->GetLabelImage( ), output_labels_fn );
- if( err != "" )
- std::cerr << err << std::endl;
-
- fpa::IO::MinimumSpanningTreeWriter< TFilter::TMinimumSpanningTree >::Pointer
- mst_writer =
- fpa::IO::MinimumSpanningTreeWriter< TFilter::TMinimumSpanningTree >::New( );
- mst_writer->SetInput( filter->GetMinimumSpanningTree( ) );
- mst_writer->SetFileName( output_minimum_spanning_tree_fn );
- mst_writer->Update( );
-
- fpa::IO::UniqueValuesContainerWriter< TFilter::TUniqueVertices >::Pointer
- endpoints_writer =
- fpa::IO::UniqueValuesContainerWriter< TFilter::TUniqueVertices >::New( );
- endpoints_writer->SetInput( filter->GetEndPoints( ) );
- endpoints_writer->SetFileName( output_endpoints_fn );
- endpoints_writer->Update( );
-
- fpa::IO::UniqueValuesContainerWriter< TFilter::TUniqueVertices >::Pointer
- bifurcations_writer =
- fpa::IO::UniqueValuesContainerWriter< TFilter::TUniqueVertices >::New( );
- bifurcations_writer->SetInput( filter->GetBifurcations( ) );
- bifurcations_writer->SetFileName( output_bifurcations_fn );
- bifurcations_writer->Update( );
-
- fpa::IO::MatrixValuesContainerWriter< TFilter::TBranches >::Pointer
- branches_writer =
- fpa::IO::MatrixValuesContainerWriter< TFilter::TBranches >::New( );
- branches_writer->SetInput( filter->GetBranches( ) );
- branches_writer->SetFileName( output_branches_fn );
- branches_writer->Update( );
-
- return( 0 );
-}
-
-// eof - $RCSfile$
-
-/* TODO
- vtkSmartPointer< vtkPoints > simple_branches_points =
- vtkSmartPointer< vtkPoints >::New( );
- vtkSmartPointer< vtkCellArray > simple_branches_cells =
- vtkSmartPointer< vtkCellArray >::New( );
-
- vtkSmartPointer< vtkPoints > detailed_branches_points =
- vtkSmartPointer< vtkPoints >::New( );
- vtkSmartPointer< vtkCellArray > detailed_branches_cells =
- vtkSmartPointer< vtkCellArray >::New( );
- vtkSmartPointer< vtkFloatArray > detailed_branches_scalars =
- vtkSmartPointer< vtkFloatArray >::New( );
-
- TFilter::TBranches::ConstIterator brIt = branches->Begin( );
- for( ; brIt != branches->End( ); ++brIt )
- {
- // Branch's first point
- TImage::PointType first_point;
- input_image->TransformIndexToPhysicalPoint( brIt->first, first_point );
- unsigned long first_id = simple_branches_points->GetNumberOfPoints( );
- simple_branches_points->InsertNextPoint(
- first_point[ 0 ], first_point[ 1 ], first_point[ 2 ]
- );
-
- TFilter::TBranches::ConstRowIterator brRowIt = branches->Begin( brIt );
- for( ; brRowIt != branches->End( brIt ); ++brRowIt )
- {
- // Branch's second point
- TImage::PointType second_point;
- input_image->
- TransformIndexToPhysicalPoint( brRowIt->first, second_point );
- unsigned long second_id = simple_branches_points->GetNumberOfPoints( );
- simple_branches_points->InsertNextPoint(
- second_point[ 0 ], second_point[ 1 ], second_point[ 2 ]
- );
- simple_branches_cells->InsertNextCell( 2 );
- simple_branches_cells->InsertCellPoint( first_id );
- simple_branches_cells->InsertCellPoint( second_id );
-
- // Detailed path
- double pathId = double( brRowIt->second - 1 ) / double( nBranches - 1 );
- TFilter::TVertices path;
- mst->GetPath( path, brIt->first, brRowIt->first );
- TFilter::TVertices::const_iterator pIt = path.begin( );
- for( ; pIt != path.end( ); ++pIt )
- {
- TImage::PointType path_point;
- input_image->TransformIndexToPhysicalPoint( *pIt, path_point );
- detailed_branches_points->InsertNextPoint(
- path_point[ 0 ], path_point[ 1 ], path_point[ 2 ]
- );
- detailed_branches_scalars->InsertNextTuple1( pathId );
- if( pIt != path.begin( ) )
- {
- unsigned long nPoints =
- detailed_branches_points->GetNumberOfPoints( );
- detailed_branches_cells->InsertNextCell( 2 );
- detailed_branches_cells->InsertCellPoint( nPoints - 2 );
- detailed_branches_cells->InsertCellPoint( nPoints - 1 );
-
- } // fi
-
- } // rof
-
- } // rof
-
- } // rof
- vtkSmartPointer< vtkPolyData > simple_branches_polydata =
- vtkSmartPointer< vtkPolyData >::New( );
- simple_branches_polydata->SetPoints( simple_branches_points );
- simple_branches_polydata->SetLines( simple_branches_cells );
- view.AddPolyData( simple_branches_polydata, 1, 0, 1, 1 );
-
- vtkSmartPointer< vtkPolyData > detailed_branches_polydata =
- vtkSmartPointer< vtkPolyData >::New( );
- detailed_branches_polydata->SetPoints( detailed_branches_points );
- detailed_branches_polydata->SetLines( detailed_branches_cells );
- detailed_branches_polydata->
- GetPointData( )->SetScalars( detailed_branches_scalars );
- view.AddPolyData( detailed_branches_polydata, 1 );
-
- // Let some more interaction
- view.Render( );
- view.Start( );
-
- return( 0 );
- }
-*/
-
-// eof - $RCSfile$
+++ /dev/null
-#include <cstdlib>
-#include <ctime>
-#include <iostream>
-#include <limits>
-#include <string>
-
-#include <itkImage.h>
-
-#include <itkImageFileReader.h>
-#include <itkMinimumMaximumImageCalculator.h>
-#include <itkShiftScaleImageFilter.h>
-
-#include <itkSignedMaurerDistanceMapImageFilter.h>
-
-#include <itkImageFileWriter.h>
-
-#include <fpa/Image/DijkstraWithEndPointDetection.h>
-#include <fpa/Base/Functors/InvertCostFunction.h>
-
-#include <fpa/IO/MinimumSpanningTreeWriter.h>
-#include <fpa/IO/UniqueValuesContainerWriter.h>
-#include <fpa/IO/MatrixValuesContainerWriter.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 3;
-typedef unsigned char TPixel;
-typedef float TScalar;
-
-typedef itk::Image< TPixel, Dim > TImage;
-typedef itk::Image< TScalar, Dim > TScalarImage;
-
-// -------------------------------------------------------------------------
-template< class I >
-void ReadImage( typename I::Pointer& image, const std::string& filename );
-
-template< class I >
-void SaveImage( const I* image, const std::string& filename );
-
-template< class I, class O >
-void DistanceMap(
- const typename I::Pointer& input, typename O::Pointer& output
- );
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 12 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ] << std::endl
- << " input_image" << std::endl
- << " seed_x seed_y seed_z" << std::endl
- << " output_distancemap" << std::endl
- << " output_costmap" << std::endl
- << " output_labels" << std::endl
- << " output_minimum_spanning_tree" << std::endl
- << " output_endpoints" << std::endl
- << " output_bifurcations" << std::endl
- << " output_branches" << std::endl
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- double seed_x = std::atof( argv[ 2 ] );
- double seed_y = std::atof( argv[ 3 ] );
- double seed_z = std::atof( argv[ 4 ] );
- std::string distancemap_fn = argv[ 5 ];
- std::string output_costmap_fn = argv[ 6 ];
- std::string output_labels_fn = argv[ 7 ];
- std::string mst_output_fn = argv[ 8 ];
- std::string endpoints_output_fn = argv[ 9 ];
- std::string bifurcations_output_fn = argv[ 10 ];
- std::string branches_output_fn = argv[ 11 ];
-
- // Read image
- TImage::Pointer input_image;
- try
- {
- ReadImage< TImage >( input_image, input_image_fn );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr
- << "Error caught while reading \""
- << input_image_fn << "\": " << err
- << std::endl;
- return( 1 );
-
- } // yrt
-
- // Get seed
- double p[ 3 ];
- TImage::PointType pnt;
- TImage::IndexType seed;
- pnt[ 0 ] = seed_x;
- pnt[ 1 ] = seed_y;
- pnt[ 2 ] = seed_z;
- input_image->TransformPhysicalPointToIndex( pnt, seed );
-
- // Compute squared distance map
- TScalarImage::Pointer dmap;
- DistanceMap< TImage, TScalarImage >( input_image, dmap );
-
- // Prepare cost conversion function
- typedef fpa::Base::Functors::InvertCostFunction< TScalar > TFunction;
- TFunction::Pointer function = TFunction::New( );
-
- // Prepare Dijkstra filter
- typedef fpa::Image::DijkstraWithEndPointDetection< TScalarImage, TScalarImage > TFilter;
- TFilter::Pointer filter = TFilter::New( );
- filter->SetInput( dmap );
- filter->SetConversionFunction( function );
- filter->SetNeighborhoodOrder( 2 );
- filter->StopAtOneFrontOff( );
- filter->AddSeed( seed, TScalar( 0 ) );
-
- // Go!
- std::time_t start, end;
- std::time( &start );
- filter->Update( );
- std::time( &end );
- std::cout
- << "Extraction time = "
- << std::difftime( end, start )
- << " s." << std::endl;
-
- // Outputs
- const TFilter::TOutputImage* accumulated_costs = filter->GetOutput( );
- const TFilter::TLabelImage* labeled_image = filter->GetLabelImage( );
- const TFilter::TMinimumSpanningTree* mst = filter->GetMinimumSpanningTree( );
- const TFilter::TUniqueVertices* endpoints = filter->GetEndPoints( );
- const TFilter::TUniqueVertices* bifurcations = filter->GetBifurcations( );
- const TFilter::TBranches* branches = filter->GetBranches( );
- unsigned long nBranches = filter->GetNumberOfBranches( );
-
- // Save outputs
- SaveImage( dmap.GetPointer( ), distancemap_fn );
- SaveImage( accumulated_costs, output_costmap_fn );
- SaveImage( labeled_image, output_labels_fn );
-
- fpa::IO::MinimumSpanningTreeWriter< TFilter::TMinimumSpanningTree >::Pointer
- mst_writer =
- fpa::IO::MinimumSpanningTreeWriter< TFilter::TMinimumSpanningTree >::New( );
- mst_writer->SetInput( mst );
- mst_writer->SetFileName( mst_output_fn );
- mst_writer->Update( );
-
- fpa::IO::UniqueValuesContainerWriter< TFilter::TUniqueVertices >::Pointer
- endpoints_writer =
- fpa::IO::UniqueValuesContainerWriter< TFilter::TUniqueVertices >::New( );
- endpoints_writer->SetInput( endpoints );
- endpoints_writer->SetFileName( endpoints_output_fn );
- endpoints_writer->Update( );
-
- fpa::IO::UniqueValuesContainerWriter< TFilter::TUniqueVertices >::Pointer
- bifurcations_writer =
- fpa::IO::UniqueValuesContainerWriter< TFilter::TUniqueVertices >::New( );
- bifurcations_writer->SetInput( bifurcations );
- bifurcations_writer->SetFileName( bifurcations_output_fn );
- bifurcations_writer->Update( );
-
- fpa::IO::MatrixValuesContainerWriter< TFilter::TBranches >::Pointer
- branches_writer =
- fpa::IO::MatrixValuesContainerWriter< TFilter::TBranches >::New( );
- branches_writer->SetInput( branches );
- branches_writer->SetFileName( branches_output_fn );
- branches_writer->Update( );
-
- return( 0 );
-}
-
-// -------------------------------------------------------------------------
-template< class I >
-void ReadImage( typename I::Pointer& image, const std::string& filename )
-{
- typename itk::ImageFileReader< I >::Pointer reader =
- itk::ImageFileReader< I >::New( );
- reader->SetFileName( filename );
- reader->Update( );
-
- typename itk::MinimumMaximumImageCalculator< I >::Pointer minmax =
- itk::MinimumMaximumImageCalculator< I >::New( );
- minmax->SetImage( reader->GetOutput( ) );
- minmax->Compute( );
- double vmin = double( minmax->GetMinimum( ) );
- double vmax = double( minmax->GetMaximum( ) );
-
- typename itk::ShiftScaleImageFilter< I, I >::Pointer shift =
- itk::ShiftScaleImageFilter< I, I >::New( );
- shift->SetInput( reader->GetOutput( ) );
- shift->SetScale( vmax - vmin );
- shift->SetShift( vmin / ( vmax - vmin ) );
- shift->Update( );
-
- image = shift->GetOutput( );
- image->DisconnectPipeline( );
-}
-
-// -------------------------------------------------------------------------
-template< class I >
-void SaveImage( const I* image, const std::string& filename )
-{
- typename itk::ImageFileWriter< I >::Pointer writer =
- itk::ImageFileWriter< I >::New( );
- writer->SetInput( image );
- writer->SetFileName( filename );
- try
- {
- writer->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr
- << "Error saving \"" << filename << "\": " << err
- << std::endl;
-
- } // yrt
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-void DistanceMap(
- const typename I::Pointer& input, typename O::Pointer& output
- )
-{
- typename itk::SignedMaurerDistanceMapImageFilter< I, O >::Pointer dmap =
- itk::SignedMaurerDistanceMapImageFilter< I, O >::New( );
- dmap->SetInput( input );
- dmap->SetBackgroundValue( ( typename I::PixelType )( 0 ) );
- dmap->InsideIsPositiveOn( );
- dmap->SquaredDistanceOn( );
- dmap->UseImageSpacingOn( );
-
- std::time_t start, end;
- std::time( &start );
- dmap->Update( );
- std::time( &end );
- std::cout
- << "Distance map time = "
- << std::difftime( end, start )
- << " s." << std::endl;
-
- output = dmap->GetOutput( );
- output->DisconnectPipeline( );
-}
-
-// eof - $RCSfile$
-
+++ /dev/null
-#include <cstdlib>
-#include <ctime>
-#include <iostream>
-#include <limits>
-#include <string>
-
-#include <itkImage.h>
-#include <itkImageToVTKImageFilter.h>
-
-#include <itkImageFileReader.h>
-#include <itkImageFileWriter.h>
-
-#include <fpa/Image/Functors/ImageCostFunction.h>
-#include <fpa/Image/DijkstraWithEndPointDetection.h>
-#include <fpa/VTK/ImageMPR.h>
-#include <fpa/VTK/Image3DObserver.h>
-
-#include <fpa/IO/MinimumSpanningTreeWriter.h>
-#include <fpa/IO/UniqueValuesContainerWriter.h>
-#include <fpa/IO/MatrixValuesContainerWriter.h>
-
-#include <vtkCellArray.h>
-#include <vtkFloatArray.h>
-#include <vtkImageMarchingCubes.h>
-#include <vtkPoints.h>
-#include <vtkPolyData.h>
-#include <vtkSmartPointer.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 3;
-typedef unsigned char TPixel;
-typedef float TScalar;
-
-typedef itk::Image< TPixel, Dim > TImage;
-typedef itk::Image< TScalar, Dim > TScalarImage;
-typedef itk::ImageToVTKImageFilter< TImage > TVTKInputImage;
-
-// -------------------------------------------------------------------------
-template< class I >
-void ReadImage( typename I::Pointer& image, const std::string& filename );
-
-template< class I >
-void SaveImage( const I* image, const std::string& filename );
-
-// -------------------------------------------------------------------------
-template< class F >
-class SkeletonCostFunction
- : public fpa::Image::Functors::ImageCostFunction< typename F::TInputImage, typename F::TResult >
-{
-public:
- typedef fpa::Image::Functors::ImageCostFunction< typename F::TInputImage, typename F::TResult > Superclass;
- typedef SkeletonCostFunction Self;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef typename Superclass::TInputImage TInputImage;
- typedef typename Superclass::TResult TResult;
- typedef typename Superclass::TIndex TIndex;
-
-public:
- itkNewMacro( Self );
- itkTypeMacro( SkeletonCostFunction, fpa_Image_Functors_ImageCostFunction );
-
-public:
- virtual void SetInputImage( const TInputImage* img )
- {
- this->Superclass::SetInputImage( img );
-
- typename TInputImage::SpacingType spac = img->GetSpacing( );
- typename TInputImage::SpacingType::ValueType min_spac = spac[ 0 ];
- for( unsigned int d = 1; d < TInputImage::ImageDimension; ++d )
- min_spac = ( spac[ d ] < min_spac )? spac[ d ]: min_spac;
- this->m_Distance = TResult( min_spac );
- }
-
- virtual TResult Evaluate( const TIndex& v, const TIndex& p ) const
- {
- TResult res = this->Superclass::Evaluate( v, p );
- if( res > TResult( 0 ) )
- return( this->m_Distance );
- else
- return( TResult( -1 ) );
- }
-
-protected:
- SkeletonCostFunction( )
- : Superclass( )
- { }
- virtual ~SkeletonCostFunction( )
- { }
-
-private:
- // Purposely not implemented
- SkeletonCostFunction( const Self& );
- void operator=( const Self& );
-
-protected:
- TResult m_Distance;
-};
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 11 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ] << std::endl
- << " input_image" << std::endl
- << " seed_x seed_y seed_z" << std::endl
- << " output_costmap" << std::endl
- << " output_labels" << std::endl
- << " output_minimum_spanning_tree" << std::endl
- << " output_endpoints" << std::endl
- << " output_bifurcations" << std::endl
- << " output_branches" << std::endl
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- std::string output_costmap_fn = argv[ 5 ];
- std::string output_labels_fn = argv[ 6 ];
- std::string mst_output_fn = argv[ 7 ];
- std::string endpoints_output_fn = argv[ 8 ];
- std::string bifurcations_output_fn = argv[ 9 ];
- std::string branches_output_fn = argv[ 10 ];
-
- // Get seed
- TImage::PointType pnt;
- pnt[ 0 ] = TImage::PointType::ValueType( std::atof( argv[ 2 ] ) );
- pnt[ 1 ] = TImage::PointType::ValueType( std::atof( argv[ 3 ] ) );
- pnt[ 2 ] = TImage::PointType::ValueType( std::atof( argv[ 4 ] ) );
-
- // Read image
- TImage::Pointer input_image;
- try
- {
- ReadImage< TImage >( input_image, input_image_fn );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr
- << "Error caught while reading \""
- << input_image_fn << "\": " << err
- << std::endl;
- return( 1 );
-
- } // yrt
-
- TVTKInputImage::Pointer vtk_input_image = TVTKInputImage::New( );
- vtk_input_image->SetInput( input_image );
- vtk_input_image->Update( );
-
- // Show input image and let some interaction
- fpa::VTK::ImageMPR view;
- view.SetBackground( 0.3, 0.2, 0.8 );
- view.SetSize( 500, 500 );
- view.SetImage( vtk_input_image->GetOutput( ) );
-
- vtkSmartPointer< vtkImageMarchingCubes > mc =
- vtkSmartPointer< vtkImageMarchingCubes >::New( );
- mc->SetInputData( vtk_input_image->GetOutput( ) );
- mc->SetValue( 0, 1e-1 );
- mc->Update( );
- view.AddPolyData( mc->GetOutput( ), 1, 1, 1, 0.4 );
-
- // Allow some interaction and wait for, at least, one seed
- view.Render( );
- view.Start( );
-
- // Transform seed
- TImage::IndexType seed;
- input_image->TransformPhysicalPointToIndex( pnt, seed );
-
- // Prepare Dijkstra filter
- typedef fpa::Image::DijkstraWithEndPointDetection< TImage, TScalarImage > TFilter;
- typedef SkeletonCostFunction< TFilter > TFunction;
-
- TFunction::Pointer function = TFunction::New( );
-
- TFilter::Pointer filter = TFilter::New( );
- filter->SetInput( input_image );
- filter->SetCostFunction( function );
- filter->SetNeighborhoodOrder( 2 );
- filter->SetSafetyNeighborhoodSize( 0 );
- filter->StopAtOneFrontOff( );
- filter->CorrectSeedsOff( );
- filter->CorrectEndPointsOff( );
- filter->AddSeed( seed, TScalar( 0 ) );
-
- // Prepare graphical debugger
- typedef fpa::VTK::Image3DObserver< TFilter, vtkRenderWindow > TDebugger;
- TDebugger::Pointer debugger = TDebugger::New( );
- debugger->SetRenderWindow( view.GetWindow( ) );
- debugger->SetRenderPercentage( 0.0000001 );
- filter->AddObserver( itk::AnyEvent( ), debugger );
- filter->ThrowEventsOn( );
-
- // Go!
- std::time_t start, end;
- std::time( &start );
- filter->Update( );
- std::time( &end );
- std::cout
- << "Extraction time = "
- << std::difftime( end, start )
- << " s." << std::endl;
-
- // Outputs
- const TFilter::TOutputImage* accumulated_costs = filter->GetOutput( );
- const TFilter::TLabelImage* labeled_image = filter->GetLabelImage( );
- const TFilter::TMinimumSpanningTree* mst = filter->GetMinimumSpanningTree( );
- const TFilter::TUniqueVertices* endpoints = filter->GetEndPoints( );
- const TFilter::TUniqueVertices* bifurcations = filter->GetBifurcations( );
- const TFilter::TBranches* branches = filter->GetBranches( );
- unsigned long nBranches = filter->GetNumberOfBranches( );
-
- // Save outputs
- SaveImage( accumulated_costs, output_costmap_fn );
- SaveImage( labeled_image, output_labels_fn );
-
- fpa::IO::MinimumSpanningTreeWriter< TFilter::TMinimumSpanningTree >::Pointer
- mst_writer =
- fpa::IO::MinimumSpanningTreeWriter< TFilter::TMinimumSpanningTree >::New( );
- mst_writer->SetInput( mst );
- mst_writer->SetFileName( mst_output_fn );
- mst_writer->Update( );
-
- fpa::IO::UniqueValuesContainerWriter< TFilter::TUniqueVertices >::Pointer
- endpoints_writer =
- fpa::IO::UniqueValuesContainerWriter< TFilter::TUniqueVertices >::New( );
- endpoints_writer->SetInput( endpoints );
- endpoints_writer->SetFileName( endpoints_output_fn );
- endpoints_writer->Update( );
-
- fpa::IO::UniqueValuesContainerWriter< TFilter::TUniqueVertices >::Pointer
- bifurcations_writer =
- fpa::IO::UniqueValuesContainerWriter< TFilter::TUniqueVertices >::New( );
- bifurcations_writer->SetInput( bifurcations );
- bifurcations_writer->SetFileName( bifurcations_output_fn );
- bifurcations_writer->Update( );
-
- fpa::IO::MatrixValuesContainerWriter< TFilter::TBranches >::Pointer
- branches_writer =
- fpa::IO::MatrixValuesContainerWriter< TFilter::TBranches >::New( );
- branches_writer->SetInput( branches );
- branches_writer->SetFileName( branches_output_fn );
- branches_writer->Update( );
-
- // Show endpoints
- vtkSmartPointer< vtkPoints > endpoints_points =
- vtkSmartPointer< vtkPoints >::New( );
- vtkSmartPointer< vtkCellArray > endpoints_cells =
- vtkSmartPointer< vtkCellArray >::New( );
- for(
- TFilter::TUniqueVertices::ConstIterator epIt = endpoints->Begin( );
- epIt != endpoints->End( );
- ++epIt
- )
- {
- TImage::PointType pnt;
- input_image->TransformIndexToPhysicalPoint( *epIt, pnt );
- endpoints_points->InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
- endpoints_cells->InsertNextCell( 1 );
- endpoints_cells->
- InsertCellPoint( endpoints_points->GetNumberOfPoints( ) - 1 );
-
- } // rof
- vtkSmartPointer< vtkPolyData > endpoints_polydata =
- vtkSmartPointer< vtkPolyData >::New( );
- endpoints_polydata->SetPoints( endpoints_points );
- endpoints_polydata->SetVerts( endpoints_cells );
- view.AddPolyData( endpoints_polydata, 0, 0, 1, 1 );
-
- // Show bifurcations
- vtkSmartPointer< vtkPoints > bifurcations_points =
- vtkSmartPointer< vtkPoints >::New( );
- vtkSmartPointer< vtkCellArray > bifurcations_cells =
- vtkSmartPointer< vtkCellArray >::New( );
- for(
- TFilter::TUniqueVertices::ConstIterator bfIt = bifurcations->Begin( );
- bfIt != bifurcations->End( );
- ++bfIt
- )
- {
- TImage::PointType pnt;
- input_image->TransformIndexToPhysicalPoint( *bfIt, pnt );
- bifurcations_points->InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
- bifurcations_cells->InsertNextCell( 1 );
- bifurcations_cells->
- InsertCellPoint( bifurcations_points->GetNumberOfPoints( ) - 1 );
-
- } // rof
- vtkSmartPointer< vtkPolyData > bifurcations_polydata =
- vtkSmartPointer< vtkPolyData >::New( );
- bifurcations_polydata->SetPoints( bifurcations_points );
- bifurcations_polydata->SetVerts( bifurcations_cells );
- view.AddPolyData( bifurcations_polydata, 0, 1, 0, 1 );
-
- // Show branches (simple and detailed)
- vtkSmartPointer< vtkPoints > simple_branches_points =
- vtkSmartPointer< vtkPoints >::New( );
- vtkSmartPointer< vtkCellArray > simple_branches_cells =
- vtkSmartPointer< vtkCellArray >::New( );
-
- vtkSmartPointer< vtkPoints > detailed_branches_points =
- vtkSmartPointer< vtkPoints >::New( );
- vtkSmartPointer< vtkCellArray > detailed_branches_cells =
- vtkSmartPointer< vtkCellArray >::New( );
- vtkSmartPointer< vtkFloatArray > detailed_branches_scalars =
- vtkSmartPointer< vtkFloatArray >::New( );
-
- TFilter::TBranches::ConstIterator brIt = branches->Begin( );
- for( ; brIt != branches->End( ); ++brIt )
- {
- // Branch's first point
- TImage::PointType first_point;
- input_image->TransformIndexToPhysicalPoint( brIt->first, first_point );
- unsigned long first_id = simple_branches_points->GetNumberOfPoints( );
- simple_branches_points->InsertNextPoint(
- first_point[ 0 ], first_point[ 1 ], first_point[ 2 ]
- );
-
- TFilter::TBranches::ConstRowIterator brRowIt = branches->Begin( brIt );
- for( ; brRowIt != branches->End( brIt ); ++brRowIt )
- {
- // Branch's second point
- TImage::PointType second_point;
- input_image->
- TransformIndexToPhysicalPoint( brRowIt->first, second_point );
- unsigned long second_id = simple_branches_points->GetNumberOfPoints( );
- simple_branches_points->InsertNextPoint(
- second_point[ 0 ], second_point[ 1 ], second_point[ 2 ]
- );
- simple_branches_cells->InsertNextCell( 2 );
- simple_branches_cells->InsertCellPoint( first_id );
- simple_branches_cells->InsertCellPoint( second_id );
-
- // Detailed path
- double pathId = double( brRowIt->second - 1 ) / double( nBranches - 1 );
- TFilter::TVertices path;
- mst->GetPath( path, brIt->first, brRowIt->first );
- TFilter::TVertices::const_iterator pIt = path.begin( );
- for( ; pIt != path.end( ); ++pIt )
- {
- TImage::PointType path_point;
- input_image->TransformIndexToPhysicalPoint( *pIt, path_point );
- detailed_branches_points->InsertNextPoint(
- path_point[ 0 ], path_point[ 1 ], path_point[ 2 ]
- );
- detailed_branches_scalars->InsertNextTuple1( pathId );
- if( pIt != path.begin( ) )
- {
- unsigned long nPoints =
- detailed_branches_points->GetNumberOfPoints( );
- detailed_branches_cells->InsertNextCell( 2 );
- detailed_branches_cells->InsertCellPoint( nPoints - 2 );
- detailed_branches_cells->InsertCellPoint( nPoints - 1 );
-
- } // fi
-
- } // rof
-
- } // rof
-
- } // rof
- vtkSmartPointer< vtkPolyData > simple_branches_polydata =
- vtkSmartPointer< vtkPolyData >::New( );
- simple_branches_polydata->SetPoints( simple_branches_points );
- simple_branches_polydata->SetLines( simple_branches_cells );
- view.AddPolyData( simple_branches_polydata, 1, 0, 1, 1 );
-
- vtkSmartPointer< vtkPolyData > detailed_branches_polydata =
- vtkSmartPointer< vtkPolyData >::New( );
- detailed_branches_polydata->SetPoints( detailed_branches_points );
- detailed_branches_polydata->SetLines( detailed_branches_cells );
- detailed_branches_polydata->
- GetPointData( )->SetScalars( detailed_branches_scalars );
- view.AddPolyData( detailed_branches_polydata, 1 );
-
- // Let some more interaction
- view.Render( );
- view.Start( );
-
- return( 0 );
-}
-
-// -------------------------------------------------------------------------
-template< class I >
-void ReadImage( typename I::Pointer& image, const std::string& filename )
-{
- typename itk::ImageFileReader< I >::Pointer reader =
- itk::ImageFileReader< I >::New( );
- reader->SetFileName( filename );
- reader->Update( );
- image = reader->GetOutput( );
- image->DisconnectPipeline( );
-}
-
-// -------------------------------------------------------------------------
-template< class I >
-void SaveImage( const I* image, const std::string& filename )
-{
- typename itk::ImageFileWriter< I >::Pointer writer =
- itk::ImageFileWriter< I >::New( );
- writer->SetInput( image );
- writer->SetFileName( filename );
- try
- {
- writer->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr
- << "Error saving \"" << filename << "\": " << err
- << std::endl;
-
- } // yrt
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <cstdlib>
-#include <iostream>
-#include <fstream>
-#include <string>
-#include <vector>
-
-#include <itkImage.h>
-#include <itkImageToVTKImageFilter.h>
-
-#include <itkImageFileReader.h>
-#include <itkImageFileWriter.h>
-
-#include <fpa/VTK/ImageMPR.h>
-#include <fpa/Image/IncrementalRegionGrow.h>
-#include <fpa/Image/Functors/RegionGrowThresholdFunction.h>
-
-/*
- #include <vtkCamera.h>
- #include <vtkImageActor.h>
- #include <vtkInteractorStyleImage.h>
- #include <vtkPointHandleRepresentation3D.h>
- #include <vtkProperty.h>
- #include <vtkRenderer.h>
- #include <vtkRenderWindow.h>
- #include <vtkRenderWindowInteractor.h>
- #include <vtkSeedRepresentation.h>
- #include <vtkSeedWidget.h>
- #include <vtkSmartPointer.h>
-
- #include <fpa/Image/Functors/ImageAbsoluteDifferenceCostFunction.h>
- #include <fpa/VTK/Image3DObserver.h>
-*/
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 3;
-typedef short TInputPixel;
-typedef short TOutputPixel;
-
-typedef itk::Image< TInputPixel, Dim > TInputImage;
-typedef itk::Image< TOutputPixel, Dim > TOutputImage;
-typedef itk::ImageToVTKImageFilter< TInputImage > TVTKInputImage;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 8 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ] << std::endl
- << "\tinput_image" << std::endl
- << "\toutput_image" << std::endl
- << "\tneighborhood_order" << std::endl
- << "\tstop_at_one_front" << std::endl
- << "\tinit_threshold" << std::endl
- << "\tend_threshold" << std::endl
- << "\tsamples" << std::endl
- << "\t[input_seeds]" << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- std::string output_image_fn = argv[ 2 ];
- unsigned int neighborhood_order = std::atoi( argv[ 3 ] );
- bool stop_at_one_front = ( std::atoi( argv[ 4 ] ) != 0 );
- TInputPixel init_threshold = TInputPixel( std::atof( argv[ 5 ] ) );
- TInputPixel end_threshold = TInputPixel( std::atof( argv[ 6 ] ) );
- unsigned int samples = TInputPixel( std::atof( argv[ 7 ] ) );
- std::string input_seeds_fn = ( argc >= 9 )? argv[ 8 ]: "";
-
- // Read image
- itk::ImageFileReader< TInputImage >::Pointer input_image_reader =
- itk::ImageFileReader< TInputImage >::New( );
- input_image_reader->SetFileName( input_image_fn );
- try
- {
- input_image_reader->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr
- << "Error while reading image from " << input_image_fn << ": "
- << err << std::endl;
- return( 1 );
-
- } // yrt
- TInputImage::ConstPointer input_image = input_image_reader->GetOutput( );
- TVTKInputImage::Pointer vtk_input_image = TVTKInputImage::New( );
- vtk_input_image->SetInput( input_image );
- vtk_input_image->Update( );
-
- // Show input image and let some interaction
- fpa::VTK::ImageMPR view;
- view.SetBackground( 0.3, 0.2, 0.8 );
- view.SetSize( 600, 600 );
- view.SetImage( vtk_input_image->GetOutput( ) );
- view.Render( );
-
- // Read seeds
- std::vector< TInputImage::IndexType > input_seeds;
- if( input_seeds_fn != "" )
- {
- std::ifstream input_seeds_str( input_seeds_fn.c_str( ) );
- if( input_seeds_str )
- {
- unsigned int nSeeds;
- input_seeds_str >> nSeeds;
- for( unsigned int i = 0; i < nSeeds; ++i )
- {
- TInputImage::PointType pnt;
- input_seeds_str >> pnt[ 0 ] >> pnt[ 1 ] >> pnt[ 2 ];
-
- TInputImage::IndexType idx;
- input_image_reader->GetOutput( )->
- TransformPhysicalPointToIndex( pnt, idx );
- input_seeds.push_back( idx );
-
- view.AddSeed( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
-
- } // rof
- input_seeds_str.close( );
- }
- else
- std::cerr << "Error reading \"" << input_seeds_fn << "\"" << std::endl;
-
- } // fi
-
- // Allow some interaction
- view.Render( );
- if( input_seeds.size( ) == 0 )
- {
- while( view.GetNumberOfSeeds( ) == 0 )
- view.Start( );
-
- for( unsigned int i = 0; i < view.GetNumberOfSeeds( ); ++i )
- {
- double p[ 3 ];
- view.GetSeed( i, p );
-
- TInputImage::PointType pnt;
- pnt[ 0 ] = p[ 0 ];
- pnt[ 1 ] = p[ 1 ];
- pnt[ 2 ] = p[ 2 ];
-
- TInputImage::IndexType idx;
- input_image_reader->GetOutput( )->
- TransformPhysicalPointToIndex( pnt, idx );
- input_seeds.push_back( idx );
-
- } // rof
- }
- else
- view.Start( );
-
- // Prepare region grow filter and cost function
- typedef fpa::Image::
- IncrementalRegionGrow< TInputImage, TOutputImage > TFilter;
- typedef fpa::Image::Functors::
- RegionGrowThresholdFunction< TInputImage > TFunction;
-
- TFilter::Pointer filter = TFilter::New( );
- filter->SetInput( input_image_reader->GetOutput( ) );
-
- /*
- typedef fpa::Image::Dijkstra< TInputImage, TOutputImage > TFilter;
- typedef fpa::Image::Functors::
- ImageAbsoluteDifferenceCostFunction< TFilter::TInputImage, TFilter::TResult >
- TCost;
-
- TCost::Pointer cost = TCost::New( );
-
- TFilter::Pointer filter = TFilter::New( );
- filter->SetInput( input_image );
- filter->SetCostFunction( cost );
- filter->SetConversionFunction( NULL );
- filter->SetNeighborhoodOrder( neighborhood_order );
- filter->SetStopAtOneFront( stop_at_one_front );
-
- // Get user-given seeds
- std::ifstream input_seeds_str( input_seeds_fn.c_str( ) );
- if( !input_seeds_str )
- {
- std::cerr << "Error opening \"" << input_seeds_fn << "\"" << std::endl;
- return( 1 );
-
- } // fi
-
- unsigned int nSeeds;
- input_seeds_str >> nSeeds;
- std::vector< TInputImage::IndexType > input_seeds;
- for( unsigned int s = 0; s < nSeeds; s++ )
- {
- TInputImage::IndexType idx;
- input_seeds_str >> idx[ 0 ] >> idx[ 1 ] >> idx[ 2 ];
- input_seeds.push_back( idx );
-
- } // rof
- input_seeds_str.close( );
-
- filter->AddSeed( input_seeds[ init_seed ], 0 );
- filter->AddSeed( input_seeds[ end_seed ], 0 );
-
- // Prepare graphical debugger
- typedef fpa::VTK::Image3DObserver< TFilter, vtkRenderWindow > TDebugger;
- TDebugger::Pointer debugger = TDebugger::New( );
- debugger->SetRenderWindow( view.GetWindow( ) );
- debugger->SetRenderPercentage( 0.0001 );
- filter->AddObserver( itk::AnyEvent( ), debugger );
- filter->ThrowEventsOn( );
-
- // Go!
- filter->Update( );
-
- // Save final total cost map
- itk::ImageFileWriter< TOutputImage >::Pointer output_image_writer =
- itk::ImageFileWriter< TOutputImage >::New( );
- output_image_writer->SetFileName( output_image_fn );
- output_image_writer->SetInput( filter->GetOutput( ) );
- try
- {
- output_image_writer->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr
- << "Error while writing image to " << output_image_fn << ": "
- << err << std::endl;
- return( 1 );
-
- } // yrt
- */
-
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <cstdlib>
-#include <iostream>
-#include <limits>
-#include <string>
-
-#include <itkImage.h>
-#include <itkImageToVTKImageFilter.h>
-
-#include <fpa/Image/RegionGrow.h>
-#include <fpa/Image/Functors/RegionGrowAllBelongsFunction.h>
-#include <fpa/VTK/Image2DObserver.h>
-
-#include "fpa_Utility.h"
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 2;
-typedef unsigned char TPixel;
-typedef itk::Image< TPixel, Dim > TImage;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 4 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " input_image neighborhood_order stop_at_one_front"
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- unsigned int neighborhood_order = std::atoi( argv[ 2 ] );
- bool stop_at_one_front = ( std::atoi( argv[ 3 ] ) != 0 );
-
- // Read image
- TImage::Pointer input_image;
- std::string err = fpa_Utility::ReadImage( input_image, input_image_fn );
- if( err != "" )
- {
- std::cerr << err << std::endl;
- return( 1 );
-
- } // fi
-
- // Show image and wait for, at least, one seed
- itk::ImageToVTKImageFilter< TImage >::Pointer vtk_input_image =
- itk::ImageToVTKImageFilter< TImage >::New( );
- vtk_input_image->SetInput( input_image );
- vtk_input_image->Update( );
-
- fpa_Utility::Viewer2DWithSeeds viewer;
- viewer.SetImage( vtk_input_image->GetOutput( ) );
- while( viewer.GetNumberOfSeeds( ) == 0 )
- viewer.Start( );
-
- // Region growing types
- typedef fpa::Image::RegionGrow< TImage > TFilter;
- typedef fpa::Image::Functors::
- RegionGrowAllBelongsFunction< TImage > TFunction;
-
- // Prepare region grow function
- TFunction::Pointer function = TFunction::New( );
-
- // Prepare region grow filter
- TFilter::Pointer filter = TFilter::New( );
- filter->SetInput( input_image );
- filter->SetGrowingFunction( function );
- filter->SetNeighborhoodOrder( neighborhood_order );
- filter->SetOutsideValue( TPixel( 0 ) );
- filter->SetInsideValue( std::numeric_limits< TPixel >::max( ) );
- filter->SetStopAtOneFront( stop_at_one_front );
-
- // Associate seeds
- for( unsigned long s = 0; s < viewer.GetNumberOfSeeds( ); ++s )
- {
- TImage::PointType pnt;
- TImage::IndexType idx;
- viewer.GetSeed( pnt, s );
- if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
- filter->AddSeed( idx, 0 );
-
- } // rof
-
- // Prepare graphical debugger
- typedef fpa::VTK::Image2DObserver< TFilter, vtkRenderWindow > TDebugger;
- TDebugger::Pointer debugger = TDebugger::New( );
- debugger->SetRenderWindow( viewer.Window );
- debugger->SetRenderPercentage( 0.01 );
- filter->AddObserver( itk::AnyEvent( ), debugger );
- filter->ThrowEventsOn( );
-
- // Go!
- filter->Update( );
-
- // Some more interaction and finish
- viewer.Start( );
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <cstdlib>
-#include <iostream>
-#include <limits>
-#include <string>
-
-#include <itkImage.h>
-#include <itkRGBPixel.h>
-#include <itkImageToVTKImageFilter.h>
-
-#include <fpa/Image/RegionGrow.h>
-#include <fpa/Image/Functors/RegionGrowAllBelongsFunction.h>
-#include <fpa/VTK/Image2DObserver.h>
-
-#include "fpa_Utility.h"
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 2;
-typedef unsigned char TPixel;
-typedef itk::Image< itk::RGBPixel< TPixel >, Dim > TColorImage;
-typedef itk::Image< TPixel, Dim > TImage;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 4 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " input_image neighborhood_order stop_at_one_front"
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- unsigned int neighborhood_order = std::atoi( argv[ 2 ] );
- bool stop_at_one_front = ( std::atoi( argv[ 3 ] ) != 0 );
-
- // Read image
- TColorImage::Pointer input_image;
- std::string err = fpa_Utility::ReadImage( input_image, input_image_fn );
- if( err != "" )
- {
- std::cerr << err << std::endl;
- return( 1 );
-
- } // fi
-
- // Show image and wait for, at least, one seed
- itk::ImageToVTKImageFilter< TColorImage >::Pointer vtk_input_image =
- itk::ImageToVTKImageFilter< TColorImage >::New( );
- vtk_input_image->SetInput( input_image );
- vtk_input_image->Update( );
-
- fpa_Utility::Viewer2DWithSeeds viewer;
- viewer.SetImage( vtk_input_image->GetOutput( ) );
- while( viewer.GetNumberOfSeeds( ) == 0 )
- viewer.Start( );
-
- // Region growing types
- typedef fpa::Image::RegionGrow< TColorImage, TImage > TFilter;
- typedef fpa::Image::Functors::
- RegionGrowAllBelongsFunction< TColorImage > TFunction;
-
- // Prepare region grow function
- TFunction::Pointer function = TFunction::New( );
-
- // Prepare region grow filter
- TFilter::Pointer filter = TFilter::New( );
- filter->SetInput( input_image );
- filter->SetGrowingFunction( function );
- filter->SetNeighborhoodOrder( neighborhood_order );
- filter->SetOutsideValue( TPixel( 0 ) );
- filter->SetInsideValue( std::numeric_limits< TPixel >::max( ) );
- filter->SetStopAtOneFront( stop_at_one_front );
-
- // Associate seeds
- for( unsigned long s = 0; s < viewer.GetNumberOfSeeds( ); ++s )
- {
- TImage::PointType pnt;
- TImage::IndexType idx;
- viewer.GetSeed( pnt, s );
- if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
- filter->AddSeed( idx, 0 );
-
- } // rof
-
- // Prepare graphical debugger
- typedef fpa::VTK::Image2DObserver< TFilter, vtkRenderWindow > TDebugger;
- TDebugger::Pointer debugger = TDebugger::New( );
- debugger->SetRenderWindow( viewer.Window );
- debugger->SetRenderPercentage( 0.01 );
- filter->AddObserver( itk::AnyEvent( ), debugger );
- filter->ThrowEventsOn( );
-
- // Go!
- filter->Update( );
-
- // Some more interaction and finish
- viewer.Start( );
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <cstdlib>
-#include <iostream>
-#include <limits>
-#include <string>
-
-#include <itkImage.h>
-#include <itkImageToVTKImageFilter.h>
-
-#include <fpa/Image/RegionGrow.h>
-#include <fpa/Image/Functors/RegionGrowThresholdFunction.h>
-#include <fpa/VTK/Image2DObserver.h>
-
-#include "fpa_Utility.h"
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 2;
-typedef unsigned char TPixel;
-typedef itk::Image< TPixel, Dim > TImage;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 3 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " input_image neighborhood_order"
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- unsigned int neighborhood_order = std::atoi( argv[ 2 ] );
-
- // Read image
- TImage::Pointer input_image;
- std::string err = fpa_Utility::ReadImage( input_image, input_image_fn );
- if( err != "" )
- {
- std::cerr << err << std::endl;
- return( 1 );
-
- } // fi
-
- // Show image and wait for, at least, one seed
- itk::ImageToVTKImageFilter< TImage >::Pointer vtk_input_image =
- itk::ImageToVTKImageFilter< TImage >::New( );
- vtk_input_image->SetInput( input_image );
- vtk_input_image->Update( );
-
- fpa_Utility::Viewer2DWithSeeds viewer;
- viewer.SetImage( vtk_input_image->GetOutput( ) );
- while( viewer.GetNumberOfSeeds( ) == 0 )
- viewer.Start( );
-
- // Region growing types
- typedef fpa::Image::RegionGrow< TImage > TFilter;
- typedef fpa::Image::Functors::
- RegionGrowThresholdFunction< TImage > TFunction;
-
- // Prepare region grow function
- TFunction::Pointer function = TFunction::New( );
-
- // Prepare region grow filter
- TFilter::Pointer filter = TFilter::New( );
- filter->SetInput( input_image );
- filter->SetGrowingFunction( function );
- filter->SetNeighborhoodOrder( neighborhood_order );
- filter->SetOutsideValue( TPixel( 0 ) );
- filter->SetInsideValue( std::numeric_limits< TPixel >::max( ) );
- filter->StopAtOneFrontOff( );
-
- // Associate seed
- TImage::PointType pnt;
- TImage::IndexType idx;
- viewer.GetSeed( pnt, 0 );
- if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
- filter->AddSeed( idx, 0 );
- function->SetLowerThreshold( input_image->GetPixel( idx ) );
- function->SetUpperThreshold( input_image->GetPixel( idx ) );
-
- // Prepare graphical debugger
- typedef fpa::VTK::Image2DObserver< TFilter, vtkRenderWindow > TDebugger;
- TDebugger::Pointer debugger = TDebugger::New( );
- debugger->SetRenderWindow( viewer.Window );
- debugger->SetRenderPercentage( 0.01 );
- filter->AddObserver( itk::AnyEvent( ), debugger );
- filter->ThrowEventsOn( );
-
- // Go!
- filter->Update( );
-
- // Some more interaction and finish
- viewer.Start( );
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <cstdlib>
-#include <iostream>
-#include <limits>
-#include <string>
-
-#include <itkImage.h>
-#include <itkRGBPixel.h>
-#include <itkImageToVTKImageFilter.h>
-
-#include <fpa/Image/RegionGrow.h>
-#include <fpa/Image/Functors/RegionGrowThresholdFunction.h>
-#include <fpa/VTK/Image2DObserver.h>
-
-#include "fpa_Utility.h"
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 2;
-typedef unsigned char TPixel;
-typedef itk::Image< itk::RGBPixel< TPixel >, Dim > TColorImage;
-typedef itk::Image< TPixel, Dim > TImage;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 3 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " input_image neighborhood_order"
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- unsigned int neighborhood_order = std::atoi( argv[ 2 ] );
-
- // Read image
- TColorImage::Pointer input_image;
- std::string err = fpa_Utility::ReadImage( input_image, input_image_fn );
- if( err != "" )
- {
- std::cerr << err << std::endl;
- return( 1 );
-
- } // fi
-
- // Show image and wait for, at least, one seed
- itk::ImageToVTKImageFilter< TColorImage >::Pointer vtk_input_image =
- itk::ImageToVTKImageFilter< TColorImage >::New( );
- vtk_input_image->SetInput( input_image );
- vtk_input_image->Update( );
-
- fpa_Utility::Viewer2DWithSeeds viewer;
- viewer.SetImage( vtk_input_image->GetOutput( ) );
- while( viewer.GetNumberOfSeeds( ) == 0 )
- viewer.Start( );
-
- // Region growing types
- typedef fpa::Image::RegionGrow< TColorImage, TImage > TFilter;
- typedef fpa::Image::Functors::
- RegionGrowThresholdFunction< TColorImage > TFunction;
-
- // Prepare region grow function
- TFunction::Pointer function = TFunction::New( );
-
- // Prepare region grow filter
- TFilter::Pointer filter = TFilter::New( );
- filter->SetInput( input_image );
- filter->SetGrowingFunction( function );
- filter->SetNeighborhoodOrder( neighborhood_order );
- filter->SetOutsideValue( TPixel( 0 ) );
- filter->SetInsideValue( std::numeric_limits< TPixel >::max( ) );
- filter->StopAtOneFrontOff( );
-
- // Associate seed
- TImage::PointType pnt;
- TImage::IndexType idx;
- viewer.GetSeed( pnt, 0 );
- if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
- filter->AddSeed( idx, 0 );
- function->SetLowerThreshold( input_image->GetPixel( idx ) );
- function->SetUpperThreshold( input_image->GetPixel( idx ) );
-
- // Prepare graphical debugger
- typedef fpa::VTK::Image2DObserver< TFilter, vtkRenderWindow > TDebugger;
- TDebugger::Pointer debugger = TDebugger::New( );
- debugger->SetRenderWindow( viewer.Window );
- debugger->SetRenderPercentage( 0.01 );
- filter->AddObserver( itk::AnyEvent( ), debugger );
- filter->ThrowEventsOn( );
-
- // Go!
- filter->Update( );
-
- // Some more interaction and finish
- viewer.Start( );
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <cstdlib>
-#include <iostream>
-#include <limits>
-#include <string>
-
-#include <itkImage.h>
-#include <itkImageToVTKImageFilter.h>
-#include <itkRGBPixel.h>
-
-#include <itkImageFileReader.h>
-
-#include <vtkCamera.h>
-#include <vtkImageActor.h>
-#include <vtkInteractorStyleImage.h>
-#include <vtkPointHandleRepresentation3D.h>
-#include <vtkProperty.h>
-#include <vtkRenderer.h>
-#include <vtkRenderWindow.h>
-#include <vtkRenderWindowInteractor.h>
-#include <vtkSeedRepresentation.h>
-#include <vtkSeedWidget.h>
-#include <vtkSmartPointer.h>
-
-#include <fpa/Image/RegionGrow.h>
-#include <fpa/VTK/Image2DObserver.h>
-#include <fpa/Image/Functors/GaussianModelEstimatorFunction.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 2;
-typedef unsigned char TPixel;
-typedef float TScalar;
-
-typedef itk::Image< itk::RGBPixel< TPixel >, Dim > TColorImage;
-typedef itk::Image< TPixel, Dim > TImage;
-typedef itk::ImageToVTKImageFilter< TColorImage > TVTKImage;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 4 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " input_image neighborhood_order support [model_file]"
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- unsigned int neighborhood_order = std::atoi( argv[ 2 ] );
- unsigned long support = std::atoi( argv[ 3 ] );
-
- // Read image
- itk::ImageFileReader< TColorImage >::Pointer input_image_reader =
- itk::ImageFileReader< TColorImage >::New( );
- input_image_reader->SetFileName( input_image_fn );
- try
- {
- input_image_reader->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr
- << "Error while reading image from " << input_image_fn << ": "
- << err << std::endl;
- return( 1 );
-
- } // yrt
- TColorImage::ConstPointer input_image = input_image_reader->GetOutput( );
- TVTKImage::Pointer vtk_input_image = TVTKImage::New( );
- vtk_input_image->SetInput( input_image );
- vtk_input_image->Update( );
-
- // VTK visualization
- vtkSmartPointer< vtkImageActor > actor =
- vtkSmartPointer< vtkImageActor >::New( );
- actor->SetInputData( vtk_input_image->GetOutput( ) );
-
- vtkSmartPointer< vtkRenderer > renderer =
- vtkSmartPointer< vtkRenderer >::New( );
- renderer->SetBackground( 0.1, 0.2, 0.7 );
- renderer->AddActor( actor );
- vtkSmartPointer< vtkRenderWindow > window =
- vtkSmartPointer< vtkRenderWindow >::New( );
- window->SetSize( 800, 800 );
- window->AddRenderer( renderer );
-
- // Correct camera due to the loaded image
- vtkCamera* camera = renderer->GetActiveCamera( );
- camera->SetViewUp( 0, -1, 0 );
- camera->SetPosition( 0, 0, -1 );
- camera->SetFocalPoint( 0, 0, 0 );
-
- // VTK interaction
- vtkSmartPointer< vtkInteractorStyleImage > imageStyle =
- vtkSmartPointer< vtkInteractorStyleImage >::New( );
- vtkSmartPointer< vtkRenderWindowInteractor > interactor =
- vtkSmartPointer< vtkRenderWindowInteractor >::New( );
- interactor->SetInteractorStyle( imageStyle );
- window->SetInteractor( interactor );
-
- // Create the widget and its representation
- vtkSmartPointer< vtkPointHandleRepresentation3D > handle =
- vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
- handle->GetProperty( )->SetColor( 1, 0, 0 );
- vtkSmartPointer< vtkSeedRepresentation > rep =
- vtkSmartPointer< vtkSeedRepresentation >::New( );
- rep->SetHandleRepresentation( handle );
-
- vtkSmartPointer< vtkSeedWidget > widget =
- vtkSmartPointer< vtkSeedWidget >::New( );
- widget->SetInteractor( interactor );
- widget->SetRepresentation( rep );
-
- // Let some interaction
- interactor->Initialize( );
- renderer->ResetCamera( );
- window->Render( );
- widget->On( );
- interactor->Start( );
-
- // Prepare region grow function
- typedef fpa::Image::Functors::GaussianModelEstimatorFunction< TColorImage, TScalar > TFunction;
- TFunction::Pointer function = TFunction::New( );
- function->SetModelSupport( support );
- if( argc > 4 )
- function->LoadModelFromFile( argv[ 4 ] );
-
- // Prepare region grow filter
- typedef fpa::Image::RegionGrow< TColorImage, TImage > TFilter;
- TFilter::Pointer filter = TFilter::New( );
- filter->SetInput( input_image );
- filter->SetMembershipFunction( function );
- filter->SetNeighborhoodOrder( neighborhood_order );
- filter->SetOutsideValue( TPixel( 0 ) );
- filter->SetInsideValue( std::numeric_limits< TPixel >::max( ) );
- filter->StopAtOneFrontOff( );
-
- // Get user-given seeds
- for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ )
- {
- double pos[ 3 ];
- rep->GetSeedWorldPosition( s, pos );
-
- TImage::PointType pnt;
- pnt[ 0 ] = TImage::PointType::ValueType( pos[ 0 ] );
- pnt[ 1 ] = TImage::PointType::ValueType( pos[ 1 ] );
-
- TImage::IndexType idx;
- if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
- filter->AddSeed( idx, 0 );
-
- } // rof
-
- // Prepare graphical debugger
- typedef fpa::VTK::Image2DObserver< TFilter, vtkRenderWindow > TDebugger;
- TDebugger::Pointer debugger = TDebugger::New( );
- debugger->SetRenderWindow( window );
- debugger->SetRenderPercentage( 0.001 );
- filter->AddObserver( itk::AnyEvent( ), debugger );
- filter->ThrowEventsOn( );
-
- // Go!
- filter->Update( );
-
- window->Render( );
- widget->Off( );
- interactor->Start( );
-
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <cstdlib>
-#include <iostream>
-#include <fstream>
-#include <limits>
-#include <string>
-#include <vector>
-
-#include <itkImage.h>
-#include <itkImageToVTKImageFilter.h>
-
-#include <itkImageFileReader.h>
-#include <itkImageFileWriter.h>
-
-#include <vtkCamera.h>
-#include <vtkImageActor.h>
-#include <vtkInteractorStyleImage.h>
-#include <vtkPointHandleRepresentation3D.h>
-#include <vtkProperty.h>
-#include <vtkRenderer.h>
-#include <vtkRenderWindow.h>
-#include <vtkRenderWindowInteractor.h>
-#include <vtkSeedRepresentation.h>
-#include <vtkSeedWidget.h>
-#include <vtkSmartPointer.h>
-
-#include <fpa/Image/Dijkstra.h>
-#include <fpa/Image/Functors/ImageAbsoluteDifferenceCostFunction.h>
-#include <fpa/VTK/ImageMPR.h>
-#include <fpa/VTK/Image3DObserver.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 3;
-typedef float TInputPixel;
-typedef float TOutputPixel;
-
-typedef itk::Image< TInputPixel, Dim > TInputImage;
-typedef itk::Image< TOutputPixel, Dim > TOutputImage;
-typedef itk::ImageToVTKImageFilter< TInputImage > TVTKInputImage;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 8 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " input_image input_seeds output_image"
- << " neighborhood_order stop_at_one_front"
- << " init_seed end_seed"
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- std::string input_seeds_fn = argv[ 2 ];
- std::string output_image_fn = argv[ 3 ];
- unsigned int neighborhood_order = std::atoi( argv[ 4 ] );
- bool stop_at_one_front = ( std::atoi( argv[ 5 ] ) != 0 );
- unsigned int init_seed = std::atoi( argv[ 6 ] );
- unsigned int end_seed = std::atoi( argv[ 7 ] );
-
- // Read image
- itk::ImageFileReader< TInputImage >::Pointer input_image_reader =
- itk::ImageFileReader< TInputImage >::New( );
- input_image_reader->SetFileName( input_image_fn );
- try
- {
- input_image_reader->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr
- << "Error while reading image from " << input_image_fn << ": "
- << err << std::endl;
- return( 1 );
-
- } // yrt
- TInputImage::ConstPointer input_image = input_image_reader->GetOutput( );
- TVTKInputImage::Pointer vtk_input_image = TVTKInputImage::New( );
- vtk_input_image->SetInput( input_image );
- vtk_input_image->Update( );
-
- // Show input image and let some interaction
- fpa::VTK::ImageMPR view;
- view.SetBackground( 0.3, 0.2, 0.8 );
- view.SetSize( 600, 600 );
- view.SetImage( vtk_input_image->GetOutput( ) );
-
- // Allow some interaction
- view.Render( );
- view.Start( );
-
- // Prepare region grow filter and cost function
- typedef fpa::Image::Dijkstra< TInputImage, TOutputImage > TFilter;
- typedef fpa::Image::Functors::
- ImageAbsoluteDifferenceCostFunction< TFilter::TInputImage, TFilter::TResult >
- TCost;
-
- TCost::Pointer cost = TCost::New( );
-
- TFilter::Pointer filter = TFilter::New( );
- filter->SetInput( input_image );
- filter->SetCostFunction( cost );
- filter->SetConversionFunction( NULL );
- filter->SetNeighborhoodOrder( neighborhood_order );
- filter->SetStopAtOneFront( stop_at_one_front );
-
- // Get user-given seeds
- std::ifstream input_seeds_str( input_seeds_fn.c_str( ) );
- if( !input_seeds_str )
- {
- std::cerr << "Error opening \"" << input_seeds_fn << "\"" << std::endl;
- return( 1 );
-
- } // fi
-
- unsigned int nSeeds;
- input_seeds_str >> nSeeds;
- std::vector< TInputImage::IndexType > input_seeds;
- for( unsigned int s = 0; s < nSeeds; s++ )
- {
- TInputImage::IndexType idx;
- input_seeds_str >> idx[ 0 ] >> idx[ 1 ] >> idx[ 2 ];
- input_seeds.push_back( idx );
-
- } // rof
- input_seeds_str.close( );
-
- filter->AddSeed( input_seeds[ init_seed ], 0 );
- filter->AddSeed( input_seeds[ end_seed ], 0 );
-
- // Prepare graphical debugger
- typedef fpa::VTK::Image3DObserver< TFilter, vtkRenderWindow > TDebugger;
- TDebugger::Pointer debugger = TDebugger::New( );
- debugger->SetRenderWindow( view.GetWindow( ) );
- debugger->SetRenderPercentage( 0.0001 );
- filter->AddObserver( itk::AnyEvent( ), debugger );
- filter->ThrowEventsOn( );
-
- // Go!
- filter->Update( );
-
- // Save final total cost map
- itk::ImageFileWriter< TOutputImage >::Pointer output_image_writer =
- itk::ImageFileWriter< TOutputImage >::New( );
- output_image_writer->SetFileName( output_image_fn );
- output_image_writer->SetInput( filter->GetOutput( ) );
- try
- {
- output_image_writer->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::cerr
- << "Error while writing image to " << output_image_fn << ": "
- << err << std::endl;
- return( 1 );
-
- } // yrt
-
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include <cstdlib>
-#include <ctime>
-#include <iostream>
-#include <limits>
-#include <string>
-
-#include <itkImage.h>
-#include <itkImageToVTKImageFilter.h>
-
-#include <itkImageFileReader.h>
-#include <fpa/VTK/ImageMPR.h>
-
-#include <fpa/Image/DijkstraWithEndPointDetection.h>
-#include <fpa/IO/MinimumSpanningTreeReader.h>
-#include <fpa/IO/UniqueValuesContainerReader.h>
-#include <fpa/IO/MatrixValuesContainerReader.h>
-
-#include <vtkCellArray.h>
-#include <vtkFloatArray.h>
-#include <vtkImageMarchingCubes.h>
-#include <vtkPoints.h>
-#include <vtkPointData.h>
-#include <vtkPolyData.h>
-#include <vtkSmartPointer.h>
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 3;
-typedef unsigned char TPixel;
-
-typedef itk::Image< TPixel, Dim > TImage;
-typedef itk::ImageToVTKImageFilter< TImage > TVTKInputImage;
-
-typedef fpa::Image::DijkstraWithEndPointDetection< TImage, TImage > TFilter;
-typedef TFilter::TMinimumSpanningTree TMinimumSpanningTree;
-typedef TFilter::TUniqueVertices TUniqueVertices;
-typedef TFilter::TBranches TBranches;
-typedef TFilter::TVertices TVertices;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 6 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ] << std::endl
- << " input_image" << std::endl
- << " input_minimum_spanning_tree" << std::endl
- << " input_endpoints" << std::endl
- << " input_bifurcations" << std::endl
- << " input_branches" << std::endl
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- std::string mst_input_fn = argv[ 2 ];
- std::string endpoints_input_fn = argv[ 3 ];
- std::string bifurcations_input_fn = argv[ 4 ];
- std::string branches_input_fn = argv[ 5 ];
-
- // Read image
- itk::ImageFileReader< TImage >::Pointer input_image_reader =
- itk::ImageFileReader< TImage >::New( );
- input_image_reader->SetFileName( input_image_fn );
- input_image_reader->Update( );
- TImage::ConstPointer input_image = input_image_reader->GetOutput( );
-
- TVTKInputImage::Pointer vtk_input_image = TVTKInputImage::New( );
- vtk_input_image->SetInput( input_image );
- vtk_input_image->Update( );
-
- // Read minimum spanning tree
- fpa::IO::MinimumSpanningTreeReader< TMinimumSpanningTree >::Pointer
- mst_input_reader =
- fpa::IO::MinimumSpanningTreeReader< TMinimumSpanningTree >::New( );
- mst_input_reader->SetFileName( mst_input_fn );
- mst_input_reader->Update( );
- TMinimumSpanningTree::ConstPointer mst_input = mst_input_reader->GetOutput( );
-
- fpa::IO::UniqueValuesContainerReader< TUniqueVertices >::Pointer
- endpoints_input_reader =
- fpa::IO::UniqueValuesContainerReader< TUniqueVertices >::New( );
- endpoints_input_reader->SetFileName( endpoints_input_fn );
- endpoints_input_reader->Update( );
- TUniqueVertices::ConstPointer endpoints_input = endpoints_input_reader->GetOutput( );
-
- fpa::IO::UniqueValuesContainerReader< TUniqueVertices >::Pointer
- bifurcations_input_reader =
- fpa::IO::UniqueValuesContainerReader< TUniqueVertices >::New( );
- bifurcations_input_reader->SetFileName( bifurcations_input_fn );
- bifurcations_input_reader->Update( );
- TUniqueVertices::ConstPointer bifurcations_input =
- bifurcations_input_reader->GetOutput( );
-
- fpa::IO::MatrixValuesContainerReader< TBranches >::Pointer
- branches_input_reader =
- fpa::IO::MatrixValuesContainerReader< TBranches >::New( );
- branches_input_reader->SetFileName( branches_input_fn );
- branches_input_reader->Update( );
- TBranches::ConstPointer branches_input = branches_input_reader->GetOutput( );
- unsigned int nBranches = branches_input_reader->GetNumberOfLabels( );
-
- // Show input image and let some interaction
- fpa::VTK::ImageMPR view;
- view.SetBackground( 0.3, 0.2, 0.8 );
- view.SetSize( 800, 800 );
- view.SetImage( vtk_input_image->GetOutput( ) );
-
- vtkSmartPointer< vtkImageMarchingCubes > mc =
- vtkSmartPointer< vtkImageMarchingCubes >::New( );
- mc->SetInputData( vtk_input_image->GetOutput( ) );
- mc->SetValue( 0, 1e-1 );
- mc->Update( );
- view.AddPolyData( mc->GetOutput( ), 1, 1, 1, 0.4 );
-
- // Show endpoints
- vtkSmartPointer< vtkPoints > endpoints_points =
- vtkSmartPointer< vtkPoints >::New( );
- vtkSmartPointer< vtkCellArray > endpoints_cells =
- vtkSmartPointer< vtkCellArray >::New( );
- for(
- TUniqueVertices::ConstIterator epIt = endpoints_input->Begin( );
- epIt != endpoints_input->End( );
- ++epIt
- )
- {
- TImage::PointType pnt;
- input_image->TransformIndexToPhysicalPoint( *epIt, pnt );
- endpoints_points->InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
- endpoints_cells->InsertNextCell( 1 );
- endpoints_cells->
- InsertCellPoint( endpoints_points->GetNumberOfPoints( ) - 1 );
-
- } // rof
- vtkSmartPointer< vtkPolyData > endpoints_polydata =
- vtkSmartPointer< vtkPolyData >::New( );
- endpoints_polydata->SetPoints( endpoints_points );
- endpoints_polydata->SetVerts( endpoints_cells );
- view.AddPolyData( endpoints_polydata, 0, 0, 1, 1 );
-
- // Show bifurcations
- vtkSmartPointer< vtkPoints > bifurcations_points =
- vtkSmartPointer< vtkPoints >::New( );
- vtkSmartPointer< vtkCellArray > bifurcations_cells =
- vtkSmartPointer< vtkCellArray >::New( );
- for(
- TUniqueVertices::ConstIterator bfIt = bifurcations_input->Begin( );
- bfIt != bifurcations_input->End( );
- ++bfIt
- )
- {
- TImage::PointType pnt;
- input_image->TransformIndexToPhysicalPoint( *bfIt, pnt );
- bifurcations_points->InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
- bifurcations_cells->InsertNextCell( 1 );
- bifurcations_cells->
- InsertCellPoint( bifurcations_points->GetNumberOfPoints( ) - 1 );
-
- } // rof
- vtkSmartPointer< vtkPolyData > bifurcations_polydata =
- vtkSmartPointer< vtkPolyData >::New( );
- bifurcations_polydata->SetPoints( bifurcations_points );
- bifurcations_polydata->SetVerts( bifurcations_cells );
- view.AddPolyData( bifurcations_polydata, 0, 1, 0, 1 );
-
- // Show branches (simple and detailed)
- vtkSmartPointer< vtkPoints > simple_branches_points =
- vtkSmartPointer< vtkPoints >::New( );
- vtkSmartPointer< vtkCellArray > simple_branches_cells =
- vtkSmartPointer< vtkCellArray >::New( );
-
- vtkSmartPointer< vtkPoints > detailed_branches_points =
- vtkSmartPointer< vtkPoints >::New( );
- vtkSmartPointer< vtkCellArray > detailed_branches_cells =
- vtkSmartPointer< vtkCellArray >::New( );
- vtkSmartPointer< vtkFloatArray > detailed_branches_scalars =
- vtkSmartPointer< vtkFloatArray >::New( );
-
- TBranches::ConstIterator brIt = branches_input->Begin( );
- for( ; brIt != branches_input->End( ); ++brIt )
- {
- // Branch's first point
- TImage::PointType first_point;
- input_image->TransformIndexToPhysicalPoint( brIt->first, first_point );
- unsigned long first_id = simple_branches_points->GetNumberOfPoints( );
- simple_branches_points->InsertNextPoint(
- first_point[ 0 ], first_point[ 1 ], first_point[ 2 ]
- );
-
- TBranches::ConstRowIterator brRowIt = branches_input->Begin( brIt );
- for( ; brRowIt != branches_input->End( brIt ); ++brRowIt )
- {
- // Branch's second point
- TImage::PointType second_point;
- input_image->
- TransformIndexToPhysicalPoint( brRowIt->first, second_point );
- unsigned long second_id = simple_branches_points->GetNumberOfPoints( );
- simple_branches_points->InsertNextPoint(
- second_point[ 0 ], second_point[ 1 ], second_point[ 2 ]
- );
- simple_branches_cells->InsertNextCell( 2 );
- simple_branches_cells->InsertCellPoint( first_id );
- simple_branches_cells->InsertCellPoint( second_id );
-
- // Detailed path
- double pathId = double( brRowIt->second - 1 ) / double( nBranches - 1 );
- TVertices path;
- mst_input->GetPath( path, brIt->first, brRowIt->first );
- TVertices::const_iterator pIt = path.begin( );
- for( ; pIt != path.end( ); ++pIt )
- {
- TImage::PointType path_point;
- input_image->TransformIndexToPhysicalPoint( *pIt, path_point );
- detailed_branches_points->InsertNextPoint(
- path_point[ 0 ], path_point[ 1 ], path_point[ 2 ]
- );
- detailed_branches_scalars->InsertNextTuple1( pathId );
- if( pIt != path.begin( ) )
- {
- unsigned long nPoints =
- detailed_branches_points->GetNumberOfPoints( );
- detailed_branches_cells->InsertNextCell( 2 );
- detailed_branches_cells->InsertCellPoint( nPoints - 2 );
- detailed_branches_cells->InsertCellPoint( nPoints - 1 );
-
- } // fi
-
- } // rof
-
- } // rof
-
- } // rof
- vtkSmartPointer< vtkPolyData > simple_branches_polydata =
- vtkSmartPointer< vtkPolyData >::New( );
- simple_branches_polydata->SetPoints( simple_branches_points );
- simple_branches_polydata->SetLines( simple_branches_cells );
- view.AddPolyData( simple_branches_polydata, 1, 0, 1, 1 );
-
- vtkSmartPointer< vtkPolyData > detailed_branches_polydata =
- vtkSmartPointer< vtkPolyData >::New( );
- detailed_branches_polydata->SetPoints( detailed_branches_points );
- detailed_branches_polydata->SetLines( detailed_branches_cells );
- detailed_branches_polydata->
- GetPointData( )->SetScalars( detailed_branches_scalars );
- view.AddPolyData( detailed_branches_polydata, 1 );
-
- // Allow some interaction
- view.Render( );
- view.Start( );
-
- return( 0 );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#include "itkBinaryThinningImageFilter.h"
-#include "itkImage.h"
-#include "itkImageFileReader.h"
-#include "itkImageFileWriter.h"
-#include "itkRescaleIntensityImageFilter.h"
-
-typedef itk::Image<short, 3> ImageType;
-
-int main(int argc, char *argv[])
-{
-
- typedef itk::ImageFileReader<ImageType> ImageReader;
- ImageReader::Pointer reader = ImageReader::New();
- std::string fileName = argv[1];
- reader->SetFileName(fileName);
- reader->Update();
- ImageType::Pointer image = reader->GetOutput();
-
- typedef itk::BinaryThinningImageFilter <ImageType, ImageType> BinaryThinningImageFilterType;
- BinaryThinningImageFilterType::Pointer binaryThinningImageFilter = BinaryThinningImageFilterType::New();
- binaryThinningImageFilter->SetInput(image);
- binaryThinningImageFilter->Update();
-
- // Rescale the image so that it can be seen (the output is 0 and 1, we want 0 and 255)
- typedef itk::RescaleIntensityImageFilter< ImageType, ImageType > RescaleType;
- RescaleType::Pointer rescaler = RescaleType::New();
- rescaler->SetInput( binaryThinningImageFilter->GetOutput() );
- rescaler->SetOutputMinimum(0);
- rescaler->SetOutputMaximum(255);
- rescaler->Update();
-
- typedef itk::ImageFileWriter< ImageType > WriterType;
- WriterType::Pointer writer = WriterType::New();
- writer->SetFileName(argv[2]);
- writer->SetInput(rescaler->GetOutput());
- writer->Update();
-
- return EXIT_SUCCESS;
-}
-
+++ /dev/null
-#ifndef __FPA__UTILITY__H__
-#define __FPA__UTILITY__H__
-
-#include <sstream>
-
-#include <itkImageFileReader.h>
-#include <itkImageFileWriter.h>
-
-#include <vtkCamera.h>
-#include <vtkImageActor.h>
-#include <vtkImageData.h>
-#include <vtkInteractorStyleImage.h>
-#include <vtkPointHandleRepresentation3D.h>
-#include <vtkProperty.h>
-#include <vtkRenderer.h>
-#include <vtkRenderWindow.h>
-#include <vtkRenderWindowInteractor.h>
-#include <vtkSeedRepresentation.h>
-#include <vtkSeedWidget.h>
-#include <vtkSmartPointer.h>
-
-namespace fpa_Utility
-{
- /**
- */
- struct Viewer2DWithSeeds
- {
- vtkSmartPointer< vtkImageData > Image;
- vtkSmartPointer< vtkImageActor > ImageActor;
- vtkSmartPointer< vtkRenderer > Renderer;
- vtkSmartPointer< vtkRenderWindow > Window;
- vtkSmartPointer< vtkInteractorStyleImage > Style;
- vtkSmartPointer< vtkRenderWindowInteractor > Interactor;
- vtkSmartPointer< vtkPointHandleRepresentation3D > Handle;
- vtkSmartPointer< vtkSeedRepresentation > Representation;
- vtkSmartPointer< vtkSeedWidget > Widget;
-
- Viewer2DWithSeeds( )
- {
- this->ImageActor = vtkSmartPointer< vtkImageActor >::New( );
- this->Renderer = vtkSmartPointer< vtkRenderer >::New( );
- this->Window = vtkSmartPointer< vtkRenderWindow >::New( );
- this->Style = vtkSmartPointer< vtkInteractorStyleImage >::New( );
- this->Interactor = vtkSmartPointer< vtkRenderWindowInteractor >::New( );
- this->Handle = vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
- this->Representation = vtkSmartPointer< vtkSeedRepresentation >::New( );
- this->Widget = vtkSmartPointer< vtkSeedWidget >::New( );
-
- this->Renderer->SetBackground( 0.1, 0.2, 0.7 );
- this->Window->SetSize( 600, 600 );
- this->Window->AddRenderer( this->Renderer );
- this->Interactor->SetInteractorStyle( this->Style );
- this->Window->SetInteractor( this->Interactor );
- this->Handle->GetProperty( )->SetColor( 1, 0, 0 );
- this->Representation->SetHandleRepresentation( this->Handle );
- this->Widget->SetInteractor( this->Interactor );
- this->Widget->SetRepresentation( this->Representation );
- }
- void SetImage( vtkImageData* image )
- {
- this->Image = image;
- this->ImageActor->SetInputData( this->Image );
- this->Renderer->AddActor( this->ImageActor );
-
- // Correct camera due to the loaded image
- vtkCamera* camera = this->Renderer->GetActiveCamera( );
- camera->SetViewUp( 0, -1, 0 );
- camera->SetPosition( 0, 0, -1 );
- camera->SetFocalPoint( 0, 0, 0 );
-
- // Prepare visualization
- this->Interactor->Initialize( );
- this->Renderer->ResetCamera( );
- }
- void Render( )
- {
- this->Window->Render( );
- }
- void Start( )
- {
- this->Window->Render( );
- this->Widget->On( );
- this->Interactor->Start( );
- }
- unsigned long GetNumberOfSeeds( ) const
- {
- return( this->Representation->GetNumberOfSeeds( ) );
- }
-
- template< class P >
- bool GetSeed( P& seed, unsigned long i )
- {
- if( i < this->Representation->GetNumberOfSeeds( ) )
- {
- double pos[ 3 ];
- this->Representation->GetSeedWorldPosition( i, pos );
-
- seed[ 0 ] = ( typename P::ValueType )( pos[ 0 ] );
- seed[ 1 ] = ( typename P::ValueType )( pos[ 1 ] );
-
- return( true );
- }
- else
- return( false );
- }
- };
-
- // -----------------------------------------------------------------------
- template< class Ip >
- std::string ReadImage( Ip& image, const std::string& fname )
- {
- typename itk::ImageFileReader< typename Ip::ObjectType >::Pointer r =
- itk::ImageFileReader< typename Ip::ObjectType >::New( );
- r->SetFileName( fname );
- try
- {
- r->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::stringstream str;
- str << "Error while reading image from " << fname << ": " << err;
- return( str.str( ) );
-
- } // yrt
- image = r->GetOutput( );
- image->DisconnectPipeline( );
- return( "" );
- }
-
- // -----------------------------------------------------------------------
- template< class I >
- std::string SaveImage( const I* image, const std::string& fname )
- {
- typename itk::ImageFileWriter< I >::Pointer w =
- itk::ImageFileWriter< I >::New( );
- w->SetInput( image );
- w->SetFileName( fname );
- try
- {
- w->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- std::stringstream str;
- str << "Error while reading image from " << fname << ": " << err;
- return( str.str( ) );
-
- } // yrt
- return( "" );
- }
-
-} // ecapseman
-
-#endif // __FPA__UTILITY__H__
-
-// eof - $RCSfile$
+++ /dev/null
-CONFIGURE_FILE(
- FrontAlgorithmsConfig.cmake.in
- ${PROJECT_BINARY_DIR}/FrontAlgorithmsConfig.cmake
- @ONLY
- )
-
-## ========================
-## == Installation rules ==
-## ========================
-
-INSTALL(
- FILES
- ${PROJECT_BINARY_DIR}/FrontAlgorithmsConfig.cmake
- DESTINATION share/cmake
- )
-
-## eof - $RCSfile$
+++ /dev/null
-# =========================
-# == Include directories ==
-# =========================
-
-INCLUDE_DIRECTORIES(
- @PROJECT_SOURCE_DIR@/lib
- @PROJECT_BINARY_DIR@/lib
- @PROJECT_SOURCE_DIR@/lib/fpa_Instances
- @PROJECT_BINARY_DIR@/lib/fpa_Instances
- @CMAKE_INSTALL_PREFIX@/include
- )
-
-# =========================
-# == Library directories ==
-# =========================
-
-IF(MSVC)
- LINK_DIRECTORIES(
- @PROJECT_BINARY_DIR@/$(ConfigurationName)
- @CMAKE_INSTALL_PREFIX@/bin
- @CMAKE_INSTALL_PREFIX@/lib
- )
-ELSE(MSVC)
- LINK_DIRECTORIES(
- @PROJECT_BINARY_DIR@
- @CMAKE_INSTALL_PREFIX@/bin
- @CMAKE_INSTALL_PREFIX@/lib
- )
-ENDIF(MSVC)
-
-# ===================
-# == Library names ==
-# ===================
-
-SET(FrontAlgorithms_LIBRARY FrontAlgorithms)
-
-## eof - $RCSfile$
+++ /dev/null
-SET(
- policies
- CMP0015
- CMP0020
- CMP0042
- )
-FOREACH(policy ${policies})
- IF(POLICY ${policy})
- CMAKE_POLICY(SET ${policy} NEW)
- ENDIF(POLICY ${policy})
-ENDFOREACH(policy)
-
-## eof - $RCSfile$
+++ /dev/null
-<cpPlugins_Workspace>
- <filter category="ImageFilters" class="CastImageFilter" name="cast" ViewX="-1098" ViewY="-242">
- <parameter name="CastType" value="char#short#int#long#uchar#ushort#uint#ulong#float#double@double" type="Choices"/>
- </filter>
- <filter category="fpaImageAlgorithmFunctors" class="InvertCostFunction" name="cost" ViewX="-951" ViewY="-428">
- <parameter name="Alpha" value="1" type="Real"/>
- <parameter name="Beta" value="1" type="Real"/>
- <parameter name="ScalarType" value="float#double@float" type="Choices"/>
- </filter>
- <filter category="fpaImageAlgorithm" class="ImageDijkstra" name="dijkstra" ViewX="-735" ViewY="-176">
- <parameter name="FillNodeQueue" value="1" type="Bool"/>
- <parameter name="NeighborhoodOrder" value="1#2@1" type="Choices"/>
- <parameter name="StopAtOneFront" value="0" type="Bool"/>
- <parameter name="VisualDebug" value="1" type="Bool"/>
- </filter>
- <filter category="ImageFilters" class="SignedMaurerDistanceMapImageFilter" name="dmap" ViewX="-1093" ViewY="-379">
- <parameter name="BackgroundValue" value="0" type="Real"/>
- <parameter name="InsideIsPositive" value="1" type="Bool"/>
- <parameter name="OutputResolution" value="float#double@float" type="Choices"/>
- <parameter name="SquaredDistance" value="0" type="Bool"/>
- <parameter name="UseImageSpacing" value="1" type="Bool"/>
- </filter>
- <filter category="fpaImageAlgorithm" class="ExtractEndPointsAndBifurcationsFromMinimumSpanningTree" name="eb" ViewX="-491" ViewY="-267">
- <parameter name="SquaredDistanceMap" value="0" type="Bool"/>
- </filter>
- <filter category="IO" class="ImageReader" name="reader" ViewX="-1366" ViewY="-264">
- <parameter name="FileNames" value="" type="OpenFileNameList"/>
- </filter>
- <filter category="Widgets" class="NoInteractiveSeedWidget" name="seed" ViewX="-1116" ViewY="-124">
- <parameter name="Text" value="" type="String"/>
- </filter>
- <connection>
- <origin filter="cost" name="Output"/>
- <destination filter="dijkstra" name="CostFunctor"/>
- </connection>
- <connection>
- <origin filter="dijkstra" name="Output"/>
- <destination filter="eb" name="CostsImage"/>
- </connection>
- <connection>
- <origin filter="dijkstra" name="MST"/>
- <destination filter="eb" name="MST"/>
- </connection>
- <connection>
- <origin filter="dmap" name="Output"/>
- <destination filter="dijkstra" name="Input"/>
- </connection>
- <connection>
- <origin filter="dmap" name="Output"/>
- <destination filter="eb" name="DistanceMap"/>
- </connection>
- <connection>
- <origin filter="reader" name="Output"/>
- <destination filter="cast" name="Input"/>
- </connection>
- <connection>
- <origin filter="reader" name="Output"/>
- <destination filter="dmap" name="Input"/>
- </connection>
- <connection>
- <origin filter="reader" name="Output"/>
- <destination filter="seed" name="ReferenceImage"/>
- </connection>
- <connection>
- <origin filter="seed" name="Output"/>
- <destination filter="dijkstra" name="Seeds"/>
- </connection>
- <exposed_output_port port_name="bifurcations" filter="eb" filter_port_name="Bifurcations"/>
- <exposed_output_port port_name="endpoints" filter="eb" filter_port_name="EndPoints"/>
- <exposed_output_port port_name="input_image_casted" filter="CastImageFilter" filter_port_name="Output"/>
- <exposed_output_port port_name="input_image_dmap" filter="dmap" filter_port_name="Output"/>
- <exposed_output_port port_name="skeleton" filter="eb" filter_port_name="Skeleton"/>
-</cpPlugins_Workspace>
+++ /dev/null
-## =============================
-## = Set names and directories =
-## =============================
-
-SET(lib_NAME TempAirwaysAppli_AirwaysLib)
-
-INCLUDE_DIRECTORIES(
- ${CMAKE_CURRENT_SOURCE_DIR}/../MathLib
- ${CMAKE_CURRENT_BINARY_DIR}/../MathLib
- )
-
-## ===============
-## = Source code =
-## ===============
-
-FILE(GLOB lib_HEADERS_H "${CMAKE_CURRENT_SOURCE_DIR}/*.h")
-FILE(GLOB lib_HEADERS_HPP "${CMAKE_CURRENT_SOURCE_DIR}/*.hpp")
-FILE(GLOB lib_HEADERS_HXX "${CMAKE_CURRENT_SOURCE_DIR}/*.hxx")
-FILE(GLOB lib_SOURCES_C "${CMAKE_CURRENT_SOURCE_DIR}/*.c")
-FILE(GLOB lib_SOURCES_CPP "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
-FILE(GLOB lib_SOURCES_CXX "${CMAKE_CURRENT_SOURCE_DIR}/*.cxx")
-
-## =====================
-## = Compilation rules =
-## =====================
-
-ADD_LIBRARY(
- ${lib_NAME}
- SHARED
- ${lib_SOURCES_C}
- ${lib_SOURCES_CPP}
- ${lib_SOURCES_CXX}
- )
-GENERATE_EXPORT_HEADER(
- ${lib_NAME}
- BASE_NAME ${lib_NAME}
- EXPORT_MACRO_NAME ${lib_NAME}_EXPORT
- EXPORT_FILE_NAME ${CMAKE_CURRENT_BINARY_DIR}/${lib_NAME}_Export.h
- STATIC_DEFINE ${lib_NAME}_BUILT_AS_STATIC
- )
-TARGET_LINK_LIBRARIES(${lib_NAME} TempAirwaysAppli_MathLib ${ITK_LIBRARIES} ${VTK_LIBRARIES})
-
-## eof - $RCSfile$
+++ /dev/null
-/*
- * airwaysEdge.cxx
- *
- * Created on: May 12, 2014
- * Author: caceres
- */
-
-#include "airwaysEdge.h"
-#include <iostream>
-
-namespace airways
-{
-
-Edge::Edge() : m_id(0), m_source(NULL), m_target(NULL), m_mark(false), m_angle(0), m_length(
- 0), m_eDistance(0), m_aRadius(0), m_minRadius(0), m_maxRadius(0)
-{
-
-}
-
-Edge::Edge(Edge* edge) : m_id(0), m_source(NULL), m_target(NULL), m_mark(false), m_angle(0), m_length(
- 0), m_eDistance(0), m_aRadius(0), m_minRadius(0), m_maxRadius(0)
-{
- this->m_id = edge->m_id;
- this->m_source = edge->m_source;
- this->m_target = edge->m_target;
- this->m_angle = edge->m_angle;
- this->m_length = edge->m_length;
- this->m_eDistance = edge->m_eDistance;
- this->m_vec_pair_posVox_rad = edge->m_vec_pair_posVox_rad;
- this->m_aRadius = edge->m_aRadius;
- this->m_minRadius = edge->m_minRadius;
- this->m_maxRadius = edge->m_maxRadius;
-}
-
-Edge::~Edge()
-{
-}
-
-int Edge::GetAngle() const
-{
- return this->m_angle;
-}
-
-double Edge::GetARadius() const
-{
- return this->m_aRadius;
-}
-
-double Edge::GetEDistance() const
-{
- return this->m_eDistance;
-}
-
-double Edge::GetLength() const
-{
- return this->m_length;
-}
-
-double Edge::GetMaxRadius() const
-{
- return this->m_maxRadius;
-}
-
-double Edge::GetMinRadius() const
-{
- return this->m_minRadius;
-}
-
-Node* Edge::GetSource() const
-{
- return this->m_source;
-}
-
-Node* Edge::GetTarget() const
-{
- return this->m_target;
-}
-
-const vec_pair_posVox_rad& Edge::GetEdgeInfo() const
-{
- return m_vec_pair_posVox_rad;
-}
-
-bool Edge::IsMarked() const
-{
- return this->m_mark;
-}
-
-bool Edge::IsPointInfluencedByEdge(float point_x, float point_y, float point_z) const
-{
- // Variables
- float minDistance = -1.0;
- bool first = true;
- float distanceTemp = 0.0;
- bool influenced = false;
- Vec3 vector(point_x, point_y, point_z);
-
- // Iterate over all voxel in the edge
- vec_pair_posVox_rad::const_iterator it = this->m_vec_pair_posVox_rad.begin();
- for (; it != this->m_vec_pair_posVox_rad.end() && !influenced; ++it)
- {
- // Get the vector from the compared source to each voxel
- Vec3 voxel_actual = ((*it).first);
- //Vec3 source_actual = this->m_source->GetCoords( );
- //Vec3 vector_actual(voxel_actual - source_actual);
-
- // Get the difference vector
- Vec3 vector_diff = vector - voxel_actual;
-
- // Get the distance
- distanceTemp = vector_diff.Norm();
-
- // Get the minimum
- if(first)
- {
- minDistance = distanceTemp;
- first = false;
- if(minDistance < ((*it).second*1.8))
- influenced = true;
- }
- else if(distanceTemp < minDistance)
- {
- minDistance = distanceTemp;
- if(minDistance < ((*it).second)*1.8)
- influenced = true;
- }
- }
-
- return influenced;
-}
-
-void Edge::SetAngle(const double& angle)
-{
- this->m_angle = angle;
-}
-
-void Edge::SetARadius(const double& aRadius)
-{
- this->m_aRadius = aRadius;
-}
-
-void Edge::SetEDistance(const double& eDistance)
-{
- this->m_eDistance = eDistance;
-}
-
-void Edge::SetLength(const double& length)
-{
- this->m_length = length;
-}
-
-void Edge::SetMaxRadius(const unsigned int& maxRadius)
-{
- this->m_maxRadius = maxRadius;
-}
-
-void Edge::SetMinRadius(const unsigned int& minRadius)
-{
- this->m_minRadius = minRadius;
-}
-
-void Edge::SetSource(Node* source)
-{
- this->m_source = source;
-}
-
-void Edge::SetTarget(Node* target)
-{
- this->m_target = target;
-}
-
-void Edge::AddSkeletonPairInfo(const pair_posVox_rad& skPairInfo)
-{
- this->m_vec_pair_posVox_rad.push_back(skPairInfo);
-}
-
-void Edge::SetSkeletonPairVector(const vec_pair_posVox_rad& skPInfoVector)
-{
- this->m_vec_pair_posVox_rad = skPInfoVector;
- UpdateEdgeInfo();
-}
-
-void Edge::UpdateEdgeInfo()
-{
- if (this->m_vec_pair_posVox_rad.empty())
- {
- std::cout << " ------------------------ This edge has no information" << std::endl;
- std::cout << "Source:" << this->m_source->GetCoords() << std::endl;
- std::cout << "Target:" << this->m_target->GetCoords() << std::endl;
- return;
- }
- double min = std::numeric_limits<unsigned int>::max();
- double max = std::numeric_limits<unsigned int>::min();
- double average = 0;
- vec_pair_posVox_rad::iterator it = this->m_vec_pair_posVox_rad.begin();
- for (; it != this->m_vec_pair_posVox_rad.end(); ++it)
- {
- pair_posVox_rad info = *it;
- average += info.second;
- if (info.second < min)
- min = info.second;
- else if (info.second > max)
- max = info.second;
- }
- this->m_aRadius = average / this->m_vec_pair_posVox_rad.size();
- this->m_minRadius = min;
- this->m_maxRadius = max;
-}
-
-double Edge::CompareWith(Edge* edge)
-{
- //std::cout << "Comparing ... " << std::endl;
- // To compared the edges, the distance in each component
- // is calculated and a distance function between edges is calculated.
- // The components are:
- // - Each component of the quaternion (son-parent quaterion). (4 components)
- // - Edge distance
- // - Edge average radius
-
- // Difference in each quaternion component
- // p
- // |
- // |
- // |
- // s
- // /
- // /
- // /
- // g
- /*const Edge* edgeActualParent = this->m_source->GetEdge( );
- Vec3 sourceActualParent = edgeActualParent->m_source->GetCoords( );
- Vec3 targetActualParent = edgeActualParent->m_target->GetCoords( );
- Vec3 sourceActual = this->m_source->GetCoords( );
- Vec3 targetActual = this->m_target->GetCoords( );
-
- Vec3 sp_actual( sourceActualParent - targetActualParent );
- Vec3 sg_actual( targetActual - sourceActual );
-
- const Edge* edgeComparedParent = edge.m_source->GetEdge( );
- Vec3 sourceComparedParent = edgeComparedParent->m_source->GetCoords( );
- Vec3 targetComparedParent = edgeComparedParent->m_target->GetCoords( );
- Vec3 sourceCompared = edge.m_source->GetCoords( );
- Vec3 targetCompared = edge.m_target->GetCoords( );
-
- Vec3 sp_compared( sourceComparedParent - targetComparedParent );
- Vec3 sg_compared( targetCompared - sourceCompared );
-
- Quaternion q_actual(sp_actual, sg_actual);
- Quaternion q_compared(sp_compared, sg_compared);
-
- float dif_r = q_actual.getR() - q_compared.getR();
- float dif_i = q_actual.getI() - q_compared.getI();
- float dif_j = q_actual.getJ() - q_compared.getJ();
- float dif_k = q_actual.getK() - q_compared.getK();
- float dif_distance = this->m_length - edge.m_length;
- float dif_radius = this->m_aRadius - edge.m_aRadius;
- */
- double distanceEdge = GetDistanceToEdge(edge);
-
- //std::cout << "Comparing ... OK" << std::endl;
-
- return distanceEdge;
-}
-
-float Edge::GetDistanceToEdge(Edge* edge)
-{
- // a. The parent edges must be aligned before calculate the distance.
- // b. Parent end-points are aligned also.
- // Steps a and b represent a rotation and a translation respectively.
- // c. For each point in the actual Edge (this) the closest point in the
- // compared edge is found. This distance is calculated and then averaged
- // for all the points. Must be done in both ways?
- // We can take the maximum of both distances max(D(a,b),D(b,a))
-
- // Variables
- float averageDistance = 0.0;
- float numPoints = 0;
-
- // Get the parent Edges
- /*const Edge* edgeActualParent = this->m_source->GetEdge( );
- Vec3 sourceActualParent = edgeActualParent->m_source->GetCoords( );
- Vec3 targetActualParent = edgeActualParent->m_target->GetCoords( );
- Vec3 sourceActual = this->m_source->GetCoords( );
- Vec3 targetActual = this->m_target->GetCoords( );
-
- Vec3 sp_actual( sourceActualParent - targetActualParent );
- Vec3 sg_actual( targetActual - sourceActual );
-
- const Edge* edgeComparedParent = edge.m_source->GetEdge( );
- Vec3 sourceComparedParent = edgeComparedParent->m_source->GetCoords( );
- Vec3 targetComparedParent = edgeComparedParent->m_target->GetCoords( );
- Vec3 sourceCompared = edge.m_source->GetCoords( );
- Vec3 targetCompared = edge.m_target->GetCoords( );
-
- Vec3 sp_compared( sourceComparedParent - targetComparedParent );
- Vec3 sg_compared( targetCompared - sourceCompared );
-
- //Get the quaternion between parents
- Quaternion q_parent(sp_actual, sp_compared);
-
- // Get the translation vector to translate the compared parent to the actual parent
- const Vec3 transParents( targetActualParent - targetComparedParent);
- */
-
- // Iterate over the voxels in the compared edge
- for(vec_pair_posVox_rad::iterator it = edge->m_vec_pair_posVox_rad.begin(); it != edge->m_vec_pair_posVox_rad.end(); ++it)
- {
- // Get the vector from the compared source to each voxel in the compared edge
- Vec3 voxel_actual = (*it).first;
- /*Vec3 vector_compared(voxel_actual - sourceCompared);
-
- // Rotate the vector using the parental quaternion
- Vec3 vector_compared_rotated = q_parent.rotateVector(vector_compared);
- */
-
- // Find the distance to the closest point in the actual edge
- //averageDistance += getDistanceToClosestPoint(sourceActual+vector_compared_rotated);
- averageDistance += this->GetSmallestDistanceToPoint(voxel_actual);
-
- ++numPoints;
- }
-
- // Get the average value
- if(numPoints > 0)
- averageDistance = averageDistance / numPoints;
-
- return averageDistance;
-}
-
-float Edge::GetDistanceToTranslatedEdge(Edge* edge, Vec3 vector_translation)
-{
- // a. The parent edges must be aligned before calculate the distance.
- // b. Parent end-points are aligned also.
- // Steps a and b represent a rotation and a translation respectively.
- // c. For each point in the actual Edge (this) the closest point in the
- // compared edge is found. This distance is calculated and then averaged
- // for all the points. Must be done in both ways?
- // We can take the maximum of both distances max(D(a,b),D(b,a))
-
- // Variables
- float averageDistance = 0.0;
- float numPoints = 0;
-
- // Iterate over the voxels in the compared edge
- for(vec_pair_posVox_rad::iterator it = edge->m_vec_pair_posVox_rad.begin(); it != edge->m_vec_pair_posVox_rad.end(); ++it)
- {
- // Get the vector from the compared source to each voxel in the compared edge
- Vec3 voxel_actual = (*it).first;
-
- // Translate the voxel
- Vec3 voxel_translated = voxel_actual + vector_translation;
-
- // Find the distance to the closest point in the actual edge
- averageDistance += this->GetSmallestDistanceToPoint(voxel_translated);
-
- ++numPoints;
- }
-
- // Get the average value
- if(numPoints > 0)
- averageDistance = averageDistance / numPoints;
-
- return averageDistance;
-}
-
-float Edge::GetDistanceWeigthedToTranslatedEdge(Edge* edge, Vec3 vector_translation)
-{
- // a. The parent edges must be aligned before calculate the distance.
- // b. Parent end-points are aligned also.
- // Steps a and b represent a rotation and a translation respectively.
- // c. For each point in the actual Edge (this) the closest point in the
- // compared edge is found. This distance is calculated and then averaged
- // for all the points. Must be done in both ways?
- // We can take the maximum of both distances max(D(a,b),D(b,a))
-
- // Variables
- double alfa = 4; // Weight for duplicated closest points
- float distance_average = 0.0;
- float distance_actual = 0.0;
- float numPoints = 0;
- std::map<Vec3, vec_pair_posVox_rad > map_vector_pair_vector_distance; // Map to save the correspondences between the given edge voxels and this voxels, and the distance between them.
-
- // Iterate over the voxels in the compared edge
- for(vec_pair_posVox_rad::iterator it = edge->m_vec_pair_posVox_rad.begin(); it != edge->m_vec_pair_posVox_rad.end(); ++it)
- {
- // Get the vector from the compared source to each voxel in the compared edge
- Vec3 voxel_actual = (*it).first;
-
- // Translate the voxel
- Vec3 voxel_translated = voxel_actual + vector_translation;
-
- // Find the distance to the closest point in the actual edge
- Vec3 point_closest = this->GetClosestPoint(voxel_translated, distance_actual);
- distance_average += distance_actual;
-
- // Add the link
- pair_posVox_rad pair_vector_distance(voxel_actual, distance_actual);
- map_vector_pair_vector_distance[point_closest].push_back(pair_vector_distance);
-
- ++numPoints;
- }
-
- // Add the weight to shared closest points
- float distance_weighted = 0.0;
- for(std::map<Vec3, vec_pair_posVox_rad>::iterator it = map_vector_pair_vector_distance.begin(); it != map_vector_pair_vector_distance.end(); ++it)
- {
- vec_pair_posVox_rad vector_pair_vector_distance = (*it).second;
- if(vector_pair_vector_distance.size() > 1)
- {
- for(vec_pair_posVox_rad::iterator it_vector = vector_pair_vector_distance.begin(); it_vector != vector_pair_vector_distance.end(); ++it_vector)
- distance_weighted += (*it_vector).second * alfa;
- }
- else
- {
- for(vec_pair_posVox_rad::iterator it_vector = vector_pair_vector_distance.begin(); it_vector != vector_pair_vector_distance.end(); ++it_vector)
- distance_weighted += (*it_vector).second;
- }
- }
-
- // Get the average value
- if(numPoints > 0)
- {
- distance_average = distance_average / numPoints;
- distance_weighted = distance_weighted / numPoints;
- }
-
- //std::cout << "[DistanceW;DistAvg][" << distance_weighted << ";" << distance_average << "];;";
- //return distance_average;
- return distance_weighted;
-}
-
-float Edge::GetDistanceToPoint(Vec3 point)
-{
- // Variables
- bool first = true;
- float distance = 0.0;
-
- // Iterate over all voxel in the edge
- vec_pair_posVox_rad::iterator it = this->m_vec_pair_posVox_rad.begin();
- for (; it != this->m_vec_pair_posVox_rad.end(); ++it)
- {
- // Get the vector from the compared source to each voxel
- Vec3 voxel_actual = ((*it).first);
-
- // Get the difference vector
- Vec3 vector_diff = point - voxel_actual;
-
- // Get the distance
- distance += vector_diff.Norm();
- }
-
- return distance;
-}
-
-
-float Edge::GetSmallestDistanceToPoint(Vec3 vector)
-{
- // Variables
- float minDistance = -1.0;
- bool first = true;
- float distanceTemp = 0.0;
-
- // Iterate over all voxel in the edge
- vec_pair_posVox_rad::iterator it = this->m_vec_pair_posVox_rad.begin();
- for (; it != this->m_vec_pair_posVox_rad.end(); ++it)
- {
- // Get the vector from the compared source to each voxel
- Vec3 voxel_actual = ((*it).first);
- //Vec3 source_actual = this->m_source->GetCoords( );
- //Vec3 vector_actual(voxel_actual - source_actual);
-
- // Get the difference vector
- Vec3 vector_diff = vector - voxel_actual;
-
- // Get the distance
- distanceTemp = vector_diff.Norm();
-
- // Get the minimum
- if(first)
- {
- minDistance = distanceTemp;
- first = false;
- }
- else if(distanceTemp < minDistance)
- minDistance = distanceTemp;
- }
-
- return minDistance;
-}
-
-Vec3 Edge::GetClosestPoint(Vec3 vector, float& distance)
-{
- // Variables
- Vec3 point_closest;
- bool first = true;
- float distanceTemp = 0.0;
-
- // Iterate over all voxel in the edge
- vec_pair_posVox_rad::iterator it = this->m_vec_pair_posVox_rad.begin();
- for (; it != this->m_vec_pair_posVox_rad.end(); ++it)
- {
- // Get the vector from the compared source to each voxel
- Vec3 voxel_actual = ((*it).first);
- //Vec3 source_actual = this->m_source->GetCoords( );
- //Vec3 vector_actual(voxel_actual - source_actual);
-
- // Get the difference vector
- Vec3 vector_diff = vector - voxel_actual;
-
- // Get the distance
- distanceTemp = vector_diff.Norm();
-
- // Get the minimum
- if(first)
- {
- point_closest = voxel_actual;
- distance = distanceTemp;
- first = false;
- }
- else if(distanceTemp < distance)
- {
- point_closest = voxel_actual;
- distance = distanceTemp;
- }
- }
-
- return point_closest;
-}
-
-Edge* Edge::ConcatenateToSuperior(Edge* superior)
-{
- if(superior == NULL)
- return new Edge(this);
-
- // Check concatenation condition in the nodes
- if(superior->GetTarget()->GetCoords() != this->GetSource()->GetCoords())
- {
- std::cout << "Edge::ConcatenateToSuperior - superior.target != actualEdge.source. Actual idNode:" << this->m_id << std::endl;
- std::cout << "[superior.target;actualEdge.source]: [" << superior->GetTarget()->GetCoords() << ";" << this->GetSource()->GetCoords() << "]" << std::endl;
- return NULL;
- }
-
- // Check concatenation condition in the edge information
- vec_pair_posVox_rad vectorInfo_thisEdge = this->GetEdgeInfo(); // Actual edge information
- vec_pair_posVox_rad vectorInfo_superiorEdge = superior->GetEdgeInfo(); // Superior edge information
-
- // Check that last superior edge position is equal to first initial actual edge position
- if(vectorInfo_superiorEdge[vectorInfo_superiorEdge.size()-1].first != vectorInfo_thisEdge[0].first)
- {
- std::cout << "Edge::ConcatenateToSuperior - superior.info[end] != actualEdge.info[begin]. Actual idNode:" << this->m_id << std::endl;
- return NULL;
- }
-
- // Change the superior edge target, the superior length, and the euclidian distance
- superior->SetTarget(this->GetTarget());
- superior->SetLength(superior->GetLength()+this->GetLength()-1);
- superior->SetEDistance(superior->GetEDistance()+this->GetEDistance());
-
- // Add the position information
- vec_pair_posVox_rad::iterator it_actualInfo = vectorInfo_thisEdge.begin();
- ++it_actualInfo; // Skip the first position because is it shared between both edges
- for(; it_actualInfo != vectorInfo_thisEdge.end(); ++it_actualInfo)
- vectorInfo_superiorEdge.push_back((*it_actualInfo));
-
- // Set the new information
- superior->SetSkeletonPairVector(vectorInfo_superiorEdge);
-
- return superior;
-
-}
-
-Edge& Edge::operator=(Edge& edge)
-{
- this->m_mark = edge.m_mark;
- this->m_angle = edge.m_angle;
- this->m_length = edge.m_length;
- this->m_eDistance = edge.m_eDistance;
- this->m_aRadius = edge.m_aRadius;
- this->m_minRadius = edge.m_minRadius;
- this->m_maxRadius = edge.m_maxRadius;
- this->m_source = edge.m_source;
- this->m_target = edge.m_target;
- this->m_vec_pair_posVox_rad = edge.m_vec_pair_posVox_rad;
- return *this;
-}
-
-const Edge& Edge::operator=(const Edge& edge)
-{
- this->m_mark = edge.m_mark;
- this->m_angle = edge.m_angle;
- this->m_length = edge.m_length;
- this->m_eDistance = edge.m_eDistance;
- this->m_aRadius = edge.m_aRadius;
- this->m_minRadius = edge.m_minRadius;
- this->m_maxRadius = edge.m_maxRadius;
- this->m_source = edge.m_source;
- this->m_target = edge.m_target;
- this->m_vec_pair_posVox_rad = edge.m_vec_pair_posVox_rad;
- return *this;
-}
-
-bool Edge::operator==(const Edge& edge)
- {
- bool cmp1 = true;
- bool cmp2 = true;
- bool cmp3 = true;
- bool cmp4 = true;
- bool cmp5 = true;
- bool cmp6 = true;
- /*if (this->m_angle != edge.m_angle)
- {
- double max =
- this->m_angle >= edge.m_angle ? this->m_angle : edge.m_angle;
- double tol = 0.3 * max;
- double diff = this->m_angle - edge.m_angle;
- if (!((-tol <= diff) && (diff <= tol)))
- cmp1 = false;
- }*/
- if (this->m_length != edge.m_length)
- {
- double max =
- this->m_length >= edge.m_length ? this->m_length : edge.m_length;
- double tol = 0.3 * max;
- double diff = abs(this->m_length - edge.m_length);
- if (diff > tol)
- cmp2 = false;
- }
- if (this->m_eDistance != edge.m_eDistance)
- {
- double max =
- this->m_eDistance >= edge.m_eDistance ?
- this->m_eDistance : edge.m_eDistance;
- double tol = 0.3 * max;
- double diff = abs(this->m_eDistance - edge.m_eDistance);
- if (diff > tol)
- cmp3 = false;
- }
- /*if (this->m_aRadius != edge.m_aRadius)
- {
- double max =
- this->m_aRadius >= edge.m_aRadius ?
- this->m_aRadius : edge.m_aRadius;
- double tol = 0.3 * max;
- double diff = abs(this->m_aRadius - edge.m_aRadius);
- if (diff > tol)
- cmp4 = false;
- }
- if (this->m_minRadius != edge.m_minRadius)
- {
- double max =
- this->m_minRadius >= edge.m_minRadius ?
- this->m_minRadius : edge.m_minRadius;
- double tol = 0.3 * max;
- double diff = abs(this->m_minRadius - edge.m_minRadius);
- if (diff > tol)
- cmp5 = false;
- }
- if (this->m_maxRadius != edge.m_maxRadius)
- {
- double max =
- this->m_maxRadius >= edge.m_maxRadius ?
- this->m_maxRadius : edge.m_maxRadius;
- double tol = 0.3 * max;
- double diff = abs(this->m_maxRadius - edge.m_maxRadius);
- if (diff > tol)
- cmp6 = false;
- }*/
- return (cmp1 && cmp2 && cmp3 && cmp4 && cmp5 && cmp6);
- }
-
-bool Edge::operator!=(const Edge& edge)
- {
- return !(*this == edge);
- }
-
-bool Edge::operator<(const Edge& edge)
-{
- bool cmp1 = true;
- bool cmp2 = true;
- if (this->m_length != edge.m_length)
- {
- double max =
- this->m_length >= edge.m_length ? this->m_length : edge.m_length;
- double tol = 0.3 * max;
- double diff = abs(this->m_length - edge.m_length);
- if (diff > tol)
- cmp2 = false;
- }
- if (this->m_eDistance != edge.m_eDistance)
- {
- double max =
- this->m_eDistance >= edge.m_eDistance ?
- this->m_eDistance : edge.m_eDistance;
- double tol = 0.3 * max;
- double diff = abs(this->m_eDistance - edge.m_eDistance);
- if (diff > tol)
- cmp2 = false;
- }
- if (cmp1 && cmp2)
- return false;
- if ((this->m_length < edge.m_length)
- || (this->m_eDistance < edge.m_eDistance))
- return true;
- return false;
-
-}
-
-bool Edge::operator>(const Edge& edge)
-{
- bool cmp1 = true;
- bool cmp2 = true;
- if (this->m_length != edge.m_length)
- {
- double max =
- this->m_length >= edge.m_length ? this->m_length : edge.m_length;
- double tol = 0.3 * max;
- double diff = abs(this->m_length - edge.m_length);
- if (diff > tol)
- cmp2 = false;
- }
- if (this->m_eDistance != edge.m_eDistance)
- {
- double max =
- this->m_eDistance >= edge.m_eDistance ?
- this->m_eDistance : edge.m_eDistance;
- double tol = 0.3 * max;
- double diff = abs(this->m_eDistance - edge.m_eDistance);
- if (diff > tol)
- cmp2 = false;
- }
- if (cmp1 && cmp2)
- return false;
- if ((this->m_length > edge.m_length)
- || (this->m_eDistance > edge.m_eDistance))
- return true;
- return false;
-}
-
-} /* namespace airways */
+++ /dev/null
-/*
- * airwaysEdge.h
- *
- * Created on: May 12, 2014
- * Author: caceres
- */
-
-#ifndef AIRWAYSEDGE_H_
-#define AIRWAYSEDGE_H_
-
-#include <cstddef>
-#include <cstdlib>
-#include <vector>
-#include <utility>
-#include <limits>
-
-#include "airwaysNode.h"
-#include "Quaternion.h"
-#include <Airways/AirwaysLib/TempAirwaysAppli_AirwaysLib_Export.h>
-
-/**
- * @brief Airways project namespace
- */
-namespace airways
-{
-
-/*
- * Pair of <Vec3,double> which means the position of the skeleton point
- * between two nodes (including branch-points) and it radius (obtained from
- * the Danielsson's distance map algorithm)
- */
-typedef std::pair<Vec3, double> pair_posVox_rad;
-
-/*
- * A vector stocking all the points between two nodes
- */
-typedef std::vector<pair_posVox_rad> vec_pair_posVox_rad;
-
-class Node;
-
-/*
- * This class represents an edge in a tree. Particularly, this edge represents the relation from child to father.
- * This means that the edge source corresponds to the father and the target to the child. This implies that the root
- * node has a NULL edge.
- */
-class TempAirwaysAppli_AirwaysLib_EXPORT Edge
-{
-public:
- /*!
- * Default constructor
- */
- Edge();
-
- /*!
- * Alternative constructor (copy)
- * @param edge
- */
- Edge(Edge* edge);
-
- /*!
- * Destructor
- */
- virtual ~Edge();
-
-
- //Getters
-
- /*!
- * This method returns the angle between two vectors using its parent as
- * reference
- * @return
- */
- int GetAngle() const;
-
- /*!
- * This method returns the Average radius between two branch-points
- * @return
- */
- double GetARadius() const;
-
- /*!
- * This method returns the euclidean distance between two branch-points
- * @return
- */
- double GetEDistance() const;
-
- /*!
- * This method returns the geodesic distance between two branch-points
- * @return
- */
- double GetLength() const;
-
- /*!
- * This method returns the maximum radius between two branch-points
- * @return
- */
- double GetMaxRadius() const;
-
- /*!
- * This method returns the minimum radius between two branch-points
- * @return
- */
- double GetMinRadius() const;
-
- /*!
- * This method returns the source node of an edge
- * @return
- */
- Node* GetSource() const;
-
- /*!
- * This method returns the target node of an edge
- * @return
- */
- Node* GetTarget() const;
-
- /*!
- * This method returns the SKPairInfoVector of an edge
- * @return
- */
- const vec_pair_posVox_rad& GetEdgeInfo() const;
-
- /*!
- * This method returns true if an edge is marked
- * @return
- */
- bool IsMarked() const;
-
- /**
- * Method that returns if a voxel is influenced by this edge, i.e. if the distance
- * to the closest voxel of the edge is smaller than the radius on the closest voxel.
- * @param x,y,z are the voxel positions in coordinates x, y, and z respectively.
- * @return true is the voxel is influenced, false otherwise
- */
- bool IsPointInfluencedByEdge(float point_x, float point_y, float point_z) const;
-
- //Setters and Modifiers
-
- /*!
- * This method sets the angle between two vectors using its parent
- * as reference
- * @param angle
- */
- void SetAngle(const double& angle);
-
- /*!
- * This method sets the average radius between two nodes
- * @param aRadius
- */
- void SetARadius(const double& aRadius);
-
-
- /*!
- * This method sets the Euclidean distance between two nodes
- * @param eDistance
- */
- void SetEDistance(const double& eDistance);
-
- /*!
- * This method sets the geodesical length between two nodes
- * @param length
- */
- void SetLength(const double& length);
-
- /*!
- * This method sets the maximum radius between two nodes
- * @param maxRadius
- */
- void SetMaxRadius(const unsigned int& maxRadius);
-
- /*!
- * This method sets the minimum radius between two nodes
- * @param minRadius
- */
- void SetMinRadius(const unsigned int& minRadius);
-
- /*!
- * This method sets the source node of an edge
- * @param source
- */
- void SetSource(Node* source);
-
- /*!
- * This method sets the target node of an edge
- * @param target
- */
- void SetTarget(Node* target);
-
- /*!
- * This method adds a pair <Coordinate, Radius> into skPInfoVector
- * @param skPairInfo
- */
- void AddSkeletonPairInfo(const pair_posVox_rad& skPairInfo);
-
- /*!
- * This method sets the skPInfoVector
- * @param skPInfoVector
- */
- void SetSkeletonPairVector(const vec_pair_posVox_rad& skPInfoVector);
-
- /*!
- * This method updates all the attributes of an edge using the information
- * provided from m_skInfoPairVector attribute.
- */
- void UpdateEdgeInfo();
-
- /**
- * Method that compares two edges.
- * @pre The actual and the edge given by parameter both have a parent edge
- * @param edge is the edge to be compared with
- * @return the evalation value
- */
- double CompareWith(Edge* edge);
-
- /**
- * Method that obtains the distance between two edges
- * @param edge is the edge to be compared with
- * @return the average distance from all points in the given edge
- * to this edge. The distance from each in point in the edge to this
- * edge is defined as the minimum distance to all the point in this
- * edge.
- */
- float GetDistanceToEdge(Edge* edge);
-
- float GetDistanceToTranslatedEdge(Edge* edge, Vec3 vector_translation);
-
- /**
- * Method that returns the distance point to point to the edge given by parameter.
- * Additionally, the points that share the same closest point receive more weight in the distance.
- * @param edge is the edge to be compared with
- * @param vector_translation is the translation vector to translate the given edge
- * @return the weigthed distance to the given edge
- */
- float GetDistanceWeigthedToTranslatedEdge(Edge* edge, Vec3 vector_translation);
-
- /**
- * Method that calculates the distance from edge to one point in the space
- * @point is the point in the space
- * @return the distance from edge to one point in the space
- */
- float GetDistanceToPoint(Vec3 point);
-
- /**
- * Method that returns the smallest distance of the edge voxels to the given voxel (represented as a vector)
- * @param vector is the point to be compared
- * @return the smallest distance of the edge voxels to the given voxel
- */
- float GetSmallestDistanceToPoint(Vec3 vector);
-
- /**
- * Method that returns the closest point in the edge to the given point (represented as a vector) and the distance between them (by parameter)
- * @param vector is the point to be compared
- * @param distance is the returned distance to the closes point
- * @return the closest vector and the minimum distance of the point to the points in the edge by parameter.
- */
- Vec3 GetClosestPoint(Vec3 vector, float& distance);
-
- /**
- * Method that concatenates the actual edge to a superior one given by parameter
- * @param superior is the superio edge. The target of the superior edge must be the source of the actual edge
- * in terms of voxel position.
- * @return the composed edge to the superior edge
- */
- Edge* ConcatenateToSuperior(Edge* superior);
-
- //Operator Overload
-
- Edge& operator=(Edge& edge);
-
- const Edge& operator=(const Edge& edge);
-
- bool operator==(const Edge& edge);
-
- bool operator!=(const Edge& edge);
-
- bool operator<(const Edge& edge);
-
- bool operator>(const Edge& edge);
-
-protected:
-
- unsigned int m_id;
-
- /**
- * Source node representing the father
- */
- Node* m_source;
-
- /**
- * Target node representing the child
- */
- Node* m_target;
-
- bool m_mark; //!Mark attribute
-
- double m_angle; //!Angle between two vectors having its parent as reference
-
- double m_length; //!Geodesic distance
-
- double m_eDistance; //!Euclidean distance
-
- double m_aRadius; //!Average radius between two nodes
-
- unsigned int m_minRadius; //!Minimum radius between two nodes
-
- unsigned int m_maxRadius; //!Maximum radius between two nodes
-
- /*!
- * The m_vec_pair_posVox_rad is a vector containing all centerline points,
- * in real coordinates of the image, and radius information of an edge.
- * i.e., for each point of the skeleton between two nodes there is a pair
- * <position real coordinates, radius>
- */
- vec_pair_posVox_rad m_vec_pair_posVox_rad;
-
- friend class AirwaysTree; //!Friend class AirwaysTree
-
- friend class Node; //!Friend class Node
-};
-
-} /* namespace airways */
-
-#endif /* AIRWAYSEDGE_H_ */
+++ /dev/null
-/*
- * airwaysNode.cxx
- *
- * Created on: May 12, 2014
- * Author: Diego Cáceres
- *
- * Modified by: Alfredo Morales Pinzón
- */
-
-#include <iostream>
-
-#include "airwaysNode.h"
-
-namespace airways
-{
-
-Node::Node() : m_id(0), m_children(), m_edge(NULL), m_coords(0, 0, 0), m_level(-1), m_mark(false)
-{
-}
-
-Node::Node(const Vec3& coord) : m_id(0), m_children(), m_edge(NULL), m_level(-1), m_mark(false)
-{
- this->m_coords = coord;
- this->m_level = 0;
-}
-
-Node::Node(Node* node) : m_id(0), m_children(), m_mark(false)
-{
- this->m_coords = node->m_coords;
- this->m_level = node->m_level;
- this->m_edge = new Edge(node->m_edge);
-}
-
-Node::~Node()
-{
-}
-
-//Getters
-
-const std::vector<Node*>& Node::GetChildren() const
-{
- return this->m_children;
-}
-
-const unsigned int Node::GetId() const
-{
- return this->m_id;
-}
-
-const Vec3& Node::GetCoords() const
-{
- return this->m_coords;
-}
-
-Edge* Node::GetEdge() const
-{
- return this->m_edge;
-}
-
-Node* Node::GetFather() const
-{
- return this->father;
-}
-
-unsigned int Node::GetLevel() const
-{
- return this->m_level;
-}
-
-int Node::GetDepthById(unsigned int idNode) const
-{
- if( this->m_id == idNode)
- return 0;
-
- vec_nodes::const_iterator it = this->m_children.begin();
- for( ; it != this->m_children.end(); ++it)
- {
- if((*it)->HasNodeId(idNode))
- return 1 + (*it)->GetDepthById(idNode);
- }
-
- std::cout << "GetDepthById - The idNode: " << idNode << "does not exist" << std::endl;
-
- return -1;
-}
-
-unsigned int Node::GetWeight() const
-{
- if(this->IsLeaf())
- return 1;
-
- unsigned int weight = 0;
-
- vec_nodes::const_iterator it = this->m_children.begin();
- for( ; it != this->m_children.end(); ++it)
- weight += (*it)->GetWeight();
-
- return 1 + weight;
-}
-
-unsigned int Node::GetHeight() const
-{
- unsigned int heightChildren = 0;
-
- vec_nodes::const_iterator it=this->m_children.begin();
- for( ; it != this->m_children.end(); ++it)
- {
- unsigned int actualHeight = (*it)->GetHeight();
- if(actualHeight > heightChildren)
- heightChildren = actualHeight;
- }
-
- // Return my heigh plus my children height
- return 1 + heightChildren;
-}
-
-unsigned int Node::GetNumberOfChildren() const
-{
- return this->m_children.size();
-}
-
-unsigned int Node::GetNumberOfNonMarkedChildren( unsigned int depth ) const
-{
- if(depth > 0)
- {
- unsigned int nonMarked = 0;
-
- for(vec_nodes::const_iterator it = this->m_children.begin(); it != this->m_children.end(); ++it)
- {
- if( !(*it)->m_mark )
- ++nonMarked;
- nonMarked += (*it)->GetNumberOfNonMarkedChildren( depth - 1 );
- }
- return nonMarked;
- }
- return 0;
-}
-
-unsigned int Node::GetNumberOfLeafs() const
-{
- if(this->IsLeaf())
- return 1;
-
- unsigned int leafs = 0;
- vec_nodes::const_iterator it = this->m_children.begin();
- for( ; it != this->m_children.end(); ++it)
- leafs += (*it)->GetNumberOfLeafs();
-
- return leafs;
-}
-
-Node* Node::GetNodeById(unsigned int nId)
-{
- // Base case
- if( m_id == nId)
- return this;
-
- Node* node_searched = NULL;
-
- // Search in the children
- vec_nodes::iterator it_children = m_children.begin();
- for( ; it_children != m_children.end() && node_searched == NULL; ++it_children)
- node_searched = (*it_children)->GetNodeById(nId);
-
- return node_searched;
-}
-
-Node* Node::GetClosestBranchNodeToPoint(float point_x, float point_y, float point_z, float &distance)
-{
- // Get the actual distance
- distance = GetBranchDistanceToPoint(point_x, point_y, point_z);
-
- // Make as closest "this" node
- Node* node_closest = this;
-
- // Iterate over the children
- vec_nodes::iterator it_children = m_children.begin();
- for( ; it_children != m_children.end(); ++it_children)
- {
- // Get actual child distance
- float distance_actual = 0;
- Node* bestNodeChild = (*it_children)->GetClosestBranchNodeToPoint(point_x, point_y, point_z, distance_actual);
-
- // If the child distance is smaller then switch
- if(distance_actual < distance)
- {
- node_closest = bestNodeChild;
- distance = distance_actual;
- }
- }
-
- return node_closest;
-}
-
-Node* Node::GetClosestNodeToPoint(Vec3 position, double& distance)
-{
- // Calculate actual distance to point
- Vec3 vector_diff = position - this->m_coords;
- distance = vector_diff.Norm();
-
- if(this->IsLeaf())
- return this;
-
- // Variables
- double actualDistance = -1;
- Node* node_Best = this;
- Node* node_Actual = NULL;
-
- // Check the children and get the best
- for(vec_nodes::const_iterator it = this->m_children.begin(); it != this->m_children.end(); ++it)
- {
- node_Actual = (*it)->GetClosestNodeToPoint(position, actualDistance);
-
- if(actualDistance < distance)
- {
- node_Best = node_Actual;
- distance = actualDistance;
- }
- }
-
- if(actualDistance == -1)
- std::cout << "GetClosestNodeToPoint NOT FOUND!" << std::endl;
-
- return node_Best;
-}
-
-float Node::GetBranchDistanceToPoint(int voxel_x, int voxel_y, int voxel_z)
-{
- Vec3 voxel(voxel_x,voxel_y, voxel_z);
- if(this->m_edge != NULL)
- return this->m_edge->GetSmallestDistanceToPoint(voxel);
- else
- {
- Vec3 vector_diff = this->m_coords - voxel;
- return vector_diff.Norm();
- }
-}
-
-bool Node::HasMinimumLevels(int levels)
-{
- if(levels == 1)
- return true;
-
- bool minimum = false;
-
- vec_nodes::iterator it=this->m_children.begin();
- for( ; it != this->m_children.end() && !minimum; ++it)
- if((*it)->HasMinimumLevels(levels-1))
- minimum = true;
-
- return minimum;
-}
-
-bool Node::IsLeaf() const
-{
- return this->m_children.empty();
-}
-
-bool Node::IsMarked() const
-{
- return this->m_mark;
-}
-
-bool Node::HasMarkedChildren() const
-{
- if(this->IsLeaf())
- return false;
-
- // Check the children
- vec_nodes::const_iterator it = this->m_children.begin();
- for( ; it != this->m_children.end(); ++it)
- if( (*it)->IsMarked() || (*it)->HasMarkedChildren())
- return true;
-
- return false;
-}
-
-bool Node::HasNode(Node* node_searched) const
-{
- if(this->m_id == node_searched->m_id)
- return true;
-
- bool found = false;
-
- vec_nodes::const_iterator it = this->m_children.begin();
- for( ; it != this->m_children.end() && !found; ++it)
- if( (*it)->HasNode(node_searched) )
- found = true;
-
- return found;
-}
-
-bool Node::HasNodeId(unsigned int id_node_searched) const
-{
- // If this is the node then return true
- if(this->m_id == id_node_searched)
- return true;
-
- // Search in the children
- bool found = false;
- vec_nodes::const_iterator it = this->m_children.begin();
- for( ; it != this->m_children.end() && !found; ++it)
- if( (*it)->HasNodeId(id_node_searched) )
- found = true;
-
- return found;
-}
-
-bool Node::IsPointInfluencedByNode(float point_x, float point_y, float point_z) const
-{
- if(this->m_edge)
- return m_edge->IsPointInfluencedByEdge(point_x, point_y, point_z);
-
- return false;
-}
-
-void Node::GetBrancheNodesInfluencingPoint(float point_x, float point_y, float point_z, vec_nodes& vec_nodes_influence)
-{
- if(this->IsPointInfluencedByNode(point_x, point_y, point_z))
- vec_nodes_influence.push_back(this);
-
- vec_nodes::const_iterator it = this->m_children.begin();
- for( ; it != this->m_children.end(); ++it)
- (*it)->GetBrancheNodesInfluencingPoint(point_x, point_y, point_z, vec_nodes_influence);
-}
-
-void Node::GetChildrenUptoDepth(unsigned int Q, vec_nodes& fathers)
-{
- if(Q > 0)
- {
- vec_nodes::const_iterator it = this->m_children.begin();
- for( ; it != this->m_children.end(); ++it)
- {
- fathers.push_back((*it));
- (*it)->GetChildrenUptoDepth(Q-1, fathers);
- }
- /*// Add this node
- fathers.push_back(this);
-
- // If the depth is greater that 1 then add the children of this node
- if(Q > 1)
- {
- vec_nodes::const_iterator it = this->m_children.begin();
- for( ; it != this->m_children.end(); ++it)
- (*it)->GetChildrenUptoDepth(Q-1, fathers);
- }*/
- }
-}
-
-void Node::CompareSubTreesOrkiszMorales(Node* nodeB, unsigned int Q, unsigned int F, vec_nodes& commonA, vec_nodes& commonB, vec_nodes& nonCommonA, vec_nodes& nonCommonB, map_id_vecnodes& map_A_to_B, map_id_vecnodes& map_B_to_A, std::vector< std::pair< pair_nodes, pair_nodes > >& vector_pair_edges)
-{
- //std::cout << "---------------------------------------------------------" << std::endl;
- //std::cout << "Comparing [A,B]: " << this->m_id << "," << nodeB->m_id << std::endl;
-
- // Variables
- double distanceAtoB = 0;
- double distanceBtoA = 0;
- Node* node_bestA = NULL;
- Node* node_bestB = NULL;
-
- // Algorithm
- // The algorithm is recursive it is implemented the node class. The idea is to overlap the initial nodes of the subtrees
- // and find the best branch correspondence for the first level of the trees.
- // Hypothesis: It is supposed that the roots of the trees are common, so the algorithm does not run in the root nodes
- // 1. Translate one of the subtree so that the initial nodes overlap.
- // 2. While one of the trees has non-marked child
- // 2.1 Compare each child to all the branches is the other tree.
- // 2.2 Select the pair, child and branch in the other tree, that has the lowest distance function.
- // 2.3 Add the pair and the distance to the final result.
- // 2.4 Mark the nodes
- // 2.5 Find and mark the omitted nodes in the similar branch. If the selected branch has more that 2 nodes it means that intermediary nodes do not have correspondence.
- // 2.6 Run the process (First step) using the found pair of nodes.
-
- //1. Translate one of the subtree so that the initial nodes overlap.
- // The translation must be applied later
-
- Vec3 vector_trans_B_to_A = this->m_coords - nodeB->m_coords;
-
- // ------------------------
- // ------------------------
- // Making the matching faster
- std::multimap<double, pair_nodes> map_dist_pairNodes_A_to_B = this->CalculateDistanceToAllBranches_FatherAndFamily(nodeB, Q, F);
- std::multimap<double, pair_nodes> map_dist_pairNodes_B_to_A = nodeB->CalculateDistanceToAllBranches_FatherAndFamily(this, Q, F);
-
- // ------------------------
- // ------------------------
-
- while( this->GetNumberOfNonMarkedChildren( Q ) > 0 && nodeB->GetNumberOfNonMarkedChildren( Q ) > 0 )
- {
- // 2.1 Compare each child to all the branches is the other tree.
-
- // 2.1.1 Get best translated branch from A to B
- //std::pair<pair_nodes,double> pair_A_to_B = this->GetClosestBranch_FatherAndFamily(nodeB);
- // 2.1.2 Get best translated branch from B to A
- //std::pair<pair_nodes,double> pair_B_to_A = nodeB->GetClosestBranch_FatherAndFamily(this);
-
- // ------------------------
- // ------------------------
- // Making the matching faster
- // Get the next best pair
- std::pair<double,pair_nodes> pair_A_to_B = GetPairWithClosestDistance_FirstNodeNonMarked(map_dist_pairNodes_A_to_B);
- std::pair<double,pair_nodes> pair_B_to_A = GetPairWithClosestDistance_FirstNodeNonMarked(map_dist_pairNodes_B_to_A);
-
- if( ! pair_A_to_B.second.first || ! pair_A_to_B.second.second )
- std::cout << "There is no closest-non-marked branch!" << std::endl;
-
- distanceAtoB = pair_A_to_B.first;
- distanceBtoA = pair_B_to_A.first;
-
- //std::map<double, pair_nodes> map_dist_pairNodes_A_to_B = this->CalculateDistanceToAllBranches_FatherAndFamily(nodeB);
- //std::map<double, pair_nodes> map_dist_pairNodes_B_to_A = nodeB->CalculateDistanceToAllBranches_FatherAndFamily(this);
- // ------------------------
- // ------------------------
-
-
- // Assign the distances
- //distanceAtoB = pair_A_to_B.second;
- //distanceBtoA = pair_B_to_A.second;
-
- // 2.2 Select the pair, child and branch in the other tree, that has the lowest distance function.
- if(distanceAtoB < distanceBtoA)
- {
- //node_bestA = pair_A_to_B.first.first;
- //node_bestB = pair_A_to_B.first.second;
- node_bestA = pair_A_to_B.second.first;
- node_bestB = pair_A_to_B.second.second;
-
- //std::cout << "Best Pair [A',B]: " << node_bestA->m_id << "," << node_bestB->m_id << std::endl;
-
- // 2.2.1 Check that there are no topological problems before adding the pair
- // Search all the nodes in the tree A linked to the found best node in B
- vec_nodes nodesA_linkedToBestB = map_B_to_A[node_bestB->m_id];
-
- // Look for topological problems
- bool topo_problem = false;
- for(vec_nodes::iterator it = nodesA_linkedToBestB.begin(); it != nodesA_linkedToBestB.end() && !topo_problem; ++it)
- {
- if( ! ( (*it)->HasNode( node_bestA ) || node_bestA->HasNode( (*it) ) ) )
- {
- topo_problem = true;
- //std::cout << "Topological problem adding node:" << node_bestA->m_id << std::endl;
- }
- }
-
- if(! topo_problem)
- {
- // 2.3 Add the pair and the distance to the final result.
- commonA.push_back(node_bestA);
- commonB.push_back(node_bestB);
- map_A_to_B[node_bestA->m_id].push_back(node_bestB);
- map_B_to_A[node_bestB->m_id].push_back(node_bestA);
-
- // Add the edge link
- pair_nodes pair_edgeA(this, node_bestA);
- pair_nodes pair_edgeB(nodeB, node_bestB);
- std::pair< pair_nodes, pair_nodes > pair_edge(pair_edgeA, pair_edgeB);
- vector_pair_edges.push_back(pair_edge);
-
-
- // 2.4 Mark the nodes
- node_bestA->Mark();
- node_bestB->Mark();
-
- // 2.5 Find and mark the omitted nodes in the similar branch. If the selected branch has more that 2 nodes it means that intermediary nodes do not have correspondence.
- Node* node_nextA = this->GetNextNodeInPathToNode(node_bestA);
- //bool markedA = node_nextA->MarkNodesUntilNode(node_bestA);
- //if(!markedA)
- // std::cout << "NodeA not found for marking [A]:" << node_bestA->m_id << std::endl;
-
- Node* node_nextB = nodeB->GetNextNodeInPathToNode(node_bestB);
- //bool markedB = node_nextB->MarkNodesUntilNode(node_bestB);
- //if(!markedB)
- // std::cout << "NodeB not found for marking [B]:" << node_bestB->m_id << std::endl;
-
- // 2.6 Run the process (First step) using the found pair of nodes.
- node_bestA->CompareSubTreesOrkiszMorales(node_bestB, Q, F, commonA, commonB, nonCommonA, nonCommonB, map_A_to_B, map_B_to_A, vector_pair_edges);
- }
- else
- {
- // 2.4 Mark the wrong node
- node_bestA->Mark();
- nonCommonA.push_back(node_bestA);
- }
- }
- else
- {
- //node_bestA = pair_B_to_A.first.second;
- //node_bestB = pair_B_to_A.first.first;
- node_bestA = pair_B_to_A.second.second;
- node_bestB = pair_B_to_A.second.first;
-
- //std::cout << "Best Pair [A,B']: " << node_bestA->m_id << "," << node_bestB->m_id << std::endl;
-
- // 2.29 Check that there are no topological problems before adding the pair
- // 2.291 Search all the nodes in the A tree linked to the found best node in B
- vec_nodes nodesB_linkedToBestA = map_A_to_B[node_bestA->m_id];
-
- // 2.292 Look for topological problems
- bool topo_problem = false;
- for(vec_nodes::iterator it = nodesB_linkedToBestA.begin(); it != nodesB_linkedToBestA.end() && !topo_problem; ++it)
- {
- if( ! ( (*it)->HasNode(node_bestB) || node_bestB->HasNode( (*it) ) ) )
- {
- topo_problem = true;
- //std::cout << "Topological problem adding node:" << node_bestB->m_id << std::endl;
- }
- }
-
- if(! topo_problem)
- {
- // 2.3 Add the pair and the distance to the final result.
- commonA.push_back(node_bestA);
- commonB.push_back(node_bestB);
- map_A_to_B[node_bestA->m_id].push_back(node_bestB);
- map_B_to_A[node_bestB->m_id].push_back(node_bestA);
-
- // Add the edge link
- pair_nodes pair_edgeA(this, node_bestA);
- pair_nodes pair_edgeB(nodeB, node_bestB);
- std::pair< pair_nodes, pair_nodes > pair_edge(pair_edgeA, pair_edgeB);
- vector_pair_edges.push_back(pair_edge);
-
- // 2.4 Mark the nodes
- node_bestA->Mark();
- node_bestB->Mark();
-
- // 2.5 Find and mark the omitted nodes in the similar branch. If the selected branch has more that 2 nodes it means that intermediary nodes do not have correspondence.
- Node* node_nextA = this->GetNextNodeInPathToNode(node_bestA);
- //bool markedA = node_nextA->MarkNodesUntilNode(node_bestA);
- //if(!markedA)
- // std::cout << "NodeA not found for marking [A]:" << node_bestA->m_id << std::endl;
-
- Node* node_nextB = nodeB->GetNextNodeInPathToNode(node_bestB);
- //bool markedB = node_nextB->MarkNodesUntilNode(node_bestB);
- //if(!markedB)
- // std::cout << "NodeB not found for marking [B]:" << node_bestB->m_id << std::endl;
-
- // 2.6 Run the process (First step) using the found pair of nodes.
- //node_bestB->CompareSubTreesOrkiszMorales(node_bestA, commonB, commonA, nonCommonB, nonCommonA, map_B_to_A, map_A_to_B, vector_pair_edges);
- node_bestA->CompareSubTreesOrkiszMorales(node_bestB, Q, F, commonA, commonB, nonCommonA, nonCommonB, map_A_to_B, map_B_to_A, vector_pair_edges);
- }
- else
- {
- // 2.4 Mark the wrong node
- node_bestB->Mark();
- nonCommonB.push_back(node_bestB);
- }
- }
-
- }
- //std::cout << "OUT Comparing [A,B]: " << this->m_id << "," << nodeB->m_id << std::endl;
- //std::cout << "---------------------------------------------------------" << std::endl;
-}
-
-std::pair< std::pair<Node*, Node*>, double> Node::GetBestBranches_ActualTranslatedOneLevelBranches_To_AllPossibleBranches(Node* nodeB)
-{
- // Variables
- double distance = -1;
- double distance_bestFinal = -1;
- Node* node_A_bestFinal = NULL;
- Node* node_B_bestFinal = NULL;
- bool first = true;
-
- // Get the translation vector for root ovelapping
- Vec3 vector_trans_A_to_B = nodeB->m_coords - this->m_coords;
-
- // Iterate over my children
- for(vec_nodes::iterator it_A = this->m_children.begin(); it_A != this->m_children.end(); ++it_A)
- {
- if( !(*it_A)->IsMarked() )
- {
- // Get the position of the actual child of this node
- Vec3 position_actual = (*it_A)->m_coords;
-
- // Translate the position
- Vec3 position_translated = position_actual + vector_trans_A_to_B;
-
- // Find the "closest" node in the subtree nodeB using a distance function
- // a. Distance to ending point
- //Node* bestNode_actual = nodeB->GetClosestRelativeToPoint(position_translated, distance);
- // b. Distance point to point
- Node* bestNode_actual = nodeB->GetClosestRelativeToBranch( (*it_A)->m_edge, vector_trans_A_to_B, distance);
-
- if(first)
- {
- first = false;
- node_A_bestFinal = (*it_A);
- node_B_bestFinal = bestNode_actual;
- distance_bestFinal = distance;
- }
- else if(distance < distance_bestFinal)
- {
- node_A_bestFinal = (*it_A);
- node_B_bestFinal = bestNode_actual;
- distance_bestFinal = distance;
- }
- }
- }
-
- if(first)
- std::cout << "GetBestTranslatedBranchFromOtherTree NOT FOUND!" << std::endl;
-
- pair_nodes pair_best(node_A_bestFinal, node_B_bestFinal);
- std::pair<pair_nodes,double> best_pair_score(pair_best, distance_bestFinal);
- return best_pair_score;
-}
-
-std::multimap< double, std::pair<Node*, Node*> > Node::CalculateDistanceToAllBranches_FatherAndFamily(Node* node_gradfather, unsigned int Q, unsigned int F)
-{
- // "this" is a grandfather node
- // Variables
- std::multimap< double, pair_nodes > map_dist_pairNodeNode;
- double distance_actual = -1;
-
- // Get the translation vector for root overlapping
- Vec3 vector_trans_A_to_B_grandfathers = node_gradfather->m_coords - this->m_coords;
-
- // Get all the possible "fathers" based on Q
- vec_nodes fathers;
- this->GetChildrenUptoDepth(Q, fathers);
- //fathers = this->m_children;
-
- // Iterate over my children which actually are fathers
-
- //vec_nodes::iterator it_father = this->m_children.begin();
- vec_nodes::iterator it_father = fathers.begin();
- //for( ; it_father != this->m_children.end(); ++it_father)
- for( ; it_father != fathers.end(); ++it_father)
- {
- if( ! (*it_father)->IsMarked() )
- {
-
- Node* node_actualBest = node_gradfather->GetClosestRelativeFatherAndFamily( this, (*it_father), F, vector_trans_A_to_B_grandfathers, distance_actual);
-
- pair_nodes pair_actual((*it_father), node_actualBest);
-
- std::pair<double,pair_nodes> actual_dist_pair(distance_actual,pair_actual);
- map_dist_pairNodeNode.insert(actual_dist_pair);
- }
- }
-
- return map_dist_pairNodeNode;
-}
-
-
-/*std::pair< std::pair<Node*, Node*>, double> Node::GetClosestBranch_FatherAndFamily(Node* node_gradfather)
-{
- // "this" is a grandfather node
- // Variables
- double distance_actual = -1;
- double distance_bestFinal = -1;
- Node* node_A_bestFinal = NULL;
- Node* node_B_bestFinal = NULL;
- bool first = true;
-
- // Get the translation vector for root overlapping
- Vec3 vector_trans_A_to_B_grandfathers = node_gradfather->m_coords - this->m_coords;
-
- // Iterate over my children which actually are fathers
- vec_nodes::iterator it_father = this->m_children.begin();
- for( ; it_father != this->m_children.end(); ++it_father)
- {
- if( !(*it_father)->IsMarked() )
- {
- // Get the position of the actual child of this node
- //Vec3 position_actualFather = (*it_father)->m_coords;
-
- // Find the "closest" node in the subtree nodeB using a distance function
- // a. Distance to ending point
- // Translate the position
- //Vec3 position_translated = position_actualFather + vector_trans_A_to_B_grandfathers;
- //Node* bestNode_actual = nodeB->GetClosestRelativeToPoint(position_translated, distance);
- // b. Distance point to point
- Node* node_actualBest = node_gradfather->GetClosestRelativeFatherAndFamily( (*it_father), vector_trans_A_to_B_grandfathers, distance_actual);
-
- if(first)
- {
- first = false;
- node_A_bestFinal = (*it_father);
- node_B_bestFinal = node_actualBest;
- distance_bestFinal = distance_actual;
- }
- else if(distance_actual < distance_bestFinal)
- {
- node_A_bestFinal = (*it_father);
- node_B_bestFinal = node_actualBest;
- distance_bestFinal = distance_actual;
- }
- }
- }
-
- if(first)
- std::cout << "GetBestTranslatedBranchFromOtherTree NOT FOUND!" << std::endl;
-
- pair_nodes pair_best(node_A_bestFinal, node_B_bestFinal);
- std::pair<pair_nodes,double> best_pair_score(pair_best, distance_bestFinal);
- return best_pair_score;
-}
-*/
-
-Node* Node::GetClosestRelativeToPoint(Vec3 position, double& distance)
-{
- if(this->IsLeaf())
- {
- distance = -1;
- return NULL;
- }
-
- distance = -1;
- bool first = true;
- double actualDistance = -1;
- Node* node_Best = NULL;
- Node* node_Actual = NULL;
-
- for(vec_nodes::const_iterator it = this->m_children.begin(); it != this->m_children.end(); ++it)
- {
- node_Actual = (*it)->GetClosestNodeToPoint(position, actualDistance);
-
- if(first)
- {
- first = false;
- node_Best = node_Actual;
- distance = actualDistance;
- }
- else if(actualDistance < distance)
- {
- node_Best = node_Actual;
- distance = actualDistance;
- }
- }
-
- if(first)
- std::cout << "GetClosestRelativeToPoint NOT FOUND!" << std::endl;
-
- if(!node_Best)
- std::cout << "GetClosestRelativeToPoint NULL!" << std::endl;
-
- return node_Best;
-}
-
-Node* Node::GetClosestRelativeToBranch(Edge* branch, Vec3 vector_translation, double& distance)
-{
- if(this->IsLeaf())
- {
- distance = -1;
- //std::cout << "GetClosestRelativeToBranch -- This node is a leaf" << std::endl;
- return NULL;
- }
-
- distance = -1;
- bool first = true;
- double actualDistance = -1;
- Node* node_Best = NULL;
- Node* node_Actual = NULL;
-
- for(vec_nodes::const_iterator it = this->m_children.begin(); it != this->m_children.end(); ++it)
- {
- node_Actual = (*it)->GetClosestBranchToTranslatedBranch(branch,vector_translation, actualDistance, NULL);
-
- if(first)
- {
- first = false;
- node_Best = node_Actual;
- distance = actualDistance;
- }
- else if(actualDistance < distance)
- {
- node_Best = node_Actual;
- distance = actualDistance;
- }
- }
-
- if(first)
- std::cout << "GetClosestRelativeToPoint NOT FOUND!" << std::endl;
-
- if(!node_Best)
- std::cout << "GetClosestRelativeToPoint NULL!" << std::endl;
-
- return node_Best;
-}
-
-Node* Node::GetClosestRelativeFatherAndFamily(Node* node_grandfather, Node* node_father, unsigned int F, Vec3 vector_translation, double& distance)
-{
- // "this" is a grandfather node
-
- distance = -1;
- if(this->IsLeaf())
- return NULL;
-
- bool first = true;
- double actualDistance = -1;
- Node* node_Best = NULL;
- Node* node_Actual = NULL;
-
- // Iterate over the children of this granfather which means
- // iterate over the fathers
- vec_nodes::const_iterator it_father = this->m_children.begin();
-
- for( ; it_father != this->m_children.end(); ++it_father)
- {
- node_Actual = (*it_father)->GetClosestFatherAndFamilyToTranslatedFatherAndFamily(node_grandfather, node_father, F, vector_translation, actualDistance, NULL);
-
- if(first)
- {
- first = false;
- node_Best = node_Actual;
- distance = actualDistance;
- }
- else if(actualDistance < distance)
- {
- node_Best = node_Actual;
- distance = actualDistance;
- }
- }
-
- if(first)
- std::cout << "GetClosestRelativeToPoint NOT FOUND!" << std::endl;
-
- if(!node_Best)
- std::cout << "GetClosestRelativeToPoint NULL!" << std::endl;
-
- return node_Best;
-}
-
-Node* Node::GetClosestBranchToTranslatedBranch(Edge* branch, Vec3 vector_translation, double& distance, Edge* edgeSuperior)
-{
- Node* node_best = this;
- Node* node_Actual = NULL;
- Edge* edge_composed = NULL;
-
- // Joint the superior edge with this edge
- edge_composed = this->ConcatenateEdgeToSuperiorEdge(edgeSuperior);
-
- distance = edge_composed->GetDistanceToTranslatedEdge(branch, vector_translation);
- distance += branch->GetDistanceToTranslatedEdge(edge_composed, -vector_translation);
- //distance = edge_composed->GetDistanceWeigthedToTranslatedEdge(branch, vector_translation);
- //distance += branch->GetDistanceWeigthedToTranslatedEdge(edge_composed, -vector_translation);
- //std::cout << "DW[thisId,toBranchTargetId,Dist]:[" << this->m_id << "," << branch->GetTarget()->GetId() << "," << distance << "]";
-
- // Lance the recursion and the the minumum distance and node
- double distance_actual = -1;
-
- // Check the children and get the best
- for(vec_nodes::iterator it = this->m_children.begin(); it != this->m_children.end(); ++it)
- {
- Edge* edge_forChild = new Edge(edge_composed);
- node_Actual = (*it)->GetClosestBranchToTranslatedBranch(branch, vector_translation, distance_actual, edge_forChild);
-
- if(distance_actual < distance)
- {
- node_best = node_Actual;
- distance = distance_actual;
- }
- delete(edge_forChild);
- }
-
- return node_best;
-}
-
-Node* Node::GetClosestFatherAndFamilyToTranslatedFatherAndFamily(Node* node_grandfather, Node* node_father, unsigned int F, Vec3 vector_translation, double& distance, Edge* edgeSuperior)
-{
- // "this" is a father node_father
- Node* node_best = this; // Best matching node is "this" in the beginnig.
- Node* node_Actual = NULL;
- Edge* edge_composed = NULL;
-
- // Joint the superior edge with this edge
- edge_composed = this->ConcatenateEdgeToSuperiorEdge(edgeSuperior);
-
- //distance = edge_composed->GetDistanceToTranslatedEdge(branch, vector_translation);
- //distance += branch->GetDistanceToTranslatedEdge(edge_composed, -vector_translation);
-
- //Edge* branch_father = node_father->m_edge;
- Edge* branch_father = node_father->GetEdgeToAncestor(node_grandfather, NULL);
- if( branch_father == NULL )
- std::cout << "No branch father" << std::endl;
-
-
- distance = edge_composed->GetDistanceWeigthedToTranslatedEdge(branch_father, vector_translation);
- distance += branch_father->GetDistanceWeigthedToTranslatedEdge(edge_composed, -vector_translation);
-
- // Find the family distance from the node_father family to this family
- double distance_family_A_to_B = 0;
- // Add the distances to the family, up to one generation by the moment
- Vec3 vector_translation_child_A_to_B = this->m_coords - node_father->m_coords; // Vector that align the fathers
-
- // Get the family up to depth F
- vec_nodes family;
- node_father->GetChildrenUptoDepth(F, family);
- //vec_nodes family = node_father->m_children;
-
- vec_nodes::iterator it_child_other = family.begin();
- for(; it_child_other != family.end(); ++it_child_other)
- {
- // Create the "child" edge
- Edge* childEdge = (*it_child_other)->GetEdgeToAncestor(node_father, NULL);
- //Edge* childEdge = (*it_child_other)->m_edge;
-
- double distance_child = 0;
- if(this->IsLeaf())
- {
- // The distance of the each point edge to the root point because the fathers are aligned
- distance_child = childEdge->GetDistanceToPoint(this->m_coords);
- }
- else
- {
- this->GetClosestRelativeToBranch(childEdge,vector_translation_child_A_to_B, distance_child);
- }
- distance_family_A_to_B += distance_child;
- }
-
- distance += distance_family_A_to_B;
-
- // Find the family distance from this family to node_father family
- double distance_family_B_to_A = 0;
-
- // Add the distances to the family, up to one generation by the moment
- Vec3 vector_translation_child_B_to_A = node_father->m_coords - this->m_coords; // Vector that align the fathers
-
- // Get the family up to depth F
- vec_nodes my_family;
- this->GetChildrenUptoDepth(F, my_family);
- //vec_nodes my_family = this->m_children;
-
- vec_nodes::iterator it_child_my = my_family.begin();
- for(; it_child_my != my_family.end(); ++it_child_my)
- {
- // Create the "child" edge
- Edge* my_childEdge = (*it_child_my)->GetEdgeToAncestor(this, NULL);
- //Edge* my_childEdge = (*it_child_my)->m_edge;
-
- double distance_child = 0;
- if(node_father->IsLeaf())
- {
- // The distance of the each point edge to the root point because the fathers are aligned
- distance_child = my_childEdge->GetDistanceToPoint(node_father->m_coords);
- }
- else
- {
- node_father->GetClosestRelativeToBranch(my_childEdge, vector_translation_child_B_to_A, distance_child);
- }
- distance_family_B_to_A += distance_child;
- }
-
- distance += distance_family_B_to_A;
-
- //std::cout << "DW[thisId,toBranchTargetId,Dist]:[" << this->m_id << "," << branch->GetTarget()->GetId() << "," << distance << "]";
-
- // Lance the recursion and the minimum distance and node_father
- double distance_actual = -1;
-
- // Check the children and get the best
- vec_nodes::iterator it = this->m_children.begin();
- for( ; it != this->m_children.end(); ++it)
- {
- Edge* edge_forChild = new Edge(edge_composed);
- node_Actual = (*it)->GetClosestFatherAndFamilyToTranslatedFatherAndFamily(node_grandfather, node_father, F, vector_translation, distance_actual, edge_forChild);
-
- if(distance_actual < distance)
- {
- node_best = node_Actual;
- distance = distance_actual;
- }
- delete(edge_forChild);
- }
-
- return node_best;
-}
-
-const Node* Node::GetClosestCommonAscendingNode() const
-{
- Node* node_closestCommonAscendingNode = NULL;
-
- if(this->m_edge)
- {
- if(this->m_edge->GetSource()->IsMarked() || this->m_edge->GetSource()->HasMarkedChildren())
- node_closestCommonAscendingNode = this->m_edge->GetSource();
- else
- return this->m_edge->GetSource()->GetClosestCommonAscendingNode();
- }
-
- return node_closestCommonAscendingNode;
-}
-
-bool Node::MarkNodesUntilNode(Node* nodeB)
-{
- this->Mark();
-
- if(this->m_id == nodeB->m_id)
- return true;
-
- bool found = false;
- bool actualFound = false;
- for(vec_nodes::const_iterator it = this->m_children.begin(); it != this->m_children.end(); ++it)
- {
- actualFound = (*it)->MarkNodesUntilNode(nodeB);
-
- if(actualFound)
- found = true;
- }
-
- return found;
-}
-
-Node* Node::GetNextNodeInPathToNode(Node* node_searched)
-{
- Node* nextNode = NULL;
- for(vec_nodes::const_iterator it = this->m_children.begin(); it != this->m_children.end() && !nextNode; ++it)
- {
- if( (*it)->HasNode(node_searched) )
- nextNode = (*it);
- }
-
- return nextNode;
-}
-
-void Node::GetPathToNode(Node* node_end, vec_nodes& vector_pathNodes)
-{
- if(!this->HasNode(node_end))
- return;
-
- vector_pathNodes.push_back(this);
- for(vec_nodes::const_iterator it = this->m_children.begin(); it != this->m_children.end(); ++it)
- (*it)->GetPathToNode(node_end, vector_pathNodes);
-}
-
-void Node::MarkPathFromNodeToNode(Node* node_begin, Node* node_end)
-{
- if(this->m_id == node_begin->m_id)
- {
- if(this->HasNode(node_end))
- this->MarkPathNodesToNode(node_end);
- }
- else
- for(vec_nodes::const_iterator it = this->m_children.begin(); it != this->m_children.end(); ++it)
- (*it)->MarkPathFromNodeToNode(node_begin, node_end);
-}
-
-void Node::MarkPathNodesToNode(Node* node_end)
-{
- if(this->HasNode(node_end))
- this->Mark();
-
- for(vec_nodes::const_iterator it = this->m_children.begin(); it != this->m_children.end(); ++it)
- (*it)->MarkPathNodesToNode(node_end);
-}
-
-Node* Node::GetDetachedRootCopy()
-{
- Node* node_copy = new Node(this);
-
- // Change properties for root node
- Node* root_detached = new Node();
- root_detached->m_coords = node_copy->m_edge->GetSource()->GetCoords();
- root_detached->m_edge = NULL;
- vec_nodes vector_new;
- vector_new.push_back(node_copy);
- root_detached->m_children = vector_new;
-
- // Change properties for the copy node
- node_copy->m_edge->SetSource(root_detached);
-
- return root_detached;
-}
-
-bool Node::CompareNodes(Node* nodeTreeB)
-{
- if (this == NULL && nodeTreeB == NULL)
- return true;
- else if (this == NULL || nodeTreeB == NULL)
- return false;
- vec_nodes::iterator it = this->m_children.begin();
- for (; it != this->m_children.end(); ++it)
- {
- if ((*it)->m_mark)
- continue;
- bool suc = false;
- vec_nodes::iterator it2 = nodeTreeB->m_children.begin();
- for (; it2 != nodeTreeB->m_children.end(); ++it2)
- suc = (*it)->CompareNodes(*it2);
- if (!suc)
- return false;
- } //for
- if (*this != *nodeTreeB)
- return false;
- this->m_mark = true;
- nodeTreeB->m_mark = true;
- return true;
-}
-
-Edge* Node::GetComposedEdge(unsigned int idNode)
-{
- // If this is the node, then a copy edge (to the parent) is returned
- if(this->m_id == idNode)
- {
- //std::cout << "This is the searched idNode: " << this->m_id << std::endl;
- Edge* nEdge = new Edge(this->m_edge);
- return nEdge;
- }
-
-
- Edge* composedEdge = NULL;
-
- for(std::vector<Node*>::iterator it = this->m_children.begin(); it != this->m_children.end(); ++it)
- {
- // If one of my children has the composed node, then my edge must be added
- // and the composed edge is returned
- Edge* childEdge = (*it)->GetComposedEdge(idNode);
- if(childEdge)
- {
- //std::cout << "My id: " << this->m_id << ", Looking for: " << idNode << std::endl;
- return AddChildEdgeInformation(childEdge);
- }
- }
-
- return composedEdge;
-}
-
-Edge* Node::AddChildEdgeInformation(Edge* nEdge)
-{
- // If this is the root then the edge to be compose is null, so the same edge must be returned
- if(this->m_edge == NULL)
- {
- //std::cout << "This is the root node" << std::endl;
- return nEdge;
- }
-
- // New information vector
- vec_pair_posVox_rad vector_newInformation;
- vec_pair_posVox_rad actualEdgeInformation = this->m_edge->GetEdgeInfo();
- vec_pair_posVox_rad composedInformation = nEdge->GetEdgeInfo();
-
- // Check that last and initial information, from this and the other edge respectively, are equal.
- if(actualEdgeInformation[actualEdgeInformation.size()-1].first != composedInformation[0].first)
- {
-
- std::cout << "actualEdgeInformation[0;end]: [" << actualEdgeInformation[0].first << ";" << actualEdgeInformation[actualEdgeInformation.size()-1].first << "], Points: " << actualEdgeInformation.size() << std::endl;
- std::cout << "ActualEdge[source;target]: [" << this->m_edge->GetSource()->GetCoords() << "];[" << this->m_edge->GetTarget()->GetCoords() << "]" << std::endl;
- std::cout << "-- -- -- " << std::endl;
- std::cout << "composedInformation[0;end]: [" << composedInformation[0].first << ";" << composedInformation[composedInformation.size()-1].first << "], Points: " << composedInformation.size() << std::endl;
- std::cout << "AddChildEdge[source;target]: [" << nEdge->GetSource()->GetCoords() << "];[" << nEdge->GetTarget()->GetCoords() << "]" << std::endl;
- std::cout << "End and initial information are not equal! : " << actualEdgeInformation[actualEdgeInformation.size()-1].first << " , " << composedInformation[0].first << std::endl;
-
-
- std::cout << "Print composed edge information" << std::endl;
- std::cout << "Composed [source, target] " << nEdge->GetSource()->GetCoords() << "];[" << nEdge->GetTarget()->GetCoords() << "]" << std::endl;
- std::cout << "Composed information using iterator:" << std::endl;
-
- for(vec_pair_posVox_rad::const_iterator it_composed = nEdge->GetEdgeInfo().begin(); it_composed != nEdge->GetEdgeInfo().end(); ++it_composed)
- std::cout << "[" << (*it_composed).first << "], ";
- }
-
- // Change the source
- nEdge->SetSource(this->m_edge->GetSource());
-
- // Change properties
- nEdge->SetLength(nEdge->GetLength()+this->m_edge->GetLength());
- nEdge->SetEDistance(nEdge->GetEDistance()+this->m_edge->GetEDistance());
-
- // Create the new information vector and calculate the new radii attributes
- for(vec_pair_posVox_rad::iterator it_actual = actualEdgeInformation.begin(); it_actual != actualEdgeInformation.end(); ++it_actual)
- vector_newInformation.push_back((*it_actual));
-
- bool connectionVoxel = true;
- for(vec_pair_posVox_rad::iterator it_composed = composedInformation.begin(); it_composed != composedInformation.end(); ++it_composed)
- {
- if(connectionVoxel)
- connectionVoxel = false;
- else
- vector_newInformation.push_back((*it_composed));
- }
-
- // Set the new information
- nEdge->SetSkeletonPairVector(vector_newInformation);
-
- return nEdge;
-}
-
-Edge* Node::GetEdgeToAncestor(Node* node_ancestor, Edge* edge)
-{
- Edge* edge_composed = NULL;
-
- // Compose the edge
- if(edge == NULL)
- edge_composed = new Edge(this->m_edge);
- else
- edge_composed = edge->ConcatenateToSuperior(new Edge(this->m_edge));
-
- // Check if the father is the ancestor
- if(this->m_edge->GetSource()->GetId() == node_ancestor->GetId())
- return edge_composed;
-
- return this->m_edge->GetSource()->GetEdgeToAncestor(node_ancestor, edge_composed);
-}
-
-Edge* Node::ConcatenateEdgeToSuperiorEdge(Edge* superiorEdge)
-{
- if(superiorEdge == NULL)
- return new Edge(this->m_edge);
-
- // Check concatenation condition in the nodes
- if(superiorEdge->GetTarget()->GetCoords() != this->m_edge->GetSource()->GetCoords())
- {
- std::cout << "Node::ConcatenateEdgeToSuperiorEdge - superiorEdge.target != actualEdge.source. Actual idNode:" << this->m_id << std::endl;
- std::cout << "[superiorEdge.target;actualEdge.source]: [" << superiorEdge->GetTarget()->GetCoords() << ";" << this->m_edge->GetSource()->GetCoords() << "]" << std::endl;
- return NULL;
- }
-
- // Check concatenation condition in the edge information
- vec_pair_posVox_rad vectorInfo_thisEdge = this->m_edge->GetEdgeInfo(); // Actual edge information
- vec_pair_posVox_rad vectorInfo_superiorEdge = superiorEdge->GetEdgeInfo(); // Superior edge information
-
- // Check that last superior edge position is equal to first initial actual edge position
- if(vectorInfo_superiorEdge[vectorInfo_superiorEdge.size()-1].first != vectorInfo_thisEdge[0].first)
- {
- std::cout << "Node::ConcatenateEdgeToSuperiorEdge - superiorEdge.info[end] != actualEdge.info[begin]. Actual idNode:" << this->m_id << std::endl;
- return NULL;
- }
-
- // Change the superior edge target, the superior length, and the euclidian distance
- superiorEdge->SetTarget(this->m_edge->GetTarget());
- superiorEdge->SetLength(superiorEdge->GetLength()+this->m_edge->GetLength()-1);
- superiorEdge->SetEDistance(superiorEdge->GetEDistance()+this->m_edge->GetEDistance());
-
- // Add the position information
- vec_pair_posVox_rad::iterator it_actualInfo = vectorInfo_thisEdge.begin();
- ++it_actualInfo; // Skip the first position because is it shared between both edges
- for(; it_actualInfo != vectorInfo_thisEdge.end(); ++it_actualInfo)
- vectorInfo_superiorEdge.push_back((*it_actualInfo));
-
- // Set the new information
- superiorEdge->SetSkeletonPairVector(vectorInfo_superiorEdge);
-
- return superiorEdge;
-}
-
-bool Node::FindSimilarEdgeByAccumulation(Node* nodeB, Node* nodeBAcc)
-{
- bool firstTime = false;
- if (nodeBAcc == NULL)
- {
- nodeBAcc = new Node();
- nodeBAcc->m_edge = new Edge();
- firstTime = true;
- } //if
- nodeBAcc->m_coords = nodeB->m_coords;
- nodeBAcc->m_level = this->m_level;
- Edge* edgeBAcc = nodeBAcc->m_edge;
- Edge* edgeB = nodeB->m_edge;
- edgeBAcc->m_angle = edgeB->m_angle;
- edgeBAcc->m_eDistance = edgeB->m_eDistance;
- if (!firstTime)
- {
- edgeBAcc->m_length += edgeB->m_length;
- //edgeBAcc->m_aRadius = (edgeB->m_aRadius + edgeBAcc->m_aRadius) / 2.0;
- edgeBAcc->m_maxRadius = edgeB->m_maxRadius > edgeBAcc->m_maxRadius ? edgeB->m_maxRadius : edgeBAcc->m_maxRadius;
- edgeBAcc->m_minRadius = edgeB->m_minRadius < edgeBAcc->m_minRadius ? edgeB->m_minRadius : edgeBAcc->m_minRadius;
- } //fi
- else
- {
- edgeBAcc->m_length = edgeB->m_length;
- edgeBAcc->m_aRadius = edgeB->m_aRadius;
- edgeBAcc->m_maxRadius = edgeB->m_maxRadius;
- edgeBAcc->m_minRadius = edgeB->m_minRadius;
- } //else
-
- if (*this == *nodeBAcc)
- return true;
- Node* aux = NULL;
- bool suc = false;
- vec_nodes::iterator it = nodeB->m_children.begin();
- for (; it != nodeB->m_children.end(); ++it)
- {
- aux = *it;
- if (this->FindSimilarEdgeByAccumulation(aux, nodeBAcc))
- {
- suc = true;
- break;
- } //if
- } //for
- if (suc)
- {
- nodeB = aux;
- return true;
- }//if
- return false;
-}
-
-bool Node::FindMarked(Node* result)
-{
- vec_nodes::iterator it = this->m_children.begin();
- for (; it != this->m_children.end(); ++it)
- if ((*it)->m_mark)
- {
- result = *it;
- return true;
- } //if
- else if ((*it)->FindMarked(result))
- return true;
- result = NULL;
- return false;
-}
-
-bool Node::MarkPath(Node* nodeB)
-{
- if (this == NULL || nodeB == NULL)
- return false;
- //comparing addresses
- if (this == nodeB)
- {
- nodeB->m_mark = true;
- return true;
- } //if
- vec_nodes::iterator it = this->m_children.begin();
- for (; it != this->m_children.end(); ++it)
- if ((*it)->MarkPath(nodeB))
- {
- (*it)->m_mark = true;
- return true;
- } //if
- return false;
-
-}
-
-unsigned int Node::GetCost(Node* nodeB)
-{
- if (this == NULL || nodeB == NULL)
- return 0;
- unsigned int maxCost = 0;
- if (*this == *nodeB)
- {
- vec_nodes::iterator it = this->m_children.begin();
- for (; it != this->m_children.end(); ++it)
- {
- vec_nodes::iterator it2 = nodeB->m_children.begin();
- for (; it2 != nodeB->m_children.end(); ++it2)
- {
- unsigned int currentCost = (*it)->GetCost(*it2);
- if (currentCost > maxCost)
- maxCost = currentCost;
- } //for
- } //for
- maxCost += 1;
- } //if
- return maxCost;
-}
-
-
-//Setters and Modifiers
-
-void Node::SetId(unsigned int nM_id)
-{
- m_id = nM_id;
-}
-
-
-void Node::AddChild(Node* node)
-{
- this->m_children.push_back(node);
-}
-
-void Node::SetChildren(std::vector<Node*>& children)
-{
- this->m_children = children;
-}
-
-void Node::SetFather(Node* nFather)
-{
- father = nFather;
-}
-
-void Node::SetEdge(Edge* edge)
-{
- this->m_edge = edge;
-}
-
-void Node::SetCoords(const Vec3& coords)
-{
- this->m_coords = coords;
-}
-
-void Node::SetLevel(const int& level)
-{
- this->m_level = level;
-}
-
-bool Node::DeleteNodeById(unsigned int nId)
-{
- if(this->IsLeaf())
- return false;
-
- bool deleted = false;
-
- vec_nodes::iterator it = this->m_children.begin();
- while(it != this->m_children.end() && !deleted)
- {
- if((*it)->m_id == nId)
- {
- it = m_children.erase(it);
- deleted = true;
- }
- else
- ++it;
- }
-
- if(!deleted)
- {
- for(vec_nodes::const_iterator it = this->m_children.begin(); it != this->m_children.end() && !deleted; ++it)
- {
- deleted = (*it)->DeleteNodeById(nId);
- }
- }
-
- return deleted;
-}
-
-void Node::MergeNodes(Node* nodeB)
-{
- if (nodeB == NULL)
- return;
- this->m_coords = nodeB->m_coords;
- Edge* edgeA = this->m_edge;
- Edge* edgeB = nodeB->m_edge;
- edgeA->m_angle = edgeB->m_angle;
- edgeA->m_eDistance = edgeB->m_eDistance;
- edgeA->m_length += edgeB->m_length;
- edgeA->m_aRadius = (edgeB->m_aRadius + edgeA->m_aRadius) / 2.0;
- edgeA->m_maxRadius = edgeB->m_maxRadius > edgeA->m_maxRadius ? edgeB->m_maxRadius : edgeA->m_maxRadius;
- edgeA->m_minRadius = edgeB->m_minRadius < edgeA->m_minRadius ? edgeB->m_minRadius : edgeA->m_minRadius;
- edgeA->m_vec_pair_posVox_rad.insert(edgeA->m_vec_pair_posVox_rad.end(), edgeB->m_vec_pair_posVox_rad.begin(), edgeB->m_vec_pair_posVox_rad.end());
-}
-
-void Node::Mark()
-{
- this->m_mark = true;
-}
-
-void Node::UnMark()
-{
- this->m_mark = false;
-}
-
-void Node::UpdateLevels(unsigned int level)
-{
- this->m_level = level;
- level++;
- vec_nodes::iterator it = this->m_children.begin();
- for (; it != this->m_children.end(); ++it)
- (*it)->UpdateLevels(level);
-}
-
-void Node::printUpToLevel(int level)
-{
- // Print myself
- cout << "level" << level << " " << m_coords << " || " << endl;
- if(level == 1)
- return;
-
- // Print my children
- for (vec_nodes::iterator it = this->m_children.begin(); it != this->m_children.end(); ++it)
- {
- (*it)->printUpToLevel(level-1);
- }
-}
-
-void Node::printNodeAndChildrenIds( )
-{
- std::cout << "------------------------------------------" << std::endl;
- std::cout << "Id: " << this->m_id << std::endl;
-
- // Print children
- for(vec_nodes::const_iterator it = this->m_children.begin(); it != this->m_children.end(); ++it)
- std::cout << (*it)->m_id << ";";
-
- // Recursion
- for(vec_nodes::const_iterator it = this->m_children.begin(); it != this->m_children.end(); ++it)
- (*it)->printNodeAndChildrenIds( );
-}
-
-void Node::printChildrenIds( )
-{
- std::cout << "------------------------------------------" << std::endl;
- std::cout << "Id: " << this->m_id << std::endl;
-
- // Print children
- for(vec_nodes::const_iterator it = this->m_children.begin(); it != this->m_children.end(); ++it)
- std::cout << (*it)->m_id << ";";
-}
-
-void Node::createQuaternionsUpToLevel(int level, int requiredLevel)
-{
- //cout << "Level:" << requiredLevel-level <<endl;
-
- if(level >= 2 && this->HasMinimumLevels(2))
- {
- // 1. Take the vector to each son (SP - The vector that points from the son to the parent [P-S]).
- // 2. For each son take each vector from son to grandson (SG - the vector that points from the son to the grandson [G-S])
- // 3. For each combination SP-SG calculate the quaternion
- for(vec_nodes::iterator it = this->m_children.begin(); it != this->m_children.end(); ++it)
- {
- // Create vector from son to parent (SP = [P - S])
- Vec3 sp(this->m_coords - (*it)->m_coords);
-
- // Get the mean radius for the parent-son branch
- double radMeanSP=(*it)->m_edge->GetARadius();
-
- // Get distance son to parent
- double distSonParent = (*it)->m_edge->GetEDistance();
-
- // Get the vectors from son to each grandson (SG = [G - S] )
- for(vec_nodes::iterator itps = (*it)->m_children.begin(); itps != (*it)->m_children.end(); ++itps)
- {
- // Build the sg vector and get the quaternion
- Vec3 sg((*itps)->m_coords - (*it)->m_coords);
- Quaternion q(sp, sg);
-
- // Get distance son to grandson
- double distSonGrandson = (*itps)->m_edge->GetEDistance();
-
- // Get the mean radius for the son-grandson branch
- double radMeanSG=(*itps)->m_edge->GetARadius();
-
- //cout << "Vectors:" << ps << sg <<endl;
- //cout << "Q:" << q << ", Distance=" << (*itps)->m_edge->GetEDistance() << endl << endl;
- // Printing
- // Level | PositionSon | SPvector | SGvector | Quaternion | distanceSonParent | distanceSonGrandSon | meanRadiusSP | meanRadiusSG
- cout << requiredLevel-level << " " << (*it)->m_coords << " " << sp << " " << sg << " " << q << " " << distSonParent << " " << distSonGrandson << " " << radMeanSP << " " << radMeanSG << endl;
- }
- }
-
- for(vec_nodes::iterator it = this->m_children.begin(); it != this->m_children.end(); ++it)
- {
- (*it)->createQuaternionsUpToLevel(level-1, requiredLevel);
- }
- }
-}
-
-std::pair<double, std::pair<Node*, Node*> > Node::GetPairWithClosestDistance_FirstNodeNonMarked(std::multimap<double, pair_nodes> map_dist_pairNodes)
-{
- // Variables
- bool pairFound = false;
- std::pair<Node*, Node*> pairNodes_null (NULL, NULL);
- std::pair<double, std::pair<Node*, Node*> > pair_closest_dist_pairNodes (-1, pairNodes_null);
-
- std::multimap<double, pair_nodes>::iterator it = map_dist_pairNodes.begin();
-
- for( ; it != map_dist_pairNodes.end() && !pairFound; ++it)
- {
- if( ! (*it).second.first->IsMarked() )
- {
- pair_closest_dist_pairNodes.first=(*it).first;
- pair_closest_dist_pairNodes.second=(*it).second;
- pairFound = true;
- }
- }
-
- return pair_closest_dist_pairNodes;
-}
-
-void Node::getStasticsBifurcations(int* p)
-{
- int numBif = this->m_children.size();
- if(numBif>0 && numBif<=6)
- p[numBif-1]=p[numBif-1]+1;
-
- for(vec_nodes::iterator it = this->m_children.begin(); it != this->m_children.end(); ++it)
- {
- (*it)->getStasticsBifurcations(p);
- }
-}
-
-//Operator Overloads
-
-Node &Node::operator=(Node & node)
-{
- this->m_children = node.m_children;
- this->m_edge = node.m_edge;
- this->m_coords = node.m_coords;
- this->m_level = node.m_level;
- this->m_mark = node.m_mark;
- return *this;
-}
-
-const Node&Node::operator=(const Node& node)
-{
- this->m_children = node.m_children;
- this->m_edge = node.m_edge;
- this->m_coords = node.m_coords;
- this->m_level = node.m_level;
- this->m_mark = node.m_mark;
- return *this;
-}
-
-bool Node::operator ==(const Node& node)
-{
- bool comp = false;
- if (this->m_edge == NULL && this->m_edge != NULL)
- return false;
- else if (this->m_edge != NULL && this->m_edge == NULL)
- return false;
- else if (this->m_edge == NULL && this->m_edge == NULL)
- comp = true;
- else
- comp = ((*this->m_edge) == (*node.m_edge));
- bool ret = (/*(this->m_coords == node.m_coords)
- && (this->m_children.size() == node.m_children.size())
- && */(this->m_level == node.m_level) && comp);
- return ret;
-}
-
-bool Node::operator !=(const Node& node)
-{
- bool comp = false;
- if (this->m_edge == NULL && this->m_edge != NULL)
- return false;
- else if (this->m_edge != NULL && this->m_edge == NULL)
- return false;
- else if (this->m_edge == NULL && this->m_edge == NULL)
- comp = true;
- else
- comp = ((*this->m_edge) == (*node.m_edge));
- return (/*(this->m_coords != node.m_coords)
- && (this->m_children.size() != node.m_children.size())
- && */(this->m_level != node.m_level) && !comp);
-}
-
-bool Node::operator <(const Node& node)
-{
- bool comp = false;
- if (this->m_edge == NULL && this->m_edge != NULL)
- return false;
- else if (this->m_edge != NULL && this->m_edge == NULL)
- return false;
- else if (this->m_edge == NULL && this->m_edge == NULL)
- comp = false;
- else
- comp = ((*this->m_edge) < (*node.m_edge));
- return comp;
-}
-
-bool Node::operator >(const Node& node)
-{
- bool comp = false;
- if (this->m_edge == NULL && this->m_edge != NULL)
- return false;
- else if (this->m_edge != NULL && this->m_edge == NULL)
- return false;
- else if (this->m_edge == NULL && this->m_edge == NULL)
- comp = false;
- else
- comp = ((*this->m_edge) > (*node.m_edge));
- return comp;
-}
-
-} /* namespace airways */
+++ /dev/null
-/*
- * airwaysNode.h
- *
- * Created on: May 12, 2014
- * Author: caceres
- *
- * Modified by: Alfredo Morales Pinzón
- */
-
-#ifndef AIRWAYSNODE_H_
-#define AIRWAYSNODE_H_
-
-#include <vector>
-#include <map>
-
-#include "../MathLib/vec3.h"
-#include "airwaysEdge.h"
-#include "Quaternion.h"
-#include <Airways/AirwaysLib/TempAirwaysAppli_AirwaysLib_Export.h>
-
-// Namespaces
-using namespace std;
-
-namespace airways
-{
-
-class AirwaysTree;
-class Edge;
-
-/*
- * This class represents a node in a tree.
- */
-class TempAirwaysAppli_AirwaysLib_EXPORT Node
-{
-
-public:
-
- // Pair of nodes
- typedef std::pair<Node*, Node*> pair_nodes;
-
- // Vector of nodes
- typedef std::vector<Node*> vec_nodes;
-
- // Map to link an id node to a list of nodes
- typedef std::map< unsigned int, vec_nodes > map_id_vecnodes;
-
- /*!
- * This is the default constructor
- */
- Node();
-
- /*!
- * This is the alternative constructor
- * @param coord
- */
- Node(const Vec3& coord);
-
- /*!
- * This is the alternative constructor (copy)
- * @param node
- */
- Node(Node* node);
-
- /*!
- * This is the destructor
- */
- virtual ~Node();
-
- //Getters
-
- /*!
- * This method returns the vector of the node children (const)
- * @return
- */
- const std::vector<Node*>& GetChildren() const;
-
- /**
- * Method that returns the node id
- * @return the id of the node
- */
- const unsigned int GetId() const;
-
- /*!
- * This method returns the spatial position of a node
- * @return
- */
- const Vec3& GetCoords() const;
-
- /*
- * Method that returns the edge between the current node and its parent
- * @return the edge
- */
- Edge* GetEdge() const;
-
- /*
- * Method that returns the father
- * @return the father
- */
- Node* GetFather() const;
-
- /*
- * This method returns the level of the node
- * @return the level of the node
- */
- unsigned int GetLevel() const;
-
- /**
- * Method that returns the depth of the node whose id is given by parameter
- * @pre the node exist in the sub-tree
- * @param idNode is the search node id
- * @return the depth of the node up to the actual node
- */
- int GetDepthById(unsigned int idNode) const;
-
- /**
- * Method that returns the weight of the tree
- * @return the weight of the tree which is the number of nodes in the tree.
- */
- unsigned int GetWeight() const;
-
- /**
- * Method that returns the height of the tree
- * @return the height of the tree
- */
- unsigned int GetHeight() const;
-
- /*!
- * This method returns the size of the children vector
- * @return the number of children
- */
- unsigned int GetNumberOfChildren() const;
-
- /**
- * Method that returns the number of children non-marked
- * @param depth is the depth up to which the non-marked child are taken into account
- * @return the number of children non-marked
- */
- unsigned int GetNumberOfNonMarkedChildren( unsigned int depth ) const;
-
- /**
- * Method that returns the number of leafs in the node and its children
- * @return the number of leafs in the in the node and its children
- */
- unsigned int GetNumberOfLeafs( ) const;
-
- /**
- * This method returns the node that has the requested id
- * @param nId is the requested id
- * @return is the node that has the requested id, NULL if the node is not found.
- */
- Node* GetNodeById(unsigned int nId);
-
- /**
- * Method that returns the closest node to the givel voxel
- * The closes node is the one whose path (skeleton) to the father has the closest point to the given point.
- * @param voxel_x x componente of the voxel
- * @param voxel_y y componente of the voxel
- * @param voxel_z z componente of the voxel
- * @param distance return the distance to the closest node
- * @return the closest node to the given voxel
- */
- Node* GetClosestBranchNodeToPoint(float point_x, float point_y, float point_z, float &distance);
-
- /**
- * Method that returns the closest node to the position given by parameter
- * @param position is the position to be compares with
- * @param distance is the minimum distance found
- * return the closest node to the position given by parameter
- */
- Node* GetClosestNodeToPoint(Vec3 position, double& distance);
-
- /**
- * Method that return the closest distance of the node skeleton
- * @param voxel_x x componente of the voxel
- * @param voxel_y y componente of the voxel
- * @param voxel_z z componente of the voxel
- * @return the closest distance of the node skeleton
- */
- float GetBranchDistanceToPoint(int voxel_x, int voxel_y, int voxel_z);
-
- /**
- * Method that returns if the tree has a minimum of levels
- * @return true if the tree has the minimum of levels, false otherwise
- */
- bool HasMinimumLevels(int levels);
-
-
- /*!
- * This method returns true if the node is a leaf
- * @return
- */
- bool IsLeaf() const;
-
- /*!
- * This method returns true if the node is marked
- * @return
- */
- bool IsMarked() const;
-
- /**
- * Method that tells if a node has marked children
- * @return true if the node has marked children, false otherwise
- */
- bool HasMarkedChildren() const;
-
- /**
- * Method that returns if a node is in the descending set of nodes
- * @return true is the given node is in the descending set of nodes, false otherwise
- */
- bool HasNode(Node* node_searched) const;
-
- /**
- * Method that return if a node is in the tree
- * @param id_node_searched id of the searched node
- * @return true is the node is in the tree, false otherwise
- */
- bool HasNodeId(unsigned int id_node_searched) const;
-
- /**
- * Method that returns if a voxel is influenced by a node, i.e. if the distance
- * to the closest voxel of the edge is smaller than the radius on the closest voxel.
- * @param x,y,z are the voxel positions in coordinates x, y, and z respectively.
- * @return true is the voxel is influenced, false otherwise.
- */
- bool IsPointInfluencedByNode(float point_x, float point_y, float point_z) const;
-
- /**
- * Method that returns the list of nodes that influence the given point
- * @param point_x, point_y, point_z are the position of the point in real coordinates x, y, and z respectively.
- * @param vec_nodes_influence vector to save the nodes
- */
- void GetBrancheNodesInfluencingPoint(float point_x, float point_y, float point_z, vec_nodes& vec_nodes_influence);
-
- /**
- * Method that adds to a vector all the children with a maximum depth Q from actual node.
- * If Q = 0, no nodes are added.
- * @param Q the depth to find the children
- * @param fathers vector to return the children
- */
- void GetChildrenUptoDepth(unsigned int Q, vec_nodes& fathers);
-
- /**
- * This method compares the subtrees that start in this node and one given by parameter.
- * @param nodeB is the stating node of the subtree to be compared with
- * @param Q is the depth to select "fathers" nodes
- * @param F is the depth to select "family" nodes
- * @param commonA vector to save the common nodes for this subtree
- * @param commonA vector to save the common nodes for the subtree given by parameter
- * @param nonCommonA vector to save the non-common nodes for this subtree
- * @param nonCommonB vector to save the non-common nodes for the subtree given by parameter
- */
- void CompareSubTreesOrkiszMorales(Node* nodeB, unsigned int Q, unsigned int F, vec_nodes& commonA, vec_nodes& commonB, vec_nodes& nonCommonA, vec_nodes& nonCommonB, map_id_vecnodes& map_A_to_B, map_id_vecnodes& map_B_to_A, std::vector< std::pair< pair_nodes, pair_nodes > >& vector_pair_edges);
-
- /**
- * Method that returns the pair of branches (one node for each tree) that has the minimum distance after root overlapping.
- * Valid branches for the actual node are the one level branches those the branches up to this child (height = 2).
- * Root overlapping means the translation of branch so that root overlap.
- * @pre: The actual branch is not marked.
- * @param nodeB is the subtree root node to be compared with
- * @return the pair of branches (one node for each tree) that has the minimum distance after root overlapping
- */
- std::pair< std::pair<Node*, Node*>, double> GetBestBranches_ActualTranslatedOneLevelBranches_To_AllPossibleBranches(Node* nodeB);
-
- /**
- * Method that returns all the distances to all the non-marked branches, i.e., the end node of the branch is non-marked,
- * inside a multimap (key, value) structure where the value elementent corresponds to the compared branches.
- * @param node_gradfather is the grandfather node to be compared
- * @param Q is the depth to select "fathers"
- * @param F is the depth to select "family" nodes
- * @return multimap where the key is the distance between branches and the value is the pair of compared branches end-nodes.
- */
- std::multimap< double, std::pair<Node*, Node*> > CalculateDistanceToAllBranches_FatherAndFamily(Node* node_gradfather, unsigned int Q, unsigned int F);
-
- /**
- * Method is executed by grandfather nodes. It returns the closest pair of nodes,
- * one must be my child and the other one of the relatives given node.
- * The closest pair is the one that has the minimal distance between the children and the families.
- * The distance is the sum of fathers distances and family distances.
- * @param nodeB is the node to be compared with
- * @return the closest pair of nodes, one must be my child and the other on of the relatives given node.
- */
- //std::pair< std::pair<Node*, Node*>, double> GetClosestBranch_FatherAndFamily(Node* nodeB);
-
- /**
- * Method that returns the closest relative node, all the nodes but this, whose position is the closest to the point given by parameter
- * @param position is the point to be compared with
- * @param distance is the minimum distance found in the relatives
- * @return the closest relative node, all the nodes but this, whose position is the closest to the point given by parameter
- */
- Node* GetClosestRelativeToPoint(Vec3 position, double& distance);
-
-
- Node* GetClosestRelativeToBranch(Edge* branch, Vec3 vector_translation, double& distance);
-
- /**
- * Method that returns the closest node to the given by node.
- * Closest involve the distance between fathers and family.
- * @param node_grandfather is the father of the "node_father" which can be different from the direct father.
- * this is the case when the father distance is the algorithm, given by Q, is greater than 1.
- * @param node_father is the node to be compared with
- * @param F is the depth to select "family" nodes
- * @param vector_translation is the translation vector to translate the "father" branch
- * @param distance is the distance to be returned by parameter
- * @return the closest node to the given by node.
- */
- Node* GetClosestRelativeFatherAndFamily(Node* node_grandfather, Node* node_father, unsigned int F, Vec3 vector_translation, double& distance);
-
- Node* GetClosestBranchToTranslatedBranch(Edge* branch, Vec3 vector_translation, double& distance, Edge* edgeSuperior);
-
- /**
- * This method returns the closest father and family, in this subtree, that is the closest to the subtree given by parameter
- * The returned node represents the father.
- * @param node_grandfather is the father of the "node_father" which can be different from the direct father.
- * this is the case when the father distance is the algorithm, given by Q, is greater than 1.
- * @param node_father is the node father to be compared with
- * @param F is the depth to select "family" nodes
- * @param vector_translation is the translation vector to translation the father given by parameter
- * @param distance is the closest distances to be returned by parameter
- * @param edgeSuperior is a superior edge where the actual edge must be attached
- * @returns the closest father and family, in this subtree, that is the closest to the subtree given by parameter
- */
- Node* GetClosestFatherAndFamilyToTranslatedFatherAndFamily(Node* node_grandfather, Node* node_father, unsigned int F, Vec3 vector_translation, double& distance, Edge* edgeSuperior);
-
- /**
- * Method that return the closest ascending node that is marked as common.
- * A common node may common if:
- * (1) it is marked or (2) one of their descendants is marked
- * return the closest ascending common node. NULL is there is no such node.
- */
- const Node* GetClosestCommonAscendingNode() const;
-
- /**
- * Method that marks all nodes between this node and the one given by parameter. If the searched node is not found then all nodes are marked.
- * @param nodeB is the searched node
- * @return true is the node was found, false otherwise
- */
- bool MarkNodesUntilNode(Node* nodeB);
-
- Node* GetNextNodeInPathToNode(Node* node_searched);
-
- /**
- * Method that returns the path from the actual node to the searched node
- * @param node_end is the searched node
- * @param vector_pathNodes vector_pathNodesis the vector to return the path
- */
- void GetPathToNode(Node* node_end, vec_nodes& vector_pathNodes);
-
- void MarkPathFromNodeToNode(Node* node_begin, Node* node_end);
-
- void MarkPathNodesToNode(Node* node_end);
-
- /**
- * Method that returns a root with a copy of this node as single child
- * @return a root with a copy of this node as single child
- */
- Node* GetDetachedRootCopy();
-
- /*!
- * This method return true if two nodes are equals
- * @param nodeTreeB
- * @return
- */
- bool CompareNodes(Node* nodeTreeB);
-
- /**
- * Method that returns a new composed edge from this node to the searched node.
- * @param idNode is the searched id node
- * @return the edge to the searched node. Null if the node is not found.
- */
- Edge* GetComposedEdge(unsigned int idNode);
-
- /**
- * Method that composes the actual edge with the edge given by parameter
- * @param nEdge edge to be composed with
- * @return final composed edge
- */
- Edge* AddChildEdgeInformation(Edge* nEdge);
-
- /**
- * Method that returns a "composed edge" up to the ancestor
- * @pre the ancesto node must be a real ancestor
- * @param node_ancestor is the ancestor node to with the edge must be composed
- * @param edge is the actual composed edge. NULL if the fist iteration
- * @return the composed edge up to the ancesto node
- */
- Edge* GetEdgeToAncestor(Node* node_ancestor, Edge* edge);
-
- /**
- * Method that concatenates the actual edge to a superior edge given by parameter.
- * As the given edge is superior then the actual edge must be concatenate at the end of the superior edge,
- * this means that superiorEdge.target must equal to the actualEdge.source.
- * @param superiorEdge is the superior edge where the actual edge must be added
- * @return - a copy of the actual edge if the superior edge is NULL
- * - if superiorEdge.target == actualEdge.source the the superior edge with the actual edge concatenated
- * - NULL otherwise (superiorEdge.target != actualEdge.source)
- */
- Edge* ConcatenateEdgeToSuperiorEdge(Edge* superiorEdge);
-
- /*!
- * This method returns true if the accumulation of a set of nodes are equals
- * (in tolerance) to the compared node (this). This method tries to find
- * edges in the case of edge losses.
- * When this method returns true, NodeB pointer is replaced to the node (target)
- * found by accumulation (See the report to understand what this means).
- * @param nodeB - Current node to compare
- * @param nodeBAcc - Accumulator Node (Optional)
- * @return
- */
- bool FindSimilarEdgeByAccumulation(Node* nodeB, Node* nodeBAcc = NULL);
-
- /*!
- * This method returns true if there is a marked node along the hierarchy
- * @param result
- * @return
- */
- bool FindMarked(Node* result);
-
- /*!
- * This method marks the path between two nodes and returns true if a path
- * has found.
- * @param nodeB
- * @return
- */
- bool MarkPath(Node* nodeB);
-
- /*!
- * This method returns the cost between two nodes.
- * @param nodeB
- * @return
- */
- unsigned int GetCost(Node* nodeB);
-
- //Setters and Modifiers
-
- /*
- * Method that sets the id of the node
- * @param nM_id is the new id
- */
- void SetId(unsigned int nM_id);
-
- /*!
- * This method adds a node in the children vector
- * @param node is the node to be added
- */
- void AddChild(Node* node);
-
- /*!
- * This method sets the children vector
- * @param children
- */
- void SetChildren(std::vector<Node*>& children);
-
- /**
- * Method that sets the father
- * @param nFather is the father
- */
- void SetFather(Node* nFather);
-
- /*!
- * This method sets an edge between the current node and its parent
- * @param edge
- */
- void SetEdge(Edge* edge);
-
- /*!
- * This method sets the coordinates of the node
- * @param coords
- */
- void SetCoords(const Vec3& coords);
-
- /**
- * Method that sets the level of the node
- * @param level is the level of the node
- */
- void SetLevel(const int& level);
-
- /**
- * Method that deleted a node and all his children, from the tree
- * @return true if the node was deleted (found), false otherwise
- */
- bool DeleteNodeById(unsigned int nId);
-
- /*!
- * This method merges the nodeB into this
- * @param nodeB
- */
- void MergeNodes(Node* nodeB);
-
- /*!
- * This method marks a node
- */
- void Mark();
-
- /*!
- * This method unmarks a node
- */
- void UnMark();
-
- /*!
- * This method update all levels along the hierarchy
- * @param level
- */
- void UpdateLevels(unsigned int level = 0);
-
-
- /**
- * Method that prints the tree up to a given level
- * @param level where the print must finish
- */
- void printUpToLevel(int level);
-
- void printNodeAndChildrenIds( );
-
- void printChildrenIds( );
-
- /**
- * Method that creates the quaternions of the airways up the maxLevel
- * @param level is the level where the extraction must end
- * @param requiredLevel is the required level until the extraction must be done
- * @pre level >= 2
- */
- void createQuaternionsUpToLevel(int level, int requiredLevel);
-
- /**
- * Method that returns the closest pair node, based on their distance, having the first node of the pair as non-marked.
- * The pair is found on the given a multimap of distances and pair of nodes. It is supposed that the multimap sorts
- * the elements by its key. In this case the key corresponds to the distance.
- * @param map_dist_pairNodes is the map containing the distances (keys) and the pair of nodes (value)
- * @return the closest pair nodes, based on their distance, given a multimap of distances and pair of nodes. If
- * no pair was found with the pair node nonmaked, a null pair is returned.
- * Actually the method returns the pair and its distances in a pair <distance, pair>
- */
- std::pair<double, std::pair<Node*, Node*> > GetPairWithClosestDistance_FirstNodeNonMarked(std::multimap<double, pair_nodes> map_dist_pairNodes);
-
- /**
- * Add the statistics of number of bifurcations in the tree to the array given by parameter
- * @param p array to save the statistics
- */
- void getStasticsBifurcations(int* p);
-
- //Operator Overloads
-
- Node& operator=(Node& node);
-
- const Node& operator=(const Node& node);
-
- bool operator ==(const Node& node);
-
- bool operator !=(const Node& node);
-
- bool operator <(const Node& node);
-
- bool operator >(const Node& node);
-
-protected:
-
- /**
- * Node id
- */
- unsigned int m_id;
-
- /**
- * Children nodes vector
- */
- vec_nodes m_children;
-
- /**
- * Father node
- */
- Node* father;
-
- /**
- * Edge between the current node and its parent.
- * The source of the edge corresponds to the parent en the target to the child,
- * in this case to "this" node.
- */
- Edge* m_edge;
-
- /**
- * Spatial 3D position of the node in real coordinates of the image
- */
- Vec3 m_coords;
-
- /**
- * Node level
- */
- int m_level;
-
- /**
- * Node mark
- */
- bool m_mark;
-};
-
-} /* namespace airways */
-
-#endif /* AIRWAYSNODE_H_ */
+++ /dev/null
-/*
- * airwaysTree.txx
- *
- * Created on: May 3, 2014
- * Author: caceres@creatis.insa-lyon.fr
- * Modifications by: Alfredo Morales Pinzón
- */
-
-#ifndef _AIRWAYS_TREE_TXX_
-#define _AIRWAYS_TREE_TXX_
-
-#include "airwaysTree.h"
-
-namespace airways
-{
-
-AirwaysTree::AirwaysTree() : m_root(NULL)
-{
-
-}
-
-//Ceron
-AirwaysTree::AirwaysTree(TInputImage::Pointer img, TInputImage::Pointer img_skele, Node* root, bool shouldUpdate){
- this->m_root = root;
- this->m_root->SetLevel(0);
- this->m_img = img;
- this->m_skeleton = img_skele;
- //TODO: Should this calculate levels and populate edges and nodes vectors?
- FillTree(root);
- if(shouldUpdate) this->UpdateEdges();
-}
-
-void AirwaysTree::FillTree(Node* node){
- //std::cout << "Calls fill tree for " << node->GetCoords() << std::endl;
- this->m_nodes.push_back(node);
- node->SetId(this->m_nodes.size());
- if(node->GetEdge() != NULL){
- this->m_edges.push_back(node->GetEdge());
- node->GetEdge()->UpdateEdgeInfo();
- }
- int level = node->GetLevel();
- //std::cout << "Node is at level " << level << std::endl;
- vec_nodes::const_iterator it = node->GetChildren().begin();
- for (; it != node->GetChildren().end(); ++it){
- (*it)->SetLevel(level+1);
- this->FillTree(*it);
- }
-}
-
-AirwaysTree::AirwaysTree(TInputImage::Pointer img, TInputImage::Pointer img_sk, Node* root)
-{
- this->m_root = root;
- this->m_root->SetLevel(0);
- this->m_skeleton = img_sk;
- this->m_img = img;
- this->UpdateEdges();
-}
-
-AirwaysTree::AirwaysTree(TInputImage::Pointer image_airwaySegmentation, TInputImage::Pointer image_skeletonDM, EdgeVector& vector_edges, Edge* edge_trachea)
-{
- std::cout << "AirwaysTree::AirwaysTree(TInputImage::Pointer img, TInputImage::Pointer img_sk, EdgeVector& tEdgeVector, Edge* trachea)" << std::endl;
- std::cout << "Edges to add:" << vector_edges.size() << std::endl;
-
- if(edge_trachea == NULL)
- std::cout << "The trachea edge is NULL" << std::endl;
-
- // Set the attribtes
- this->m_skeleton = image_skeletonDM;
- this->m_img = image_airwaySegmentation;
- this->m_root = edge_trachea->m_source;
- this->m_root->SetLevel(0);
-
- this->m_nodes.push_back(edge_trachea->m_source); // Add the first node, the root to the nodes of the tree
- edge_trachea->m_source->SetId(this->m_nodes.size());// Set the root id
-
- // Insert the trachea edge
- this->Insert(edge_trachea);
-
- // Insert all edges
- unsigned int iniSize = vector_edges.size();
-
- while (!vector_edges.empty())
- {
- bool oneEdgeAdded = false;
- EdgeVector::iterator it = vector_edges.begin();
- while (it != vector_edges.end())
- {
- if (this->Insert(*it))
- {
- std::cout << "Edges added: [" << (*it)->GetSource()->GetCoords() << "]->[" << (*it)->GetTarget()->GetCoords() << "], missing: " << vector_edges.size()-1 << std::endl;
- oneEdgeAdded = true;
- it = vector_edges.erase(it);
- }
- else
- ++it;
- } //while
-
- // If there are edges to be added but they could not be added
- if(!oneEdgeAdded)
- {
- std::cout << "Edges not added:" << vector_edges.size() << std::endl;
- for (EdgeVector::iterator it = vector_edges.begin(); it != vector_edges.end(); ++it)
- std::cout << "Edge missing: [" << (*it)->GetSource()->GetCoords() << "]->[" << (*it)->GetTarget()->GetCoords() << "]" << std::endl;
- break;
- }
- // AMP: I did not find any explanation for this "exception"
- /*count++;
- if (count == iniSize)
- {
- std::cout << "handled exception: arwaysTree.txx, AirwaysTree" << std::endl;
- break;
- } //if
- */
- } //while
- this->UpdateEdges();
-
- std::cout << "AirwaysTree::AirwaysTree(TInputImage::Pointer img, TInputImage::Pointer img_sk, EdgeVector& tEdgeVector, Edge* trachea) ... OK" << std::endl;
-}
-
-AirwaysTree::~AirwaysTree()
-{
-
-}
-
-Node* AirwaysTree::GetRoot() const
-{
- return this->m_root;
-}
-
-std::string AirwaysTree::GetImageName() const
-{
- return (this->m_img_name);
-}
-
-std::string AirwaysTree::GetResultPath() const
-{
- return (this->m_result_path);
-}
-
-TInputImage::Pointer AirwaysTree::GetSegmentedImage() const
-{
- return this->m_img;
-}
-
-TInputImage::Pointer AirwaysTree::GetSkeletonImage() const
-{
- return this->m_skeleton;
-}
-
-const Node* AirwaysTree::GetNode(const Vec3 nodeCoords) const
-{
- return this->GetNode(nodeCoords);
-}
-
-Node* AirwaysTree::GetNodeById(unsigned int nId)
-{
- return this->m_root->GetNodeById(nId);
-}
-
-int AirwaysTree::GetDepthById(unsigned int nId)
-{
- return this->m_root->GetDepthById(nId);
-}
-
-unsigned int AirwaysTree::CountMarkedNodes(Node* current) const
-{
- if (current == NULL)
- current = this->m_root;
- Node* aux = NULL;
- bool found = current->FindMarked(aux);
- if (!found && !current->IsMarked())
- return 0;
- if (aux != NULL && found)
- current = aux;
- unsigned int count = 1;
- vec_nodes::const_iterator it = current->GetChildren().begin();
- for (; it != current->GetChildren().end(); ++it)
- count += this->CountMarkedNodes(*it);
- return count;
-}
-
-unsigned int AirwaysTree::GetWeight( ) const
-{
- if (this->m_root == NULL)
- return 0;
-
- return this->m_root->GetWeight();
-}
-
-unsigned int AirwaysTree::GetHeight(Node* current) const
-{
- if (current == NULL)
- current = this->m_root;
- if (current->IsLeaf())
- return 1;
- unsigned int max = 0;
- vec_nodes::const_iterator it = current->GetChildren().begin();
- for (; it != current->GetChildren().end(); ++it)
- {
- unsigned int cMax = this->GetHeight(*it);
- if (cMax > max)
- max = cMax;
- } //rof
- if (current == this->m_root)
- return max;
- return ++max;
-}
-
-unsigned int AirwaysTree::GetLevels(Node* current, unsigned int cLevel) const
-{
- if (current == NULL)
- current = this->m_root;
- if (current->IsLeaf())
- return current->GetLevel();
- unsigned int maxLevel = cLevel;
- vec_nodes::const_iterator it = current->GetChildren().begin();
- for (; it != current->GetChildren().end(); ++it)
- {
- unsigned int level = this->GetLevels(*it, maxLevel);
- if (level > maxLevel)
- maxLevel = level;
- } //rof
- return maxLevel;
-}
-
-unsigned int AirwaysTree::GetNumberOfLeafs( ) const
-{
- if(!this->m_root)
- return 0;
-
- return this->m_root->GetNumberOfLeafs( );
-}
-
-const EdgeVector& AirwaysTree::GetEdges() const
-{
- return this->m_edges;
-}
-
-const vec_nodes& AirwaysTree::GetNodes() const
-{
- return this->m_nodes;
-}
-
-const Node* AirwaysTree::GetClosestBrachNodeToIndex(float point_x, float point_y, float point_z) const
-{
- float distance = 0;
- Node* closestNode = this->m_root->GetClosestBranchNodeToPoint(point_x, point_y, point_z, distance);
- return closestNode;
-}
-
-void AirwaysTree::GetBrancheNodesInfluencingPoint(float point_x, float point_y, float point_z, vec_nodes& vec_nodes_influence)
-{
- if(this->m_root)
- {
- std::cout << "AirwaysTree::GetBrancheNodesInfluencingPoint" << std::endl;
- this->m_root->GetBrancheNodesInfluencingPoint(point_x, point_y, point_z, vec_nodes_influence);
- }
-}
-
-AirwaysTree& AirwaysTree::GetTreeFromMarkedNodes(Node* currentNode, AirwaysTree* tree)
-{
- if (tree == NULL)
- {
- if (!this->m_root->IsMarked())
- return *(new AirwaysTree());
- currentNode = this->m_root;
- tree = new AirwaysTree();
- Node* current = new Node(currentNode->GetCoords());
- tree->SetRoot(current);
- vec_nodes::const_iterator it = currentNode->GetChildren().begin();
- for (; it != currentNode->GetChildren().end(); ++it)
- this->GetTreeFromMarkedNodes(*it, tree);
- this->ImageReconstruction(tree->m_img);
- //this->ImageReconstruction(tree->m_skeleton);
- return *tree;
- } //fi
- if (currentNode->IsMarked())
- {
- Edge* edge = new Edge();
- *edge = *currentNode->GetEdge();
- Node* target = new Node(currentNode->GetCoords());
- edge->m_target = target;
- tree->Insert(edge);
- vec_nodes::const_iterator it = currentNode->GetChildren().begin();
- for (; it != currentNode->GetChildren().end(); ++it)
- this->GetTreeFromMarkedNodes(*it, tree);
- } //fi
- return *(new AirwaysTree());
-}
-
-AirwaysTree& AirwaysTree::GetSubTreeFromNode(Node* node, AirwaysTree* tree)
-{
- if (tree == NULL)
- {
- tree = new AirwaysTree();
- Node* current = new Node(node->GetCoords());
- tree->SetRoot(current);
- vec_nodes::const_iterator it = node->GetChildren().begin();
- for (; it != node->GetChildren().end(); ++it)
- this->GetSubTreeFromNode(*it, tree);
- this->ImageReconstructionFromNode(tree->m_img, node);
- //this->ImageReconstructionFromNode(tree->m_skeleton, node, true);
- return *tree;
- } //fi
- Edge* edge = new Edge();
- *edge = *node->GetEdge();
- Node* target = new Node(node->GetCoords());
- edge->m_target = target;
- tree->Insert(edge);
- vec_nodes::const_iterator it = node->GetChildren().begin();
- for (; it != node->GetChildren().end(); ++it)
- this->GetSubTreeFromNode(*it, tree);
-
- return *(new AirwaysTree());
-}
-
-AirwaysTree& AirwaysTree::GetSubTreeByLevels(const int& level, Node* node,
- AirwaysTree* tree)
-{
- if (tree == NULL)
- {
- node = this->m_root;
- tree = new AirwaysTree();
- Node* current = new Node(node->GetCoords());
- tree->SetRoot(current);
- if (node->GetLevel() <= level)
- {
- node->Mark();
- vec_nodes::const_iterator it = node->GetChildren().begin();
- for (; it != node->GetChildren().end(); ++it)
- this->GetSubTreeByLevels(level, *it, tree);
- } //fi
- if (node->GetLevel() == level)
- {
- DuplicatorType::Pointer duplicator = DuplicatorType::New();
- duplicator->SetInputImage(this->m_img);
- duplicator->Update();
- tree->m_img = duplicator->GetOutput();
- duplicator->SetInputImage(this->m_skeleton);
- duplicator->Update();
- tree->m_skeleton = duplicator->GetOutput();
- } //if
- else
- {
- this->ImageReconstruction(tree->m_img);
- //this->ImageReconstruction(tree->m_skeleton, true);
- } //else
- this->UnMarkAll();
- return *tree;
- } //fi
- if (node->GetLevel() <= level)
- {
- node->Mark();
- Edge* edge = new Edge();
- *edge = *node->GetEdge();
- Node* target = new Node(node->GetCoords());
- edge->m_target = target;
- tree->Insert(edge);
- vec_nodes::const_iterator it = node->GetChildren().begin();
- for (; it != node->GetChildren().end(); ++it)
- this->GetSubTreeByLevels(level, *it, tree);
- if (node->GetChildren().size() == 1)
- {
- Node* child = *(node->GetChildren().begin());
- node->MergeNodes(child);
- const Edge* edge = (child)->GetEdge();
- //removing from nodeVector and edgeVector
- EdgeVector::iterator it2 = this->m_edges.begin();
- for (; it2 != this->m_edges.end(); ++it2)
- if (edge == *it2)
- {
- this->m_edges.erase(it2);
- break;
- } //if
- vec_nodes::iterator it3 = this->m_nodes.begin();
- for (; it3 != this->m_nodes.end(); ++it3)
- if (child == *it3)
- {
- this->m_nodes.erase(it3);
- break;
- } //if
- } //if
- } //if
- return *(new AirwaysTree());
-}
-
-AirwaysTree& AirwaysTree::GetSubTreeByLength(const double& length, Node* node,
- AirwaysTree* tree, double cLenght)
-{
- if (tree == NULL)
- {
- node = this->m_root;
- tree = new AirwaysTree();
- Node* current = new Node(node->GetCoords());
- tree->SetRoot(current);
- node->Mark();
- vec_nodes::const_iterator it = node->GetChildren().begin();
- for (; it != node->GetChildren().end(); ++it)
- this->GetSubTreeByLength(length, *it, tree);
- this->ImageReconstruction(tree->m_img);
- //this->ImageReconstruction(tree->m_skeleton, true);
- this->UnMarkAll();
- return *tree;
- } //fi
- cLenght += node->GetEdge()->m_length;
- if (cLenght <= length)
- {
- node->Mark();
- Edge* edge = new Edge();
- *edge = *node->GetEdge();
- Node* target = new Node(node->GetCoords());
- edge->m_target = target;
- tree->Insert(edge);
- vec_nodes::const_iterator it = node->GetChildren().begin();
- for (; it != node->GetChildren().end(); ++it)
- this->GetSubTreeByLength(length, *it, tree, cLenght);
- if (node->GetChildren().size() == 1)
- {
- Node* child = *(node->GetChildren().begin());
- node->MergeNodes(child);
- const Edge* edge = (child)->GetEdge();
- //removing from nodeVector and edgeVector
- EdgeVector::iterator it2 = this->m_edges.begin();
- for (; it2 != this->m_edges.end(); ++it2)
- if (edge == *it2)
- {
- this->m_edges.erase(it2);
- break;
- } //if
- vec_nodes::iterator it3 = this->m_nodes.begin();
- for (; it3 != this->m_nodes.end(); ++it3)
- if (child == *it3)
- {
- this->m_nodes.erase(it3);
- break;
- } //if
- } //if
- } //if
- return *(new AirwaysTree());
-}
-
-AirwaysTree& AirwaysTree::GetSubTreeByRadius(const double& radius, Node* node,
- AirwaysTree* tree, double cRadius)
-{
- if (tree == NULL)
- {
- node = this->m_root;
- tree = new AirwaysTree();
- Node* current = new Node(node->GetCoords());
- tree->SetRoot(current);
- node->Mark();
- vec_nodes::const_iterator it = node->GetChildren().begin();
- for (; it != node->GetChildren().end(); ++it)
- this->GetSubTreeByRadius(radius, *it, tree);
- this->ImageReconstruction(tree->m_img);
- //this->ImageReconstruction(tree->m_skeleton, true);
- this->UnMarkAll();
- return *tree;
- } //fi
- cRadius += node->GetEdge()->m_aRadius;
- if (cRadius >= radius)
- {
- node->Mark();
- Edge* edge = new Edge();
- *edge = *node->GetEdge();
- Node* target = new Node(node->GetCoords());
- edge->m_target = target;
- tree->Insert(edge);
- vec_nodes::const_iterator it = node->GetChildren().begin();
- for (; it != node->GetChildren().end(); ++it)
- this->GetSubTreeByRadius(radius, *it, tree, cRadius);
- if (node->GetChildren().size() == 1)
- {
- Node* child = *(node->GetChildren().begin());
- node->MergeNodes(child);
- const Edge* edge = (child)->GetEdge();
- //removing from nodeVector and edgeVector
- EdgeVector::iterator it2 = this->m_edges.begin();
- for (; it2 != this->m_edges.end(); ++it2)
- if (edge == *it2)
- {
- this->m_edges.erase(it2);
- break;
- } //if
- vec_nodes::iterator it3 = this->m_nodes.begin();
- for (; it3 != this->m_nodes.end(); ++it3)
- if (child == *it3)
- {
- this->m_nodes.erase(it3);
- break;
- } //if
- } //if
- } //if
- return *(new AirwaysTree());
-}
-
-void AirwaysTree::MarkLevels(const int& level, Node* currentNode)
-{
- if (currentNode == NULL)
- currentNode = this->m_root;
- if (currentNode->GetLevel() <= level)
- {
- currentNode->Mark();
- vec_nodes::const_iterator it = currentNode->GetChildren().begin();
- for (; it != currentNode->GetChildren().end(); it++)
- this->MarkLevels(level, *it);
- } //if
-}
-
-bool AirwaysTree::IsEmpty() const
-{
- return this->m_root == NULL;
-}
-
-bool AirwaysTree::IsNodeInsidePath(unsigned int idNode_starting, unsigned int idNode_ending, unsigned int idNode_searched)
-{
- // Check if the starting point exist
- Node* node_starting = this->m_root->GetNodeById(idNode_starting);
- if(!node_starting)
- return false;
-
- // Check if the searched node exist in the subtree of the starting node
- Node* node_searched = node_starting->GetNodeById(idNode_searched);
- if(!node_searched)
- return false;
-
- // Check if the ending node exist in the subtree of the searched node
- if(!node_searched->HasNodeId(idNode_ending))
- return false;
-
- // If all conditions were true then the node is in the path
- return true;
-}
-
-void AirwaysTree::SetRoot(Node* root)
-{
- this->m_root = root;
- this->m_root->SetLevel(0);
- this->m_nodes.push_back(this->m_root);
-}
-
-void AirwaysTree::SetImageName(const std::string& img_name)
-{
- this->m_img_name = img_name;
-}
-
-void AirwaysTree::SetResultPath(const std::string& folderPath)
-{
- this->m_result_path = folderPath;
-}
-
-bool AirwaysTree::Insert(Edge* edge)
-{
- if (this->m_root == NULL)
- return false;
- // Search if the source or target coordinates exist in the tree
- Node* source = this->GetNode(edge->m_source->GetCoords());
- Node* target = this->GetNode(edge->m_target->GetCoords());
-
- // If the source and the target coordinates do not exist then the
- // edge can not be added, also if both exist in the tree.
- if ( ( source == NULL && target == NULL ) || ( source != NULL && target != NULL) )
- return false;
- else if (source == NULL && target != NULL) // If target was found
- {
- // Change the direction of the edge
- edge->m_target = edge->m_source;
- edge->m_source = target;
- }
- else
- edge->m_source = source;
-
- // Set the target and source nodes for the Edge
- edge->m_target->SetEdge(edge);
- edge->m_target->SetLevel(edge->m_source->GetLevel() + 1);
- edge->m_source->AddChild(edge->m_target);
-
-
- // Add the new child node
- this->m_nodes.push_back(edge->m_target);
- this->m_edges.push_back(edge);
-
- // Set the id node
- edge->m_target->SetId(this->m_nodes.size());
- return true;
-}
-
-void AirwaysTree::UnMarkAll(Node* currentNode)
-{
- if (currentNode == NULL)
- currentNode = this->m_root;
- currentNode->UnMark();
-
- vec_nodes::const_iterator it = currentNode->GetChildren().begin();
- for (; it != currentNode->GetChildren().end(); ++it)
- this->UnMarkAll(*it);
-}
-
-void AirwaysTree::UpdateLevels(unsigned int levels)
-{
- this->m_root->UpdateLevels(levels);
-}
-
-void AirwaysTree::CompareTreesOrkiszMorales(AirwaysTree& treeB, unsigned int Q, unsigned int F, vec_nodes& commonA, vec_nodes& commonB, vec_nodes& nonCommonA, vec_nodes& nonCommonB, std::map< unsigned int, std::vector<Node*> >& map_A_to_B, std::map< unsigned int, std::vector<Node*> >& map_B_to_A, std::vector< std::pair< std::pair<Node*, Node*>, std::pair<Node*, Node*> > >& vector_pair_edges_A_to_B)
-{
- // Algorithm
- // The algorithm is recursive it is implemented the node class. The idea is to overlap the initial nodes of the subtrees
- // and find the best branch correspondence for the first level of the trees.
- // Hypothesis: It is supposed that the roots of the trees are common, so the algorithm does not run in the root nodes
- // 1. Translate one of the subtree so that the initial nodes overlap.
- // 2. While one of the trees has non-marked child
- // 2.1 Compare each child to all the branches is the other tree.
- // 2.2 Select the pair, child and branch in the other tree, that has the lowest distance function.
- // 2.3 Add the pair and the distance to the final result.
- // 2.4 Mark the nodes
- // 2.5 Find and mark the omitted nodes in the similar branch. If the selected branch has more that 2 nodes it means that intemediary nodes do not have correpondece.
- // 2.6 Run the process (First step) using the found pair of nodes.
-
- if( !this->IsEmpty() && !treeB.IsEmpty() )
- {
-
- // ----------------------------
- // ---- Pre-Matching steps ----
-
- // Get the root nodes
- Node* root_A = this->m_root;
- Node* root_B = treeB.m_root;
-
- // Mark the roots
- root_A->Mark();
- root_B->Mark();
-
- // Add the root match
- map_A_to_B[root_A->GetId()].push_back(root_B);
- map_B_to_A[root_B->GetId()].push_back(root_A);
-
- // Add the root nodes match
- pair_nodes pair_edgeA(root_A, root_A);
- pair_nodes pair_edgeB(root_B, root_B);
- std::pair< pair_nodes, pair_nodes > pairRoorNodes_edge(pair_edgeA, pair_edgeB);
- vector_pair_edges_A_to_B.push_back(pairRoorNodes_edge);
-
- // ----------------------------
- // ----- Run the comparison----
-
- root_A->CompareSubTreesOrkiszMorales(root_B, Q, F, commonA, commonB, nonCommonA, nonCommonB, map_A_to_B, map_B_to_A, vector_pair_edges_A_to_B);
-
- }
- else
- std::cout << "Trees are empties." << std::endl;
-}
-
-void AirwaysTree::MarkPathFromNodeToNode(Node* node_begin, Node* node_end)
-{
- if(this->m_root)
- this->m_root->MarkPathFromNodeToNode(node_begin, node_end);
-}
-
-void AirwaysTree::CompareTrees(AirwaysTree& treeB)
-{
- // Compare all the "branches" (paths) in treeA with all branches in treeB
- Vector_Pair_PairNodes_Score vectorPairNodesScore = this->CompareAllBranches(treeB);
-
- std::cout << "Vector pairs size:" << vectorPairNodesScore.size() << std::endl;
-
- // Algorithm to find the comment branches (paths)
- // Until one of the trees is empty
- // 1. Find the pair, with at least one leaf in the pair, with the lowest score
- // 2. Compare the score of the father node of the leaf, or one of the leafs, with the correspondent pair leaf
- // If the score is lower that the score of the actual pair
- // - The compared leaf is not common. Mark the compared leaf, delete the compared leave and save the leaf as not common.
- // If the score is greater
- // - The leafs are common then mark both leafs as commons. Mark both leaves, delete them and save them as common leafs.
-
- // Variables
- //AirwaysTree* tree_copyA = this->GetCopy();
- //AirwaysTree* tree_copyB = treeB.GetCopy();
-
- //NodeVector nonCommonNodes_A;
- //NodeVector commonNodes_A;
- //NodeVector nonCommonNodes_B;
- //NodeVector commonNodes_B;
-
- std::map<unsigned int, Node*> nonCommonNodes_A;
- std::map<unsigned int, Node*> commonNodes_A;
- std::map<unsigned int, Node*> nonCommonNodes_B;
- std::map<unsigned int, Node*> commonNodes_B;
-
- // Until one of the trees is not empty
- while( this->GetWeight() > 1 && treeB.GetWeight() > 1 )
- {
- // Print the weight of the trees
- std::cout << "Weight [A,B]: [" << this->GetWeight() << "," << treeB.GetWeight() << "]" << std::endl;
- std::cout << "Leafs [A,B]: [" << this->GetNumberOfLeafs() << "," << treeB.GetNumberOfLeafs() << "]" << std::endl;
- std::cout << "Vector pairs size:" << vectorPairNodesScore.size() << std::endl;
-
-
- // 1. Find the pair, with at least one leaf in the pair, with the lowest score
- Pair_PairNodes_Score pair_nonMarked = this->GetBestLeaf(vectorPairNodesScore);
- Node* node_actualA = pair_nonMarked.first.first;
- Node* node_actualB = pair_nonMarked.first.second;
- double score_actual = pair_nonMarked.second;
-
- // 2. Take the leaf (L) and his father (F), the other node is called (O). Compare the score of the father node (F) with the correspondent pair leaf (O).
- if(node_actualA->IsLeaf())
- {
- //const Edge* edgeActual = node_actualA->GetEdge();
- //Node* targetActual = edgeActual->GetTarget();
- //const unsigned int id_father = targetActual->GetId();
- //double score_fatherA_to_B = this->GetPairNodes_Score(vectorPairNodesScore, 0, node_actualB->GetId());
- double score_fatherA_to_B = this->GetPairNodes_Score(vectorPairNodesScore, node_actualA->GetEdge()->GetTarget()->GetId(), node_actualB->GetId());
- //double score_fatherA_to_B = pair_fatherA_to_B.second;
- // If the score is lower than the score of the actual pair
- if(score_fatherA_to_B < score_actual)
- {
- //- The compared leaf is not common. Mark the compared leaf, delete the compared leave and save the leaf as not common.
- node_actualA->Mark();
- std::map<unsigned int, Node*>::iterator it;
- it=nonCommonNodes_A.find(node_actualA->GetId());
- if(it==nonCommonNodes_A.end())
- nonCommonNodes_A[node_actualA->GetId()] = node_actualA;
- //nonCommonNodes_A.push_back(node_actualA);
- }
- // If the score is greater
- else
- {
- // - The leafs are common then mark both leafs as commons. Mark both leaves, delete them and save them as common leafs.
- node_actualA->Mark();
- node_actualB->Mark();
-
- std::map<unsigned int, Node*>::iterator it;
- it=commonNodes_B.find(node_actualB->GetId());
- if(it==commonNodes_B.end())
- commonNodes_B[node_actualB->GetId()] = node_actualB;
-
- it=commonNodes_A.find(node_actualA->GetId());
- if(it==commonNodes_A.end())
- {
- std::cout << "CommonNode A:" << node_actualA->GetId() << std::endl;
- commonNodes_A[node_actualA->GetId()] = node_actualA;
- }
-
- //commonNodes_B.push_back(node_actualB);
- //commonNodes_A.push_back(node_actualA);
- }
- this->DeleteNodeById(node_actualA->GetId());
- this->DeleteEntriesByIdNode(vectorPairNodesScore, 0, node_actualA->GetId());
- }
- else
- {
- double score_fatherB_to_A = this->GetPairNodes_Score(vectorPairNodesScore, node_actualA->GetId(), node_actualB->GetEdge()->GetTarget()->GetId());
- //double score_fatherB_to_A = pair_fatherB_to_A.second;
- // If the score is lower that the score of the actual pair
- if(score_fatherB_to_A < score_actual)
- {
- //- The compared leaf is not common. Mark the compared leaf, delete the compared leave and save the leaf as not common.
- node_actualB->Mark();
- std::map<unsigned int, Node*>::iterator it;
- it=nonCommonNodes_B.find(node_actualB->GetId());
- if(it==nonCommonNodes_B.end())
- nonCommonNodes_B[node_actualB->GetId()] = node_actualB;
- //nonCommonNodes_B.push_back(node_actualB);
- }
- // If the score is greater
- else
- {
- // - The leafs are common then mark both leafs as commons. Mark both leaves, delete them and save them as common leafs.
- node_actualA->Mark();
- node_actualB->Mark();
- //commonNodes_B.push_back(node_actualB);
- //commonNodes_A.push_back(node_actualA);
-
- std::map<unsigned int, Node*>::iterator it;
- it=commonNodes_B.find(node_actualB->GetId());
- if(it==commonNodes_B.end())
- commonNodes_B[node_actualB->GetId()] = node_actualB;
-
- it=commonNodes_A.find(node_actualA->GetId());
- if(it==commonNodes_A.end())
- commonNodes_A[node_actualA->GetId()] = node_actualA;
- }
- treeB.DeleteNodeById(node_actualB->GetId());
- this->DeleteEntriesByIdNode(vectorPairNodesScore, 1, node_actualB->GetId());
- }
- }
-
- // Print the results
- std::cout << "Non-CommonNodes [A,B]" << nonCommonNodes_A.size() << ", " << nonCommonNodes_B.size() << std::endl;
- std::cout << "CommonNodes [A,B]" << commonNodes_A.size() << ", " << commonNodes_B.size() << std::endl;
-
- // Get the branches with the lowest difference
- /*bool first = true;
- double lowestValue = 0;
- Pair_Node_Node bestPairNodes;
- int iteration = 1;
- for(Vector_Pair_PairNodes_Score::iterator it = vectorPairNodesScore.begin(); it != vectorPairNodesScore.end(); ++it )
- {
- if(first)
- {
- lowestValue = (*it).second;
- bestPairNodes = (*it).first;
- first = false;
- }
- else if( (*it).second < lowestValue )
- {
- lowestValue = (*it).second;
- bestPairNodes = (*it).first;
- }
- }
-
- // Print the best pair of nodes
- if(vectorPairNodesScore.size() > 0)
- std::cout << "Best pair: Node A:" << (bestPairNodes).first->GetId() << ", Node B:" << (bestPairNodes).second->GetId() << std::endl;
- */
-
- /*// AMP - This code was commented after a meeting with Leonardo Florez
- // We make the hypothesis that both roots are equal and
- // that the root has only one child.
- // The comparison of two branches implies the alignment
- // of the mother branches and then the comparison of the
- // daughters branches using intrinsic characteristics of
- // each branch and a distance function between both.
-
- if (this->IsEmpty() || treeB.IsEmpty())
- {
- std::cout << "One or both airways are empty." << std::endl;
- return;
- }
-
- Edge actualRootEdge = this->m_root->GetEdge();
- Edge comparedRootEdge = treeB.m_root->GetEdge();
-
- // By the hypothesis, both root edges are similar. So we have to compared
- // the edged of the root edges.
- actualRootEdge.compareChildEdges(comparedRootEdge);
- */
-}
-
-Pair_PairNodes_Score AirwaysTree::GetBestLeaf(Vector_Pair_PairNodes_Score vectorPairNodesScore)
-{
- // Variables
- Pair_PairNodes_Score pairNodesScore_final;
- bool first = true;
-
- for(Vector_Pair_PairNodes_Score::iterator it = vectorPairNodesScore.begin(); it != vectorPairNodesScore.end(); ++it)
- {
- // Check that one of the node is a leaf
- pair_nodes pair_actual = (*it).first;
- Node* a = pair_actual.first;
- Node* b = pair_actual.second;
- if( a->IsLeaf() || b->IsLeaf() )
- {
- if(first)
- {
- first = false;
- pairNodesScore_final = (*it);
- }
- else if((*it).second < pairNodesScore_final.second)
- {
- pairNodesScore_final = (*it);
- }
- }
- }
-
- if(first)
- std::cout << "Best leaf not found" << std::endl;
-
- return pairNodesScore_final;
-}
-
-double AirwaysTree::GetPairNodes_Score(Vector_Pair_PairNodes_Score vectorPairNodesScore, const unsigned int idA, const unsigned int idB)
-{
- bool found = false;
- double score = -1;
-
- for(Vector_Pair_PairNodes_Score::iterator it = vectorPairNodesScore.begin(); it != vectorPairNodesScore.end(); ++it)
- {
- // Check that one of the node is a leaf
- pair_nodes pair_actual = (*it).first;
- Node* a = pair_actual.first;
- Node* b = pair_actual.second;
- if( a->GetId() == idA && b->GetId() == idB )
- {
- found = true;
- score = (*it).second;
- }
- }
-
- if(!found)
- std::cout << "Pair of Ids not found: " << idA << ", " << idB << std::endl;
-
- return score;
-}
-
-bool AirwaysTree::DeleteNodeById(unsigned int nId)
-{
- bool deleted = false;
- if(m_root->GetId() == nId)
- {
- delete(m_root);
- m_root = NULL;
- return true;
- }
-
- return this->m_root->DeleteNodeById(nId);
-}
-
-unsigned int AirwaysTree::DeleteEntriesByIdNode(Vector_Pair_PairNodes_Score& vectorPairNodesScore, unsigned int component, unsigned int nId)
-{
- unsigned int pairs_deleted = 0;
-
- Vector_Pair_PairNodes_Score::iterator it = vectorPairNodesScore.begin();
- while(it != vectorPairNodesScore.end())
- {
- // Check that one of the node is a leaf
- pair_nodes pair_actual = (*it).first;
- unsigned int id_actual = -1;
- if(component == 0)
- id_actual = pair_actual.first->GetId();
- else
- id_actual = pair_actual.second->GetId();
-
- if( id_actual == nId)
- {
- it = vectorPairNodesScore.erase(it);
- ++pairs_deleted;
- }
- else
- ++it;
- }
-
- std::cout << "Pairs deleted: " << pairs_deleted << std::endl;
-
- return pairs_deleted;
-}
-
-AirwaysTree* AirwaysTree::GetCopy()
-{
- return NULL;
-}
-
-Vector_Pair_PairNodes_Score AirwaysTree::CompareAllBranches(AirwaysTree& treeB)
-{
- std::cout << "Compare all branches ..." << std::endl;
- // Variables
- int nodesA = this->m_nodes.size();
- int nodesB = treeB.m_nodes.size();
-
- Vector_Pair_PairNodes_Score vectorPairNodesScore;
-
- // For all the actual branches ( nodes different from the root)
- for(unsigned int idA = 2; idA <= nodesA; ++idA)
- {
- // Get the actual branch in A
- Edge* branchA = this->GetComposedEdge(idA);
-
- //Get the final actual node in A
- Node* node_actualA = this->GetNodeById(idA);
-
- std::cout << "IdA: " << idA << std::endl;
-
- // For all the branches in B tree
- for(unsigned int idB = 2; idB <= nodesB; ++idB)
- {
- // Get the actual branch in B
- Edge* branchB = treeB.GetComposedEdge(idB);
-
- //Get the final actual node in B
- Node* node_actualB = treeB.GetNodeById(idB);
-
- // Get the score from A to B and from B to A
- double scoreA2B = branchA->CompareWith(branchB);
- double scoreB2A = branchB->CompareWith(branchA);
-
- // Get the final score
- // Options:
- // A. Maximum score
- //double score = scoreB2A > scoreA2B ? scoreB2A : scoreA2B ;
-
- // B. Sum of scores
- double score = scoreB2A + scoreA2B;
-
- // Build the pair of nodes
- pair_nodes actualPairNodes(node_actualA, node_actualB);
-
- Pair_PairNodes_Score actualPairNodesScore(actualPairNodes, score);
- vectorPairNodesScore.push_back(actualPairNodesScore);
-
- //std::cout << "IdA: " << idA << ", IdB: " << idB << ", score: " << score << ", ... OK" << std::endl;
- delete(branchB);
- }
- delete(branchA);
- }
-
- std::cout << "Compare all branches ... OK" << std::endl;
- return vectorPairNodesScore;
-}
-
-Edge* AirwaysTree::GetComposedEdge(unsigned int idNode)
-{
- return this->m_root->GetComposedEdge(idNode);
-}
-
-AirwaysTree* AirwaysTree::GetSingleDetachedTreeNodeById(unsigned int nId)
-{
- AirwaysTree* tree_detached = NULL;
- Node* node_searched = this->GetNodeById(nId);
- if(node_searched)
- {
- Node* node_root_detached = node_searched->GetDetachedRootCopy();
- tree_detached = new AirwaysTree();
- tree_detached->m_root = node_root_detached;
- }
- else
- std::cout << "Node not found" << std::endl;
- return tree_detached;
-}
-
-void AirwaysTree::SubIsomorphism(AirwaysTree& treeB)
-{
- if (this->IsEmpty() || treeB.IsEmpty())
- return;
- //Marking the root node
- this->m_root->Mark();
- treeB.m_root->Mark();
-
- //iterating children - first step
- vec_nodes::const_iterator it = this->m_root->GetChildren().begin();
- for (; it != this->m_root->GetChildren().end(); ++it)
- {
- unsigned int totalCost = 0;
- Node* currentB = NULL;
- Node* currentA = *it;
- if (currentA->IsMarked())
- continue;
- vec_nodes::const_iterator it2 = treeB.m_root->GetChildren().begin();
- for (; it2 != treeB.m_root->GetChildren().end(); ++it2)
- {
- if ((*it2)->IsMarked())
- continue;
- unsigned int currentCost = (*it)->GetCost(*it2);
- if (totalCost < currentCost)
- {
- currentB = *it2;
- totalCost = currentCost;
- } //if
- } //for
- if (currentB != NULL)
- if (*currentA == *currentB)
- this->GetSubTreeByDetachingNode(currentA).SubIsomorphism(
- treeB.GetSubTreeByDetachingNode(currentB));
- } //for
- //end of first step
- //second step
- it = this->m_root->GetChildren().begin();
- for (; it != this->m_root->GetChildren().end(); ++it)
- {
- if ((*it)->IsMarked())
- continue;
- vec_nodes::const_iterator it2 = treeB.m_root->GetChildren().begin();
- for (; it2 != treeB.m_root->GetChildren().end(); ++it2)
- {
- Node* currentB = *it2;
- Node* currentA = *it;
- if (*currentB > *currentA)
- continue;
- if (currentA->FindSimilarEdgeByAccumulation(currentB))
- {
- AirwaysTree subTreeA = this->GetSubTreeByDetachingNode(
- currentA);
- AirwaysTree subTreeB = treeB.GetSubTreeByDetachingNode(
- currentB);
- subTreeB.UpdateLevels((*it2)->GetLevel());
- subTreeA.SubIsomorphism(subTreeB);
- treeB.m_root->UpdateLevels(treeB.m_root->GetLevel());
- currentA->Mark();
- if (!(*it2)->MarkPath(currentB))
- std::cout << "Error finding path" << std::endl;
- break;
- } //if
- } //for
- } //for
- vec_nodes::const_iterator it2 = treeB.m_root->GetChildren().begin();
- for (; it2 != treeB.m_root->GetChildren().end(); ++it2)
- {
- if ((*it2)->IsMarked())
- continue;
- it = this->m_root->GetChildren().begin();
- for (; it != this->m_root->GetChildren().end(); ++it)
- {
- Node* currentB = *it2;
- Node* currentA = *it;
- if (*currentA > *currentB)
- continue;
- if (currentB->FindSimilarEdgeByAccumulation(currentA))
- {
- AirwaysTree subTreeA = this->GetSubTreeByDetachingNode(
- currentA);
- AirwaysTree subTreeB = treeB.GetSubTreeByDetachingNode(
- currentB);
- subTreeA.UpdateLevels((*it)->GetLevel());
- subTreeA.SubIsomorphism(subTreeB);
- this->m_root->UpdateLevels(this->m_root->GetLevel());
- currentB->Mark();
- if (!(*it)->MarkPath(currentA))
- std::cout << "Error finding path" << std::endl;
- break;
- } //if
- } //for
- }
- //End of second step
-}
-
-bool AirwaysTree::Isomorphism(AirwaysTree& tree)
-{
- if ((this->GetWeight() != tree.GetWeight())
- || (this->GetHeight() != tree.GetHeight()))
- return false;
- return this->m_root->CompareNodes(tree.m_root);
-}
-
-void AirwaysTree::ImageReconstructionFromNode(TInputImage::Pointer& result, Node* node, bool skeleton)
-{
- if (node == NULL)
- return;
- //Finding the center of the sphere
- const Edge* edge = node->GetEdge();
- if (edge == NULL)
- return;
- //making a copy of the current image
- TInputImage::Pointer copy;
- DuplicatorType::Pointer duplicator = DuplicatorType::New();
- if (skeleton)
- duplicator->SetInputImage(this->m_skeleton);
- else
- duplicator->SetInputImage(this->m_img);
- duplicator->Update();
- copy = duplicator->GetOutput();
- //First remove the node brothers -- the following code in a way does not
- // make sense but I'll just comment it if it is necessary
- /*Node* parent = edge->m_source;
- NodeVector::iterator pIt = parent->m_children.begin();
- for (; pIt != parent->m_children.end(); ++pIt)
- if ((*pIt) != node)
- this->RemoveBranchFromImage(copy, node);
- //end of brother removal*/
- pair_posVox_rad center;
- vec_pair_posVox_rad::const_iterator it = edge->m_vec_pair_posVox_rad.begin();
- for (; it != edge->m_vec_pair_posVox_rad.end(); ++it)
- if (edge->m_source->GetCoords() == (*it).first)
- center = *it;
- //converting to index
- TInputImage::PointType point;
- point[0] = center.first[0];
- point[1] = center.first[1];
- point[2] = center.first[2];
- TInputImage::IndexType indCenter;
- if (skeleton)
- this->m_skeleton->TransformPhysicalPointToIndex(point, indCenter);
- else
- this->m_img->TransformPhysicalPointToIndex(point, indCenter);
- //creating itk sphere
- SphereType::Pointer sphere = SphereType::New();
- sphere->SetRadius(center.second * 4);
- SphereType::InputType sphereCenter;
- sphereCenter[0] = indCenter[0];
- sphereCenter[1] = indCenter[1];
- sphereCenter[2] = indCenter[2];
- sphere->SetCenter(sphereCenter);
-
- //testing code
- // std::cout<<"center = "<< indCenter << std::endl;
- //std::cout << "Radio = " << center.second << std::endl;
- TInputImage::SizeType regionSize;
- regionSize[0] = 8 * center.second;
- regionSize[1] = 8 * center.second;
- regionSize[2] = 8 * center.second;
- //std::cout << "RegionSize = " << regionSize << std::endl;
-
- TInputImage::IndexType regionIndex;
- regionIndex[0] = indCenter[0] - center.second * 4;
- regionIndex[1] = indCenter[1] - center.second * 4;
- regionIndex[2] = indCenter[2] - center.second * 4;
- // std::cout << "regionIndex = " << regionIndex << std::endl;
-
- TInputImage::RegionType region;
- region.SetSize(regionSize);
- region.SetIndex(regionIndex);
- RegionIterator it2(copy, region);
- while (!it2.IsAtEnd())
- {
- TInputImage::IndexType ind = it2.GetIndex();
- SphereType::InputType point;
- point[0] = ind[0];
- point[1] = ind[1];
- point[2] = ind[2];
- SphereType::OutputType output = sphere->Evaluate(point);
- if (output)
- it2.Set(0);
- ++it2;
- }
-
- /*
- * First region growing - Segmenting the wanted branch to be removed
- * Removing the branch from the image
- */
- if (!ComputeSimpleRegionGrowing(copy, this->m_root->GetCoords()))
- return;
- SubtractImageFilterType::Pointer subtractFilter =
- SubtractImageFilterType::New();
- if (skeleton)
- subtractFilter->SetInput1(this->m_skeleton);
- else
- subtractFilter->SetInput1(this->m_img);
- subtractFilter->SetInput2(copy);
- subtractFilter->Update();
- TInputImage::Pointer diff = subtractFilter->GetOutput();
- /*
- * Second region growing - Cleaning the resulting image
- */
- Node* leaf = this->GetLeaf(node);
- if (ComputeSimpleRegionGrowing(diff, leaf->GetCoords()))
- result = diff;
- else
- std::cout << "problemas" << std::endl;
- //cin.ignore().get(); //Pause Command for Linux Terminal
-
-}
-
-void AirwaysTree::ImageReconstruction(TInputImage::Pointer& result, bool skeleton, Node* node)
-{
- if (node == NULL)
- {
- DuplicatorType::Pointer duplicator = DuplicatorType::New();
- if (skeleton)
- duplicator->SetInputImage(this->m_skeleton);
- else
- duplicator->SetInputImage(this->m_img);
- duplicator->Update();
- result = duplicator->GetOutput();
- node = this->m_root;
- } //if
- if (!node->IsMarked())
- {
- this->RemoveBranchFromImage(result, node);
- return;
- }
- vec_nodes::const_iterator it = node->GetChildren().begin();
- for (; it != node->GetChildren().end(); ++it)
- this->ImageReconstruction(result, skeleton, *it);
-
-}
-
-void AirwaysTree::ImageReconstructionBySpheres(TInputImage::Pointer& result, Node* node, bool useMarks)
-{
- if (node == NULL)
- {
- node = this->m_root;
- DuplicatorType::Pointer duplicator = DuplicatorType::New();
- duplicator->SetInputImage(m_img);
- duplicator->Update();
- result = duplicator->GetOutput();
- //Removing white pixels -- cleaning image
- TInputImage::RegionType lRegion = result->GetLargestPossibleRegion();
- RegionIterator it(result, lRegion);
- while (!it.IsAtEnd())
- {
- it.Set(0);
- ++it;
- } //while
- } //if
- if (node->IsMarked() || !useMarks)
- {
- this->CreateSpheres(result, node);
- vec_nodes::const_iterator it = node->GetChildren().begin();
- for (; it != node->GetChildren().end(); ++it)
- this->ImageReconstructionBySpheres(result, *it);
- } //if
-}
-
-Node* AirwaysTree::GetNode(const Vec3 nodeCoords, Node* current)
-{
- if (current == NULL)
- current = this->m_root;
- if (current->GetCoords() == nodeCoords)
- return current;
- vec_nodes::const_iterator it = current->GetChildren().begin();
- for (; it != current->GetChildren().end(); ++it)
- {
- Node* child = GetNode(nodeCoords, *it);
- if (child != NULL)
- return child;
- } //rof
- return NULL;
-}
-
-Node* AirwaysTree::GetLeaf(Node* current)
-{
- if (current == NULL)
- current = this->m_root;
- if (current->IsLeaf())
- return current;
- vec_nodes::const_iterator it = current->GetChildren().begin();
- Node* node = NULL;
- unsigned int maxHeight = 0;
- for (; it != current->GetChildren().end(); ++it)
- {
- unsigned int cHeight = this->GetHeight(*it);
- if (maxHeight <= cHeight)
- {
- maxHeight = cHeight;
- node = *it;
- } //if
- } //for
- if (node != NULL)
- return this->GetLeaf(node);
- return NULL;
-}
-
-void AirwaysTree::UpdateEdges(Node* node)
-{
- if (node == NULL)
- node = this->m_root;
-
- if (node->GetEdge() != NULL)
- {
- Edge* edge = node->GetEdge();
- //edge->m_skInfoPairVector = this->GetSkeletonInfoFromEdge(edge->m_source->GetCoords(), edge->m_target->GetCoords());
- edge->SetSkeletonPairVector( this->GetSkeletonInfoFromEdge(edge->m_source->GetCoords(), edge->m_target->GetCoords()) );
- node->GetEdge()->UpdateEdgeInfo();
- }
- vec_nodes::const_iterator it = node->GetChildren().begin();
- for (; it != node->GetChildren().end(); ++it)
- this->UpdateEdges(*it);
-}
-
-AirwaysTree& AirwaysTree::GetSubTreeByDetachingNode(Node* node)
-{
- AirwaysTree* tree = new AirwaysTree();
- tree->m_root = node;
- return *tree;
-}
-
-DiGraph_EdgePair AirwaysTree::AddBoostEdge(const pair_posVox_rad& source, const pair_posVox_rad& target, DiGraph& graph)
-{
- bool vFound[2] = { false, false };
- DiGraph_VertexDescriptor vDescriptor[2];
-
- //Remember that DiGraph_VertexIteratorPair, first = begin, second = end
- DiGraph_VertexIndexMap index = get(boost::vertex_index, graph);
-
- //Search the vertex in the graph
- for (DiGraph_VertexIteratorPair vPair = boost::vertices(graph); vPair.first != vPair.second && (!vFound[0] || !vFound[1]); ++vPair.first)
- {
- // Get the current information [vector, intensity]
- pair_posVox_rad current = graph[index[*vPair.first]];
-
- // Check if current is equal to the source or target vertex
- if (current.first == source.first)
- {
- vDescriptor[0] = index[*vPair.first];
- vFound[0] = true;
- } //if
- else if (current.first == target.first)
- {
- vDescriptor[1] = index[*vPair.first];
- vFound[1] = true;
- } //if
- } //for
-
- // If one of the vertices is not in the graph, adds the new vertex
-
- // Add the vertices if they are not in the graph
- if (!vFound[0])
- vDescriptor[0] = boost::add_vertex(source, graph);
- if (!vFound[1])
- vDescriptor[1] = boost::add_vertex(target, graph);
-
- // Check if the edge exist in the graph
- // boost::edge returns the pair<edge_descriptor, bool>, with bool=true is the edge exists
- DiGraph_EdgePair edgeC1 = boost::edge(vDescriptor[0], vDescriptor[1],graph);
- DiGraph_EdgePair edgeC2 = boost::edge(vDescriptor[1], vDescriptor[0],graph);
-
- // If the edge does not exist, then add it
- if (!edgeC1.second && !edgeC2.second)
- {
- DiGraph_EdgePair nEdge = boost::add_edge(vDescriptor[0], vDescriptor[1], graph);
- return nEdge;
- } //if
-
- // If an edge has not been added then -> second = false
- // Remove the added vertices because the edge already exists.
- if (!vFound[0])
- boost::remove_vertex(vDescriptor[0], graph);
-
- if (!vFound[1])
- boost::remove_vertex(vDescriptor[1], graph);
-
- edgeC1.second = false;
- edgeC1.second = false;
-
- return edgeC1;
-}
-
-bool AirwaysTree::FindNeighborhood(DiGraph& graph, Vec3Queue& queue, Vec3List& used, const Vec3& end, ConstNeighborhoodIterator& iterator)
-{
- if (queue.empty())
- return false;
-
- // Get the next pixel in the queue
- Vec3 current = queue.front();
-
- // Put the pixel in the used list
- used.push_back(current);
-
- // Delete next pixel from the queu
- queue.pop();
-
- //AMP//iterator.GoToBegin();
- //AMP//while (!iterator.IsAtEnd())
- //AMP//{
-
- // AMP commented
- /*unsigned int centerIndex = iterator.GetCenterNeighborhoodIndex();
- TInputImage::IndexType index = iterator.GetIndex(centerIndex);
- SKPairInfo src(Vec3(index[0], index[1], index[2]),
- iterator.GetPixel(iterator.GetCenterNeighborhoodIndex()));
- if (src.first != current)
- {
- ++iterator;
- continue;
- } //if
- */
- //PMA commented
-
- // AMP
-
- // Set the current index to the actual pixel
- TInputImage::IndexType indexActual;
- indexActual[0] = current[0];
- indexActual[1] = current[1];
- indexActual[2] = current[2];
-
- // Place the iterator in the actual index
- iterator.SetLocation(indexActual);
-
- // Create the pair [vector, intensity] for the actual index
- pair_posVox_rad src(current, iterator.GetPixel(iterator.GetCenterNeighborhoodIndex()));
-
- // PMA
-
- // Iterate over the neighbors
- for (unsigned int i = 0; i < iterator.Size(); i++)
- {
- //AMP//if (iterator.GetPixel(i) != 0 && i != centerIndex)
-
- // If the intensity is not zero and it's the center
- if (iterator.GetPixel(i) != 0 && i != iterator.GetCenterNeighborhoodIndex())
- {
- // Get the index of the iterator
- TInputImage::IndexType ind = iterator.GetIndex(i);
-
- // Create the target pair [vector, intensity] for the target
- pair_posVox_rad target(Vec3(ind[0], ind[1], ind[2]), iterator.GetPixel(i));
-
- // Add the edge to the graph
- bool added = AddBoostEdge(src, target, graph).second;
-
- // If it could not be added then it is because it already exist, then go to next neighboor
- if (!added)
- continue;
-
- // The edge was added. Stop the adding process if the target vertex was reached.
- if (target.first == end)
- return true;
-
- // If it the edge was added and it is not the target then add it to the queue, if and only if
- // it was not already used.
- if (std::find(used.begin(), used.end(), target.first)== used.end())
- queue.push(target.first);
- }//if
- }//for
- //AMP//break;
- //AMP//} //while
- return false;
-}
-
-DiGraph AirwaysTree::GetGraphShortestPath(const DiGraph& graph, const Vec3& begin, const Vec3& end)
-{
- // Variables
- DiGraph ret; // Returning graph with the shortest path
- DiGraph_EdgeIterator ei, eo; // Initial and final iterators
-
- // Iterate over the edges of the graph
- boost::tie(ei, eo) = boost::edges(graph);
- for (; ei != eo; ++ei)
- {
- // Get the source of the actual edge
- pair_posVox_rad src = graph[boost::source(*ei, graph)];
-
- // If the source corresponds to the begin pixel
- if (src.first == begin)
- {
- // Get the target of the actual edge
- pair_posVox_rad target = graph[boost::target(*ei, graph)];
-
- // If the actual target corresponds to the end pixel
- if (target.first == end)
- {
- // Add the edge to the final path
- AddBoostEdge(src, target, ret);
-
- //AMP
- std::cout << "Add final target [src]-[ target]:[" << src.first << "]-[" << target.first << "], numVertices:" << boost::num_vertices(ret) << std::endl;
- //PMA
-
- // Return the path
- return ret;
- }
-
- // If the actual target does not correspond to the end pixel, then add it to the returning path
- // and run the shortest path with the target of the actual edge.
- ret = GetGraphShortestPath(graph, target.first, end);
-
- // If the path is empty then the iteration continues
- if (boost::num_vertices(ret) == 0)
- continue;
-
- // if not return ret + new edge
- // If the path was found then add the actual edge and return the path
- AddBoostEdge(src, target, ret);
- //AMP
- //std::cout << "Add found edge [src]-[ target]:[" << src.first << "]-[" << target.first << "], numVertices:" << boost::num_vertices(ret) << std::endl;
- //PMA
- return ret;
-
- }//fi
- }
- return ret;
-}
-
-vec_pair_posVox_rad AirwaysTree::GetGraphShortestPath_AMP(const DiGraph& graph, const Vec3& begin, const Vec3& end)
-{
- //std::cout << "SKPairInfoVector AirwaysTree::GetGraphShortestPath_AMP(const DiGraph& graph, const Vec3& begin, const Vec3& end)" << std::endl;
- // Variables
- vec_pair_posVox_rad path;
- DiGraph ret; // Returning graph with the shortest path
- DiGraph_EdgeIterator ei, eo; // Initial and final iterators
-
- // Iterate over the edges of the graph
- boost::tie(ei, eo) = boost::edges(graph);
- for (; ei != eo; ++ei)
- {
- // Get the source of the actual edge
- pair_posVox_rad src = graph[boost::source(*ei, graph)];
-
- // If the source corresponds to the begin pixel
- if (src.first == begin)
- {
- // Get the target of the actual edge
- pair_posVox_rad target = graph[boost::target(*ei, graph)];
-
- // If the actual target corresponds to the end pixel
- if (target.first == end)
- {
- // Add the edge to the final path
- AddBoostEdge(src, target, ret);
- path.push_back(target);
- path.push_back(src);
-
- //AMP
- //std::cout << "Add final target [src]-[ target]:[" << src.first << "]-[" << target.first << "], numVertices:" << boost::num_vertices(ret) << ", path_size:" << path.size() << std::endl;
- //PMA
-
- // Return the path
- //std::cout << "SKPairInfoVector AirwaysTree::GetGraphShortestPath_AMP(const DiGraph& graph, const Vec3& begin, const Vec3& end) ... FIRST ... OK" << std::endl;
- return path;
- }
-
- //std::cout << "Not yet in the target voxel" << std::endl;
- // If the actual target does not correspond to the end pixel, then add it to the returning path
- // and run the shortest path with the target of the actual edge.
- path = GetGraphShortestPath_AMP(graph, target.first, end);
- //std::cout << "Path found, path size:" << path.size() << std::endl;
-
- // If the path is empty then the iteration continues
- if (path.size() == 0)
- continue;
-
- // if not return ret + new edge
- // If the path was found then add the actual edge and return the path
- AddBoostEdge(src, target, ret);
- path.push_back(src);
- //AMP
- //std::cout << "Add found edge [src]-[ target]:[" << src.first << "]-[" << target.first << "], numVertices:" << boost::num_vertices(ret) << ", path_size:" << path.size() << std::endl;
- //PMA
- //std::cout << "SKPairInfoVector AirwaysTree::GetGraphShortestPath_AMP(const DiGraph& graph, const Vec3& begin, const Vec3& end) ... SECOND ... OK" << std::endl;
- return path;
-
- }//fi
- }
-
- //std::cout << "SKPairInfoVector AirwaysTree::GetGraphShortestPath_AMP(const DiGraph& graph, const Vec3& begin, const Vec3& end) ... END ... OK" << std::endl;
- return path;
-}
-
-vec_pair_posVox_rad AirwaysTree::GetSkeletonInfoFromEdge(const Vec3& source, const Vec3& target)
-{
- //converting to pixel
- TInputImage::PointType pointSource;
- pointSource[0] = source[0];
- pointSource[1] = source[1];
- pointSource[2] = source[2];
-
- TInputImage::PointType pointTarget;
- pointTarget[0] = target[0];
- pointTarget[1] = target[1];
- pointTarget[2] = target[2];
-
- TInputImage::IndexType indexSource;
- TInputImage::IndexType indexTarget;
-
- this->m_skeleton->TransformPhysicalPointToIndex(pointSource, indexSource);
- this->m_skeleton->TransformPhysicalPointToIndex(pointTarget, indexTarget);
- //end of conversion
-
- // AMP // Print the initial and final voxels to verify their positions
- //std::cout << "Begin: [" << indexSource[0] << "," << indexSource[1] << "," << indexSource[2] << "] -- " << this->m_skeleton->GetPixel(indexSource) << std::endl;
- //std::cout << "End: [" << indexTarget[0] << "," << indexTarget[1] << "," << indexTarget[2] << "] -- " << this->m_skeleton->GetPixel(indexTarget) << std::endl;
- //std::cout << "BeginVoxel: [" << pointSource[0] << "," << pointSource[1] << "," << pointSource[2] << "]"<< std::endl;
- //std::cout << "EndVoxel: [" << pointTarget[0] << "," << pointTarget[1] << "," << pointTarget[2] << "]" << std::endl;
- // PMA //
-
- Vec3 sourcePxl(indexSource[0], indexSource[1], indexSource[2]);
- Vec3 targetPxl(indexTarget[0], indexTarget[1], indexTarget[2]);
-
- // AMP // Commented
- /*
- // Compute the distance in each direction and add "21" in each one
- float dstX = beginPxl.EculideanDistance(
- Vec3(endPxl[0], beginPxl[1], beginPxl[2])) + 21;
- float dstY = beginPxl.EculideanDistance(
- Vec3(beginPxl[0], endPxl[1], beginPxl[2])) + 21;
- float dstZ = beginPxl.EculideanDistance(
- Vec3(beginPxl[0], beginPxl[1], endPxl[2])) + 21;
-
- //start point
- TInputImage::IndexType index;
- index[0] = beginPxl[0] < endPxl[0] ? beginPxl[0] : endPxl[0];
- index[1] = beginPxl[1] < endPxl[1] ? beginPxl[1] : endPxl[1];
- index[2] = beginPxl[2] < endPxl[2] ? beginPxl[2] : endPxl[2];
-
- index[0] -= index[0] <= 10 ? 0 : 10;
- index[1] -= index[1] <= 10 ? 0 : 10;
- index[2] -= index[2] <= 10 ? 0 : 10;
-
-
- //size of region
- TInputImage::SizeType size;
- size[0] = ceil(dstX);
- size[1] = ceil(dstY);
- size[2] = ceil(dstZ);
-
- TInputImage::RegionType region;
- region.SetSize(size);
- region.SetIndex(index);
-
- //ConstNeighborhoodIterator iterator(radius, this->m_skeleton, region);
- // PMA // Commented
- */
-
- TInputImage::SizeType radius;
- radius[0] = 1;
- radius[1] = 1;
- radius[2] = 1;
- ConstNeighborhoodIterator iterator(radius, this->m_skeleton, this->m_skeleton->GetLargestPossibleRegion());
-
- DiGraph graph;
- Vec3Queue queue;
- Vec3List used;
-
- // Set the first pixel as starting pixel
- queue.push(sourcePxl);
-
- //FindNeighborhood(graph, queue, used, endPxl, iterator);
-
- // Add to the graph all the connected voxel until the ending pixel is found
- bool endFound = false;
- while (!queue.empty() && !endFound)
- endFound = FindNeighborhood(graph, queue, used, targetPxl, iterator);
-
- if(!endFound)
- std::cout << "***************** END NOT FOUND!!!!" << std::endl;
- else
- std::cout << "***************** END FOUND!!!! - Graph Vertices:" << boost::num_vertices(graph) << ", Graph Edges:" << boost::num_edges(graph) << std::endl;
-
- // Get the shortest path between the begin and end pixels
- //std::cout << "GetGraphShortestPath [from]-[to]:[" << sourcePxl << "]-[" << targetPxl << "]" << std::endl;
- //DiGraph result = GetGraphShortestPath(graph, sourcePxl, targetPxl);
- vec_pair_posVox_rad path = GetGraphShortestPath_AMP(graph, sourcePxl, targetPxl);
- //std::cout << "GetGraphShortestPath ... OK , numVertices:" << boost::num_vertices(result) << std::endl;
-
- //AMP
- bool beginPixelFound = false;
- bool endPixelFound = false;
- vec_pair_posVox_rad vector;
-
- for(vec_pair_posVox_rad::reverse_iterator it_path = path.rbegin(); it_path != path.rend(); ++it_path)
- {
- TInputImage::IndexType ind;
- ind[0] = (*it_path).first[0];
- ind[1] = (*it_path).first[1];
- ind[2] = (*it_path).first[2];
- //std::cout << "["<< (*it_path).first << "], ";
-
- // To avoid precision problems
- if (indexSource == ind)
- {
- beginPixelFound = true;
- (*it_path).first = source;
- }
- else if (indexTarget == ind)
- {
- endPixelFound = true;
- (*it_path).first = target;
- }
- else
- {
- TInputImage::PointType pnt;
- this->m_skeleton->TransformIndexToPhysicalPoint(ind, pnt);
- (*it_path).first = Vec3(pnt[0], pnt[1], pnt[2]);
- }
- vector.push_back((*it_path));
- }
- //vector = path;
- //PMA
-
- // Variables to iterate over the shortest path and save the results
- /*// AMP
- DiGraph_VertexIterator i, e;
- SKPairInfoVector vector;
-
- // Iterate over the shortest path and add each vertex in real coordinates
- boost::tie(i, e) = boost::vertices(result);
- std::cout << "Inserting ... [begin,end]: [" << begin << "], [" << end << "]" << std::endl;
- for (; i != e; ++i)
- //for (; e != i; --e)
- {
- // Get the actual vertex
- SKPairInfo vertex = result[*i];
- //SKPairInfo vertex = result[*e];
- std::cout << "["<< vertex.first << "], ";
-
- // Get the index (voxel position) of the actual vertex
- TInputImage::IndexType ind;
- ind[0] = vertex.first[0];
- ind[1] = vertex.first[1];
- ind[2] = vertex.first[2];
-
- // To avoid precision problems
- if (indexBegin == ind)
- {
- beginPixelFound = true;
- vertex.first = begin;
- }
- else if (indexEnd == ind)
- {
- endPixelFound = true;
- vertex.first = end;
- }
- else
- {
- TInputImage::PointType pnt;
- this->m_skeleton->TransformIndexToPhysicalPoint(ind, pnt);
- vertex.first = Vec3(pnt[0], pnt[1], pnt[2]);
- }
- vector.push_back(vertex);
- }
- std::cout << "Inserting ... OK" << std::endl;
-
-
- *///AMP
-
-
- if(!beginPixelFound)
- std::cout << "Begin not found: "<< source << std::endl;
- if(!endPixelFound)
- std::cout << "End not found:" << target << std::endl;
-
- return vector;
-}
-
-bool AirwaysTree::ComputeSimpleRegionGrowing(TInputImage::Pointer& img,
- const Vec3 seedPtn)
-{
- TInputImage::PointType targetPtn;
- targetPtn[0] = seedPtn[0];
- targetPtn[1] = seedPtn[1];
- targetPtn[2] = seedPtn[2];
- TInputImage::IndexType seed;
- img->TransformPhysicalPointToIndex(targetPtn, seed);
- if (img->GetPixel(seed) == 0)
- {
- //std::cout << "seed is 0" << std::endl;
- return false;
- }
- ConnectedFilterType::Pointer neighborhoodConnected =
- ConnectedFilterType::New();
- neighborhoodConnected->SetLower(1);
- neighborhoodConnected->SetUpper(1);
- neighborhoodConnected->SetReplaceValue(1);
- neighborhoodConnected->SetSeed(seed);
- neighborhoodConnected->SetInput(img);
- neighborhoodConnected->Update();
- img = neighborhoodConnected->GetOutput();
- return true;
-}
-
-void AirwaysTree::RemoveBranchFromImage(TInputImage::Pointer& img, Node* node)
-{
- //typedef itk::ImageFileWriter<TInputImage> WriterType;
- //Finding the center of the sphere
- const Edge* edge = node->GetEdge();
- if (edge == NULL)
- return;
- pair_posVox_rad center;
- vec_pair_posVox_rad::const_iterator it = edge->m_vec_pair_posVox_rad.begin();
- for (; it != edge->m_vec_pair_posVox_rad.end(); ++it)
- if (edge->m_source->GetCoords() == (*it).first)
- center = *it;
- //converting to index
- TInputImage::PointType point;
- point[0] = center.first[0];
- point[1] = center.first[1];
- point[2] = center.first[2];
- TInputImage::IndexType indCenter;
- img->TransformPhysicalPointToIndex(point, indCenter);
- double radius = center.second;
- //creating itk sphere
- SphereType::Pointer sphere = SphereType::New();
- SphereType::InputType sphereCenter;
- sphereCenter[0] = indCenter[0];
- sphereCenter[1] = indCenter[1];
- sphereCenter[2] = indCenter[2];
- sphere->SetCenter(sphereCenter);
- unsigned int objCount = 0;
- unsigned int obj3Count = 0; // to assure 3 Connected obj
- //Number of connected components, children_size + parent
- unsigned int nCConnex = edge->m_source->GetNumberOfChildren() + 1;
- TInputImage::Pointer copy;
- //std::cout << "entró" << std::endl;
- while (objCount < nCConnex || obj3Count <= nCConnex)
- {
- if (objCount >= 3)
- obj3Count++;
- radius += 1.0;
- sphere->SetRadius(radius);
- //making a copy of the current image
- DuplicatorType::Pointer duplicator = DuplicatorType::New();
- duplicator->SetInputImage(img);
- duplicator->Update();
- copy = duplicator->GetOutput();
-
- //testing code
- // std::cout<<"center = "<< indCenter << std::endl;
- //std::cout << "Radio = " << center.second << std::endl;
- TInputImage::SizeType regionSize;
- regionSize[0] = 4 * radius;
- regionSize[1] = 4 * radius;
- regionSize[2] = 4 * radius;
- //std::cout << "RegionSize = " << regionSize << std::endl;
- TInputImage::SizeType size = img->GetLargestPossibleRegion().GetSize();
- TInputImage::IndexType regionIndex;
- regionIndex[0] = indCenter[0] - (radius * 2);
- if (regionIndex[0] < 0)
- regionIndex[0] = indCenter[0];
- else if (regionIndex[0] > (unsigned int) size[0])
- regionIndex[0] = size[0];
- regionIndex[1] = indCenter[1] - (radius * 2);
- if (regionIndex[1] < 0)
- regionIndex[1] = indCenter[1];
- else if (regionIndex[1] > (unsigned int) size[1])
- regionIndex[1] = size[1];
- regionIndex[2] = indCenter[2] - (radius * 2);
- if (regionIndex[2] < 0)
- regionIndex[2] = indCenter[2];
- else if (regionIndex[2] > (unsigned int) size[2])
- regionIndex[2] = size[2];
- int diff[3];
- diff[0] = size[0] - (regionSize[0] + regionIndex[0]);
- diff[1] = size[1] - (regionSize[1] + regionIndex[1]);
- diff[2] = size[2] - (regionSize[2] + regionIndex[2]);
- //std::cout << "(1) Region Index = " << regionIndex << std::endl;
- //std::cout << "(1) Region size = " << regionSize << std::endl;
- if (diff[0] < 0)
- regionSize[0] = size[0] - regionIndex[0];
- if (diff[1] < 0)
- regionSize[1] = size[1] - regionIndex[1];
- if (diff[2] < 0)
- regionSize[2] = size[2] - regionIndex[2];
- // std::cout << "regionIndex = " << regionIndex << std::endl;
- //std::cout << "(2) Region Index = " << regionIndex << std::endl;
- //std::cout << "(2) Region size = " << regionSize << std::endl;
- TInputImage::RegionType region;
- region.SetSize(regionSize);
- region.SetIndex(regionIndex);
- RegionIterator it2(copy, region);
- while (!it2.IsAtEnd())
- {
- TInputImage::IndexType ind = it2.GetIndex();
- SphereType::InputType point;
- point[0] = ind[0];
- point[1] = ind[1];
- point[2] = ind[2];
- SphereType::OutputType output = sphere->Evaluate(point);
- if (output)
- it2.Set(0);
- ++it2;
- } //while
- if (node->IsLeaf())
- {
- TInputImage::PointType ptn;
- ptn[0] = node->GetCoords()[0];
- ptn[1] = node->GetCoords()[1];
- ptn[2] = node->GetCoords()[2];
- TInputImage::IndexType tgt;
- img->TransformPhysicalPointToIndex(ptn, tgt);
- if (img->GetPixel(tgt) == 0)
- {
- std::cout << "It entered here!!!!" << std::endl;
- return;
- }
- } //if
- CastFilterType::Pointer castFilter = CastFilterType::New();
- castFilter->SetInput(copy);
- castFilter->Update();
- ConnectedComponentImageFilterType::Pointer connFilter =
- ConnectedComponentImageFilterType::New();
- connFilter->SetFullyConnected(true);
- connFilter->SetInput(castFilter->GetOutput());
- connFilter->Update();
- objCount = connFilter->GetObjectCount();
- //test
- /*WriterType::Pointer writer = WriterType::New();
- writer->SetInput(copy);
- writer->SetFileName("output_antes.mhd");
- writer->Update();*/
- } //while
- //std::cout << "salio" << std::endl;
- /*
- * First region growing - Segmenting the wanted branch to be removed
- * Removing the branch from the image
- */
- Node* leaf = this->GetLeaf(node);
- if (!ComputeSimpleRegionGrowing(copy, leaf->GetCoords()))
- return;
- SubtractImageFilterType::Pointer subtractFilter =
- SubtractImageFilterType::New();
- subtractFilter->SetInput1(img);
- subtractFilter->SetInput2(copy);
- subtractFilter->Update();
- TInputImage::Pointer diff = subtractFilter->GetOutput();
- /*
- * Second region growing - Cleaning the resulting image
- */
- if (ComputeSimpleRegionGrowing(diff, this->m_root->GetCoords()))
- img = diff;
- /*else
- std::cout << "problemas" << std::endl;*/
- //cin.ignore().get(); //Pause Command for Linux Terminal
-}
-
-//Metodo obsoleto, ya no nos interesa la reconstruccion por esferas
-void AirwaysTree::CreateSpheres(TInputImage::Pointer& img, Node* node)
-{
- if (node->GetEdge() == NULL)
- return;
- const Edge* edge = node->GetEdge();
- vec_pair_posVox_rad::const_iterator it = edge->m_vec_pair_posVox_rad.begin();
- for (; it != edge->m_vec_pair_posVox_rad.end(); ++it)
- {
- //converting to index
- TInputImage::PointType point;
- point[0] = (*it).first[0];
- point[1] = (*it).first[1];
- point[2] = (*it).first[2];
- TInputImage::IndexType indexPoint;
- img->TransformPhysicalPointToIndex(point, indexPoint);
- //creating itk sphere
- SphereType::Pointer sphere = SphereType::New();
- sphere->SetRadius((*it).second);
- SphereType::InputType sphereCenter;
- sphereCenter[0] = indexPoint[0];
- sphereCenter[1] = indexPoint[1];
- sphereCenter[2] = indexPoint[2];
- sphere->SetCenter(sphereCenter);
- //creating region
- TInputImage::SizeType regionSize;
- regionSize[0] = 4 * (*it).second;
- regionSize[1] = 4 * (*it).second;
- regionSize[2] = 4 * (*it).second;
- TInputImage::IndexType regionIndex;
- regionIndex[0] = indexPoint[0] - 2 * ceil((*it).second);
- regionIndex[1] = indexPoint[1] - 2 * ceil((*it).second);
- regionIndex[2] = indexPoint[2] - 2 * ceil((*it).second);
- TInputImage::RegionType region;
- region.SetSize(regionSize);
- region.SetIndex(regionIndex);
- RegionIterator it2(img, region);
- while (!it2.IsAtEnd())
- {
- TInputImage::IndexType ind = it2.GetIndex();
- SphereType::InputType point;
- point[0] = ind[0];
- point[1] = ind[1];
- point[2] = ind[2];
- SphereType::OutputType output = sphere->Evaluate(point);
- if (output)
- it2.Set(1);
- ++it2;
- } //while
- } //for
-}
-
-void AirwaysTree::printUpToLevel(int level)
-{
- cout << "Printing up to level: " << level <<endl;
- this->m_root->printUpToLevel(level);
- cout << "Printing done" <<endl;
-}
-
-void AirwaysTree::printNodeAndChildrenIds()
-{
- cout << "Printing nodes and children: " <<endl;
- this->m_root->printNodeAndChildrenIds( );
- cout << "Printing nodes and children DONE" <<endl;
-}
-
-void AirwaysTree::createQuaternionsUpToLevel(int level)
-{
- cout << "Creating quaternions up to level: " << level <<endl;
- if(level >= 2)
- {
- // Print header
- cout << "Level" << " " << "SonPositionX" << " " << "SonPositionY" << " " << "SonPositionZ" << " "
- "ParentVectorX" << " " << "ParentVectorY" << " " << "ParentVectorZ" << " " <<
- "ChildVectorX" << " " << "ChildVectorY" << " " << "ChildVectorZ"<< " " <<
- "Qr" << " " << "Qx" << " " << "Qy" " " << "Qz" " " << "Qtheta" << " " <<
- "Wx" << " " << "Wy" << " " << "Wz" << " " <<
- "EuclDistSonParent" << " " <<"EuclDistSonGrandson" << " " <<
- "RadMeanSonParent" << " " << "RadMeanSonGrandson" <<endl;
-
- this->m_root->createQuaternionsUpToLevel(level, level);
- }
- else
- cout << "Quaternions must be created from level 2." <<endl;
- cout << "Creating quaternions done" <<endl;
-}
-
-void AirwaysTree::getStatisticsBifurcations()
-{
- cout << "Statistics bifurcations ... " <<endl;
-
- int p[6] = {0,0,0,0,0,0};
-
- this->m_root->getStasticsBifurcations(p);
-
- cout << "Bifurcations:" << endl;
- for(int i = 0; i < 6; i++)
- {
- cout << i+1 << "->" << p[i] << endl;
- }
-
- cout << "Statistics bifurcations done " <<endl;
-}
-
-void AirwaysTree::saveAirwayToImage(std::string filename, int dims[3], double spc[3], double nOrigin[3])
-{
- TInputImage::Pointer imagePointer;
- imagePointer = TInputImage::New();
-
- TInputImage::IndexType start;
- start[0] = 0;
- start[1] = 0;
- start[2] = 0;
-
- TInputImage::SizeType size;
- size[0] = dims[0];
- size[1] = dims[1];
- size[2] = dims[2];
-
- TInputImage::RegionType region;
- region.SetSize( size );
- region.SetIndex( start );
-
- TInputImage::SpacingType spacing;
- spacing[0] = spc[0];
- spacing[1] = spc[1];
- spacing[2] = spc[2];
-
- TInputImage::PointType origin;
- origin[0] = nOrigin[0];
- origin[1] = nOrigin[1];
- origin[2] = nOrigin[2];
-
- imagePointer->SetRegions( region );
- imagePointer->SetSpacing( spacing );
- imagePointer->SetOrigin( origin );
- imagePointer->Allocate();
-
- //this->m_root->saveToImage(_imagePointer);
- vec_nodes nodes_children_root = this->m_root->GetChildren();
- vec_nodes::const_iterator it_children = nodes_children_root.begin();
- for( ; it_children != nodes_children_root.end(); ++it_children)
- {
- Vec3 coords_father = (*it_children)->GetEdge()->GetSource()->GetCoords();
- Vec3 coords_child = (*it_children)->GetCoords();
- drawLineInImage(coords_father, coords_child, imagePointer);
- }
-
- cout << "Writing ..." << endl;
- typedef itk::ImageFileWriter<TInputImage> WriterType;
- WriterType::Pointer writer = WriterType::New();
- writer->SetInput(imagePointer);
- writer->SetFileName(filename);
- writer->Update();
- cout << "Writing ... done" << endl;
-}
-
-void AirwaysTree::drawLineInImage(Vec3 initVoxel, Vec3 endVoxel, TInputImage::Pointer imagePointer)
-{
- TInputImage::RegionType region = imagePointer->GetLargestPossibleRegion();
-
- TInputImage::SpacingType spacing = imagePointer->GetSpacing();
-
- TInputImage::PointType origin = imagePointer->GetOrigin();
-
- TInputImage::IndexType init;
- init[0]=(initVoxel[0]-origin[0])/spacing[0];
- init[1]=(initVoxel[1]-origin[1])/spacing[1];
- init[2]=(initVoxel[2]-origin[2])/spacing[2];
-
- TInputImage::IndexType end;
- end[0]=(endVoxel[0]-origin[0])/spacing[0];
- end[1]=(endVoxel[1]-origin[1])/spacing[1];
- end[2]=(endVoxel[2]-origin[2])/spacing[2];
-
- TPixel pixel;
- pixel = 1;
-
- itk::LineIterator<TInputImage> it(imagePointer, init, end);
- it.GoToBegin();
- while (!it.IsAtEnd())
- {
- it.Set(pixel);
- ++it;
- }
-}
-
-//To store the graph in a vtk
-void AirwaysTree::saveAirwayAsVTK(const std::string filename, bool common)
-{
- vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
- colors->SetNumberOfComponents(3);
- colors->SetName("Colors");
-
- //pointer of lines and points
- vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
- vtkSmartPointer<vtkPoints> pts = vtkSmartPointer<vtkPoints>::New();
-
- Vec3 root = this->m_root->GetCoords();
-
- //UndirectedGraph
-
- srand(time(NULL));
- unsigned int id = 1;
-
- CalculateVTKLinesFromEdges(this->m_root, 0, id, pts, lines, colors, common);
-
- vtkSmartPointer<vtkPolyData> linesPolyData = vtkSmartPointer<vtkPolyData>::New();
- linesPolyData->SetPoints(pts);
- linesPolyData->SetLines(lines);
-
- linesPolyData->GetCellData()->SetScalars(colors);
-
- // Write the file
- vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();
- writer->SetFileName(filename.c_str());
-#if VTK_MAJOR_VERSION <= 5
- writer->SetInput(linesPolyData);
-#else
- writer->SetInputData(linesPolyData);
-#endif
- writer->Write();
-}
-
-//To store the graph in a vtk
-void AirwaysTree::CalculateVTKLinesFromEdges(const Node* node, const unsigned int& parentId,
- unsigned int& cId, vtkSmartPointer<vtkPoints>& pts,
- vtkSmartPointer<vtkCellArray>& lines,
- vtkSmartPointer<vtkUnsignedCharArray>& colors, bool common)
-{
- if (node == NULL)
- return;
-
- // Colors
- unsigned char red[3] = { 255, 0, 0 };
- unsigned char green[3] = { 0, 255, 0 };
- unsigned char blue[3] = { 0, 0, 255 };
- unsigned char yellow[3] = { 255, 255, 0 };
-
- const vec_nodes children = node->GetChildren();
-
- for(vec_nodes::const_iterator it = children.begin(); it != children.end(); ++it)
- {
- if (!(*it)->IsMarked() && common)
- continue;
-
- const Edge* edge = (*it)->GetEdge();
- //pts->InsertNextPoint(edge->GetSource()->GetCoords().GetVec3());
- //pts->InsertNextPoint(edge->GetTarget()->GetCoords().GetVec3());
-
- pts->InsertNextPoint(node->GetCoords().GetVec3());
- pts->InsertNextPoint((*it)->GetCoords().GetVec3());
-
- // Set color to be used
- int numColor = node->GetLevel() % 4;
- if(numColor == 0)
- colors->InsertNextTupleValue(green);
- else if(numColor == 1)
- colors->InsertNextTupleValue(red);
- else if(numColor == 2)
- colors->InsertNextTupleValue(blue);
- else
- colors->InsertNextTupleValue(yellow);
-
- vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
- line->GetPointIds()->SetId(0, parentId);
- line->GetPointIds()->SetId(1, cId++);
- lines->InsertNextCell(line);
- unsigned int newParent = cId++;
- CalculateVTKLinesFromEdges(*it, newParent, cId, pts, lines, colors, common);
- } //for
-}
-
-
-} /* namespace airways */
-
-
-#endif
-
+++ /dev/null
-/*
- * airwaysTree.h
- *
- * Created on: May 3, 2014
- * Author: caceres@creatis.insa-lyon.fr
- */
-
-#ifndef _AIRWAYS_TREE_H_
-#define _AIRWAYS_TREE_H_
-
-#include "airwaysTreeTypeDefinition.h"
-
-// VTK
-#include <vtkVersion.h>
-#include <vtkSmartPointer.h>
-#include <vtkCellArray.h>
-#include <vtkCellData.h>
-#include <vtkLine.h>
-#include <vtkPolyDataMapper.h>
-#include <vtkRenderWindow.h>
-#include <vtkRenderer.h>
-#include <vtkRenderWindowInteractor.h>
-#include <vtkPolyDataWriter.h>
-#include <vtkSphereSource.h>
-
-// ITK
-#include "itkImage.h"
-#include "itkImageRegionIterator.h"
-#include "itkLineIterator.h"
-#include <itkImageFileWriter.h>
-#include <Airways/AirwaysLib/TempAirwaysAppli_AirwaysLib_Export.h>
-
-namespace airways
-{
-
-// Types
-
-// Vector of nodes
-typedef std::vector<Node*> vec_nodes;
-
-// Pair of nodes
-typedef std::pair<Node*, Node*> pair_nodes;
-
-//Pair of a pair of nodes and a score
-typedef std::pair<pair_nodes,double> Pair_PairNodes_Score;
-
-/**
- *
- */
-//typedef std::pair<pair_nodes,double> Pair_PairNodes_Score;
-
-/**
- * Vector of pairs of a pair of nodes and a score
- */
-typedef std::vector<Pair_PairNodes_Score> Vector_Pair_PairNodes_Score;
-
-/*!
- * A vector stocking all the points between two nodes
- */
-typedef std::vector<pair_posVox_rad> vec_pair_posVox_rad;
-
-class TempAirwaysAppli_AirwaysLib_EXPORT AirwaysTree
-{
-public:
-
- AirwaysTree();
-
- AirwaysTree(TInputImage::Pointer img, TInputImage::Pointer img_sk, Node* root);
-
- AirwaysTree(TInputImage::Pointer image_airwaySegmentation, TInputImage::Pointer image_skeletonDM, EdgeVector& vector_edges, Edge* edge_trachea);
-
-
- //CERON
- // New constructor that doesn't update path info between nodes.
- AirwaysTree(TInputImage::Pointer image, TInputImage::Pointer image_skeleton, Node* root, bool shouldUpdate);
- virtual ~AirwaysTree();
-
- /**
- * Getters
- */
-
- Node* GetRoot() const;
-
- std::string GetImageName() const;
-
- std::string GetResultPath() const;
-
- TInputImage::Pointer GetSegmentedImage() const;
-
- TInputImage::Pointer GetSkeletonImage() const;
-
- const Node* GetNode(const Vec3 nodeCoords) const;
-
- /**
- * Method that return the node with the specified id
- * @param nId is id of the requested node
- * @return the requested id, NULL if not found
- */
- Node* GetNodeById(unsigned int nId);
-
- /**
- * Method that returns the depth of the node whose id is given by parameter
- * @pre the node exist in the sub-tree
- * @param idNode is the search node id
- * @return the depth of the node up to the actual node
- */
- int GetDepthById(unsigned int nId);
-
- unsigned int CountMarkedNodes(Node* current = NULL) const;
-
- /**
- * Method that returns the weight of the tree
- * @return the weight of the tree which is the number of nodes in the tree.
- */
- unsigned int GetWeight( ) const;
-
- unsigned int GetHeight(Node* current = NULL) const;
-
- unsigned int GetLevels(Node* current = NULL, unsigned int cLevel = 0) const;
-
- /**
- * Method that returns the number of leafs in the tree
- * @return the number of leafs in the tree
- */
- unsigned int GetNumberOfLeafs() const;
-
- const EdgeVector& GetEdges() const;
-
- const vec_nodes& GetNodes() const;
-
- /**
- * Method that returns the closest node of a given voxel.
- * The closes node is the one whose path to the father has the closest point to the given point
- * in real coordinates of the image.
- * @param voxel_x x componente of the voxel
- * @param voxel_y y componente of the voxel
- * @param voxel_z z componente of the voxel
- * @return the closest node to the given voxel
- */
- const Node* GetClosestBrachNodeToIndex(float point_x, float point_y, float point_z) const;
-
- /**
- * Method that returns the list of nodes that influence the given point
- * @param point_x, point_y, point_z are the position of the point in real coordinates x, y, and z respectively.
- * @param vec_nodes_influence vector to save the nodes
- */
- void GetBrancheNodesInfluencingPoint(float point_x, float point_y, float point_z, vec_nodes& vec_nodes_influence);
-
- AirwaysTree& GetTreeFromMarkedNodes(Node* currentNode = NULL, AirwaysTree* tree = NULL);
-
- AirwaysTree& GetSubTreeFromNode(Node* node, AirwaysTree* tree = NULL);
-
- AirwaysTree& GetSubTreeByLevels(const int& level, Node* node = NULL, AirwaysTree* tree = NULL);
-
- AirwaysTree& GetSubTreeByLength(const double& length, Node* node = NULL, AirwaysTree* tree = NULL, double cLenght = 0.0);
-
- AirwaysTree& GetSubTreeByRadius(const double& radius, Node* node = NULL, AirwaysTree* tree = NULL, double cRadius = 0.0);
-
- void MarkLevels(const int& level, Node* currentNode = NULL);
-
- bool IsEmpty() const;
-
- /**
- * Method that search a node inside a path. The path is defined by the starting and ending nodes
- * @param idNode_starting is the id of the starting node
- * @param idNode_ending is the id of the ending node
- * @param idNode_searched is the of the searched node
- * @return true if the searched node is inside the path, false otherwise
- */
- bool IsNodeInsidePath(unsigned int idNode_starting, unsigned int idNode_ending, unsigned int idNode_searched);
-
- void SetRoot(Node* root);
-
- void SetImageName(const std::string& img_name);
-
- void SetResultPath(const std::string& folderPath);
-
- bool Insert(Edge* edge);
-
- void UnMarkAll(Node* currentNode = NULL);
-
- /**
- * Method that compares two tree starting from the root node.
- * @param treeB is the tree to be compared with
- * @param Q is the depth to select "fathers" nodes
- * @param F is the depth to select "family" nodes
- * @param commonA vector to save the common nodes for this subtree
- * @param commonA vector to save the common nodes for the subtree given by parameter
- * @param nonCommonA vector to save the non-common nodes for this subtree
- * @param nonCommonB vector to save the non-common nodes for the subtree given by parameter
- */
- void CompareTreesOrkiszMorales(AirwaysTree& treeB, unsigned int Q, unsigned int F, vec_nodes& commonA, vec_nodes& commonB, vec_nodes& nonCommonA, vec_nodes& nonCommonB, std::map< unsigned int, std::vector<Node*> >& map_A_to_B, std::map< unsigned int, std::vector<Node*> >& map_B_to_A, std::vector< std::pair< std::pair<Node*, Node*>, std::pair<Node*, Node*> > >& vector_pair_edges_A_to_B);
-
- void MarkPathFromNodeToNode(Node* node_begin, Node* node_end);
-
- /**
- * Method that compares the actual tree with another given by parameter
- * @param treeB the tree to be compared with
- */
- void CompareTrees(AirwaysTree& treeB);
-
- /**
- * Method that finds the pair, at least one is a leaf, with the lowest score
- * @param vectorPairNodesScore is the vector of pairs
- * @return the pair, at least one is a leaf, with the lowest score
- */
- Pair_PairNodes_Score GetBestLeaf(Vector_Pair_PairNodes_Score vectorPairNodesScore);
-
- /**
- * Method that returns the pair of pair nodes and score for the given ids.
- * @param vectorPairNodesScore vector of pair nodes and score
- * @param idA is the first id if the pair nodes
- * @param idB is the second id if the pair nodes
- * @return the score for the given pair.
- */
- double GetPairNodes_Score(Vector_Pair_PairNodes_Score vectorPairNodesScore, const unsigned int idA, const unsigned int idB);
-
- /**
- * Method that returns a copy of the tree
- * @return the copy of this tree
- */
- AirwaysTree* GetCopy();
-
- /**
- * Method that deleted a node, all his children, from the tree
- * @return true if the node was deleted (found), false otherwise
- */
- bool DeleteNodeById(unsigned int nId);
-
- /**
- * Method that removes all the pairs that contains the a given id is a given component position.
- * @param vectorPairNodesScore the vector of pair nodes and score
- * @param component is the component position to be analyzed
- * @param nId is the searched id
- * @return the number of deleted pairs
- */
- unsigned int DeleteEntriesByIdNode(Vector_Pair_PairNodes_Score& vectorPairNodesScore, unsigned int component, unsigned int nId);
-
- /**
- * Method that compares all the actual branches to all branches in the tree given by parameter
- * @param treeB in the tree to be compared with
- */
- Vector_Pair_PairNodes_Score CompareAllBranches(AirwaysTree& treeB);
-
- /**
- * Method that return the composed edge from the root node to the node whose id is given by parameter
- * @param idNode is the id of the node where the complex edge ends.
- */
- Edge* GetComposedEdge(unsigned int idNode);
-
- /**
- * Method that detaches a node and return a tree with a root and just the detaches node
- * @param nId is the id node to be searched
- * @return a tree with a root and just the detaches node
- */
- AirwaysTree* GetSingleDetachedTreeNodeById(unsigned int nId);
-
- void UpdateLevels(unsigned int levels = 0);
-
- void SubIsomorphism(AirwaysTree& treeB);
-
- bool Isomorphism(AirwaysTree& tree);
-
- void ImageReconstructionFromNode(TInputImage::Pointer& result, Node* node, bool skeleton = false);
-
- void ImageReconstruction(TInputImage::Pointer& result, bool skeleton = false, Node* node = NULL);
-
- void ImageReconstructionBySpheres(TInputImage::Pointer& result, Node* node = NULL, bool useMarks = false);
-
-
- /**
- * Method that prints the airway up to a given level
- * @level is the level where the printing stops
- */
- void printUpToLevel(int level);
-
- void printNodeAndChildrenIds();
-
- /**
- * Method that creates the quaternions of the airways up to a given level
- * @level is the level where the creation stops.
- * @pre level >= 2
- */
- void createQuaternionsUpToLevel(int level);
-
- /**
- * Method that prints the statistics of number of bifurcations in each node
- */
- void getStatisticsBifurcations();
-
- void saveAirwayAsVTK(const std::string filename, bool common = false);
-
- /**
- * Method that save the airways in a image
- * @param filename is the name of the image to be saved
- * @param dims is the image dimensions
- * @param spacing is the image spacing
- * @param origin is the image origin
- */
- void saveAirwayToImage(std::string filename, int dims[3], double spc[3], double origin[3]);
-
- /**
- * Method that draws a line in an image
- * @initVoxel is the initial voxel
- * @endVoxel is the final voxel
- * @imagePointer is the image pointer
- */
- void drawLineInImage(Vec3 initVoxel, Vec3 endVoxel, TInputImage::Pointer imagePointer);
-
- void drawLine(int* pixelPointInit, int* pixelPointEnd, TInputImage::Pointer _imagePointer);
-
-
-protected:
-
- Node* GetNode(const Vec3 nodeCoords, Node* current = NULL);
-
- Node* GetLeaf(Node* current = NULL);
-
- void UpdateEdges(Node* node = NULL);
-
- AirwaysTree& GetSubTreeByDetachingNode(Node* node);
-
- /**
- * Method that adds an edge to the graph given by parameter
- * @param source is the source vertex of the edge
- * @param target is the target vertex of the edge
- * @param graph is the graph to add the new edge
- */
- DiGraph_EdgePair AddBoostEdge(const pair_posVox_rad& source, const pair_posVox_rad& target, DiGraph& graph);
-
- bool FindNeighborhood(DiGraph& graph, Vec3Queue& queue, Vec3List& used, const Vec3& end, ConstNeighborhoodIterator& iterator);
-
- /**
- * Method that return the shortest* path between two nodes, begin and end. *As we are dealing with arborescent trees
- * then there is just one path between two nodes!
- * The path goes from the end to the begin pixel!
- * @param graph containing all the nodes and edges
- * @param begin is the starting node
- * @param end is the ending node
- * @return the shortest path between the starting and ending nodes or vertices.
- */
- DiGraph GetGraphShortestPath(const DiGraph& graph, const Vec3& begin, const Vec3& end);
-
- vec_pair_posVox_rad GetGraphShortestPath_AMP(const DiGraph& graph, const Vec3& begin, const Vec3& end);
-
- vec_pair_posVox_rad GetSkeletonInfoFromEdge(const Vec3& begin, const Vec3& end);
-
- bool ComputeSimpleRegionGrowing(TInputImage::Pointer& img, const Vec3 seedPtn);
-
- void RemoveBranchFromImage(TInputImage::Pointer& img, Node* node);
-
- void CreateSpheres(TInputImage::Pointer& img, Node* node);
-
- void CalculateVTKLinesFromEdges(const Node* node, const unsigned int& parentId,
- unsigned int& cId, vtkSmartPointer<vtkPoints>& pts,
- vtkSmartPointer<vtkCellArray>& lines,
- vtkSmartPointer<vtkUnsignedCharArray>& colors, bool common);
- void FillTree(Node* node);
-
-protected:
-
- std::string m_img_name;
- std::string m_result_path;
- TInputImage::Pointer m_skeleton;
- TInputImage::Pointer m_img;
- Node* m_root;
- vec_nodes m_nodes;
- EdgeVector m_edges;
-};
-} /* namespace airways */
-
-#endif /* AIRWAYSTREE_H_ */
+++ /dev/null
-/*
- * airwaysTreeTypeDefinition.h
- *
- * Created on: May 19, 2014
- * Author: caceres
- */
-
-#ifndef AIRWAYSTREETYPEDEFINITION_H_
-#define AIRWAYSTREETYPEDEFINITION_H_
-
-//std
-#include <vector>
-#include <queue>
-#include <cstddef>
-#include <utility>
-//boost
-#include <boost/graph/adjacency_list.hpp>
-//itk
-#include "itkImage.h"
-#include "itkConnectedComponentImageFilter.h"
-#include "itkConstNeighborhoodIterator.h"
-#include "itkImageDuplicator.h"
-#include "itkSphereSpatialFunction.h"
-#include "itkConnectedThresholdImageFilter.h"
-#include "itkSubtractImageFilter.h"
-#include "itkCastImageFilter.h"
-//airways
-#include "../MathLib/vec3.h"
-#include "airwaysNode.h"
-#include "airwaysEdge.h"
-
-namespace airways
-{
- typedef std::pair<Vec3, double> pair_posVox_rad;
- typedef std::vector<pair_posVox_rad> vec_pair_posVox_rad;
-
- /**
- * Pair of id nodes
- */
-
-
- /**
- * Pair of a pair of nodes and a score
- */
- //typedef std::pair<pair_node_node,double> Pair_PairNodes_Score;
-
- //----------------------------------------------------------------------------
- /*
- * Typedef declaration
- */
- /**
- * @typedef Defines a graph using the Boost DiGraph library
- */
- typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS,
- pair_posVox_rad> DiGraph;
- //end typedef Graph
- //--------------------------------------------------------------------------
- /**
- * @typedef Defines boost::vertex_descriptor of DiGraph
- */
- typedef boost::graph_traits<DiGraph>::vertex_descriptor DiGraph_VertexDescriptor;
- //--------------------------------------------------------------------------
- ///DiGraph edge_descriptor
- typedef boost::graph_traits<DiGraph>::edge_descriptor DiGraph_EdgeDescriptor;
- //--------------------------------------------------------------------------
- ///DiGraph edge pair
- typedef std::pair<DiGraph_EdgeDescriptor, bool> DiGraph_EdgePair;
- //--------------------------------------------------------------------------
- ///DiGraph Vertex IndexMap
- typedef boost::property_map<DiGraph, boost::vertex_index_t>::type DiGraph_VertexIndexMap;
- //--------------------------------------------------------------------------
- ///DiGraph VertexIterator
- typedef boost::graph_traits<DiGraph>::vertex_iterator DiGraph_VertexIterator;
- //--------------------------------------------------------------------------
- ///DiGraph Vertex iterator pair
- typedef std::pair<DiGraph_VertexIterator, DiGraph_VertexIterator> DiGraph_VertexIteratorPair;
- //--------------------------------------------------------------------------
- ///DiGraph Edge iterator
- typedef boost::graph_traits<DiGraph>::edge_iterator DiGraph_EdgeIterator;
- //--------------------------------------------------------------------------
- ///DiGraph In Edge iterator
- typedef boost::graph_traits<DiGraph>::in_edge_iterator DiGraph_InEdgeIterator;
- //--------------------------------------------------------------------------
- ///DiGraph Out Edge iterator
- typedef boost::graph_traits<DiGraph>::out_edge_iterator DiGraph_OutEdgeIterator;
- //--------------------------------------------------------------------------
- ///DiGraph Adjacency iterator
- typedef boost::graph_traits<DiGraph>::adjacency_iterator DiGraph_AdjacencyIterator;
- //--------------------------------------------------------------------------
- ///DiGraph Vertex descriptor vector
- typedef std::vector<DiGraph_VertexDescriptor> DiGraph_VertexVector;
- //--------------------------------------------------------------------------
- ///DiGraph Vertex descriptor queue
- typedef std::queue<DiGraph_VertexDescriptor> DiGraph_VertexQueue;
- //--------------------------------------------------------------------------
- ///DiGraph Edge descriptor vector
- typedef std::vector<DiGraph_EdgeDescriptor> DiGraph_EdgeVector;
- //----------------------------------------------------------------------------
- const unsigned int Dim = 3;
- typedef double TPixel;
- typedef unsigned char TPixel2;
- typedef itk::Image<TPixel, Dim> TInputImage;
- typedef itk::Image<TPixel2, Dim> TInputImage2;
- typedef itk::Image<unsigned short, Dim> TInputImage3;
- //----------------------------------------------------------------------------
- typedef itk::ImageDuplicator<TInputImage> DuplicatorType;
- //--------------------------------------------------------------------------
- typedef itk::ConstNeighborhoodIterator<TInputImage> ConstNeighborhoodIterator;
- typedef itk::ImageRegionIterator<TInputImage> RegionIterator;
- //----------------------------------------------------------------------------
- typedef itk::SphereSpatialFunction<> SphereType;
- //----------------------------------------------------------------------------
- typedef itk::ConnectedThresholdImageFilter<TInputImage, TInputImage> ConnectedFilterType;
- //----------------------------------------------------------------------------
- typedef itk::SubtractImageFilter<TInputImage, TInputImage> SubtractImageFilterType;
- //----------------------------------------------------------------------------
- typedef itk::CastImageFilter<TInputImage, TInputImage2> CastFilterType;
- typedef itk::ConnectedComponentImageFilter<TInputImage2, TInputImage3> ConnectedComponentImageFilterType;
- //----------------------------------------------------------------------------
-
- //----------------------------------------------------------------------------
- typedef std::vector<Edge*> EdgeVector;
- //----------------------------------------------------------------------------
- typedef std::queue<Vec3> Vec3Queue;
- typedef std::vector<Vec3> Vec3List;
-//
-/*
- * End of typedef declaration
- */
-}
-
-#endif /* AIRWAYSTREETYPEDEFINITION_H_ */
+++ /dev/null
-SUBDIRS(
- MathLib
- AirwaysLib
- )
-
-## eof - $RCSfile$
+++ /dev/null
-## =============================
-## = Set names and directories =
-## =============================
-
-SET(lib_NAME TempAirwaysAppli_MathLib)
-
-## ===============
-## = Source code =
-## ===============
-
-FILE(GLOB lib_HEADERS_H "${CMAKE_CURRENT_SOURCE_DIR}/*.h")
-FILE(GLOB lib_HEADERS_HPP "${CMAKE_CURRENT_SOURCE_DIR}/*.hpp")
-FILE(GLOB lib_HEADERS_HXX "${CMAKE_CURRENT_SOURCE_DIR}/*.hxx")
-FILE(GLOB lib_SOURCES_C "${CMAKE_CURRENT_SOURCE_DIR}/*.c")
-FILE(GLOB lib_SOURCES_CPP "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
-FILE(GLOB lib_SOURCES_CXX "${CMAKE_CURRENT_SOURCE_DIR}/*.cxx")
-
-## =====================
-## = Compilation rules =
-## =====================
-
-ADD_LIBRARY(
- ${lib_NAME}
- SHARED
- ${lib_SOURCES_C}
- ${lib_SOURCES_CPP}
- ${lib_SOURCES_CXX}
- )
-GENERATE_EXPORT_HEADER(
- ${lib_NAME}
- BASE_NAME ${lib_NAME}
- EXPORT_MACRO_NAME ${lib_NAME}_EXPORT
- EXPORT_FILE_NAME ${CMAKE_CURRENT_BINARY_DIR}/${lib_NAME}_Export.h
- STATIC_DEFINE ${lib_NAME}_BUILT_AS_STATIC
- )
-
-## eof - $RCSfile$
+++ /dev/null
-//----------------------------------------------------------------------------
-// Class definition include
-//----------------------------------------------------------------------------
-
-#include "Quaternion.h"
-
-//----------------------------------------------------------------------------
-// Class implementation
-//----------------------------------------------------------------------------
-//----------------------------------------------------------------------------
-// Builder
-//----------------------------------------------------------------------------
-
-Quaternion::Quaternion( )
-{
- theta = 0.0;
- w = Vec3(0,0,0);
- r = cos(theta/2);
- double sinHalfTheta = sin(theta/2);
- im = w*sinHalfTheta;
-}
-
-Quaternion::Quaternion(Vec3 v1, Vec3 v2)
-{
- // Normalize the vectors
- v1.Normalize();
- v2.Normalize();
-
- // Dot product
- float cosTheta = v1.Dot(v2);
- theta = acos(cosTheta);
-
- // Cross product
- w = v1.Cross(v2);
-
- // Normalization
- w.Normalize();
-
- // Build the quaternion
- r = cos(theta/2);
- double sinHalfTheta = sin(theta/2);
- im = w*sinHalfTheta;
-}
-
-Quaternion::Quaternion(float nTheta, Vec3 nW)
-{
- theta = nTheta;
- w = nW;
- w.Normalize();
-
- // Build the quaternion
- r = cos(theta/2);
- double sinHalfTheta = sin(theta/2);
- im = w*sinHalfTheta;
-}
-
-Quaternion::Quaternion(float nR, float nI, float nJ, float nK)
-{
- r = nR;
- im = Vec3(nI, nJ, nK);
-
- theta = 2*acos(r);
- double sinHalfTheta = sin(theta/2);
- w = im/sinHalfTheta;
-}
-
-//----------------------------------------------------------------------------
-// Destructor
-//----------------------------------------------------------------------------
-
-Quaternion::~Quaternion( )
-{
-
-}
-//----------------------------------------------------------------------------
-// Methods
-//----------------------------------------------------------------------------
-
-float Quaternion::getR()
-{
- return r;
-}
-
-float Quaternion::getI()
-{
- return w[0];
-}
-
-float Quaternion::getJ()
-{
- return w[1];
-}
-
-float Quaternion::getK()
-{
- return w[2];
-}
-
-Vec3 Quaternion::getW()
-{
- return w;
-}
-
-Quaternion Quaternion::conjugate( )
-{
- return Quaternion(theta, -w);
-}
-
-Vec3 Quaternion::rotateVector(Vec3 vector)
-{
- // Quaterion representing the vector
- vector.Normalize();
- Quaternion qv(0,vector[0],vector[1],vector[2]);
- Quaternion qthis(r,im[0],im[1],im[2]);
- Quaternion qthis_conj = qthis.conjugate();
-
-
- cout << "Qv: [" << qv << "]" << endl;
- cout << "Qthis: [" << qthis << "]" << endl;
- cout << "QthisConj: [" << qthis_conj << "]" << endl;
-
- // Final quaternion
- Quaternion Qtemp = qthis*qv;
- cout << "Qtemp: [" << Qtemp << "]" << endl;
-
- Quaternion qf = Qtemp*qthis_conj;
-
- cout << "Qf: [" << qf << "]" << endl;
-
- return qf.im;
- //return Vec3(0,0,0);
-}
-
-//----------------------------------------------------------------------------
-// Operators
-//----------------------------------------------------------------------------
-
-const float& Quaternion::operator[](unsigned int i) const
-{
- return (i == 0 ? r : (im)[i-1]);
-}
-
-Quaternion Quaternion::operator*(Quaternion q)
-{
- float a1 = this->r;
- float b1 = this->w[0];
- float c1 = this->w[1];
- float d1 = this->w[2];
-
- float a2 = q.r;
- float b2 = q.w[0];
- float c2 = q.w[1];
- float d2 = q.w[2];
-
- float r_n = a1*a2 - b1*b2 - c1*c2 - d1*d2;
- float i_n = a1*b2 + a2*b1 + c1*d2 - c2*d1;
- float j_n = a1*c2 - b1*d2 + a2*c1 + b2*d1;
- float k_n = a1*d2 + b1*c2 - b2*c1 + a2*d1;
-
- return Quaternion(r_n, i_n, j_n, k_n);
-}
-
-std::ostream& operator<<(std::ostream& os, const Quaternion& q)
-{
- os << q[0] << " " << q[1] << " " << q[2] << " " << q[3];
- os << " " <<q.theta*180/M_PI << " " << q.w;
- return os;
-}
+++ /dev/null
-/**
- * Class that represents a Quaternion
- * Author: Alfredo Morales Pinzón
- * Date: October 7, 2014
- */
-
-#ifndef __Quaternion_h__
-#define __Quaternion_h__
-
-//-----------------
-// C++
-//-----------------
-#include <math.h>
-
-//-----------------
-// OWN
-//-----------------
-#include <Airways/MathLib/TempAirwaysAppli_MathLib_Export.h>
-#include "vec3.h"
-
-// Namespaces
-using namespace std;
-
-//------------------------------------------------------------------------------
-// Class that represents a Quaterion with all its operations
-//------------------------------------------------------------------------------
-class TempAirwaysAppli_MathLib_EXPORT Quaternion
-{
-public:
-
- //------------------------------------------------------------
- //Builder
- //------------------------------------------------------------
-
- /*
- * Class builder
- */
- Quaternion( );
-
- /*
- * Class builder using two vectors
- * @param v1 is the first vector
- * @param v2 is the second vector
- */
- Quaternion(Vec3 v1, Vec3 v2);
-
- /*
- * Class builder using theta and w vector
- * @param nTheta is the theta angle
- * @param nW is the w vector
- */
- Quaternion(float nTheta, Vec3 nW);
-
- /*
- * Class builder using r and im
- * @param nR in the real part of the quaternion
- * @param nI, nJ and nK are the imaginary parts of the quaternion
- */
- Quaternion(float nR, float nI, float nJ, float nK);
-
- //------------------------------------------------------------
- //Destructor
- //------------------------------------------------------------
-
- ~Quaternion();
-
- //------------------------------------------------------------
- //Public methods
- //------------------------------------------------------------
-
- /**
- * Method that returns the real (r) component
- * @return the r component
- */
- float getR();
-
- /**
- * Method that returns the i component
- * @return the i component
- */
- float getI();
-
- /**
- * Method that returns the j component
- * @return the j component
- */
- float getJ();
-
- /**
- * Method that returns the k component
- * @return the k component
- */
- float getK();
-
- /**
- * Method that returns the w vector
- * @return the w vector
- */
- Vec3 getW();
-
- /**
- * Method that returns the conjugate of the quaternion
- * @return the conjugate of the quaternion
- */
- Quaternion conjugate( );
-
- /**
- * Method that returns a vector transformed by the quaternion
- * @param vector to be rotated
- * @return the transformed vector
- */
- Vec3 rotateVector(Vec3 vector);
-
- //------------------------------------------------------------
- //Operators
- //------------------------------------------------------------
-
- /*
- * Definition of operator *
- * @param is the quaternion to be multiplied with
- * @return the multiplication quaternion
- */
- Quaternion operator*(Quaternion q);
-
- /**
- * Definition of operator []
- * @param Position of the quanternion to be returned. Position 0 corresponds
- * to the real component and 1, 2, and 3 to the complex components.
- * @param The value on the specified position is returned.
- *
- */
- const float& operator[](unsigned int i) const;
-
- /**
- * Operator to print
- */
- friend std::ostream& operator<<(std::ostream& os, const Quaternion& coord);
-
-
-private:
-
- //------------------------------------------------------------
- //Private methods
- //------------------------------------------------------------
-
-
- //------------------------------------------------------------
- //Atributes
- //------------------------------------------------------------
-
- /**
- * Real part of the quaternion
- */
- float r;
-
- /**
- * Angle between vectors
- */
- float theta;
-
- /**
- * Rotation vector
- */
- Vec3 w;
-
- /**
- * Vector the quaternion
- */
- Vec3 im;
-
-};
-
-//------------------------------------------------------------------------------
-#endif
+++ /dev/null
-#include "vec3.h"
-
-
-Vec3::Vec3() : x(0.0), y(0.0), z(0.0)
-{
-}
-
-Vec3::Vec3(const float& x, const float& y, const float& z)
-{
- this->x = x;
- this->y = y;
- this->z = z;
-}
-
-const float* Vec3::GetVec3() const
-{
- float* ret = new float[3];
- ret[0] = this->x;
- ret[1] = this->y;
- ret[2] = this->z;
- return ret;
-}
-
-float* Vec3::GetVec3()
-{
- float* ret = new float[3];
- ret[0] = this->x;
- ret[1] = this->y;
- ret[2] = this->z;
- return ret;
-}
-
-Vec3& Vec3::operator=(const Vec3& vec)
-{
- this->x = vec.x;
- this->y = vec.y;
- this->z = vec.z;
- return *this;
-}
-
-float& Vec3::operator[](unsigned int i)
-{
- return (i == 0 ? x : i == 1 ? y : z);
-}
-
-const float& Vec3::operator[](unsigned int i) const
-{
- return (i == 0 ? this->x : i == 1 ? this->y : this->z);
-}
-
-Vec3 Vec3::operator+() const
-{
- return *this;
-}
-
-Vec3 Vec3::operator-() const
-{
- return Vec3(-this->x, -this->y, -this->z);
-}
-
-Vec3& Vec3::operator+=(const Vec3& b)
- {
- this->x += b.x;
- this->y += b.y;
- this->z += b.z;
- return *this;
- }
-
-Vec3& Vec3::operator-=(const Vec3& b)
- {
- this->x -= b.x;
- this->y -= b.y;
- this->z -= b.z;
- return *this;
- }
-
-Vec3& Vec3::operator*=(const float& k)
- {
- this->x *= k;
- this->y *= k;
- this->z *= k;
- return *this;
- }
-
-Vec3& Vec3::operator/=(const float& k)
- {
- this->x /= k;
- this->y /= k;
- this->z /= k;
- return *this;
- }
-
-Vec3 Vec3::operator+(const Vec3& b)
-{
- return Vec3(this->x + b.x, this->y + b.y, this->z + b.z);
-}
-
-Vec3 Vec3::operator-(const Vec3& b)
-{
- return Vec3(this->x - b.x, this->y - b.y, this->z - b.z);
-}
-
-Vec3 Vec3::operator*(const float& k)
-{
- return Vec3(this->x * k, this->y * k, this->z * k);
-}
-
-Vec3 Vec3::operator/(const float& k)
-{
- return Vec3(this->x / k, this->y / k, this->z / k);
-}
-
-bool Vec3::operator==(const Vec3& b) const
-{
- //double epsilon = std::numeric_limits<double>::epsilon();
- //return (fabs(this->x - b.x) <= epsilon) && (fabs(this->y - b.y) <= epsilon)
- //&& (fabs(this->z - b.z) <= epsilon);
- return this->x == b.x && this->y == b.y && this->z == b.z;
-}
-
-bool Vec3::operator!=(const Vec3& b) const
- {
- return (!(*this == b));
- }
-
-bool Vec3::operator<(const Vec3& b) const
-{
- if(this->x < b.x)
- return true;
- else if(this->x > b.x)
- return false;
- else
- {
- if(this->y < b.y)
- return true;
- else if(this->y > b.y)
- return false;
- else
- {
- if(this->z < b.z)
- return true;
- return false;
- }
- }
-}
-
-bool Vec3::operator>(const Vec3& b)
-{
- if(this->x > b.x)
- return true;
- else if(this->x < b.x)
- return false;
- else
- {
- if(this->y > b.y)
- return true;
- else if(this->y < b.y)
- return false;
- else
- {
- if(this->z > b.z)
- return true;
- return false;
- }
- }
-}
-
-float Vec3::Norm() const
-{
- return sqrt(this->x * this->x + this->y * this->y + this->z * this->z);
-}
-
-void Vec3::Normalize()
-{
- float norm = sqrt(this->x * this->x + this->y * this->y + this->z * this->z);
- this->x = this->x / norm;
- this->y = this->y / norm;
- this->z = this->z / norm;
-}
-
-void Vec3::set(const float& x, const float& y, const float& z)
-{
- this->x = x;
- this->y = y;
- this->z = z;
-}
-
-float Vec3::Dot(const Vec3& b) const
-{
- return (this->x * b.x + this->y * b.y + this->z * b.z);
-}
-
-Vec3 Vec3::Orthogonal(const Vec3& b) const
-{
- Vec3 u = Vec3(fabs(b.x), fabs(b.y), fabs(b.z));
- int i = 0;
- int j = 1;
- if ((u.x > u.y) && (u.z > u.y))
- j = 2;
- else
- {
- i = 1;
- j = 2;
- if (u.x > u.z)
- j = 0;
- }
- u = Vec3();
- u[i] = b[j];
- u[j] = -b[i];
- return u;
-}
-
-Vec3 Vec3::Cross(const Vec3& b) const
-{
- return Vec3(this->y * b.z - this->z * b.y, this->z * b.x - this->x * b.z,
- this->x * b.y - this->y * b.x);
-}
-
-
-float Vec3::EculideanDistance(const Vec3& b) const
-{
- return sqrt(
- pow(this->x - b.x, 2.0) + pow(this->y - b.y, 2.0)
- + pow(this->z - b.z, 2.0));
-}
-
-std::ostream&
-operator<<(std::ostream& os, const Vec3& coord)
-{
- os << coord[0] << " " << coord[1] << " " << coord[2];
- return os;
-}
-
+++ /dev/null
-/**
- * Class that models a vector in 3D
- * Author: Diego Cáceres
- * Modifications by: Alfredo Morales Pinzón
- * Date modifications: Octobre 7, 2014
- */
-#ifndef VEC3_H
-#define VEC3_H
-
-#include <Airways/MathLib/TempAirwaysAppli_MathLib_Export.h>
-#include <cmath>
-#include <iostream>
-#include <limits> // std::numeric_limits
-
-//------------------------------------------------------------------------------
-/**
- * @brief The Vec3 class that represents a vector in 3D
- */
-class TempAirwaysAppli_MathLib_EXPORT Vec3
-{
-private:
- float x, y, z; //!< Coordinates
-public:
- //----------------------------------------------------------------------------
- /**
- * @brief Vec3
- */
- Vec3();
- //----------------------------------------------------------------------------
- /**
- * @brief Vec3
- * @param x
- * @param y
- * @param z
- */
- Vec3(const float& x, const float& y, const float& z);
- //----------------------------------------------------------------------------
- //Getters
- //----------------------------------------------------------------------------
- /**
- * @brief GetVec3
- * @return
- */
- const float* GetVec3() const;
- //----------------------------------------------------------------------------
- /**
- * @brief GetVec3
- * @return
- */
- float* GetVec3();
- //----------------------------------------------------------------------------
- /**
- * @brief Norm
- * @return
- */
- float Norm() const;
-
- /**
- * Method that normalizes the vector. v = v/|v|
- */
- void Normalize();
-
- /**
- * Method that sets all the values
- */
- void set(const float& x, const float& y, const float& z);
-
- /**
- * @brief Dot
- * @param b
- * @return
- */
- float Dot(const Vec3& b) const;
- //----------------------------------------------------------------------------
- /**
- * @brief Orthogonal
- * @param b
- * @return
- */
- Vec3 Orthogonal(const Vec3& b) const;
- //----------------------------------------------------------------------------
- /**
- * @brief Cross
- * @param b
- * @return
- */
- Vec3 Cross(const Vec3& b) const;
- //----------------------------------------------------------------------------
- /**
- * @brief EculideanDistance between two points
- * @param b
- * @return
- */
- float EculideanDistance(const Vec3& b) const;
- //----------------------------------------------------------------------------
- //Operator Overloads
- //----------------------------------------------------------------------------
- /**
- * @brief The copy operator
- * @param vec
- * @return
- */
- Vec3& operator=(const Vec3& vec);
- //----------------------------------------------------------------------------
- /**
- * @brief operator []
- * @param i
- * @return
- */
- float& operator[](unsigned int i);
- //----------------------------------------------------------------------------
- /**
- * @brief operator []
- * @param i
- * @return
- */
- const float& operator[](unsigned int i) const;
- //----------------------------------------------------------------------------
- /**
- * @brief operator +
- * @return
- */
- Vec3 operator+() const;
- //----------------------------------------------------------------------------
- /**
- * @brief operator -
- * @return
- */
- Vec3 operator-() const;
- //----------------------------------------------------------------------------
- /**
- * @brief operator +=
- * @param b
- * @return
- */
- Vec3& operator+=(const Vec3& b);
- //----------------------------------------------------------------------------
- /**
- * @brief operator -=
- * @param b
- * @return
- */
- Vec3& operator-=(const Vec3& b);
- //----------------------------------------------------------------------------
- /**
- * @brief operator *=
- * @param k
- * @return
- */
- Vec3& operator*=(const float& k);
- //----------------------------------------------------------------------------
- /**
- * @brief operator /=
- * @param k
- * @return
- */
- Vec3& operator/=(const float& k);
- //----------------------------------------------------------------------------
- /**
- * @brief operator +
- * @param b
- * @return
- */
- Vec3 operator+(const Vec3& b);
- //----------------------------------------------------------------------------
- /**
- * @brief operator -
- * @param b
- * @return
- */
- Vec3 operator-(const Vec3& b);
- //----------------------------------------------------------------------------
- /**
- * @brief operator *
- * @param k
- * @return
- */
- Vec3 operator*(const float& k);
- //----------------------------------------------------------------------------
- /**
- * @brief operator /
- * @param k
- * @return
- */
- Vec3 operator/(const float& k);
- //----------------------------------------------------------------------------
- /**
- * @brief operator ==
- * @param b
- * @return
- */
- bool operator==(const Vec3& b) const;
- //----------------------------------------------------------------------------
- /**
- * @brief operator !=
- * @param b
- * @return
- */
- bool operator!=(const Vec3& b) const;
- //----------------------------------------------------------------------------
- /**
- * @brief operator <
- * @param b
- * @return
- */
- bool operator<(const Vec3& b) const;
- //----------------------------------------------------------------------------
- /**
- * @brief operator >
- * @param b
- * @return
- */
- bool operator>(const Vec3& b);
- //----------------------------------------------------------------------------
- friend std::ostream& operator<<(std::ostream& os, const Vec3& coord);
- //----------------------------------------------------------------------------
-
-};
-//------------------------------------------------------------------------------
-
-#endif // VEC3_H
+++ /dev/null
-#ifndef __AIRWAYS__FPA2AIRWAYS__CONVERTER__H__
-#define __AIRWAYS__FPA2AIRWAYS__CONVERTER__H__
-
-#include <itkProcessObject.h>
-#include <itkSimpleDataObjectDecorator.h>
-
-namespace fpa2Airways
-{
- /**
- */
- template< class _TSkeleton, class _TAirways >
- class Converter
- : public itk::ProcessObject
- {
- public:
- typedef Converter Self;
- typedef itk::ProcessObject Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef _TSkeleton TSkeleton;
- typedef _TAirways TAirways;
- typedef itk::SimpleDataObjectDecorator< _TAirways* > TOutput;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( Converter, itk::ProcessObject );
-
- public:
- void SetInput( const TSkeleton* sk );
- TSkeleton* GetInput( );
- const TSkeleton* GetInput( ) const;
- TAirways* GetOutput( );
- const TAirways* GetOutput( ) const;
-
- protected:
- Converter( );
- virtual ~Converter( );
-
- virtual void GenerateData( ) ITK_OVERRIDE;
-
- private:
- // Purposely not implemented.
- Converter( const Self& );
- Self& operator=( const Self& );
- };
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <Airways/fpa2Airways/Converter.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __AIRWAYS__FPA2AIRWAYS__CONVERTER__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __AIRWAYS__FPA2AIRWAYS__CONVERTER__HXX__
-#define __AIRWAYS__FPA2AIRWAYS__CONVERTER__HXX__
-
-// -------------------------------------------------------------------------
-template< class _TSkeleton, class _TAirways >
-void fpa2Airways::Converter< _TSkeleton, _TAirways >::
-SetInput( const _TSkeleton* sk )
-{
- this->itk::ProcessObject::SetNthInput( 0, const_cast< _TSkeleton* >( sk ) );
-}
-
-// -------------------------------------------------------------------------
-template< class _TSkeleton, class _TAirways >
-_TSkeleton* fpa2Airways::Converter< _TSkeleton, _TAirways >::
-GetInput( )
-{
- return(
- dynamic_cast< _TSkeleton* >( this->itk::ProcessObject::GetInput( 0 ) )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class _TSkeleton, class _TAirways >
-const _TSkeleton* fpa2Airways::Converter< _TSkeleton, _TAirways >::
-GetInput( ) const
-{
- return(
- dynamic_cast< const _TSkeleton* >(
- this->itk::ProcessObject::GetInput( 0 )
- )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class _TSkeleton, class _TAirways >
-_TAirways* fpa2Airways::Converter< _TSkeleton, _TAirways >::
-GetOutput( )
-{
- auto o = dynamic_cast< _TAirways* >(
- this->itk::ProcessObject::GetOutput( 0 )
- );
- return( o->Get( ) );
-}
-
-// -------------------------------------------------------------------------
-template< class _TSkeleton, class _TAirways >
-const _TAirways* fpa2Airways::Converter< _TSkeleton, _TAirways >::
-GetOutput( ) const
-{
- auto o = dynamic_cast< const _TAirways* >(
- this->itk::ProcessObject::GetOutput( 0 )
- );
- return( o->Get( ) );
-}
-
-// -------------------------------------------------------------------------
-template< class _TSkeleton, class _TAirways >
-fpa2Airways::Converter< _TSkeleton, _TAirways >::
-Converter( )
- : Superclass( )
-{
- this->SetNumberOfRequiredInputs( 1 );
- this->SetNumberOfRequiredOutputs( 1 );
- typename TOutput::Pointer o = TOutput::New( );
- this->itk::ProcessObject::SetNthOutput( 0, o.GetPointer( ) );
-}
-
-// -------------------------------------------------------------------------
-template< class _TSkeleton, class _TAirways >
-fpa2Airways::Converter< _TSkeleton, _TAirways >::
-~Converter( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class _TSkeleton, class _TAirways >
-void fpa2Airways::Converter< _TSkeleton, _TAirways >::
-GenerateData( )
-{
-}
-
-#endif // __AIRWAYS__FPA2AIRWAYS__CONVERTER__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-IF(BUILD_TempAirwaysAppli)
- SUBDIRS(
- Airways
- )
-ENDIF(BUILD_TempAirwaysAppli)
-IF(BUILD_PLUGINS)
- SUBDIRS(
- fpa_Instances
- )
-ENDIF(BUILD_PLUGINS)
-
-## eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__ALGORITHM__H__
-#define __FPA__BASE__ALGORITHM__H__
-
-#include <map>
-#include <utility>
-#include <vector>
-#include <fpa/Base/Events.h>
-
-namespace fpa
-{
- namespace Base
- {
- /**
- * Base front propagation algorithm. From a series of start seeds with
- * costs, a priority queue is filled and emptied updating costs. Each
- * vertex could be marked as "visited", "in the front", "not yet there"
- * or "freezed".
- *
- * @param V Vertex type.
- * @param C Vertex value type.
- * @param R Result value type.
- * @param S Space type where vertices are.
- * @param VC Vertex lexicographical compare.
- * @param B Base class for this algorithm. It should be any itk-based
- * filter (itk::ProcessObject).
- *
- */
- template< class V, class C, class R, class S, class VC, class B >
- class Algorithm
- : public B
- {
- public:
- typedef Algorithm Self;
- typedef B Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef V TVertex;
- typedef C TValue;
- typedef R TResult;
- typedef S TSpace;
- typedef VC TVertexCompare;
-
- fpa_Base_NewEvent( TStartEvent );
- fpa_Base_NewEvent( TStartLoopEvent );
- fpa_Base_NewEvent( TStartBacktrackingEvent );
- fpa_Base_NewEvent( TEndEvent );
- fpa_Base_NewEvent( TEndLoopEvent );
- fpa_Base_NewEvent( TEndBacktrackingEvent );
- fpa_Base_NewEventWithVertex( TAliveEvent, TVertex );
- fpa_Base_NewEventWithVertex( TFrontEvent, TVertex );
- fpa_Base_NewEventWithVertex( TFreezeEvent, TVertex );
- fpa_Base_NewEventWithVertex( TBacktrackingEvent, TVertex );
-
- protected:
- typedef std::vector< TVertex > _TVertices;
- typedef std::pair< TVertex, bool > _TCollision;
- typedef std::vector< _TCollision > _TCollisionsRow;
- typedef std::vector< _TCollisionsRow > _TCollisions;
-
- /**
- */
- enum _TNodeLabel
- {
- FarLabel = 0,
- FrontLabel,
- AliveLabel
- };
-
- /**
- */
- class _TNode
- {
- public:
- _TNode( );
- virtual ~_TNode( );
-
- public:
- TVertex Parent;
- TResult Result;
- short FrontId;
- char Label;
- };
- typedef std::map< TVertex, _TNode, TVertexCompare > _TNodes;
-
- public:
- itkTypeMacro( Algorithm, B );
-
- itkBooleanMacro( ThrowEvents );
- itkBooleanMacro( StopAtOneFront );
-
- itkGetConstMacro( ThrowEvents, bool );
- itkGetConstMacro( StopAtOneFront, bool );
-
- itkSetMacro( ThrowEvents, bool );
- itkSetMacro( StopAtOneFront, bool );
-
- public:
- virtual void InvokeEvent( const itk::EventObject& e );
- virtual void InvokeEvent( const itk::EventObject& e ) const;
-
- void AddSeed( const TVertex& s, const TResult& r );
- const TVertex& GetSeed( const unsigned int& id ) const;
- void ClearSeeds( );
- unsigned long GetNumberOfSeeds( ) const;
-
- protected:
- Algorithm( );
- virtual ~Algorithm( );
-
- // Connection with itk's pipeline
- virtual void GenerateData( ) ITK_OVERRIDE;
-
- // Main loop algorithm
- virtual void _Loop( );
-
- // Supporting methods for loop
- virtual void _BeforeGenerateData( );
- virtual void _AfterGenerateData( );
- virtual void _BeforeLoop( );
- virtual void _AfterLoop( );
-
- // Methods to control forced stops
- virtual bool _UpdateCollisions( const TVertex& a, const TVertex& b );
- virtual bool _NeedToStop( ) const;
-
- // Graph-related abstract methods
- virtual unsigned long _NumberOfVertices( ) const = 0;
- virtual const TValue& _VertexValue( const TVertex& v ) const = 0;
- virtual double _Distance(
- const TVertex& a, const TVertex& b
- ) const = 0;
- virtual bool _HasEdge( const TVertex& a, const TVertex& b ) const = 0;
- virtual void _Neighborhood(
- _TVertices& neighborhood, const TVertex& v
- ) const = 0;
-
- // Results-related abstract methods
- virtual bool _ComputeNeighborResult(
- TResult& result, const TVertex& neighbor, const TVertex& parent
- ) const = 0;
- virtual void _InitResults( ) = 0;
- virtual const TResult& _Result( const TVertex& v ) const = 0;
- virtual void _SetResult( const TVertex& v, const _TNode& n );
-
- // Marks-related abstract methods
- virtual _TNode& _Node( const TVertex& v );
- virtual const _TNode& _Node( const TVertex& v ) const;
- virtual void _InitMarks( );
- virtual void _Mark( const TVertex& v, const _TNode& node );
-
- // Queue-related abstract methods
- virtual void _InitQueue( );
- virtual bool _IsQueueEmpty( ) const = 0;
- virtual void _QueuePush( const TVertex& v, const _TNode& n ) = 0;
- virtual void _QueuePop( TVertex& v, _TNode& n ) = 0;
- virtual void _QueueClear( ) = 0;
-
- private:
- // Purposely not implemented
- Algorithm( const Self& other );
- Self& operator=( const Self& other );
-
- protected:
- bool m_ThrowEvents;
- bool m_StopAtOneFront;
- _TNodes m_Seeds;
- _TVertices m_SeedVertices;
- _TNodes m_Marks;
- _TCollisions m_Collisions;
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Base/Algorithm.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__BASE__ALGORITHM__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__ALGORITHM__HXX__
-#define __FPA__BASE__ALGORITHM__HXX__
-
-#include <queue>
-#include <itkProcessObject.h>
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-fpa::Base::Algorithm< V, C, R, S, VC, B >::_TNode::
-_TNode( )
- : Result( TResult( 0 ) ),
- FrontId( -1 ),
- Label( Self::FarLabel )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-fpa::Base::Algorithm< V, C, R, S, VC, B >::_TNode::
-~_TNode( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-void fpa::Base::Algorithm< V, C, R, S, VC, B >::
-InvokeEvent( const itk::EventObject& e )
-{
- if( this->m_ThrowEvents )
- this->Superclass::InvokeEvent( e );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-void fpa::Base::Algorithm< V, C, R, S, VC, B >::
-InvokeEvent( const itk::EventObject& e ) const
-{
- if( this->m_ThrowEvents )
- this->Superclass::InvokeEvent( e );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-void fpa::Base::Algorithm< V, C, R, S, VC, B >::
-AddSeed( const TVertex& s, const TResult& r )
-{
- _TNode ns;
- ns.Parent = s;
- ns.Result = r;
- ns.FrontId = this->m_SeedVertices.size( );
- ns.Label = Self::FrontLabel;
- this->m_Seeds[ s ] = ns;
- this->m_SeedVertices.push_back( s );
- this->Modified( );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-const typename fpa::Base::Algorithm< V, C, R, S, VC, B >::
-TVertex& fpa::Base::Algorithm< V, C, R, S, VC, B >::
-GetSeed( const unsigned int& id ) const
-{
- return( this->m_SeedVertices[ id ] );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-void fpa::Base::Algorithm< V, C, R, S, VC, B >::
-ClearSeeds( )
-{
- this->m_Seeds.clear( );
- this->m_SeedVertices.clear( );
- this->Modified( );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-unsigned long fpa::Base::Algorithm< V, C, R, S, VC, B >::
-GetNumberOfSeeds( ) const
-{
- return( this->m_Seeds.size( ) );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-fpa::Base::Algorithm< V, C, R, S, VC, B >::
-Algorithm( )
- : Superclass( ),
- m_ThrowEvents( false ),
- m_StopAtOneFront( false )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-fpa::Base::Algorithm< V, C, R, S, VC, B >::
-~Algorithm( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-void fpa::Base::Algorithm< V, C, R, S, VC, B >::
-GenerateData( )
-{
- unsigned long N = this->m_Seeds.size( );
- if( N == 0 )
- return;
-
- this->InvokeEvent( TStartEvent( ) );
- this->_BeforeGenerateData( );
-
- this->m_Collisions.clear( );
- this->m_Collisions.
- resize( N, _TCollisionsRow( N, _TCollision( TVertex( ), false ) ) );
- this->_InitResults( );
- this->_InitMarks( );
- this->_InitQueue( );
- this->_Loop( );
- this->_AfterGenerateData( );
- this->InvokeEvent( TEndEvent( ) );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-void fpa::Base::Algorithm< V, C, R, S, VC, B >::
-_Loop( )
-{
- this->InvokeEvent( TStartLoopEvent( ) );
- this->_BeforeLoop( );
- while( !( this->_IsQueueEmpty( ) ) )
- {
- // Get next candidate
- TVertex vertex;
- _TNode node;
- this->_QueuePop( vertex, node );
- if( this->_Node( vertex ).Label == Self::AliveLabel )
- continue;
-
- // Mark it as "Alive" and update final result
- node.Label = Self::AliveLabel;
- this->_Mark( vertex, node );
- this->_SetResult( vertex, node );
- this->InvokeEvent( TAliveEvent( vertex, node.FrontId ) );
-
- // Check if a forced stop condition arises
- if( !( this->_NeedToStop( ) ) )
- {
- // Compute neighborhood
- _TVertices neighborhood;
- this->_Neighborhood( neighborhood, vertex );
-
- // Iterate over neighbors
- typename _TVertices::iterator nIt = neighborhood.begin( );
- while( nIt != neighborhood.end( ) )
- {
- _TNode neighbor = this->_Node( *nIt );
- if( neighbor.Label == Self::AliveLabel )
- {
- // Update collisions
- if( this->_UpdateCollisions( vertex, *nIt ) )
- {
- this->_QueueClear( );
- nIt = neighborhood.end( );
- continue;
-
- } // fi
- }
- else
- {
- // Add new candidate to queue
- if( this->_ComputeNeighborResult( neighbor.Result, *nIt, vertex ) )
- {
- neighbor.FrontId = node.FrontId;
- neighbor.Parent = vertex;
- neighbor.Label = Self::FrontLabel;
- this->_QueuePush( *nIt, neighbor );
- this->_Mark( *nIt, neighbor );
- this->InvokeEvent( TFrontEvent( *nIt, node.FrontId ) );
- }
- else
- this->InvokeEvent( TFreezeEvent( *nIt, node.FrontId ) );
-
- } // fi
- ++nIt;
-
- } // elihw
- }
- else
- this->_QueueClear( );
-
- } // elihw
- this->_AfterLoop( );
- this->InvokeEvent( TEndLoopEvent( ) );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-void fpa::Base::Algorithm< V, C, R, S, VC, B >::
-_BeforeGenerateData( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-void fpa::Base::Algorithm< V, C, R, S, VC, B >::
-_AfterGenerateData( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-void fpa::Base::Algorithm< V, C, R, S, VC, B >::
-_BeforeLoop( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-void fpa::Base::Algorithm< V, C, R, S, VC, B >::
-_AfterLoop( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-bool fpa::Base::Algorithm< V, C, R, S, VC, B >::
-_UpdateCollisions( const TVertex& a, const TVertex& b )
-{
- bool ret = false;
- _TNode na = this->_Node( a );
- _TNode nb = this->_Node( b );
- long fa = na.FrontId;
- long fb = nb.FrontId;
-
- if( fa != fb )
- {
- // Mark collision, if it is new
- bool exists = this->m_Collisions[ fa ][ fb ].second;
- exists &= this->m_Collisions[ fb ][ fa ].second;
-
- if( !exists )
- {
- this->m_Collisions[ fa ][ fb ].first = a;
- this->m_Collisions[ fa ][ fb ].second = true;
- this->m_Collisions[ fb ][ fa ].first = b;
- this->m_Collisions[ fb ][ fa ].second = true;
-
- // Stop if one front is desired
- if( this->m_StopAtOneFront )
- {
- // Perform a depth-first iteration on front graph
- unsigned long N = this->GetNumberOfSeeds( );
- 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
- ret = ( count == N );
-
- } // fi
-
- } // fi
-
- } // fi
- return( ret );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-bool fpa::Base::Algorithm< V, C, R, S, VC, B >::
-_NeedToStop( ) const
-{
- return( false );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-typename fpa::Base::Algorithm< V, C, R, S, VC, B >::
-_TNode& fpa::Base::Algorithm< V, C, R, S, VC, B >::
-_Node( const TVertex& v )
-{
- typename _TNodes::iterator vIt = this->m_Marks.find( v );
- if( vIt == this->m_Marks.end( ) )
- {
- _TNode new_node;
- new_node.Parent = v;
- new_node.Result = TResult( 0 );
- new_node.FrontId = -1;
- new_node.Label = Self::FarLabel;
- this->m_Marks[ v ] = new_node;
- vIt = this->m_Marks.find( v );
-
- } // fi
- return( vIt->second );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-void fpa::Base::Algorithm< V, C, R, S, VC, B >::
-_SetResult( const TVertex& v, const _TNode& n )
-{
- // Do nothing at this hierarchy level
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-const typename fpa::Base::Algorithm< V, C, R, S, VC, B >::
-_TNode& fpa::Base::Algorithm< V, C, R, S, VC, B >::
-_Node( const TVertex& v ) const
-{
- typename _TNodes::const_iterator vIt = this->m_Marks.find( v );
- return( vIt->second );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-void fpa::Base::Algorithm< V, C, R, S, VC, B >::
-_InitMarks( )
-{
- this->m_Marks.clear( );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-void fpa::Base::Algorithm< V, C, R, S, VC, B >::
-_Mark( const TVertex& v, const _TNode& node )
-{
- this->m_Marks[ v ] = node;
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-void fpa::Base::Algorithm< V, C, R, S, VC, B >::
-_InitQueue( )
-{
- this->_QueueClear( );
- for(
- typename _TNodes::const_iterator sIt = this->m_Seeds.begin( );
- sIt != this->m_Seeds.end( );
- sIt++
- )
- {
- this->_QueuePush( sIt->first, sIt->second );
- this->_Mark( sIt->first, sIt->second );
-
- } // rof
-}
-
-#endif // __FPA__BASE__ALGORITHM__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__DIJKSTRA__H__
-#define __FPA__BASE__DIJKSTRA__H__
-
-#include <vector>
-#include <fpa/Base/Algorithm.h>
-#include <fpa/Base/MinimumSpanningTree.h>
-
-namespace fpa
-{
- namespace Base
- {
- /**
- * Dijkstra is a front propagation algorithm that minimizes costs
- *
- * @param V Vertex type.
- * @param C Vertex value type.
- * @param R Result value type.
- * @param S Space type where vertices are.
- * @param VC Vertex lexicographical compare.
- * @param MST Minimum spanning tree type.
- * @param B Base class for this algorithm. It should be any itk-based
- * filter (itk::ProcessObject).
- *
- */
- template< class V, class C, class R, class S, class VC, class MST, class B >
- class Dijkstra
- : public Algorithm< V, C, R, S, VC, B >
- {
- public:
- typedef Dijkstra Self;
- typedef Algorithm< V, C, R, S, VC, B > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef MST TMinimumSpanningTree;
- typedef typename Superclass::TVertex TVertex;
- typedef typename Superclass::TValue TValue;
- typedef typename Superclass::TResult TResult;
- typedef typename Superclass::TSpace TSpace;
- typedef typename Superclass::TVertexCompare TVertexCompare;
-
- typedef typename Superclass::TStartEvent TStartEvent;
- typedef typename Superclass::TStartLoopEvent TStartLoopEvent;
- typedef typename Superclass::TEndEvent TEndEvent;
- typedef typename Superclass::TEndLoopEvent TEndLoopEvent;
- typedef typename Superclass::TAliveEvent TAliveEvent;
- typedef typename Superclass::TFrontEvent TFrontEvent;
- typedef typename Superclass::TFreezeEvent TFreezeEvent;
-
- typedef typename Superclass::TStartBacktrackingEvent TStartBacktrackingEvent;
- typedef typename Superclass::TEndBacktrackingEvent TEndBacktrackingEvent;
- typedef typename Superclass::TBacktrackingEvent TBacktrackingEvent;
-
- protected:
- typedef typename Superclass::_TVertices _TVertices;
- typedef typename Superclass::_TCollision _TCollision;
- typedef typename Superclass::_TCollisionsRow _TCollisionsRow;
- typedef typename Superclass::_TCollisions _TCollisions;
- typedef typename Superclass::_TNode _TNode;
- typedef typename Superclass::_TNodes _TNodes;
-
- struct _TQueueNode
- {
- TVertex Vertex;
- _TNode Node;
-
- // Make the min-heap behave as a max-heap
- bool operator<( const _TQueueNode& other ) const
- { return( other.Node.Result < this->Node.Result ); }
- };
- typedef std::vector< _TQueueNode > _TQueue;
-
- public:
- itkTypeMacro( Dijkstra, Algorithm );
-
- itkBooleanMacro( LocalCosts );
- itkBooleanMacro( FillNodeQueue );
- itkGetConstMacro( LocalCosts, bool );
- itkGetConstMacro( FillNodeQueue, bool );
- itkSetMacro( LocalCosts, bool );
- itkSetMacro( FillNodeQueue, bool );
-
- public:
- TMinimumSpanningTree* GetMinimumSpanningTree( );
- const TMinimumSpanningTree* GetMinimumSpanningTree( ) const;
- void GraftMinimumSpanningTree( itk::DataObject* obj );
-
- protected:
- Dijkstra( );
- virtual ~Dijkstra( );
-
- virtual TResult _Cost( const TVertex& v, const TVertex& p ) const = 0;
-
- virtual void _BeforeGenerateData( ) ITK_OVERRIDE;
-
- // Results-related abstract methods
- virtual bool _ComputeNeighborResult(
- TResult& result, const TVertex& neighbor, const TVertex& parent
- ) const ITK_OVERRIDE;
- virtual void _SetResult( const TVertex& v, const _TNode& n ) ITK_OVERRIDE;
-
- // Queue-related abstract methods
- virtual bool _IsQueueEmpty( ) const ITK_OVERRIDE;
- virtual void _QueuePush( const TVertex& v, const _TNode& n ) ITK_OVERRIDE;
- virtual void _QueuePop( TVertex& v, _TNode& n ) ITK_OVERRIDE;
- virtual void _QueueClear( ) ITK_OVERRIDE;
-
- private:
- // Purposely not implemented
- Dijkstra( const Self& other );
- Self& operator=( const Self& other );
-
- protected:
- bool m_LocalCosts;
- bool m_FillNodeQueue;
- _TQueue m_Queue;
- unsigned int m_MSTIdx;
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Base/Dijkstra.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__BASE__DIJKSTRA__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__DIJKSTRA__HXX__
-#define __FPA__BASE__DIJKSTRA__HXX__
-
-#include <algorithm>
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class MST, class B >
-typename fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >::
-TMinimumSpanningTree* fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >::
-GetMinimumSpanningTree( )
-{
- return(
- dynamic_cast< TMinimumSpanningTree* >(
- this->itk::ProcessObject::GetOutput( this->m_MSTIdx )
- )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class MST, class B >
-const typename fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >::
-TMinimumSpanningTree* fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >::
-GetMinimumSpanningTree( ) const
-{
- return(
- dynamic_cast< const TMinimumSpanningTree* >(
- this->itk::ProcessObject::GetOutput( this->m_MSTIdx )
- )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class MST, class B >
-void fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >::
-GraftMinimumSpanningTree( itk::DataObject* obj )
-{
- TMinimumSpanningTree* mst = dynamic_cast< TMinimumSpanningTree* >( obj );
- if( mst != NULL )
- this->GraftNthOutput( this->m_MSTIdx, mst );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class MST, class B >
-fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >::
-Dijkstra( )
- : Superclass( ),
- m_LocalCosts( false ),
- m_FillNodeQueue( false )
-{
- this->m_MSTIdx = this->GetNumberOfRequiredOutputs( );
- this->SetNumberOfRequiredOutputs( this->m_MSTIdx + 1 );
- this->itk::ProcessObject::SetNthOutput(
- this->m_MSTIdx, TMinimumSpanningTree::New( )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class MST, class B >
-fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >::
-~Dijkstra( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class MST, class B >
-void fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >::
-_BeforeGenerateData( )
-{
- this->Superclass::_BeforeGenerateData( );
- this->GetMinimumSpanningTree( )->SetFillNodeQueue( this->m_FillNodeQueue );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class MST, class B >
-bool fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >::
-_ComputeNeighborResult(
- TResult& result, const TVertex& neighbor, const TVertex& parent
- ) const
-{
- result = this->_Cost( neighbor, parent );
- result *= TResult( this->_Distance( neighbor, parent ) );
-
- // WARNING: Dijkstra does not work on negative values!
- if( result >= TResult( 0 ) )
- {
- _TNode pn = this->_Node( parent );
- if( pn.Label == Self::AliveLabel && !this->m_LocalCosts )
- result += pn.Result;
- return( true );
- }
- else
- return( false );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class MST, class B >
-void fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >::
-_SetResult( const TVertex& v, const _TNode& n )
-{
- this->GetMinimumSpanningTree( )->SetNode( v, n.Parent, n.FrontId, n.Result );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class MST, class B >
-bool fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >::
-_IsQueueEmpty( ) const
-{
- return( this->m_Queue.empty( ) );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class MST, class B >
-void fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >::
-_QueuePush( const TVertex& v, const _TNode& n )
-{
- _TQueueNode qn;
- qn.Vertex = v;
- qn.Node = n;
- this->m_Queue.push_back( qn );
- std::push_heap( this->m_Queue.begin( ), this->m_Queue.end( ) );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class MST, class B >
-void fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >::
-_QueuePop( TVertex& v, _TNode& n )
-{
- _TQueueNode qn = this->m_Queue.front( );
- std::pop_heap( this->m_Queue.begin( ), this->m_Queue.end( ) );
- this->m_Queue.pop_back( );
- v = qn.Vertex;
- n = qn.Node;
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class MST, class B >
-void fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >::
-_QueueClear( )
-{
- this->m_Queue.clear( );
-}
-
-#endif // __FPA__BASE__DIJKSTRA__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__EVENTS__H__
-#define __FPA__BASE__EVENTS__H__
-
-#include <vector>
-#include <itkProcessObject.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 V >
- class BaseEventWithVertex
- : public BaseEvent
- {
- public:
- BaseEventWithVertex( )
- : BaseEvent( )
- { }
- BaseEventWithVertex( const V& 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< V >* >( e ) != NULL
- );
- }
- itk::EventObject* MakeObject( ) const
- { return( new BaseEventWithVertex< V >( ) ); }
-
- public:
- V Vertex;
- long FrontId;
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#endif // __FPA__BASE__EVENTS__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__EXTRACTENDPOINTSANDBIFURCATIONSFROMMINIMUMSPANNINGTREE__H__
-#define __FPA__BASE__EXTRACTENDPOINTSANDBIFURCATIONSFROMMINIMUMSPANNINGTREE__H__
-
-#include <utility>
-#include <vector>
-#include <itkProcessObject.h>
-#include <itkSimpleDataObjectDecorator.h>
-#include <cpExtensions/DataStructures/ImageIndexesContainer.h>
-
-namespace fpa
-{
- namespace Base
- {
- /**
- */
- template< class _TMST >
- class ExtractEndPointsAndBifurcationsFromMinimumSpanningTree
- : public itk::ProcessObject
- {
- public:
- typedef ExtractEndPointsAndBifurcationsFromMinimumSpanningTree Self;
- typedef itk::ProcessObject Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef _TMST TMinimumSpanningTree;
- typedef typename _TMST::TVertex TVertex;
- typedef std::pair< TVertex, TVertex > TBranch;
- typedef std::vector< TBranch > TBranches;
-
- typedef
- cpExtensions::DataStructures::ImageIndexesContainer< TVertex::Dimension >
- TVertices;
-
- public:
- itkTypeMacro(
- ExtractEndPointsAndBifurcationsFromMinimumSpanningTree,
- itk::ProcessObject
- );
-
- public:
- const TMinimumSpanningTree* GetMinimumSpanningTree( );
- void SetMinimumSpanningTree( TMinimumSpanningTree* mst );
-
- TVertices* GetEndPoints( );
- TVertices* GetBifurcations( );
- TVertices* GetCollisions( );
-
- virtual void Update( ) ITK_OVERRIDE
- {
- this->GenerateData( );
- }
-
- protected:
- ExtractEndPointsAndBifurcationsFromMinimumSpanningTree( );
- virtual ~ExtractEndPointsAndBifurcationsFromMinimumSpanningTree( );
-
- virtual void GenerateData( ) ITK_OVERRIDE;
-
- virtual void _MarkSkeleton(
- const TVertex& v, const unsigned long& l
- ) = 0;
- virtual void _MarkSphere(
- const TVertex& v,
- const double& r,
- const unsigned long& l
- ) = 0;
- virtual unsigned long _Mark( const TVertex& v ) = 0;
- virtual unsigned long _SkeletonMark( const TVertex& v ) = 0;
- virtual double _Radius( const TVertex& v ) = 0;
-
- virtual void _Tmp( ) = 0;
-
- private:
- // Purposely not implemented
- ExtractEndPointsAndBifurcationsFromMinimumSpanningTree( const Self& other );
- Self& operator=( const Self& other );
-
- protected:
- TBranches m_Branches;
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Base/ExtractEndPointsAndBifurcationsFromMinimumSpanningTree.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__BASE__EXTRACTENDPOINTSANDBIFURCATIONSFROMMINIMUMSPANNINGTREE__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__EXTRACTENDPOINTSANDBIFURCATIONSFROMMINIMUMSPANNINGTREE__HXX__
-#define __FPA__BASE__EXTRACTENDPOINTSANDBIFURCATIONSFROMMINIMUMSPANNINGTREE__HXX__
-
-#include <cmath>
-#include <map>
-
-// -------------------------------------------------------------------------
-template< class _TMST >
-const typename
-fpa::Base::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TMST >::
-TMinimumSpanningTree*
-fpa::Base::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TMST >::
-GetMinimumSpanningTree( )
-{
- return(
- dynamic_cast< const _TMST* >( this->itk::ProcessObject::GetInput( 0 ) )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class _TMST >
-void
-fpa::Base::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TMST >::
-SetMinimumSpanningTree( TMinimumSpanningTree* mst )
-{
- this->itk::ProcessObject::SetNthInput( 0, const_cast< _TMST* >( mst ) );
-}
-
-// -------------------------------------------------------------------------
-template< class _TMST >
-typename
-fpa::Base::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TMST >::
-TVertices*
-fpa::Base::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TMST >::
-GetEndPoints( )
-{
- return(
- dynamic_cast< TVertices* >( this->itk::ProcessObject::GetOutput( 0 ) )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class _TMST >
-typename
-fpa::Base::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TMST >::
-TVertices*
-fpa::Base::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TMST >::
-GetBifurcations( )
-{
- return(
- dynamic_cast< TVertices* >( this->itk::ProcessObject::GetOutput( 1 ) )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class _TMST >
-typename
-fpa::Base::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TMST >::
-TVertices*
-fpa::Base::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TMST >::
-GetCollisions( )
-{
- return(
- dynamic_cast< TVertices* >( this->itk::ProcessObject::GetOutput( 2 ) )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class _TMST >
-fpa::Base::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TMST >::
-ExtractEndPointsAndBifurcationsFromMinimumSpanningTree( )
- : Superclass( )
-{
- this->SetNumberOfRequiredInputs( 1 );
- this->SetNumberOfRequiredOutputs( 4 );
- typename TVertices::Pointer ep = TVertices::New( );
- typename TVertices::Pointer bf = TVertices::New( );
- typename TVertices::Pointer co = TVertices::New( );
- this->itk::ProcessObject::SetNthOutput( 0, ep.GetPointer( ) );
- this->itk::ProcessObject::SetNthOutput( 1, bf.GetPointer( ) );
- this->itk::ProcessObject::SetNthOutput( 2, co.GetPointer( ) );
-}
-
-// -------------------------------------------------------------------------
-template< class _TMST >
-fpa::Base::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TMST >::
-~ExtractEndPointsAndBifurcationsFromMinimumSpanningTree( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class _TMST >
-void
-fpa::Base::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TMST >::
-GenerateData( )
-{
- typedef std::multimap< double, TVertex > _TQueue;
- typedef std::pair< TVertex, TVertex > _TBranch;
- typedef std::vector< _TBranch > _TBranches;
- typedef typename _TQueue::value_type _TQueueValue;
-
- // 0. Useful objects and values
- auto mst = this->GetMinimumSpanningTree( );
- auto endpoints = this->GetEndPoints( );
- auto bifurcations = this->GetBifurcations( );
- auto collisions = this->GetCollisions( );
- endpoints->Get( ).clear( );
- bifurcations->Get( ).clear( );
- collisions->Get( ).clear( );
- this->m_Branches.clear( );
-
- // 1. Get priority queue
- auto& q = mst->GetNodeQueue( );
-
- // 2. Main loop: iterate in inverse order (max-priority)
- unsigned long label = 0;
- for( auto qIt = q.rbegin( ); qIt != q.rend( ); ++qIt )
- {
- auto gCost = qIt->first;
- auto vertex = qIt->second;
-
- // 2.1. Check if the vertex has already been visited
- if( this->_Mark( vertex ) > 0 || this->_SkeletonMark( vertex ) > 0 )
- continue;
-
- // 2.2. Get path from front seed
- auto path = mst->GetPath( vertex );
-
- // 2.3. Prepare new branch data and prepare new end-point
- label++;
- this->m_Branches.push_back( _TBranch( vertex, vertex ) );
- endpoints->Get( ).push_back( vertex );
-
- // 2.4. Backtracking
- auto pIt = path.begin( );
- TVertex last_collision;
- bool inCollision = false;
- while( pIt != path.end( ) )
- {
- auto mark = this->_SkeletonMark( *pIt );
- if( mark > 0 && mark != label )
- {
- // 2.4.1. A bifurcation has been reached
- bifurcations->Get( ).push_back( *pIt );
-
- // Reorder labels
- auto coll_branch = this->m_Branches[ mark - 1 ];
- this->m_Branches[ mark - 1 ] = _TBranch( coll_branch.first, *pIt );
- this->m_Branches[ label - 1 ] = _TBranch( qIt->second, *pIt );
- this->m_Branches.push_back( _TBranch( *pIt, coll_branch.second ) );
-
- // Mark skeleton (b,coll_branch_second) with the new label
- label++;
- while( *pIt != coll_branch.second && pIt != path.end( ) )
- {
- this->_MarkSkeleton( *pIt, label );
- pIt++;
-
- } // elihw
- if( pIt != path.end( ) )
- this->_MarkSkeleton( *pIt, label );
-
- // Force inner loop termination
- pIt = path.end( );
- }
- else
- {
- if( !inCollision )
- {
- mark = this->_Mark( *pIt );
- if( mark > 0 && mark != label )
- {
- // 2.4.2. A collision has been reached
- last_collision = *pIt;
- collisions->Get( ).push_back( *pIt );
- inCollision = true;
- }
- else
- {
- // 2.4.3. Just mark sphere and skeleton
- double r = this->_Radius( *pIt );
- this->_MarkSkeleton( *pIt, label );
- this->_MarkSphere( *pIt, r, label );
- this->m_Branches[ label - 1 ].second = *pIt;
-
- // 2.4.4. Is this a seed? -> add it to endpoints
- auto sIt = pIt;
- sIt++;
- if( sIt == path.end( ) )
- endpoints->Get( ).push_back( *pIt );
-
- } // fi
-
- } // fi
- pIt++;
-
- } // fi
-
- } // elihw
-
- } // rof
-
- // Remove illegal branches
- auto dIt = this->m_Branches.begin( );
- while( dIt != this->m_Branches.end( ) )
- {
- if( dIt->first == dIt->second )
- dIt = this->m_Branches.erase( dIt );
- else
- dIt++;
-
- } // fi
-
- // Finish
- endpoints->SetReferenceImage( mst );
- bifurcations->SetReferenceImage( mst );
- collisions->SetReferenceImage( mst );
-}
-
-#endif // __FPA__BASE__EXTRACTENDPOINTSANDBIFURCATIONSFROMMINIMUMSPANNINGTREE__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__EXTRACTPATHFROMMINIMUMSPANNINGTREE__H__
-#define __FPA__BASE__EXTRACTPATHFROMMINIMUMSPANNINGTREE__H__
-
-#include <set>
-#include <itkProcessObject.h>
-#include <cpExtensions/DataStructures/PolyLineParametricPath.h>
-
-namespace fpa
-{
- namespace Base
- {
- /**
- */
- template< class T >
- class ExtractPathFromMinimumSpanningTree
- : public itk::ProcessObject
- {
- public:
- typedef ExtractPathFromMinimumSpanningTree Self;
- typedef itk::ProcessObject Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef T TMinimumSpanningTree;
- typedef typename T::TVertex TVertex;
- typedef
- cpExtensions::DataStructures::PolyLineParametricPath< TVertex::Dimension >
- TPath;
- typedef std::pair< TVertex, TVertex > _TBranch;
- typedef std::vector< _TBranch > _TBranches;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( ExtractPathFromMinimumSpanningTree, itk::ProcessObject );
-
- itkGetConstMacro( Vertex0, TVertex );
- itkGetConstMacro( Vertex1, TVertex );
-
- itkSetMacro( Vertex0, TVertex );
- itkSetMacro( Vertex1, TVertex );
-
- public:
- const T* GetInput( ) const;
- void SetInput( const T* tree );
-
- TPath* GetOutput( );
-
- protected:
- ExtractPathFromMinimumSpanningTree( );
- virtual ~ExtractPathFromMinimumSpanningTree( );
-
- virtual void GenerateData( ) ITK_OVERRIDE;
-
- private:
- // Purposely not implemented
- ExtractPathFromMinimumSpanningTree( const Self& other );
- Self& operator=( const Self& other );
-
- protected:
- TVertex m_Vertex0;
- TVertex m_Vertex1;
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Base/ExtractPathFromMinimumSpanningTree.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__BASE__EXTRACTPATHFROMMINIMUMSPANNINGTREE__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__EXTRACTPATHFROMMINIMUMSPANNINGTREE__HXX__
-#define __FPA__BASE__EXTRACTPATHFROMMINIMUMSPANNINGTREE__HXX__
-
-// -------------------------------------------------------------------------
-template< class T >
-const T* fpa::Base::ExtractPathFromMinimumSpanningTree< T >::
-GetInput( ) const
-{
- return(
- dynamic_cast< const T* >( this->itk::ProcessObject::GetInput( 0 ) )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class T >
-void fpa::Base::ExtractPathFromMinimumSpanningTree< T >::
-SetInput( const T* tree )
-{
- this->itk::ProcessObject::SetNthInput( 0, const_cast< T* >( tree ) );
-}
-
-// -------------------------------------------------------------------------
-template< class T >
-typename fpa::Base::ExtractPathFromMinimumSpanningTree< T >::
-TPath* fpa::Base::ExtractPathFromMinimumSpanningTree< T >::
-GetOutput( )
-{
- return(
- itkDynamicCastInDebugMode< TPath* >( this->GetPrimaryOutput( ) )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class T >
-fpa::Base::ExtractPathFromMinimumSpanningTree< T >::
-ExtractPathFromMinimumSpanningTree( )
- : Superclass( )
-{
- this->itk::ProcessObject::SetNumberOfRequiredInputs( 1 );
-
- typename TPath::Pointer out = TPath::New( );
- this->itk::ProcessObject::SetNumberOfRequiredOutputs( 1 );
- this->itk::ProcessObject::SetNthOutput( 0, out.GetPointer( ) );
-}
-
-// -------------------------------------------------------------------------
-template< class T >
-fpa::Base::ExtractPathFromMinimumSpanningTree< T >::
-~ExtractPathFromMinimumSpanningTree( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class T >
-void fpa::Base::ExtractPathFromMinimumSpanningTree< T >::
-GenerateData( )
-{
- auto tree = this->GetInput( );
- auto path = this->GetOutput( );
-
- auto lst = tree->GetPath( this->m_Vertex0, this->m_Vertex1 );
- path->Initialize( );
- for( auto i = lst.begin( ); i != lst.end( ); ++i )
- path->AddVertex( *i );
- path->SetReferenceImage( tree );
-}
-
-#endif // __FPA__BASE__EXTRACTPATHFROMMINIMUMSPANNINGTREE__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__FASTMARCHING__H__
-#define __FPA__BASE__FASTMARCHING__H__
-
-#include <fpa/Base/Dijkstra.h>
-
-namespace fpa
-{
- namespace Base
- {
- /**
- */
- template< class V, class C, class VV, class VC, class B >
- class FastMarching
- : public Dijkstra< V, C, VV, VC, B >
- {
- public:
- // Templated types
- typedef V TVertex;
- typedef C TCost;
- typedef VV TVertexValue;
- typedef B TBaseFilter;
-
- // Standard class typdedefs
- typedef FastMarching Self;
- typedef Dijkstra< V, C, VV, VC, B > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef typename Superclass::TResult TResult;
- typedef typename Superclass::TTraits TTraits;
-
- protected:
- typedef typename Superclass::_TFrontId _TFrontId;
- typedef typename Superclass::_TNode _TNode;
- typedef typename Superclass::_TNodes _TNodes;
- struct _TNodeEikonalSort
- {
- bool operator()( const _TNode& a, const _TNode& b ) const
- { return( a.Result < b.Result ); }
- };
-
- public:
- itkTypeMacro( FastMarching, Dijkstra );
-
- protected:
- FastMarching( );
- virtual ~FastMarching( );
-
- virtual bool _UpdateNeigh( _TNode& nn, const _TNode& n );
-
- /**
- * Eikonal solution method
- *
- * This method returns the computed time and a flag indicating if the
- * determinant was valid.
- */
- bool _SolveEikonal( double& re, const _TNode& n, const double& F );
-
- private:
- // Purposely not implemented
- FastMarching( const Self& );
- void operator=( const Self& );
-
- protected:
- static const double LargestValue;
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Base/FastMarching.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__BASE__FASTMARCHING__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__FASTMARCHING__HXX__
-#define __FPA__BASE__FASTMARCHING__HXX__
-
-#include <cmath>
-#include <limits>
-
-#include <itkExceptionObject.h>
-
-// ---------------------------------------------------------------------
-template< class V, class C, class VV, class VC, class B >
-const double fpa::Base::FastMarching< V, C, VV, VC, B >::
-LargestValue = std::numeric_limits< double >::max( );
-
-// -------------------------------------------------------------------------
-template< class V, class C, class VV, class VC, class B >
-fpa::Base::FastMarching< V, C, VV, VC, B >::
-FastMarching( )
- : Superclass( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class VV, class VC, class B >
-fpa::Base::FastMarching< V, C, VV, VC, B >::
-~FastMarching( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class VV, class VC, class B >
-bool fpa::Base::FastMarching< V, C, VV, VC, B >::
-_UpdateNeigh( _TNode& nn, const _TNode& n )
-{
- bool r = true;
- if( !( this->_IsMarked( nn.Vertex ) ) )
- {
- double re;
- double F = double( this->_Value( nn.Vertex ) );
- r = this->_SolveEikonal( re, nn, F );
- if( r )
- {
- nn.Result = TResult( re );
- nn.Cost = TCost( re );
-
- } // fi
-
- } // fi
- return( r );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class VV, class VC, class B >
-bool fpa::Base::FastMarching< V, C, VV, VC, B >::
-_SolveEikonal( double& re, const _TNode& n, const double& F )
-{
- _TNodes neighs;
- this->_Neighs( n, neighs );
-
- // Compute interest nodes (i.e. the smallest valued in each dimension)
- _TNodes minNodes;
- unsigned int i = 0;
- while( i < neighs.size( ) )
- {
- V nm = neighs[ i++ ].Vertex;
- V np = neighs[ i++ ].Vertex;
- bool mm = this->_IsMarked( nm );
- bool mp = this->_IsMarked( np );
- TResult rm = this->_Result( nm );
- TResult rp = this->_Result( np );
-
- _TNode Ti;
- if( mm && mp )
- minNodes.push_back(
- ( rm < rp )?
- _TNode( nm, rm, n.FrontId ):
- _TNode( np, rp, n.FrontId )
- );
- else if( !mm && mp )
- minNodes.push_back( _TNode( np, rp, n.FrontId ) );
- else if( mm && !mp )
- minNodes.push_back( _TNode( nm, rm, n.FrontId ) );
-
- } // elihw
- std::sort( minNodes.begin( ), minNodes.end( ), _TNodeEikonalSort( ) );
-
- // Compute solution
- double al = double( 0 );
- double be = double( 0 );
- double ga = double( -1 ) / ( F * F );
- re = Self::LargestValue;
-
- typename _TNodes::const_iterator nIt = minNodes.begin( );
- bool valid = true;
- while( nIt != minNodes.end( ) && valid )
- {
- if( !( re < double( nIt->Result ) ) )
- {
- double d = this->_Norm( n.Vertex, nIt->Vertex );
- double s = double( 1 ) / ( d * d );
- double v = double( nIt->Result );
-
- al += s;
- be += v * s;
- ga += v * v * s;
-
- double de = ( be * be ) - ( al * ga );
- valid = !( de < double( 0 ) );
- if( valid )
- re = ( be + std::sqrt( de ) ) / al;
- nIt++;
- }
- else
- nIt = minNodes.end( );
-
- } // elihw
- return( valid );
-}
-
-#endif // __FPA__BASE__FASTMARCHING__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__FUNCTORS__INVERTCOSTFUNCTION__H__
-#define __FPA__BASE__FUNCTORS__INVERTCOSTFUNCTION__H__
-
-#include <cmath>
-#include <itkFunctionBase.h>
-
-namespace fpa
-{
- namespace Base
- {
- namespace Functors
- {
- /**
- */
- template< class C >
- class InvertCostFunction
- : public itk::FunctionBase< C, C >
- {
- public:
- /// Type-related and pointers
- typedef InvertCostFunction Self;
- typedef itk::FunctionBase< C, C > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( InvertCostFunction, itkFunctionBase );
-
- itkGetConstMacro( Alpha, C );
- itkGetConstMacro( Beta, C );
-
- itkSetMacro( Alpha, C );
- itkSetMacro( Beta, C );
-
- public:
- virtual C Evaluate( const C& input ) const ITK_OVERRIDE
- {
- C a = std::pow( input, this->m_Alpha );
- if( input >= C( 0 ) )
- return( std::pow( C( 1 ) / ( C( 1 ) + a ), this->m_Beta ) );
- else
- return( std::pow( C( -1 ) / ( C( 1 ) - a ), this->m_Beta ) );
- }
-
- protected:
- InvertCostFunction( )
- : Superclass( ),
- m_Alpha( C( 1 ) ),
- m_Beta( C( 1 ) )
- { }
- virtual ~InvertCostFunction( )
- { }
-
- private:
- // Purposely not implemented
- InvertCostFunction( const Self& );
- void operator=( const Self& );
-
- protected:
- C m_Alpha;
- C m_Beta;
- };
-
- } // ecapseman
-
- } // ecapseman
-
-} // ecapseman
-
-#endif // __FPA__BASE__FUNCTORS__INVERTCOSTFUNCTION__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__FUNCTORS__TAUTOLOGYFUNCTION__H__
-#define __FPA__BASE__FUNCTORS__TAUTOLOGYFUNCTION__H__
-
-#include <itkFunctionBase.h>
-
-namespace fpa
-{
- namespace Base
- {
- namespace Functors
- {
- /**
- */
- template< class S, class V >
- class TautologyFunction
- : public itk::FunctionBase< V, bool >
- {
- public:
- typedef TautologyFunction Self;
- typedef itk::FunctionBase< V, bool > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef S TSpace;
- typedef V TVertex;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( TautologyFunction, itkFunctionBase );
-
- itkGetConstObjectMacro( Space, TSpace );
- itkSetConstObjectMacro( Space, TSpace );
-
- public:
- virtual bool Evaluate( const TVertex& input ) const ITK_OVERRIDE
- { return( true ); }
-
- protected:
- TautologyFunction( )
- : Superclass( )
- { }
- virtual ~TautologyFunction( )
- { }
-
- private:
- // Purposely not implemented
- TautologyFunction( const Self& );
- void operator=( const Self& );
-
- protected:
- typename TSpace::ConstPointer m_Space;
- };
-
- } // ecapseman
-
- } // ecapseman
-
-} // ecapseman
-
-#endif // __FPA__BASE__FUNCTORS__TAUTOLOGYFUNCTION__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__IMAGESKELETON__H__
-#define __FPA__BASE__IMAGESKELETON__H__
-
-#include <itkSimpleDataObjectDecorator.h>
-#include <cpExtensions/DataStructures/PolyLineParametricPath.h>
-
-namespace fpa
-{
- namespace Base
- {
- /**
- */
- template< class _TMST >
- class ImageSkeleton
- : public itk::SimpleDataObjectDecorator< std::map< typename _TMST::TVertex, std::map< typename _TMST::TVertex, typename cpExtensions::DataStructures::PolyLineParametricPath< _TMST::TVertex::Dimension >::Pointer, typename _TMST::TVertex::LexicographicCompare >, typename _TMST::TVertex::LexicographicCompare > >
- {
- public:
- // Base types
- typedef _TMST TMinimumSpanningTree;
- typedef typename _TMST::TVertex TVertex;
- typedef typename TVertex::LexicographicCompare TVertexCmp;
- typedef
- cpExtensions::DataStructures::PolyLineParametricPath< TVertex::Dimension >
- TPath;
- typedef
- std::map< TVertex, typename TPath::Pointer, TVertexCmp >
- TSkeletonRow;
- typedef std::map< TVertex, TSkeletonRow, TVertexCmp > TSkeleton;
-
- // ITK-related types
- typedef ImageSkeleton Self;
- typedef itk::SimpleDataObjectDecorator< TSkeleton > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( ImageSkeleton, itk::SimpleDataObjectDecorator );
-
- itkGetConstObjectMacro( MinimumSpanningTree, _TMST );
- itkSetConstObjectMacro( MinimumSpanningTree, _TMST );
-
- public:
- void AddBranch( const TVertex& a, const TVertex& b );
- const TPath* GetBranch( const TVertex& a, const TVertex& b ) const;
-
- protected:
- ImageSkeleton( );
- virtual ~ImageSkeleton( );
-
- private:
- // Purposely not implemented
- ImageSkeleton( const Self& other );
- Self& operator=( const Self& other );
-
- protected:
- typename _TMST::ConstPointer m_MinimumSpanningTree;
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Base/ImageSkeleton.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__BASE__IMAGESKELETON__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__IMAGESKELETON__HXX__
-#define __FPA__BASE__IMAGESKELETON__HXX__
-
-// -------------------------------------------------------------------------
-template< class _TMST >
-void fpa::Base::ImageSkeleton< _TMST >::
-AddBranch( const TVertex& a, const TVertex& b )
-{
- if( this->m_MinimumSpanningTree.IsNull( ) )
- return;
-
- // Check if the branch already exists
- bool found = false;
- auto aIt = this->Get( ).find( a );
- if( aIt != this->Get( ).end( ) )
- found = ( aIt->second.find( b ) != aIt->second.end( ) );
- if( found )
- return;
-
- // Create path
- auto vertices = this->m_MinimumSpanningTree->GetPath( a, b );
- typename TPath::Pointer path = TPath::New( );
- for( auto vIt = vertices.begin( ); vIt != vertices.end( ); ++vIt )
- path->AddVertex( *vIt );
-
- // Assign path vertices
- path->SetReferenceImage( this->m_MinimumSpanningTree );
-
- typedef typename TSkeleton::value_type _T1;
- typedef typename TSkeletonRow::value_type _T2;
-
- TSkeleton& sk = this->Get( );
- auto sIt = sk.find( a );
- if( sIt == sk.end( ) )
- {
- sIt = sk.insert( _T1( a, TSkeletonRow( ) ) ).first;
- this->Modified( );
-
- } // fi
- if( sIt->second.find( b ) == sIt->second.end( ) )
- {
- sIt->second.insert( _T2( b, path ) );
- this->Modified( );
-
- } // fi
-}
-
-// -------------------------------------------------------------------------
-template< class _TMST >
-const typename fpa::Base::ImageSkeleton< _TMST >::
-TPath* fpa::Base::ImageSkeleton< _TMST >::
-GetBranch( const TVertex& a, const TVertex& b ) const
-{
- auto aIt = this->Get( ).find( a );
- if( aIt != this->Get( ).end( ) )
- {
- auto bIt = aIt->second.find( b );
- if( bIt != aIt->second.end( ) )
- return( bIt->second.GetPointer( ) );
- else
- return( NULL );
- }
- else
- return( NULL );
-}
-
-// -------------------------------------------------------------------------
-template< class _TMST >
-fpa::Base::ImageSkeleton< _TMST >::
-ImageSkeleton( )
- : Superclass( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class _TMST >
-fpa::Base::ImageSkeleton< _TMST >::
-~ImageSkeleton( )
-{
-}
-
-#endif // __FPA__BASE__IMAGESKELETON__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__INCREMENTALREGIONGROW__H__
-#define __FPA__BASE__INCREMENTALREGIONGROW__H__
-
-#include <vector>
-#include <itkFunctionBase.h>
-#include <fpa/Base/RegionGrow.h>
-
-namespace fpa
-{
- namespace Base
- {
- /**
- * Region grow is a front propagation with no costs.
- */
- template< class V, class R, class VV, class VC, class B >
- class IncrementalRegionGrow
- : public RegionGrow< V, R, VV, VC, B >
- {
- public:
- /// Standard class typdedefs
- typedef IncrementalRegionGrow Self;
- typedef RegionGrow< V, R, VV, VC, B > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef typename Superclass::TVertex TVertex;
- typedef typename Superclass::TValue TValue;
- typedef typename Superclass::TResult TResult;
- typedef typename Superclass::TVertexCompare TVertexCompare;
- typedef typename Superclass::TGrowingFunction TGrowingFunction;
-
- typedef std::vector< typename TGrowingFunction::Pointer > TFunctions;
- typedef std::vector< unsigned long > TVolumes;
-
- protected:
- typedef typename Superclass::_TVertices _TVertices;
- typedef typename Superclass::_TCollision _TCollision;
- typedef typename Superclass::_TCollisionsRow _TCollisionsRow;
- typedef typename Superclass::_TCollisions _TCollisions;
- typedef typename Superclass::_TNode _TNode;
- typedef typename Superclass::_TNodes _TNodes;
- typedef typename Superclass::_TQueue _TQueue;
-
- public:
- itkTypeMacro( IncrementalRegionGrow, RegionGrow );
-
- public:
- TGrowingFunction* GetGrowingFunction( unsigned int i );
- const TGrowingFunction* GetGrowingFunction( unsigned int i ) const;
- unsigned long GetGrowingFunctionVolume( unsigned int i ) const;
- unsigned int GetNumberOfGrowingFunctions( ) const;
- void ClearGrowingFunctions( );
- unsigned int AddGrowingFunction( TGrowingFunction* function );
-
- protected:
- IncrementalRegionGrow( );
- virtual ~IncrementalRegionGrow( );
-
- virtual void _BeforeGenerateData( );
- virtual void _AfterLoop( );
- virtual void _Loop( );
- virtual bool _CheckMembership( const TVertex& v ) const;
-
- private:
- // Purposely not implemented.
- IncrementalRegionGrow( const Self& );
- void operator=( const Self& );
-
- protected:
- mutable _TQueue m_AuxiliaryQueue;
-
- TFunctions m_Functions;
- TVolumes m_Volumes;
- unsigned int m_ActualFunction;
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Base/IncrementalRegionGrow.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__BASE__INCREMENTALREGIONGROW__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__INCREMENTALREGIONGROW__HXX__
-#define __FPA__BASE__INCREMENTALREGIONGROW__HXX__
-
-// -------------------------------------------------------------------------
-template< class V, class R, class VV, class VC, class B >
-typename fpa::Base::IncrementalRegionGrow< V, R, VV, VC, B >::
-TGrowingFunction* fpa::Base::IncrementalRegionGrow< V, R, VV, VC, B >::
-GetGrowingFunction( unsigned int i )
-{
- if( i < this->m_Functions.size( ) )
- return( this->m_Functions[ i ] );
- else
- return( NULL );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class R, class VV, class VC, class B >
-const typename fpa::Base::IncrementalRegionGrow< V, R, VV, VC, B >::
-TGrowingFunction* fpa::Base::IncrementalRegionGrow< V, R, VV, VC, B >::
-GetGrowingFunction( unsigned int i ) const
-{
- if( i < this->m_Functions.size( ) )
- return( this->m_Functions[ i ] );
- else
- return( NULL );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class R, class VV, class VC, class B >
-unsigned long fpa::Base::IncrementalRegionGrow< V, R, VV, VC, B >::
-GetGrowingFunctionVolume( unsigned int i ) const
-{
- if( i < this->m_Volumes.size( ) )
- return( this->m_Volumes[ i ] );
- else
- return( NULL );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class R, class VV, class VC, class B >
-unsigned int fpa::Base::IncrementalRegionGrow< V, R, VV, VC, B >::
-GetNumberOfGrowingFunctions( ) const
-{
- return( this->m_Functions.size( ) );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class R, class VV, class VC, class B >
-void fpa::Base::IncrementalRegionGrow< V, R, VV, VC, B >::
-ClearGrowingFunctions( )
-{
- this->m_Functions.clear( );
- this->m_Volumes.clear( );
- this->Modified( );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class R, class VV, class VC, class B >
-unsigned int fpa::Base::IncrementalRegionGrow< V, R, VV, VC, B >::
-AddGrowingFunction( TGrowingFunction* function )
-{
- this->m_Functions.push_back( function );
- this->m_Volumes.push_back( 0 );
- this->Modified( );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class R, class VV, class VC, class B >
-fpa::Base::IncrementalRegionGrow< V, R, VV, VC, B >::
-IncrementalRegionGrow( )
- : Superclass( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class V, class R, class VV, class VC, class B >
-fpa::Base::IncrementalRegionGrow< V, R, VV, VC, B >::
-~IncrementalRegionGrow( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class V, class R, class VV, class VC, class B >
-void fpa::Base::IncrementalRegionGrow< V, R, VV, VC, B >::
-_BeforeGenerateData( )
-{
- this->Superclass::_BeforeGenerateData( );
- this->m_ActualFunction = 0;
-}
-
-// -------------------------------------------------------------------------
-template< class V, class R, class VV, class VC, class B >
-void fpa::Base::IncrementalRegionGrow< V, R, VV, VC, B >::
-_AfterLoop( )
-{
- /* TODO
- this->Superclass::_AfterLoop( );
-
- // Replace queue
- this->_QueueClear( );
- while( !( this->m_AuxiliaryQueue.empty( ) ) )
- {
- // Get node
- _TNode node = this->m_AuxiliaryQueue.front( );
- this->m_AuxiliaryQueue.pop( );
- this->_QueuePush( node );
-
- // Unmark it
- typename _TMarks::iterator mIt = this->m_Marks.find( node.Vertex );
- if( mIt != this->m_Marks.end( ) )
- this->m_Marks.erase( mIt );
-
- } // elihw
-
- // Move to next function
- this->m_ActualFunction++;
- */
-}
-
-// -------------------------------------------------------------------------
-template< class V, class R, class VV, class VC, class B >
-void fpa::Base::IncrementalRegionGrow< V, R, VV, VC, B >::
-_Loop( )
-{
- while( this->m_ActualFunction < this->m_Functions.size( ) )
- this->Superclass::_Loop( );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class R, class VV, class VC, class B >
-bool fpa::Base::IncrementalRegionGrow< V, R, VV, VC, B >::
-_CheckMembership( const TVertex& v ) const
-{
- /* TODO
-
- if( this->m_ActualFunction < this->m_Functions.size( ) )
- {
- bool ret =
- this->m_Functions[ this->m_ActualFunction ]->Evaluate( v );
- if( !ret )
- this->m_AuxiliaryQueue.push( n );
- else
- this->m_Volumes[ this->m_ActualFunction ]++;
- return( ret );
- }
- else
- return( false );
-*/
- return( false );
-}
-
-#endif // __FPA__BASE__INCREMENTALREGIONGROW__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__MINIMUMSPANNINGTREE__H__
-#define __FPA__BASE__MINIMUMSPANNINGTREE__H__
-
-#include <map>
-#include <vector>
-#include <utility>
-#include <itkPoint.h>
-#include <itkSmartPointer.h>
-
-namespace fpa
-{
- namespace Base
- {
- /**
- */
- template< class _TSuperclass, class _TVertex >
- 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 std::vector< TVertex > TVertices;
- typedef std::pair< TVertex, bool > TCollision;
- typedef std::vector< TCollision > TCollisionsRow;
- typedef std::vector< TCollisionsRow > TCollisions;
-
- typedef itk::Point< double, TVertex::Dimension > TPoint;
- typedef std::vector< TPoint > TPoints;
- typedef std::multimap< double, TVertex > TNodeQueue;
-
- protected:
- typedef std::vector< unsigned long > _TRow;
- typedef std::vector< _TRow > _TMatrix;
-
- public:
- itkTypeMacro( MinimumSpanningTree, _TSuperclass );
-
- itkBooleanMacro( FillNodeQueue );
-
- itkGetConstReferenceMacro( Collisions, TCollisions );
- itkGetConstReferenceMacro( NodeQueue, TNodeQueue );
- itkGetConstMacro( FillNodeQueue, bool );
-
- itkSetMacro( FillNodeQueue, bool );
-
- public:
- void SetCollisions( const TCollisions& collisions );
- TVertices GetPath( const TVertex& a ) const;
- TVertices GetPath( const TVertex& a, const TVertex& b ) const;
-
- virtual TPoints GetEuclideanPath( const TVertex& a ) const;
- virtual TPoints GetEuclideanPath(
- const TVertex& a, const TVertex& b
- ) const;
- virtual bool IsDefinedInEuclideanSpace( ) const;
-
- virtual void SetNode(
- const TVertex& v,
- const TVertex& p,
- const short& fid,
- const double& cost
- );
- virtual void Clear( );
-
- protected:
- MinimumSpanningTree( );
- virtual ~MinimumSpanningTree( );
-
- virtual bool _HasVertex( const TVertex& a ) const = 0;
- virtual short _FrontId( const TVertex& a ) const = 0;
- virtual void _Path( TVertices& path, const TVertex& a ) const = 0;
-
- private:
- // Purposely not implemented
- MinimumSpanningTree( const Self& other );
- Self& operator=( const Self& other );
-
- protected:
- TCollisions m_Collisions;
- _TMatrix m_FrontPaths;
- TNodeQueue m_NodeQueue;
- bool m_FillNodeQueue;
-
- static const unsigned long INF_VALUE;
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Base/MinimumSpanningTree.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__BASE__MINIMUMSPANNINGTREE__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__MINIMUMSPANNINGTREE__HXX__
-#define __FPA__BASE__MINIMUMSPANNINGTREE__HXX__
-
-#include <limits>
-
-// -------------------------------------------------------------------------
-template< class _TSuperclass, class _TVertex >
-const unsigned long fpa::Base::
-MinimumSpanningTree< _TSuperclass, _TVertex >::INF_VALUE =
- std::numeric_limits< unsigned long >::max( );
-
-// -------------------------------------------------------------------------
-template< class _TSuperclass, class _TVertex >
-void fpa::Base::MinimumSpanningTree< _TSuperclass, _TVertex >::
-SetCollisions( const TCollisions& collisions )
-{
- // Prepare a front graph
- this->m_Collisions = collisions;
- unsigned long nSeeds = this->m_Collisions.size( );
- _TMatrix dist( nSeeds, _TRow( nSeeds, Self::INF_VALUE ) );
- this->m_FrontPaths = dist;
- for( unsigned long i = 0; i < nSeeds; ++i )
- {
- for( unsigned long j = 0; j < nSeeds; ++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
- for( unsigned long k = 0; k < nSeeds; ++k )
- {
- for( unsigned long i = 0; i < nSeeds; ++i )
- {
- for( unsigned long j = 0; j < nSeeds; ++j )
- {
- if( ( dist[ i ][ k ] + dist[ k ][ j ] ) < dist[ i ][ j ] )
- {
- dist[ i ][ j ] = dist[ i ][ k ] + dist[ k ][ j ];
- this->m_FrontPaths[ i ][ j ] = this->m_FrontPaths[ i ][ k ];
-
- } // fi
-
- } // rof
-
- } // rof
-
- } // rof
- this->Modified( );
-}
-
-// -------------------------------------------------------------------------
-template< class _TSuperclass, class _TVertex >
-typename fpa::Base::MinimumSpanningTree< _TSuperclass, _TVertex >::
-TVertices fpa::Base::MinimumSpanningTree< _TSuperclass, _TVertex >::
-GetPath( const TVertex& a ) const
-{
- TVertices path;
- if( this->_HasVertex( a ) )
- this->_Path( path, a );
- return( path );
-}
-
-// -------------------------------------------------------------------------
-template< class _TSuperclass, class _TVertex >
-typename fpa::Base::MinimumSpanningTree< _TSuperclass, _TVertex >::
-TVertices fpa::Base::MinimumSpanningTree< _TSuperclass, _TVertex >::
-GetPath( const TVertex& a, const TVertex& b ) const
-{
- TVertices path;
-
- // Check existence
- if( !this->_HasVertex( a ) || !this->_HasVertex( b ) )
- return( path );
-
- // Get front ids
- short fa = this->_FrontId( a );
- short fb = this->_FrontId( b );
-
- if( fa == fb )
- {
- // Get paths
- TVertices ap, bp;
- this->_Path( ap, a );
- this->_Path( bp, b );
-
- // Ignore common part: find common ancestor
- auto raIt = ap.rbegin( );
- auto rbIt = bp.rbegin( );
- while( *raIt == *rbIt && raIt != ap.rend( ) && rbIt != bp.rend( ) )
- {
- ++raIt;
- ++rbIt;
-
- } // elihw
- if( raIt != ap.rbegin( ) ) --raIt;
- if( rbIt != bp.rbegin( ) ) --rbIt;
-
- // Add part from a
- for( auto iaIt = ap.begin( ); iaIt != ap.end( ) && *iaIt != *raIt; ++iaIt )
- path.push_back( *iaIt );
-
- // Add part from b
- for( ; rbIt != bp.rend( ); ++rbIt )
- path.push_back( *rbIt );
- }
- else
- {
- // Use this->m_FrontPaths from Floyd-Warshall
- if( this->m_FrontPaths[ fa ][ fb ] < Self::INF_VALUE )
- {
- // Compute front path
- std::vector< long > fpath;
- fpath.push_back( fa );
- while( fa != fb )
- {
- fa = this->m_FrontPaths[ fa ][ fb ];
- fpath.push_back( fa );
-
- } // elihw
-
- // Continue only if both fronts are connected
- unsigned int N = fpath.size( );
- if( N > 0 )
- {
- // First path: from start vertex to first collision
- path = this->GetPath(
- a, this->m_Collisions[ fpath[ 0 ] ][ fpath[ 1 ] ].first
- );
-
- // Intermediary paths
- for( unsigned int i = 1; i < N - 1; ++i )
- {
- TVertices ipath =
- this->GetPath(
- this->m_Collisions[ fpath[ i ] ][ fpath[ i - 1 ] ].first,
- this->m_Collisions[ fpath[ i ] ][ fpath[ i + 1 ] ].first
- );
- path.insert( path.end( ), ipath.begin( ), ipath.end( ) );
-
- } // rof
-
- // Final path: from last collision to end point
- TVertices lpath =
- this->GetPath(
- this->m_Collisions[ fpath[ N - 1 ] ][ fpath[ N - 2 ] ].first, b
- );
- path.insert( path.end( ), lpath.begin( ), lpath.end( ) );
-
- } // fi
-
- } // fi
-
- } // fi
- return( path );
-}
-
-// -------------------------------------------------------------------------
-template< class _TSuperclass, class _TVertex >
-typename fpa::Base::MinimumSpanningTree< _TSuperclass, _TVertex >::
-TPoints fpa::Base::MinimumSpanningTree< _TSuperclass, _TVertex >::
-GetEuclideanPath( const TVertex& a ) const
-{
- TPoints points;
- return( points );
-}
-
-// -------------------------------------------------------------------------
-template< class _TSuperclass, class _TVertex >
-typename fpa::Base::MinimumSpanningTree< _TSuperclass, _TVertex >::
-TPoints fpa::Base::MinimumSpanningTree< _TSuperclass, _TVertex >::
-GetEuclideanPath( const TVertex& a, const TVertex& b ) const
-{
- TPoints points;
- return( points );
-}
-
-// -------------------------------------------------------------------------
-template< class _TSuperclass, class _TVertex >
-bool fpa::Base::MinimumSpanningTree< _TSuperclass, _TVertex >::
-IsDefinedInEuclideanSpace( ) const
-{
- return( false );
-}
-
-// -------------------------------------------------------------------------
-template< class _TSuperclass, class _TVertex >
-void fpa::Base::MinimumSpanningTree< _TSuperclass, _TVertex >::
-SetNode(
- const TVertex& v, const TVertex& p,
- const short& fid, const double& cost
- )
-{
- typedef typename TNodeQueue::value_type _TNodeQueueValue;
- if( this->m_FillNodeQueue )
- this->m_NodeQueue.insert( _TNodeQueueValue( cost, v ) );
-}
-
-// -------------------------------------------------------------------------
-template< class _TSuperclass, class _TVertex >
-void fpa::Base::MinimumSpanningTree< _TSuperclass, _TVertex >::
-Clear( )
-{
- this->m_NodeQueue.clear( );
-}
-
-// -------------------------------------------------------------------------
-template< class _TSuperclass, class _TVertex >
-fpa::Base::MinimumSpanningTree< _TSuperclass, _TVertex >::
-MinimumSpanningTree( )
- : Superclass( ),
- m_FillNodeQueue( false )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class _TSuperclass, class _TVertex >
-fpa::Base::MinimumSpanningTree< _TSuperclass, _TVertex >::
-~MinimumSpanningTree( )
-{
-}
-
-#endif // __FPA__BASE__MINIMUMSPANNINGTREE__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__REGIONGROW__H__
-#define __FPA__BASE__REGIONGROW__H__
-
-#include <queue>
-#include <utility>
-#include <fpa/Base/Algorithm.h>
-#include <fpa/Base/Functors/TautologyFunction.h>
-
-namespace fpa
-{
- namespace Base
- {
- /**
- * Region grow is a front propagation with no costs.
- *
- * @param V Vertex type.
- * @param C Vertex value type.
- * @param R Result value type.
- * @param S Space type where vertices are.
- * @param VC Vertex lexicographical compare.
- * @param B Base class for this algorithm. It should be any itk-based
- * filter (itk::ProcessObject).
- *
- */
- template< class V, class C, class R, class S, class VC, class B >
- class RegionGrow
- : public Algorithm< V, C, R, S, VC, B >
- {
- public:
- typedef RegionGrow Self;
- typedef Algorithm< V, C, R, S, VC, B > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef typename Superclass::TVertex TVertex;
- typedef typename Superclass::TValue TValue;
- typedef typename Superclass::TResult TResult;
- typedef typename Superclass::TSpace TSpace;
- typedef typename Superclass::TVertexCompare TVertexCompare;
-
- typedef fpa::Base::Functors::TautologyFunction< S, V > TGrowingFunction;
-
- protected:
- typedef typename Superclass::_TVertices _TVertices;
- typedef typename Superclass::_TCollision _TCollision;
- typedef typename Superclass::_TCollisionsRow _TCollisionsRow;
- typedef typename Superclass::_TCollisions _TCollisions;
- typedef typename Superclass::_TNode _TNode;
- typedef typename Superclass::_TNodes _TNodes;
-
- typedef std::queue< std::pair< TVertex, _TNode > > _TQueue;
-
- public:
- itkTypeMacro( RegionGrow, Algorithm );
-
- itkGetConstMacro( InsideValue, TResult );
- itkGetConstMacro( OutsideValue, TResult );
- itkGetObjectMacro( GrowingFunction, TGrowingFunction );
- itkGetConstObjectMacro( GrowingFunction, TGrowingFunction );
-
- itkSetMacro( InsideValue, TResult );
- itkSetMacro( OutsideValue, TResult );
- itkSetObjectMacro( GrowingFunction, TGrowingFunction );
-
- protected:
- RegionGrow( );
- virtual ~RegionGrow( );
-
- virtual bool _CheckMembership( const TVertex& v ) const;
-
- // Results-related abstract methods
- virtual bool _ComputeNeighborResult(
- TResult& result, const TVertex& neighbor, const TVertex& parent
- ) const ITK_OVERRIDE;
-
- // Queue-related abstract methods
- virtual bool _IsQueueEmpty( ) const ITK_OVERRIDE;
- virtual void _QueuePush( const TVertex& v, const _TNode& n ) ITK_OVERRIDE;
- virtual void _QueuePop( TVertex& v, _TNode& n ) ITK_OVERRIDE;
- virtual void _QueueClear( ) ITK_OVERRIDE;
-
- private:
- // Purposely not implemented
- RegionGrow( const Self& other );
- Self& operator=( const Self& other );
-
- protected:
- TResult m_InsideValue;
- TResult m_OutsideValue;
- _TQueue m_Queue;
-
- typename TGrowingFunction::Pointer m_GrowingFunction;
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Base/RegionGrow.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__BASE__REGIONGROW__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__REGIONGROWING__HXX__
-#define __FPA__BASE__REGIONGROWING__HXX__
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-fpa::Base::RegionGrow< V, C, R, S, VC, B >::
-RegionGrow( )
- : Superclass( ),
- m_InsideValue( TResult( 1 ) ),
- m_OutsideValue( TResult( 0 ) )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-fpa::Base::RegionGrow< V, C, R, S, VC, B >::
-~RegionGrow( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-bool fpa::Base::RegionGrow< V, C, R, S, VC, B >::
-_CheckMembership( const TVertex& v ) const
-{
- if( this->m_GrowingFunction.IsNotNull( ) )
- return( this->m_GrowingFunction->Evaluate( v ) );
- else
- return( true );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-bool fpa::Base::RegionGrow< V, C, R, S, VC, B >::
-_ComputeNeighborResult(
- TResult& result, const TVertex& neighbor, const TVertex& parent
- ) const
-{
- if( this->_CheckMembership( neighbor ) )
- {
- result = this->m_InsideValue;
- return( true );
- }
- else
- {
- result = this->m_OutsideValue;
- return( false );
-
- } // fi
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-bool fpa::Base::RegionGrow< V, C, R, S, VC, B >::
-_IsQueueEmpty( ) const
-{
- return( this->m_Queue.empty( ) );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-void fpa::Base::RegionGrow< V, C, R, S, VC, B >::
-_QueuePush( const TVertex& v, const _TNode& n )
-{
- this->m_Queue.push( std::pair< TVertex, _TNode >( v, n ) );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-void fpa::Base::RegionGrow< V, C, R, S, VC, B >::
-_QueuePop( TVertex& v, _TNode& n )
-{
- v = this->m_Queue.front( ).first;
- n = this->m_Queue.front( ).second;
- this->m_Queue.pop( );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class C, class R, class S, class VC, class B >
-void fpa::Base::RegionGrow< V, C, R, S, VC, B >::
-_QueueClear( )
-{
- while( this->m_Queue.size( ) > 0 )
- this->m_Queue.pop( );
-}
-
-#endif // __FPA__BASE__REGIONGROWING__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__REGIONGROWWITHMULTIPLECRITERIA__H__
-#define __FPA__BASE__REGIONGROWWITHMULTIPLECRITERIA__H__
-
-#include <vector>
-#include <itkFunctionBase.h>
-#include <fpa/Base/RegionGrow.h>
-
-namespace fpa
-{
- namespace Base
- {
- /**
- * Region grow is a front propagation with no costs.
- */
- template< class V, class R, class VV, class VC, class B >
- class RegionGrowWithMultipleCriteria
- : public RegionGrow< V, R, VV, VC, B >
- {
- public:
- typedef V TVertex;
- typedef R TResult;
- typedef VV TVertexValue;
- typedef B TBaseFilter;
-
- /// Standard class typdedefs
- typedef RegionGrowWithMultipleCriteria Self;
- typedef RegionGrow< V, R, VV, VC, B > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef typename Superclass::TTraits TTraits;
- typedef typename Superclass::TCost TCost;
- typedef itk::FunctionBase< V, TCost > TMembershipFunction;
- typedef
- typename TMembershipFunction::Pointer
- TMembershipFunctionPointer;
- typedef std::vector< TMembershipFunctionPointer > TFunctions;
-
- protected:
- typedef typename Superclass::_TFrontId _TFrontId;
- typedef typename Superclass::_TNode _TNode;
- typedef typename Superclass::_TNodes _TNodes;
- typedef typename Superclass::_TQueue _TQueue;
- typedef typename Superclass::_TMarks _TMarks;
-
- public:
- itkTypeMacro( RegionGrowWithMultipleCriteria, RegionGrow );
-
- public:
- unsigned int GetNumberOfMembershipFunctions( ) const;
- void ClearMembershipFunctions( );
- void AddMembershipFunction( TMembershipFunction* function );
-
- protected:
- RegionGrowWithMultipleCriteria( );
- virtual ~RegionGrowWithMultipleCriteria( );
-
- virtual void _BeforeMainLoop( );
- virtual void _AfterLoop( );
- virtual void _Loop( );
- virtual bool _CheckMembership( const _TNode& n ) const;
-
- private:
- RegionGrowWithMultipleCriteria( const Self& ); // Not impl.
- void operator=( const Self& ); // Not impl.
-
- protected:
- mutable _TQueue m_AuxiliaryQueue;
- TFunctions m_Functions;
- typename TFunctions::iterator m_ActualFunction;
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Base/RegionGrowWithMultipleCriteria.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__BASE__REGIONGROWWITHMULTIPLECRITERIA__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__BASE__REGIONGROWWITHMULTIPLECRITERIA__HXX__
-#define __FPA__BASE__REGIONGROWWITHMULTIPLECRITERIA__HXX__
-
-// -------------------------------------------------------------------------
-template< class V, class R, class VV, class VC, class B >
-unsigned int fpa::Base::RegionGrowWithMultipleCriteria< V, R, VV, VC, B >::
-GetNumberOfMembershipFunctions( ) const
-{
- return( this->m_Functions.size( ) );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class R, class VV, class VC, class B >
-void fpa::Base::RegionGrowWithMultipleCriteria< V, R, VV, VC, B >::
-ClearMembershipFunctions( )
-{
- this->m_Functions.clear( );
- this->Modified( );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class R, class VV, class VC, class B >
-void fpa::Base::RegionGrowWithMultipleCriteria< V, R, VV, VC, B >::
-AddMembershipFunction( TMembershipFunction* function )
-{
- this->m_Functions.push_back( function );
- this->Modified( );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class R, class VV, class VC, class B >
-fpa::Base::RegionGrowWithMultipleCriteria< V, R, VV, VC, B >::
-RegionGrowWithMultipleCriteria( )
- : Superclass( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class V, class R, class VV, class VC, class B >
-fpa::Base::RegionGrowWithMultipleCriteria< V, R, VV, VC, B >::
-~RegionGrowWithMultipleCriteria( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class V, class R, class VV, class VC, class B >
-void fpa::Base::RegionGrowWithMultipleCriteria< V, R, VV, VC, B >::
-_BeforeMainLoop( )
-{
- this->Superclass::_BeforeMainLoop( );
- this->m_ActualFunction = this->m_Functions.begin( );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class R, class VV, class VC, class B >
-void fpa::Base::RegionGrowWithMultipleCriteria< V, R, VV, VC, B >::
-_AfterLoop( )
-{
- this->Superclass::_AfterLoop( );
-
- // Replace queue
- this->_QueueClear( );
- while( !( this->m_AuxiliaryQueue.empty( ) ) )
- {
- // Get node
- _TNode node = this->m_AuxiliaryQueue.front( );
- this->m_AuxiliaryQueue.pop( );
- this->_QueuePush( node );
-
- // Unmark it
- typename _TMarks::iterator mIt = this->m_Marks.find( node.Vertex );
- if( mIt != this->m_Marks.end( ) )
- this->m_Marks.erase( mIt );
-
- } // elihw
-
- // Move to next function
- this->m_ActualFunction++;
-}
-
-// -------------------------------------------------------------------------
-template< class V, class R, class VV, class VC, class B >
-void fpa::Base::RegionGrowWithMultipleCriteria< V, R, VV, VC, B >::
-_Loop( )
-{
- while( this->m_ActualFunction != this->m_Functions.end( ) )
- this->Superclass::_Loop( );
-}
-
-// -------------------------------------------------------------------------
-template< class V, class R, class VV, class VC, class B >
-bool fpa::Base::RegionGrowWithMultipleCriteria< V, R, VV, VC, B >::
-_CheckMembership( const _TNode& n ) const
-{
- if( this->m_ActualFunction != this->m_Functions.end( ) )
- {
- bool ret = ( *( this->m_ActualFunction ) )->Evaluate( n.Vertex );
- if( !ret )
- this->m_AuxiliaryQueue.push( n );
- return( ret );
- }
- else
- return( false );
-}
-
-#endif // __FPA__BASE__REGIONGROWWITHMULTIPLECRITERIA__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#include <fpa/Common.h>
-
-// -------------------------------------------------------------------------
-std::string fpa::GetVersion( )
-{
- return( "@VERSION_STRING@" );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__COMMON__H__
-#define __FPA__COMMON__H__
-
-#include <string>
-#include <fpa/fpa_Export.h>
-
-namespace fpa
-{
- std::string fpa_EXPORT GetVersion( );
-
-} // ecapseman
-
-#endif // __FPA__COMMON__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IO__MINIMUMSPANNINGTREEREADER__H__
-#define __FPA__IO__MINIMUMSPANNINGTREEREADER__H__
-
-#include <string>
-#include <itkProcessObject.h>
-
-namespace fpa
-{
- namespace IO
- {
- /**
- */
- template< class _TTree >
- class MinimumSpanningTreeReader
- : public itk::ProcessObject
- {
- public:
- typedef MinimumSpanningTreeReader Self;
- typedef itk::ProcessObject Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef _TTree TTree;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( MinimumSpanningTreeReader, itkProcessObject );
-
- itkGetConstMacro( FileName, std::string );
- itkSetMacro( FileName, std::string );
-
- public:
- _TTree* GetOutput( );
- virtual void Update( ) ITK_OVERRIDE;
-
- protected:
- MinimumSpanningTreeReader( );
- virtual ~MinimumSpanningTreeReader( );
-
- virtual void GenerateData( ) ITK_OVERRIDE;
-
- private:
- // Purposely not implemented
- MinimumSpanningTreeReader( const Self& other );
- Self& operator=( const Self& other );
-
- protected:
- std::string m_FileName;
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/IO/MinimumSpanningTreeReader.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__IO__MINIMUMSPANNINGTREEREADER__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IO__MINIMUMSPANNINGTREEREADER__HXX__
-#define __FPA__IO__MINIMUMSPANNINGTREEREADER__HXX__
-
-#include <fstream>
-#include <sstream>
-#include <itkMacro.h>
-#include <itkOffset.h>
-
-// -------------------------------------------------------------------------
-template< class _TTree >
-_TTree* fpa::IO::MinimumSpanningTreeReader< _TTree >::
-GetOutput( )
-{
- return(
- dynamic_cast< _TTree* >( this->itk::ProcessObject::GetOutput( 0 ) )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class _TTree >
-void fpa::IO::MinimumSpanningTreeReader< _TTree >::
-Update( )
-{
- this->GenerateData( );
-}
-
-// -------------------------------------------------------------------------
-template< class _TTree >
-fpa::IO::MinimumSpanningTreeReader< _TTree >::
-MinimumSpanningTreeReader( )
- : Superclass( ),
- m_FileName( "" )
-{
- this->SetNumberOfRequiredInputs( 0 );
- this->SetNumberOfRequiredOutputs( 0 );
- typename _TTree::Pointer out = _TTree::New( );
- this->itk::ProcessObject::SetNthOutput( 0, out.GetPointer( ) );
-}
-
-// -------------------------------------------------------------------------
-template< class _TTree >
-fpa::IO::MinimumSpanningTreeReader< _TTree >::
-~MinimumSpanningTreeReader( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class _TTree >
-void fpa::IO::MinimumSpanningTreeReader< _TTree >::
-GenerateData( )
-{
- _TTree* tree = this->GetOutput( );
-
- char* buff = NULL;
- std::ifstream file(
- this->m_FileName.c_str( ),
- std::ios::in | std::ios::binary | std::ios::ate
- );
- if( !file )
- {
- itkExceptionMacro(
- << "Error opening file to read a minimum spanning tree: \""
- << this->m_FileName
- << "\""
- );
- return;
-
- } // fi
-
- // Put all file into a memory buffer
- auto size = file.tellg( );
- buff = new char[ size ];
- file.seekg( 0, std::ios::beg );
- file.read ( buff, size );
- file.close( );
- std::istringstream in( buff );
-
- // Read basic data
- unsigned int dim, fill_queue;
- in >> dim >> fill_queue;
- tree->SetFillNodeQueue( fill_queue == 1 );
-
- // Read regions
- typename _TTree::IndexType li, ri, bi;
- typename _TTree::SizeType ls, rs, bs;
- li.Fill( 0 );
- ri = bi = li;
- ls.Fill( 0 );
- rs = bs = ls;
- for( unsigned int d = 0; d < dim; ++d )
- if( d < _TTree::ImageDimension )
- in >> li[ d ] >> ls[ d ];
- for( unsigned int d = 0; d < dim; ++d )
- if( d < _TTree::ImageDimension )
- in >> ri[ d ] >> rs[ d ];
- for( unsigned int d = 0; d < dim; ++d )
- if( d < _TTree::ImageDimension )
- in >> bi[ d ] >> bs[ d ];
- typename _TTree::RegionType lr, rr, br;
- lr.SetIndex( li ); lr.SetSize( ls );
- rr.SetIndex( ri ); rr.SetSize( rs );
- br.SetIndex( bi ); br.SetSize( bs );
-
- // Read spatial information
- typename _TTree::SpacingType spc;
- typename _TTree::PointType ori;
- typename _TTree::DirectionType dir;
- for( unsigned int d = 0; d < dim; ++d )
- if( d < _TTree::ImageDimension )
- in >> ori[ d ];
- for( unsigned int d = 0; d < dim; ++d )
- if( d < _TTree::ImageDimension )
- in >> spc[ d ];
- for( unsigned int d = 0; d < dim; ++d )
- {
- if( d < _TTree::ImageDimension )
- {
- for( unsigned int e = 0; e < dim; ++e )
- if( e < _TTree::ImageDimension )
- in >> dir[ d ][ e ];
-
- } // fi
-
- } // rof
-
- // Allocate memory and prepare it
- tree->SetLargestPossibleRegion( lr );
- tree->SetRequestedRegion( rr );
- tree->SetBufferedRegion( br );
- tree->SetOrigin( ori );
- tree->SetSpacing( spc );
- tree->SetDirection( dir );
- tree->Allocate( );
- tree->Clear( );
-
- // Read collisions
- typedef typename _TTree::TCollision _TCollision;
- typedef typename _TTree::TCollisionsRow _TCollisionsRow;
- typename _TTree::TCollisions coll;
- unsigned long coll_size;
- in >> coll_size;
- for( unsigned long i = 0; i < coll_size; ++i )
- {
- coll.push_back( _TCollisionsRow( ) );
-
- unsigned long row_size;
- in >> row_size;
- for( unsigned long j = 0; j < row_size; ++j )
- {
- typename _TTree::IndexType v;
- for( unsigned int d = 0; d < dim; ++d )
- if( d < _TTree::ImageDimension )
- in >> v[ d ];
- unsigned int b;
- in >> b;
- coll[ i ].push_back( _TCollision( v, b == 1 ) );
-
- } // rof
-
- } // rof
- tree->SetCollisions( coll );
-
- // Read vertices
- while( !in.eof( ) )
- {
- short fid;
- double cost;
- typename _TTree::IndexType v;
- typename _TTree::IndexType::OffsetType p;
- in >> fid >> cost;
- for( unsigned int d = 0; d < dim; ++d )
- if( d < _TTree::ImageDimension )
- in >> v[ d ];
- for( unsigned int d = 0; d < dim; ++d )
- if( d < _TTree::ImageDimension )
- in >> p[ d ];
- tree->SetNode( v, v + p, fid, cost );
-
- } // elihw
-
- // Free buffer
- delete [] buff;
-}
-
-#endif // __FPA__IO__MINIMUMSPANNINGTREEREADER__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IO__MINIMUMSPANNINGTREEWRITER__H__
-#define __FPA__IO__MINIMUMSPANNINGTREEWRITER__H__
-
-#include <string>
-#include <itkProcessObject.h>
-
-namespace fpa
-{
- namespace IO
- {
- /**
- */
- template< class _TTree >
- class MinimumSpanningTreeWriter
- : public itk::ProcessObject
- {
- public:
- typedef MinimumSpanningTreeWriter Self;
- typedef itk::ProcessObject Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef _TTree TTree;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( MinimumSpanningTreeWriter, itkProcessObject );
-
- itkGetConstMacro( FileName, std::string );
- itkSetMacro( FileName, std::string );
-
- public:
- void SetInput( const _TTree* input );
- _TTree* GetInput( );
- const _TTree* GetInput( ) const;
- virtual void Update( ) ITK_OVERRIDE;
-
- protected:
- MinimumSpanningTreeWriter( );
- virtual ~MinimumSpanningTreeWriter( );
-
- virtual void GenerateData( ) ITK_OVERRIDE;
-
- private:
- // Purposely not implemented
- MinimumSpanningTreeWriter( const Self& other );
- Self& operator=( const Self& other );
-
- protected:
- std::string m_FileName;
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/IO/MinimumSpanningTreeWriter.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__IO__MINIMUMSPANNINGTREEWRITER__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IO__MINIMUMSPANNINGTREEWRITER__HXX__
-#define __FPA__IO__MINIMUMSPANNINGTREEWRITER__HXX__
-
-#include <fstream>
-#include <sstream>
-#include <itkMacro.h>
-#include <itkOffset.h>
-#include <itkImageRegionConstIteratorWithIndex.h>
-
-// -------------------------------------------------------------------------
-template< class _TTree >
-void fpa::IO::MinimumSpanningTreeWriter< _TTree >::
-SetInput( const _TTree* input )
-{
- this->itk::ProcessObject::SetNthInput( 0, const_cast< _TTree* >( input ) );
-}
-
-// -------------------------------------------------------------------------
-template< class _TTree >
-_TTree* fpa::IO::MinimumSpanningTreeWriter< _TTree >::
-GetInput( )
-{
- return(
- dynamic_cast< _TTree* >( this->itk::ProcessObject::GetInput( 0 ) )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class _TTree >
-const _TTree* fpa::IO::MinimumSpanningTreeWriter< _TTree >::
-GetInput( ) const
-{
- return(
- dynamic_cast< const _TTree* >( this->itk::ProcessObject::GetInput( 0 ) )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class _TTree >
-void fpa::IO::MinimumSpanningTreeWriter< _TTree >::
-Update( )
-{
- _TTree* input = this->GetInput( );
- if( input != NULL )
- {
- input->UpdateOutputInformation( );
- input->UpdateOutputData( );
- this->GenerateData( );
- this->ReleaseInputs( );
-
- } // fi
-}
-
-// -------------------------------------------------------------------------
-template< class _TTree >
-fpa::IO::MinimumSpanningTreeWriter< _TTree >::
-MinimumSpanningTreeWriter( )
- : Superclass( ),
- m_FileName( "" )
-{
- this->SetNumberOfRequiredInputs( 1 );
-}
-
-// -------------------------------------------------------------------------
-template< class _TTree >
-fpa::IO::MinimumSpanningTreeWriter< _TTree >::
-~MinimumSpanningTreeWriter( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class _TTree >
-void fpa::IO::MinimumSpanningTreeWriter< _TTree >::
-GenerateData( )
-{
- typedef itk::Offset< _TTree::ImageDimension > _TOffset;
- _TOffset zero_off;
- zero_off.Fill( 0 );
- const _TTree* input = this->GetInput( );
-
- // Create buffer
- std::stringstream out;
-
- // Get tree properties
- unsigned int dim = _TTree::ImageDimension;
- auto lr = input->GetLargestPossibleRegion( );
- auto rr = input->GetRequestedRegion( );
- auto br = input->GetBufferedRegion( );
- auto ori = input->GetOrigin( );
- auto spc = input->GetSpacing( );
- auto dir = input->GetDirection( );
-
- // Write tree dimension
- out << dim << std::endl;
- out << ( ( input->GetFillNodeQueue( ) )? 1: 0 ) << std::endl;
-
- // Write tree regions
- out << lr.GetIndex( )[ 0 ] << " " << lr.GetSize( )[ 0 ];
- for( unsigned int d = 1; d < dim; ++d )
- out << " " << lr.GetIndex( )[ d ] << " " << lr.GetSize( )[ d ];
- out << std::endl;
- out << rr.GetIndex( )[ 0 ] << " " << rr.GetSize( )[ 0 ];
- for( unsigned int d = 1; d < dim; ++d )
- out << " " << rr.GetIndex( )[ d ] << " " << rr.GetSize( )[ d ];
- out << std::endl;
- out << br.GetIndex( )[ 0 ] << " " << br.GetSize( )[ 0 ];
- for( unsigned int d = 1; d < dim; ++d )
- out << " " << br.GetIndex( )[ d ] << " " << br.GetSize( )[ d ];
- out << std::endl;
-
- // Write spatial properties
- out << ori[ 0 ];
- for( unsigned int d = 1; d < dim; ++d )
- out << " " << ori[ d ];
- out << std::endl;
- out << spc[ 0 ];
- for( unsigned int d = 1; d < dim; ++d )
- out << " " << spc[ d ];
- out << std::endl;
- out << dir[ 0 ][ 0 ];
- for( unsigned int d = 0; d < dim; ++d )
- for( unsigned int e = 0; e < dim; ++e )
- if( d != 0 || e != 0 )
- out << " " << dir[ d ][ e ];
- out << std::endl;
-
- // Write collisions
- auto& coll = input->GetCollisions( );
- out << coll.size( ) << std::endl;
- for( unsigned long i = 0; i < coll.size( ); ++i )
- {
- out << coll[ i ].size( );
- for( unsigned long j = 0; j < coll[ i ].size( ); ++j )
- {
- for( unsigned int d = 0; d < dim; ++d )
- out << " " << coll[ i ][ j ].first[ d ];
- out << " " << coll[ i ][ j ].second << std::endl;
-
- } // rof
-
- } // rof
-
- // Write vertices
- itk::ImageRegionConstIteratorWithIndex< _TTree > vIt( input, rr );
- for( vIt.GoToBegin( ); !vIt.IsAtEnd( ); ++vIt )
- {
- if(
- vIt.Get( ).Parent != zero_off ||
- vIt.Get( ).GlobalCost > double( 0 )
- )
- {
- out << vIt.Get( ).FrontId << " " << vIt.Get( ).GlobalCost;
- for( unsigned int d = 0; d < dim; ++d )
- out << " " << vIt.GetIndex( )[ d ];
- for( unsigned int d = 0; d < dim; ++d )
- out << " " << vIt.Get( ).Parent[ d ];
- out << std::endl;
-
- } // fi
-
- } // rof
-
- // Real file write
- std::ofstream file(
- this->m_FileName.c_str( ), std::ios::binary | std::ios::trunc
- );
- if( !file )
- {
- itkExceptionMacro(
- << "Error opening file to write a minimum spanning tree: \""
- << this->m_FileName
- << "\""
- );
- return;
-
- } // fi
- file.write( out.str( ).c_str( ), out.str( ).size( ) );
- file.close( );
-}
-
-#endif // __FPA__IO__MINIMUMSPANNINGTREEWRITER__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__ALGORITHM__H__
-#define __FPA__IMAGE__ALGORITHM__H__
-
-#include <itkImage.h>
-
-namespace fpa
-{
- namespace Image
- {
- /**
- * A generic front propagation algorithm were vertices are image pixels.
- *
- * @param I Input image type
- * @param O Output image type
- * @param A Base algorithm (RegionGrow, Dijkstra or FastMarching)
- */
- template< class I, class O, class A >
- class Algorithm
- : public A
- {
- public:
- /// Standard class typdedefs
- typedef Algorithm Self;
- typedef A Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- /// Template input values
- typedef I TInputImage;
- typedef O TOutputImage;
-
- typedef typename Superclass::TVertex TVertex;
- typedef typename Superclass::TValue TValue;
- typedef typename Superclass::TResult TResult;
- typedef typename Superclass::TSpace TSpace;
- typedef typename Superclass::TVertexCompare TVertexCompare;
-
- protected:
- typedef typename Superclass::_TVertices _TVertices;
- typedef typename Superclass::_TCollision _TCollision;
- typedef typename Superclass::_TCollisionsRow _TCollisionsRow;
- typedef typename Superclass::_TCollisions _TCollisions;
- typedef typename Superclass::_TNode _TNode;
- typedef typename Superclass::_TNodes _TNodes;
-
- public:
- itkTypeMacro( Algorithm, TAlgorithm );
-
- /// Set/Get
- itkGetConstMacro( NeighborhoodOrder, unsigned int );
- itkSetMacro( NeighborhoodOrder, unsigned int );
-
- protected:
- Algorithm( );
- virtual ~Algorithm( );
-
- virtual void _BeforeGenerateData( ) ITK_OVERRIDE;
-
- // Graph-related abstract methods
- virtual unsigned long _NumberOfVertices( ) const ITK_OVERRIDE;
- virtual const TValue& _VertexValue( const TVertex& v ) const ITK_OVERRIDE;
- virtual double _Distance(
- const TVertex& a, const TVertex& b
- ) const ITK_OVERRIDE;
- virtual bool _HasEdge( const TVertex& a, const TVertex& b ) const ITK_OVERRIDE;
- virtual void _Neighborhood(
- _TVertices& neighborhood, const TVertex& v
- ) const ITK_OVERRIDE;
-
- // Results-related abstract methods
- virtual void _InitResults( ) ITK_OVERRIDE;
- virtual const TResult& _Result( const TVertex& v ) const ITK_OVERRIDE;
- virtual void _SetResult( const TVertex& v, const _TNode& n ) ITK_OVERRIDE;
-
- private:
- // Purposely not implemented
- Algorithm( const Self& other );
- Self& operator=( const Self& other );
-
- protected:
- unsigned int m_NeighborhoodOrder;
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Image/Algorithm.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__IMAGE__ALGORITHM__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__ALGORITHM__HXX__
-#define __FPA__IMAGE__ALGORITHM__HXX__
-
-#include <cmath>
-#include <itkConstNeighborhoodIterator.h>
-
-// -------------------------------------------------------------------------
-template< class I, class O, class A >
-fpa::Image::Algorithm< I, O, A >::
-Algorithm( )
- : Superclass( ),
- m_NeighborhoodOrder( 1 )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O, class A >
-fpa::Image::Algorithm< I, O, A >::
-~Algorithm( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O, class A >
-void fpa::Image::Algorithm< I, O, A >::
-_BeforeGenerateData( )
-{
- this->Superclass::_BeforeGenerateData( );
- this->AllocateOutputs( );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O, class A >
-unsigned long fpa::Image::Algorithm< I, O, A >::
-_NumberOfVertices( ) const
-{
- return( this->GetInput( )->GetRequestedRegion( ).GetNumberOfPixels( ) );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O, class A >
-const typename fpa::Image::Algorithm< I, O, A >::
-TValue& fpa::Image::Algorithm< I, O, A >::
-_VertexValue( const TVertex& v ) const
-{
- return( this->GetInput( )->GetPixel( v ) );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O, class A >
-double fpa::Image::Algorithm< I, O, A >::
-_Distance( const TVertex& a, const TVertex& b ) const
-{
- typename I::PointType pa, pb;
- this->GetInput( )->TransformIndexToPhysicalPoint( a, pa );
- this->GetInput( )->TransformIndexToPhysicalPoint( b, pb );
- return( double( pa.EuclideanDistanceTo( pb ) ) );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O, class A >
-bool fpa::Image::Algorithm< I, O, A >::
-_HasEdge( const TVertex& a, const TVertex& b ) const
-{
- unsigned long dist = 0;
- for( unsigned int d = 0; d < I::ImageDimension; d++ )
- dist += std::abs( long( a[ d ] ) - long( b[ d ] ) );
- if( this->m_NeighborhoodOrder == 1 )
- return( dist <= 1 );
- else
- return( dist <= I::ImageDimension );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O, class A >
-void fpa::Image::Algorithm< I, O, A >::
-_Neighborhood( _TVertices& neighborhood, const TVertex& v ) const
-{
- typename I::RegionType reg = this->GetInput( )->GetRequestedRegion( );
-
- neighborhood.clear( );
- if( this->m_NeighborhoodOrder == 1 )
- {
- for( unsigned int d = 0; d < I::ImageDimension; d++ )
- {
- for( int i = -1; i <= 1; i += 2 )
- {
- TVertex n = v;
- n[ d ] += i;
- if( reg.IsInside( n ) )
- neighborhood.push_back( n );
-
- } // rof
-
- } // rof
- }
- else
- {
- typedef itk::ConstNeighborhoodIterator< I > TNeighIt;
- typename I::SizeType nSize;
- nSize.Fill( 1 );
-
- TNeighIt nIt( nSize, this->GetInput( ), reg );
- nIt.SetLocation( v );
- for( unsigned int i = 0; i < nIt.Size( ); i++ )
- {
- TVertex n = nIt.GetIndex( i );
- if( n == v )
- continue;
- if( reg.IsInside( n ) )
- neighborhood.push_back( n );
-
- } // rof
-
- } // fi
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O, class A >
-void fpa::Image::Algorithm< I, O, A >::
-_InitResults( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O, class A >
-const typename fpa::Image::Algorithm< I, O, A >::
-TResult& fpa::Image::Algorithm< I, O, A >::
-_Result( const TVertex& v ) const
-{
- return( this->GetOutput( )->GetPixel( v ) );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O, class A >
-void fpa::Image::Algorithm< I, O, A >::
-_SetResult( const TVertex& v, const _TNode& n )
-{
- this->Superclass::_SetResult( v, n );
- this->GetOutput( )->SetPixel( v, n.Result );
-}
-
-#endif // __FPA__IMAGE__ALGORITHM__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__DIJKSTRA__H__
-#define __FPA__IMAGE__DIJKSTRA__H__
-
-#include <itkFunctionBase.h>
-#include <itkImageToImageFilter.h>
-#include <fpa/Base/Dijkstra.h>
-#include <fpa/Image/Algorithm.h>
-#include <fpa/Image/MinimumSpanningTree.h>
-#include <fpa/Image/Functors/ImageCostFunction.h>
-
-namespace fpa
-{
- namespace Image
- {
- /**
- * @param I Input image type
- * @param O Output image type
- */
- template< class I, class O = I >
- class Dijkstra
- : public Algorithm< I, O, fpa::Base::Dijkstra< typename I::IndexType, typename I::PixelType, typename O::PixelType, I, itk::Functor::IndexLexicographicCompare< I::ImageDimension >, fpa::Image::MinimumSpanningTree< I::ImageDimension >, itk::ImageToImageFilter< I, O > > >
- {
- public:
- typedef fpa::Base::Dijkstra< typename I::IndexType, typename I::PixelType, typename O::PixelType, I, itk::Functor::IndexLexicographicCompare< I::ImageDimension >, fpa::Image::MinimumSpanningTree< I::ImageDimension >, itk::ImageToImageFilter< I, O > > TBaseAlgorithm;
- typedef Dijkstra Self;
- typedef Algorithm< I, O, TBaseAlgorithm > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef typename Superclass::TInputImage TInputImage;
- typedef typename Superclass::TOutputImage TOutputImage;
- typedef typename Superclass::TVertex TVertex;
- typedef typename Superclass::TValue TValue;
- typedef typename Superclass::TResult TResult;
- typedef typename Superclass::TSpace TSpace;
-
- typedef typename Superclass::TStartEvent TStartEvent;
- typedef typename Superclass::TStartLoopEvent TStartLoopEvent;
- typedef typename Superclass::TEndEvent TEndEvent;
- typedef typename Superclass::TEndLoopEvent TEndLoopEvent;
- typedef typename Superclass::TAliveEvent TAliveEvent;
- typedef typename Superclass::TFrontEvent TFrontEvent;
- typedef typename Superclass::TFreezeEvent TFreezeEvent;
-
- typedef typename Superclass::TStartBacktrackingEvent TStartBacktrackingEvent;
- typedef typename Superclass::TEndBacktrackingEvent TEndBacktrackingEvent;
- typedef typename Superclass::TBacktrackingEvent TBacktrackingEvent;
-
- typedef typename TBaseAlgorithm::TMinimumSpanningTree TMinimumSpanningTree;
-
- typedef fpa::Image::Functors::ImageCostFunction< TInputImage, TResult > TCostFunction;
- typedef itk::FunctionBase< TResult, TResult > TConversionFunction;
-
- protected:
- typedef typename Superclass::_TVertices _TVertices;
- typedef typename Superclass::_TCollision _TCollision;
- typedef typename Superclass::_TCollisionsRow _TCollisionsRow;
- typedef typename Superclass::_TCollisions _TCollisions;
- typedef typename Superclass::_TNode _TNode;
- typedef typename Superclass::_TNodes _TNodes;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( Dijkstra, Algorithm );
-
- itkGetObjectMacro( CostFunction, TCostFunction );
- itkGetObjectMacro( ConversionFunction, TConversionFunction );
-
- itkGetConstObjectMacro( CostFunction, TCostFunction );
- itkGetConstObjectMacro( ConversionFunction, TConversionFunction );
-
- itkSetObjectMacro( CostFunction, TCostFunction );
- itkSetObjectMacro( ConversionFunction, TConversionFunction );
-
- protected:
- Dijkstra( );
- virtual ~Dijkstra( );
-
- virtual TResult _Cost( const TVertex& v, const TVertex& p ) const ITK_OVERRIDE;
-
- virtual void _BeforeGenerateData( ) ITK_OVERRIDE;
- virtual void _AfterGenerateData( ) ITK_OVERRIDE;
- virtual void _InitResults( ) ITK_OVERRIDE;
-
- private:
- // Purposely not implemented
- Dijkstra( const Self& other );
- Self& operator=( const Self& other );
-
- protected:
- typename TCostFunction::Pointer m_CostFunction;
- typename TConversionFunction::Pointer m_ConversionFunction;
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Image/Dijkstra.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__IMAGE__DIJKSTRA__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__DIJKSTRA__HXX__
-#define __FPA__IMAGE__DIJKSTRA__HXX__
-
-#include <limits>
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-fpa::Image::Dijkstra< I, O >::
-Dijkstra( )
- : Superclass( )
-{
- this->m_CostFunction = TCostFunction::New( );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-fpa::Image::Dijkstra< I, O >::
-~Dijkstra( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-typename fpa::Image::Dijkstra< I, O >::
-TResult fpa::Image::Dijkstra< I, O >::
-_Cost( const TVertex& v, const TVertex& p ) const
-{
- if( this->_HasEdge( v, p ) )
- {
- TResult c = this->m_CostFunction->Evaluate( v, p );
- if( this->m_ConversionFunction.IsNotNull( ) )
- c = this->m_ConversionFunction->Evaluate( c );
- return( c );
- }
- else
- return( std::numeric_limits< TResult >::max( ) );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-void fpa::Image::Dijkstra< I, O >::
-_BeforeGenerateData( )
-{
- this->Superclass::_BeforeGenerateData( );
- this->m_CostFunction->SetInputImage( this->GetInput( ) );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-void fpa::Image::Dijkstra< I, O >::
-_AfterGenerateData( )
-{
- this->Superclass::_AfterGenerateData( );
- this->GetMinimumSpanningTree( )->SetCollisions( this->m_Collisions );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-void fpa::Image::Dijkstra< I, O >::
-_InitResults( )
-{
- this->Superclass::_InitResults( );
- this->GetOutput( )->FillBuffer( TResult( 0 ) );
-}
-
-#endif // __FPA__IMAGE__DIJKSTRA__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__DIJKSTRAWITHENDPOINTDETECTION__H__
-#define __FPA__IMAGE__DIJKSTRAWITHENDPOINTDETECTION__H__
-
-#include <map>
-#include <itkImage.h>
-#include <fpa/Image/Dijkstra.h>
-#include <fpa/Base/MatrixValuesContainer.h>
-#include <fpa/Base/UniqueValuesContainer.h>
-
-namespace fpa
-{
- namespace Image
- {
- /**
- * @param I Input image type
- * @param O Output image type
- */
- template< class I, class O >
- class DijkstraWithEndPointDetection
- : public Dijkstra< I, O >
- {
- public:
- typedef DijkstraWithEndPointDetection Self;
- typedef Dijkstra< I, O > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef typename Superclass::TInputImage TInputImage;
- typedef typename Superclass::TOutputImage TOutputImage;
- typedef typename Superclass::TVertex TVertex;
- typedef typename Superclass::TVertexCompare TVertexCompare;
- typedef typename Superclass::TValue TValue;
- typedef typename Superclass::TResult TResult;
- typedef typename Superclass::TSpace TSpace;
- typedef typename Superclass::TMinimumSpanningTree TMinimumSpanningTree;
- typedef typename Superclass::TCostFunction TCostFunction;
- typedef typename Superclass::TConversionFunction TConversionFunction;
- typedef typename Superclass::_TVertices TVertices;
-
- typedef typename Superclass::TStartEvent TStartEvent;
- typedef typename Superclass::TStartLoopEvent TStartLoopEvent;
- typedef typename Superclass::TEndEvent TEndEvent;
- typedef typename Superclass::TEndLoopEvent TEndLoopEvent;
- typedef typename Superclass::TAliveEvent TAliveEvent;
- typedef typename Superclass::TFrontEvent TFrontEvent;
- typedef typename Superclass::TFreezeEvent TFreezeEvent;
-
- typedef typename
- Superclass::TStartBacktrackingEvent TStartBacktrackingEvent;
- typedef typename
- Superclass::TEndBacktrackingEvent TEndBacktrackingEvent;
- typedef typename
- Superclass::TBacktrackingEvent TBacktrackingEvent;
-
- typedef unsigned short TLabel;
- typedef itk::Image< TLabel, I::ImageDimension > TLabelImage;
-
- typedef fpa::Base::
- UniqueValuesContainer< TVertex, TVertexCompare > TUniqueVertices;
- typedef fpa::Base::
- MatrixValuesContainer< TVertex, TLabel, TVertexCompare > TBranches;
-
- protected:
- typedef typename Superclass::_TVertices _TVertices;
- typedef typename Superclass::_TCollision _TCollision;
- typedef typename Superclass::_TCollisionsRow _TCollisionsRow;
- typedef typename Superclass::_TCollisions _TCollisions;
- typedef typename Superclass::_TNode _TNode;
- typedef typename Superclass::_TNodes _TNodes;
-
- typedef typename I::PixelType _TPixel;
- typedef typename I::RegionType _TRegion;
- typedef typename I::SizeType _TSize;
-
- typedef std::pair< TResult, TVertex > _TCandidate;
- typedef std::multimap< TResult, TVertex > _TCandidates;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( DijkstraWithEndPointDetection, Dijkstra );
-
- itkBooleanMacro( CorrectSeeds );
- itkBooleanMacro( CorrectEndPoints );
-
- itkGetConstMacro( CorrectSeeds, bool );
- itkGetConstMacro( CorrectEndPoints, bool );
- itkGetConstMacro( SafetyNeighborhoodSize, unsigned int );
-
- itkGetConstMacro( NumberOfBranches, unsigned long );
-
- itkSetMacro( CorrectSeeds, bool );
- itkSetMacro( CorrectEndPoints, bool );
- itkSetMacro( SafetyNeighborhoodSize, unsigned int );
-
- public:
- TLabelImage* GetLabelImage( );
- const TLabelImage* GetLabelImage( ) const;
- void GraftLabelImage( itk::DataObject* obj );
-
- TUniqueVertices* GetEndPoints( );
- const TUniqueVertices* GetEndPoints( ) const;
- void GraftEndPoints( itk::DataObject* obj );
-
- TUniqueVertices* GetBifurcations( );
- const TUniqueVertices* GetBifurcations( ) const;
- void GraftBifurcations( itk::DataObject* obj );
-
- TBranches* GetBranches( );
- const TBranches* GetBranches( ) const;
- void GraftBranches( itk::DataObject* obj );
-
- protected:
- DijkstraWithEndPointDetection( );
- virtual ~DijkstraWithEndPointDetection( );
-
- virtual void _BeforeGenerateData( );
- virtual void _AfterGenerateData( );
- virtual void _SetResult( const TVertex& v, const _TNode& n );
-
- void _EndPointsAndBifurcations( );
- void _FindBranches( );
- void _LabelAll( );
-
- _TRegion _Region( const TVertex& c, const double& r );
-
- template< class _T >
- TVertex _MaxInRegion(
- const _T* image, const TVertex& v, const double& r
- );
-
- private:
- // Purposely not implemented
- DijkstraWithEndPointDetection( const Self& other );
- Self& operator=( const Self& other );
-
- protected:
- unsigned int m_LabelImageIndex;
- unsigned int m_BifurcationsIndex;
- unsigned int m_EndPointsIndex;
- unsigned int m_BranchesIndex;
-
- bool m_CorrectSeeds;
- bool m_CorrectEndPoints;
- unsigned int m_SafetyNeighborhoodSize;
-
- _TCandidates m_Candidates;
- unsigned long m_NumberOfBranches;
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Image/DijkstraWithEndPointDetection.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__IMAGE__DIJKSTRAWITHENDPOINTDETECTION__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__DIJKSTRAWITHENDPOINTDETECTION__HXX__
-#define __FPA__IMAGE__DIJKSTRAWITHENDPOINTDETECTION__HXX__
-
-#include <vector>
-#include <set>
-#include <itkImageRegionConstIteratorWithIndex.h>
-#include <itkImageRegionIteratorWithIndex.h>
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-typename fpa::Image::DijkstraWithEndPointDetection< I, O >::
-TLabelImage* fpa::Image::DijkstraWithEndPointDetection< I, O >::
-GetLabelImage( )
-{
- return(
- dynamic_cast< TLabelImage* >(
- this->itk::ProcessObject::GetOutput( this->m_LabelImageIndex )
- )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-const typename fpa::Image::DijkstraWithEndPointDetection< I, O >::
-TLabelImage* fpa::Image::DijkstraWithEndPointDetection< I, O >::
-GetLabelImage( ) const
-{
- return(
- dynamic_cast< const TLabelImage* >(
- this->itk::ProcessObject::GetOutput( this->m_LabelImageIndex )
- )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-void fpa::Image::DijkstraWithEndPointDetection< I, O >::
-GraftLabelImage( itk::DataObject* obj )
-{
- TLabelImage* lbl =
- dynamic_cast< TLabelImage* >(
- this->itk::ProcessObject::GetOutput( this->m_LabelImageIndex )
- );
- if( lbl != NULL )
- this->GraftNthOutput( this->m_LabelImageIndex, lbl );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-typename fpa::Image::DijkstraWithEndPointDetection< I, O >::
-TUniqueVertices* fpa::Image::DijkstraWithEndPointDetection< I, O >::
-GetEndPoints( )
-{
- return(
- dynamic_cast< TUniqueVertices* >(
- this->itk::ProcessObject::GetOutput( this->m_EndPointsIndex )
- )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-const typename fpa::Image::DijkstraWithEndPointDetection< I, O >::
-TUniqueVertices* fpa::Image::DijkstraWithEndPointDetection< I, O >::
-GetEndPoints( ) const
-{
- return(
- dynamic_cast< const TUniqueVertices* >(
- this->itk::ProcessObject::GetOutput( this->m_EndPointsIndex )
- )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-void fpa::Image::DijkstraWithEndPointDetection< I, O >::
-GraftEndPoints( itk::DataObject* obj )
-{
- TUniqueVertices* lbl =
- dynamic_cast< TUniqueVertices* >(
- this->itk::ProcessObject::GetOutput( this->m_EndPointsIndex )
- );
- if( lbl != NULL )
- this->GraftNthOutput( this->m_EndPointsIndex, lbl );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-typename fpa::Image::DijkstraWithEndPointDetection< I, O >::
-TUniqueVertices* fpa::Image::DijkstraWithEndPointDetection< I, O >::
-GetBifurcations( )
-{
- return(
- dynamic_cast< TUniqueVertices* >(
- this->itk::ProcessObject::GetOutput( this->m_BifurcationsIndex )
- )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-const typename fpa::Image::DijkstraWithEndPointDetection< I, O >::
-TUniqueVertices* fpa::Image::DijkstraWithEndPointDetection< I, O >::
-GetBifurcations( ) const
-{
- return(
- dynamic_cast< const TUniqueVertices* >(
- this->itk::ProcessObject::GetOutput( this->m_BifurcationsIndex )
- )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-void fpa::Image::DijkstraWithEndPointDetection< I, O >::
-GraftBifurcations( itk::DataObject* obj )
-{
- TUniqueVertices* lbl =
- dynamic_cast< TUniqueVertices* >(
- this->itk::ProcessObject::GetOutput( this->m_BifurcationsIndex )
- );
- if( lbl != NULL )
- this->GraftNthOutput( this->m_BifurcationsIndex, lbl );
-}
-
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-typename fpa::Image::DijkstraWithEndPointDetection< I, O >::
-TBranches* fpa::Image::DijkstraWithEndPointDetection< I, O >::
-GetBranches( )
-{
- return(
- dynamic_cast< TBranches* >(
- this->itk::ProcessObject::GetOutput( this->m_BranchesIndex )
- )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-const typename fpa::Image::DijkstraWithEndPointDetection< I, O >::
-TBranches* fpa::Image::DijkstraWithEndPointDetection< I, O >::
-GetBranches( ) const
-{
- return(
- dynamic_cast< const TBranches* >(
- this->itk::ProcessObject::GetOutput( this->m_BranchesIndex )
- )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-void fpa::Image::DijkstraWithEndPointDetection< I, O >::
-GraftBranches( itk::DataObject* obj )
-{
- TBranches* lbl =
- dynamic_cast< TBranches* >(
- this->itk::ProcessObject::GetOutput( this->m_BranchesIndex )
- );
- if( lbl != NULL )
- this->GraftNthOutput( this->m_BranchesIndex, lbl );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-fpa::Image::DijkstraWithEndPointDetection< I, O >::
-DijkstraWithEndPointDetection( )
- : Superclass( ),
- m_CorrectSeeds( true ),
- m_CorrectEndPoints( true ),
- m_SafetyNeighborhoodSize( 3 )
-{
- this->m_LabelImageIndex = this->GetNumberOfRequiredOutputs( );
- this->m_EndPointsIndex = this->m_LabelImageIndex + 1;
- this->m_BifurcationsIndex = this->m_LabelImageIndex + 2;
- this->m_BranchesIndex = this->m_LabelImageIndex + 3;
- this->SetNumberOfRequiredOutputs( this->m_LabelImageIndex + 4 );
- this->itk::ProcessObject::SetNthOutput(
- this->m_LabelImageIndex, TLabelImage::New( )
- );
- this->itk::ProcessObject::SetNthOutput(
- this->m_EndPointsIndex, TUniqueVertices::New( )
- );
- this->itk::ProcessObject::SetNthOutput(
- this->m_BifurcationsIndex, TUniqueVertices::New( )
- );
- this->itk::ProcessObject::SetNthOutput(
- this->m_BranchesIndex, TBranches::New( )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-fpa::Image::DijkstraWithEndPointDetection< I, O >::
-~DijkstraWithEndPointDetection( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-void fpa::Image::DijkstraWithEndPointDetection< I, O >::
-_BeforeGenerateData( )
-{
- if( this->m_CorrectSeeds )
- {
- const I* input = this->GetInput( );
- typename I::SpacingType spac = input->GetSpacing( );
- double max_spac = double( spac[ 0 ] );
- for( unsigned int d = 1; d < I::ImageDimension; ++d )
- max_spac =
- ( double( spac[ d ] ) > max_spac )? double( spac[ d ] ): max_spac;
- max_spac *= double( 3 );
-
- // Correct seeds
- for( unsigned int s = 0; s < this->m_SeedVertices.size( ); ++s )
- {
- TVertex seed = this->m_SeedVertices[ s ];
- _TNode n = this->m_Seeds[ seed ];
- _TRegion region = this->_Region( seed, max_spac );
- itk::ImageRegionConstIteratorWithIndex< I > iIt( input, region );
-
- iIt.GoToBegin( );
- _TPixel max_value = iIt.Get( );
- for( ++iIt; !iIt.IsAtEnd( ); ++iIt )
- {
- if( iIt.Get( ) > max_value )
- {
- this->m_SeedVertices[ s ] = iIt.GetIndex( );
- max_value = iIt.Get( );
-
- } // fi
-
- } // rof
- this->m_Seeds.erase( seed );
- n.Parent = this->m_SeedVertices[ s ];
- this->m_Seeds[ this->m_SeedVertices[ s ] ] = n;
-
- } // rof
-
- } // fi
-
- // End initialization
- this->Superclass::_BeforeGenerateData( );
- this->m_Candidates.clear( );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-void fpa::Image::DijkstraWithEndPointDetection< I, O >::
-_AfterGenerateData( )
-{
- // Finish base algorithm
- this->Superclass::_AfterGenerateData( );
-
- // Check if backtracking has any sense
- if( this->m_Candidates.size( ) == 0 )
- return;
- this->InvokeEvent( TEndEvent( ) );
- this->InvokeEvent( TStartBacktrackingEvent( ) );
-
- // Detect endpoints and bifurcations
- this->_EndPointsAndBifurcations( );
-
- // Find branches
- this->_FindBranches( );
-
- // Label pixels and branches
- this->_LabelAll( );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-void fpa::Image::DijkstraWithEndPointDetection< I, O >::
-_SetResult( const TVertex& v, const _TNode& n )
-{
- this->Superclass::_SetResult( v, n );
- this->m_Candidates.insert( _TCandidate( n.Result, v ) );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-void fpa::Image::DijkstraWithEndPointDetection< I, O >::
-_EndPointsAndBifurcations( )
-{
- // Prepare backtracking objects
- TUniqueVertices* endpoints = this->GetEndPoints( );
- TUniqueVertices* bifurcations = this->GetBifurcations( );
- endpoints->Clear( );
- bifurcations->Clear( );
-
- // Get some input values
- TVertex seed = this->GetSeed( 0 );
- const I* input = this->GetInput( );
- const TMinimumSpanningTree* mst = this->GetMinimumSpanningTree( );
-
- // Prepare a pixel marks structure
- typedef std::map< TVertex, bool, TVertexCompare > _TPixelMarks;
- _TPixelMarks pixel_marks;
-
- // Object to hold tree-nodes marks
- typedef std::set< TVertex, TVertexCompare > _TTreeMarks;
- _TTreeMarks tree_marks;
-
- // Iterate over the candidates, starting from the candidates that
- // are near thin branches (high accumulated cost)
- typename _TCandidates::const_reverse_iterator cIt =
- this->m_Candidates.rbegin( );
- for( ; cIt != this->m_Candidates.rend( ); ++cIt )
- {
- // If pixel has already been visited, pass
- TVertex v = cIt->second;
- if( pixel_marks[ v ] )
- continue;
-
- // Correct it to nearest start candidate (high distance value)
- double vr = std::sqrt( double( input->GetPixel( v ) ) );
- if( this->m_CorrectEndPoints )
- v = this->_MaxInRegion( input, v, vr * double( 1.5 ) );
-
- // Now, check for real marking conditions
- // 1. Has it been visited by dijkstra?
- if( this->_Node( v ).Label == Self::FarLabel )
- continue;
- // 2. Is it already marked?
- if( pixel_marks[ v ] )
- continue;
- // 3. Is it already an endpoint?
- if( endpoints->Find( v ) )
- continue;
- // 4. Ok, it is completely new!
- endpoints->Insert( v );
-
- // Get the path all the way to global seed
- TVertices path = mst->GetPath( v, seed );
-
- // Backtracking to find endpoints and bifurcations
- bool adding_new_points = true;
- typename TVertices::const_iterator pIt = path.begin( );
- for( ; pIt != path.end( ) && adding_new_points; ++pIt )
- {
- this->InvokeEvent( TBacktrackingEvent( *pIt, 1 ) );
- if( tree_marks.find( *pIt ) == tree_marks.end( ) )
- {
- // Mark current point as a tree point
- tree_marks.insert( *pIt );
-
- // Mark a region around current point as visited
- vr = std::sqrt( double( input->GetPixel( *pIt ) ) );
- _TRegion region = this->_Region( *pIt, vr );
- if( region.GetNumberOfPixels( ) > 0 )
- {
- itk::ImageRegionConstIteratorWithIndex< I > iIt( input, region );
- for( iIt.GoToBegin( ); !iIt.IsAtEnd( ); ++iIt )
- pixel_marks[ iIt.GetIndex( ) ] = true;
- }
- else
- pixel_marks[ *pIt ] = true;
- }
- else
- {
- // A bifurcation point has been reached!
- if( *pIt != seed )
- {
- bifurcations->Insert( *pIt );
- adding_new_points = false;
-
- } // fi
-
- } // fi
-
- } // rof
- this->InvokeEvent( TEndBacktrackingEvent( ) );
-
- } // rof
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-void fpa::Image::DijkstraWithEndPointDetection< I, O >::
-_FindBranches( )
-{
- // Configure and obtain inputs
- TVertex seed = this->GetSeed( 0 );
- const TMinimumSpanningTree* mst = this->GetMinimumSpanningTree( );
- const TUniqueVertices* endpoints = this->GetEndPoints( );
- const TUniqueVertices* bifurcations = this->GetBifurcations( );
- TBranches* branches = this->GetBranches( );
- branches->Clear( );
-
- // Reconstruct pixels
- typename TUniqueVertices::ConstIterator eIt = endpoints->Begin( );
- for( ; eIt != endpoints->End( ); ++eIt )
- {
- // Get the path all the way to global seed
- TVertices path = mst->GetPath( *eIt, seed );
-
- TVertex start_vertex = *eIt;
- typename TVertices::const_iterator pIt = path.begin( );
- for( ; pIt != path.end( ); ++pIt )
- {
- if( bifurcations->Find( *pIt ) )
- {
- branches->SetValue( start_vertex, *pIt, 1 );
- start_vertex = *pIt;
-
- } // fi
-
- } // rof
-
- // Finish with branches to global seed
- branches->SetValue( start_vertex, seed, 1 );
-
- } // rof
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-void fpa::Image::DijkstraWithEndPointDetection< I, O >::
-_LabelAll( )
-{
- // Configure and obtain inputs
- const I* input = this->GetInput( );
- const TMinimumSpanningTree* mst = this->GetMinimumSpanningTree( );
- const TUniqueVertices* bifurcations = this->GetBifurcations( );
- TBranches* branches = this->GetBranches( );
- TLabelImage* label = this->GetLabelImage( );
- label->FillBuffer( 0 );
-
- // Label branches
- typename TBranches::Iterator bIt = branches->Begin( );
- TLabel actual_label = 0;
- for( ; bIt != branches->End( ); ++bIt )
- {
- typename TBranches::RowIterator brIt = branches->Begin( bIt );
- for( ; brIt != branches->End( bIt ); ++brIt )
- {
- actual_label++;
- brIt->second = actual_label;
-
- TVertices path = mst->GetPath( bIt->first, brIt->first );
- typename TVertices::const_iterator pIt = path.begin( );
- for( ; pIt != path.end( ); ++pIt )
- {
- double d = std::sqrt( double( input->GetPixel( *pIt ) ) );
- _TRegion region = this->_Region( *pIt, d );
- itk::ImageRegionConstIteratorWithIndex< I > iIt( input, region );
- itk::ImageRegionIteratorWithIndex< TLabelImage > lIt( label, region );
- iIt.GoToBegin( );
- lIt.GoToBegin( );
- for( ; !iIt.IsAtEnd( ); ++iIt, ++lIt )
- {
- // Mask real input image
- if(
- !( iIt.Get( ) < ( typename I::PixelType )( 0 ) ) &&
- lIt.Get( ) == TLabel( 0 )
- )
- lIt.Set( actual_label );
-
- } // rof
-
- } // rof
-
- } // rof
-
- } // rof
- this->m_NumberOfBranches = actual_label;
-
- // Label bifurcations
- typename TUniqueVertices::ConstIterator bifIt =
- bifurcations->Begin( );
- for( ; bifIt != bifurcations->End( ); ++bifIt )
- {
- actual_label++;
- double d = std::sqrt( double( input->GetPixel( *bifIt ) ) );
- _TRegion region = this->_Region( *bifIt, d * 1.5 );
- itk::ImageRegionConstIteratorWithIndex< I > iIt( input, region );
- itk::ImageRegionIteratorWithIndex< TLabelImage > lIt( label, region );
- iIt.GoToBegin( );
- lIt.GoToBegin( );
- for( ; !iIt.IsAtEnd( ); ++iIt, ++lIt )
- {
- // Mask real input image
- if( !( iIt.Get( ) < ( typename I::PixelType )( 0 ) ) )
- lIt.Set( actual_label );
-
- } // rof
-
- } // rof
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-typename fpa::Image::DijkstraWithEndPointDetection< I, O >::
-_TRegion fpa::Image::DijkstraWithEndPointDetection< I, O >::
-_Region( const TVertex& c, const double& r )
-{
- typename I::ConstPointer input = this->GetInput( );
- typename I::SpacingType spac = input->GetSpacing( );
- _TRegion region = input->GetLargestPossibleRegion( );
- typename I::IndexType idx0 = region.GetIndex( );
- typename I::IndexType idx1 = idx0 + region.GetSize( );
-
- // Compute region size and index
- typename I::IndexType i0, i1;
- _TSize size;
- for( unsigned int d = 0; d < I::ImageDimension; ++d )
- {
- // NOTE: 3 is a minimum neighborhood size
- long s =
- long( std::ceil( r / double( spac[ d ] ) ) ) +
- long( this->m_SafetyNeighborhoodSize );
- i0[ d ] = c[ d ] - s;
- i1[ d ] = c[ d ] + s;
-
- if( i0[ d ] < idx0[ d ] ) i0[ d ] = idx0[ d ];
- if( i1[ d ] < idx0[ d ] ) i1[ d ] = idx0[ d ];
- if( i0[ d ] > idx1[ d ] ) i0[ d ] = idx1[ d ];
- if( i1[ d ] > idx1[ d ] ) i1[ d ] = idx1[ d ];
- size[ d ] = i1[ d ] - i0[ d ];
-
- } // rof
-
- // Prepare region and return it
- region.SetIndex( i0 );
- region.SetSize( size );
-
- return( region );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-template< class _T >
-typename fpa::Image::DijkstraWithEndPointDetection< I, O >::
-TVertex fpa::Image::DijkstraWithEndPointDetection< I, O >::
-_MaxInRegion( const _T* image, const TVertex& v, const double& r )
-{
- typedef itk::ImageRegionConstIteratorWithIndex< _T > _TIt;
-
- _TIt iIt( image, this->_Region( v, r ) );
- iIt.GoToBegin( );
- TVertex max_vertex = iIt.GetIndex( );
- typename _T::PixelType max_value = iIt.Get( );
- for( ++iIt; !iIt.IsAtEnd( ); ++iIt )
- {
- typename _T::PixelType value = iIt.Get( );
- if( value > max_value )
- {
- max_value = value;
- max_vertex = iIt.GetIndex( );
-
- } // fi
-
- } // rof
- return( max_vertex );
-}
-
-#endif // __FPA__IMAGE__DIJKSTRAWITHENDPOINTDETECTION__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__EXTRACTENDPOINTSANDBIFURCATIONSFROMMINIMUMSPANNINGTREE__H__
-#define __FPA__IMAGE__EXTRACTENDPOINTSANDBIFURCATIONSFROMMINIMUMSPANNINGTREE__H__
-
-#include <fpa/Base/ExtractEndPointsAndBifurcationsFromMinimumSpanningTree.h>
-#include <fpa/Base/ImageSkeleton.h>
-
-namespace fpa
-{
- namespace Image
- {
- /**
- */
- template< class _TImage, class _TMST >
- class ExtractEndPointsAndBifurcationsFromMinimumSpanningTree
- : public fpa::Base::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TMST >
- {
- public:
- typedef
- fpa::Base::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TMST >
- Superclass;
- typedef ExtractEndPointsAndBifurcationsFromMinimumSpanningTree Self;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef _TImage TImage;
- typedef typename Superclass::TMinimumSpanningTree TMinimumSpanningTree;
- typedef typename Superclass::TVertex TVertex;
-
- typedef itk::Image< unsigned short, TImage::ImageDimension > TMarkImage;
- typedef fpa::Base::ImageSkeleton< _TMST > TSkeleton;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro(
- ExtractEndPointsAndBifurcationsFromMinimumSpanningTree,
- fpa::Base::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree
- );
-
- itkBooleanMacro( SquaredDistanceMap );
- itkGetConstMacro( SquaredDistanceMap, bool );
- itkSetMacro( SquaredDistanceMap, bool );
-
- public:
- const TImage* GetCostsImage( );
- const TImage* GetDistanceMap( );
- TSkeleton* GetSkeleton( );
- void SetCostsImage( TImage* image );
- void SetDistanceMap( TImage* image );
-
- protected:
- ExtractEndPointsAndBifurcationsFromMinimumSpanningTree( );
- virtual ~ExtractEndPointsAndBifurcationsFromMinimumSpanningTree( );
-
- virtual void GenerateData( ) ITK_OVERRIDE;
-
- virtual void _MarkSkeleton(
- const TVertex& v, const unsigned long& l
- ) ITK_OVERRIDE;
- virtual void _MarkSphere(
- const TVertex& v,
- const double& r,
- const unsigned long& l
- ) ITK_OVERRIDE;
- virtual unsigned long _Mark( const TVertex& v ) ITK_OVERRIDE;
- virtual unsigned long _SkeletonMark( const TVertex& v ) ITK_OVERRIDE;
- virtual double _Radius( const TVertex& v ) ITK_OVERRIDE;
-
- virtual void _Tmp( ) ITK_OVERRIDE
- {
- }
-
- private:
- // Purposely not implemented
- ExtractEndPointsAndBifurcationsFromMinimumSpanningTree( const Self& other );
- Self& operator=( const Self& other );
-
- protected:
- typename TMarkImage::Pointer m_MarkImage;
- typename TMarkImage::Pointer m_SkeletonImage;
- bool m_SquaredDistanceMap;
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Image/ExtractEndPointsAndBifurcationsFromMinimumSpanningTree.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__IMAGE__EXTRACTENDPOINTSANDBIFURCATIONSFROMMINIMUMSPANNINGTREE__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__EXTRACTENDPOINTSANDBIFURCATIONSFROMMINIMUMSPANNINGTREE__HXX__
-#define __FPA__IMAGE__EXTRACTENDPOINTSANDBIFURCATIONSFROMMINIMUMSPANNINGTREE__HXX__
-
-#include <cmath>
-#include <itkImageRegionIteratorWithIndex.h>
-
-// -------------------------------------------------------------------------
-template< class _TImage, class _TMST >
-const typename
-fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
-TImage*
-fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
-GetCostsImage( )
-{
- return(
- dynamic_cast< const _TImage* >( this->itk::ProcessObject::GetInput( 1 ) )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class _TImage, class _TMST >
-const typename
-fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
-TImage*
-fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
-GetDistanceMap( )
-{
- return(
- dynamic_cast< const _TImage* >( this->itk::ProcessObject::GetInput( 2 ) )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class _TImage, class _TMST >
-typename
-fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
-TSkeleton*
-fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
-GetSkeleton( )
-{
- return(
- dynamic_cast< TSkeleton* >(
- this->itk::ProcessObject::GetOutput(
- this->GetNumberOfRequiredOutputs( ) - 1
- )
- )
- );
-}
-
-// -------------------------------------------------------------------------
-template< class _TImage, class _TMST >
-void
-fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
-SetCostsImage( TImage* image )
-{
- this->itk::ProcessObject::SetNthInput( 1, const_cast< _TImage* >( image ) );
-}
-
-// -------------------------------------------------------------------------
-template< class _TImage, class _TMST >
-void
-fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
-SetDistanceMap( TImage* image )
-{
- this->itk::ProcessObject::SetNthInput( 2, const_cast< _TImage* >( image ) );
-}
-
-// -------------------------------------------------------------------------
-template< class _TImage, class _TMST >
-fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
-ExtractEndPointsAndBifurcationsFromMinimumSpanningTree( )
- : Superclass( ),
- m_SquaredDistanceMap( false )
-{
- this->SetNumberOfRequiredInputs( 3 );
- unsigned int nOuts = this->GetNumberOfRequiredOutputs( );
- this->SetNumberOfRequiredOutputs( nOuts + 1 );
- typename TSkeleton::Pointer sk = TSkeleton::New( );
- this->itk::ProcessObject::SetNthOutput( nOuts, sk.GetPointer( ) );
-}
-
-// -------------------------------------------------------------------------
-template< class _TImage, class _TMST >
-fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
-~ExtractEndPointsAndBifurcationsFromMinimumSpanningTree( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class _TImage, class _TMST >
-void
-fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
-GenerateData( )
-{
- // Create auxiliary objects
- auto image = this->GetCostsImage( );
- this->m_MarkImage = TMarkImage::New( );
- this->m_MarkImage->SetLargestPossibleRegion( image->GetLargestPossibleRegion( ) );
- this->m_MarkImage->SetRequestedRegion( image->GetRequestedRegion( ) );
- this->m_MarkImage->SetBufferedRegion( image->GetBufferedRegion( ) );
- this->m_MarkImage->SetDirection( image->GetDirection( ) );
- this->m_MarkImage->SetOrigin( image->GetOrigin( ) );
- this->m_MarkImage->SetSpacing( image->GetSpacing( ) );
- this->m_MarkImage->Allocate( );
- this->m_MarkImage->FillBuffer( 0 );
- this->m_SkeletonImage = TMarkImage::New( );
- this->m_SkeletonImage->SetLargestPossibleRegion( image->GetLargestPossibleRegion( ) );
- this->m_SkeletonImage->SetRequestedRegion( image->GetRequestedRegion( ) );
- this->m_SkeletonImage->SetBufferedRegion( image->GetBufferedRegion( ) );
- this->m_SkeletonImage->SetDirection( image->GetDirection( ) );
- this->m_SkeletonImage->SetOrigin( image->GetOrigin( ) );
- this->m_SkeletonImage->SetSpacing( image->GetSpacing( ) );
- this->m_SkeletonImage->Allocate( );
- this->m_SkeletonImage->FillBuffer( 0 );
-
- // Real execution
- this->Superclass::GenerateData( );
-
- // Build skeleton
- auto sk = this->GetSkeleton( );
- sk->SetMinimumSpanningTree( this->GetMinimumSpanningTree( ) );
- auto bIt = this->m_Branches.begin( );
- for( ; bIt != this->m_Branches.end( ); ++bIt )
- sk->AddBranch( bIt->second, bIt->first );
-}
-
-// -------------------------------------------------------------------------
-template< class _TImage, class _TMST >
-void
-fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
-_MarkSkeleton( const TVertex& v, const unsigned long& l )
-{
- if( this->m_SkeletonImage->GetRequestedRegion( ).IsInside( v ) )
- this->m_SkeletonImage->SetPixel( v, l );
-}
-
-// -------------------------------------------------------------------------
-template< class _TImage, class _TMST >
-void
-fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
-_MarkSphere(
- const TVertex& v,
- const double& r,
- const unsigned long& l
- )
-{
- double rr = r * double( 1.1 );
-
- // Get marking region
- auto rreg = this->m_MarkImage->GetRequestedRegion( );
- auto spac = this->m_MarkImage->GetSpacing( );
- TVertex ireg = rreg.GetIndex( );
- TVertex jreg = ireg + rreg.GetSize( );
- TVertex idx, jdx;
- typename _TImage::SizeType size;
- bool all = false;
- for( unsigned int d = 0; d < _TImage::ImageDimension; ++d )
- {
- unsigned long s = std::ceil( rr / double( spac[ d ] ) );
- if( s < 3 )
- {
- s = 3;
- all = true;
-
- } // fi
- s += 3;
- idx[ d ] = v[ d ] - s;
- jdx[ d ] = v[ d ] + s;
-
- jreg[ d ]--;
- if( idx[ d ] < ireg[ d ] ) idx[ d ] = ireg[ d ];
- if( idx[ d ] > jreg[ d ] ) idx[ d ] = jreg[ d ];
- if( jdx[ d ] < ireg[ d ] ) jdx[ d ] = ireg[ d ];
- if( jdx[ d ] > jreg[ d ] ) jdx[ d ] = jreg[ d ];
- size[ d ] = jdx[ d ] - idx[ d ] + 1;
-
- } // rof
- typename _TImage::RegionType region;
- region.SetIndex( idx );
- region.SetSize( size );
-
- // Mark region
- typename _TImage::PointType c;
- this->m_MarkImage->TransformIndexToPhysicalPoint( v, c );
- itk::ImageRegionIteratorWithIndex< TMarkImage >
- spIt( this->m_MarkImage, region );
- for( spIt.GoToBegin( ); !spIt.IsAtEnd( ); ++spIt )
- {
- typename _TImage::PointType pnt;
- this->m_MarkImage->TransformIndexToPhysicalPoint( spIt.GetIndex( ), pnt );
- /*
- if( double( pnt.EuclideanDistanceTo( c ) ) <= rr || all )
- if( spIt.Get( ) == 0 )
- */
- spIt.Set( l );
-
- } // rof
-}
-
-// -------------------------------------------------------------------------
-template< class _TImage, class _TMST >
-unsigned long
-fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
-_Mark( const TVertex& v )
-{
- return( this->m_MarkImage->GetPixel( v ) );
-}
-
-// -------------------------------------------------------------------------
-template< class _TImage, class _TMST >
-unsigned long fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
-_SkeletonMark( const TVertex& v )
-{
- return( this->m_SkeletonImage->GetPixel( v ) );
-}
-
-// -------------------------------------------------------------------------
-template< class _TImage, class _TMST >
-double
-fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
-_Radius( const TVertex& v )
-{
- double d = double( this->GetDistanceMap( )->GetPixel( v ) );
- double s = std::fabs( d );
- if( s > double( 0 ) )
- s /= d;
- if( this->m_SquaredDistanceMap )
- return( s * std::sqrt( std::fabs( d ) ) );
- else
- return( d );
-}
-
-#endif // __FPA__IMAGE__EXTRACTENDPOINTSANDBIFURCATIONSFROMMINIMUMSPANNINGTREE__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__FASTMARCHING__H__
-#define __FPA__IMAGE__FASTMARCHING__H__
-
-#include <itkImage.h>
-#include <itkImageFunction.h>
-#include <itkImageToImageFilter.h>
-#include <itkIndex.h>
-#include <fpa/Base/FastMarching.h>
-#include <fpa/Image/Algorithm.h>
-
-namespace fpa
-{
- namespace Image
- {
- /**
- * @param I Input image type
- */
- template< class I, class C >
- class FastMarching
- : public Algorithm< I, fpa::Base::FastMarching< typename I::IndexType, C, typename I::PixelType, itk::Functor::IndexLexicographicCompare< I::ImageDimension >, itk::ImageToImageFilter< I, itk::Image< C, I::ImageDimension > > > >
- {
- public:
- // Standard class typdedefs
- typedef typename I::IndexType TVertex;
- typedef typename I::PixelType TVertexValue;
- typedef itk::Image< C, I::ImageDimension > TCostImage;
- typedef itk::ImageToImageFilter< I, TCostImage > TBaseFilter;
- typedef fpa::Base::FastMarching< TVertex, C, TVertexValue, itk::Functor::IndexLexicographicCompare< I::ImageDimension >, TBaseFilter > TBaseAlgorithm;
-
- typedef FastMarching Self;
- typedef Algorithm< I, TBaseAlgorithm > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( FastMarching, fpaBaseFastMarching );
-
- protected:
- FastMarching( )
- : Superclass( )
- { }
- virtual ~FastMarching( )
- { }
-
- private:
- // Purposely not implemented
- FastMarching( const Self& );
- void operator=( const Self& );
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#endif // __FPA__IMAGE__FASTMARCHING__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__FUNCTORS__FLUXMEDIALNESS__H__
-#define __FPA__IMAGE__FUNCTORS__FLUXMEDIALNESS__H__
-
-#include <fpa/Image/Functors/GradientImageFunctionBase.h>
-
-namespace fpa
-{
- namespace Image
- {
- namespace Functors
- {
- /**
- */
- template< class _TGradient >
- class FluxMedialness
- : public GradientImageFunctionBase< _TGradient >
- {
- public:
- typedef FluxMedialness Self;
- typedef GradientImageFunctionBase< _TGradient > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- itkStaticConstMacro( Dimension, unsigned int, Superclass::Dimension );
-
- typedef typename Superclass::TOutput TOutput;
- typedef typename Superclass::TScalar TScalar;
- typedef typename Superclass::TIndex TIndex;
- typedef typename Superclass::TVector TVector;
- typedef typename Superclass::TPoint TPoint;
-
- typedef std::vector< double > TRCandidates;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( FluxMedialness, GradientImageFunctionBase );
-
- itkGetConstMacro( RadiusStep, double );
- itkGetConstMacro( MinRadius, double );
- itkGetConstMacro( MaxRadius, double );
- itkGetConstMacro( RadialSampling, unsigned int );
-
- itkSetMacro( RadiusStep, double );
- itkSetMacro( MinRadius, double );
- itkSetMacro( MaxRadius, double );
- itkSetMacro( RadialSampling, unsigned int );
-
- protected:
- FluxMedialness( );
- virtual ~FluxMedialness( );
-
- virtual TOutput _Evaluate( const TIndex& i ) const ITK_OVERRIDE;
-
- private:
- // Purposely not implemented.
- FluxMedialness( const Self& );
- void operator=( const Self& );
-
- protected:
- double m_MinRadius;
- double m_MaxRadius;
- unsigned int m_RadialSampling;
- double m_RadiusStep;
- };
-
- } // ecapseman
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Image/Functors/FluxMedialness.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__IMAGE__FUNCTORS__FLUXMEDIALNESS__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__FUNCTORS__FLUXMEDIALNESS__HXX__
-#define __FPA__IMAGE__FUNCTORS__FLUXMEDIALNESS__HXX__
-
-#include <cmath>
-#include <vnl/vnl_math.h>
-#include <itkLineConstIterator.h>
-
-// -------------------------------------------------------------------------
-template< class _TGradient >
-fpa::Image::Functors::FluxMedialness< _TGradient >::
-FluxMedialness( )
- : Superclass( ),
- m_MinRadius( double( 0 ) ),
- m_MaxRadius( double( 1 ) ),
- m_RadialSampling( 4 ),
- m_RadiusStep( double( 1 ) )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class _TGradient >
-fpa::Image::Functors::FluxMedialness< _TGradient >::
-~FluxMedialness( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class _TGradient >
-typename fpa::Image::Functors::FluxMedialness< _TGradient >::
-TOutput fpa::Image::Functors::FluxMedialness< _TGradient >::
-_Evaluate( const TIndex& i ) const
-{
- itk::Object::GlobalWarningDisplayOff( );
-
- double pi2n = double( 2 ) * double( vnl_math::pi );
- pi2n /= int( this->m_RadialSampling );
- const _TGradient* img = this->GetInputImage( );
- // Gradient in central pixel
- //TVector grad_idx = img->GetPixel( i );
-
- double Flux1 = 0;
- double Flux = 0;
-
- TRCandidates FluxFinal;
- TRCandidates radiusGenerated;
- double dR = double( 0 );
- double optR = double( 0 );
- TPoint center;
- img->TransformIndexToPhysicalPoint( i, center );
- double radius = double(0);
-
- for( unsigned int cx = 0; cx < Self::Dimension - 1; cx++ )
- {
- for( unsigned int cy = cx + 1; cy < Self::Dimension; cy++ )
- {
- dR = double( 0 );
- FluxFinal.clear();
- radiusGenerated.clear();
- radius = this->m_MinRadius;
- while( radius <= this->m_MaxRadius )
- {
- Flux = 0;
- for( unsigned int I_radial = 0; I_radial < this->m_RadialSampling ; I_radial++ )
- {
- Flux1 = 0;
-
- // Direction of first profile
- typename TPoint::VectorType dir1;
- dir1.Fill( double( 0 ) );
- dir1[ cx ] = std::cos( pi2n * double( I_radial ) );
- dir1[ cy ] = std::sin( pi2n * double( I_radial ) );
- dir1 *= (radius);
- TIndex rIdx;
- if (img->TransformPhysicalPointToIndex( center + dir1, rIdx ))
- {
- TVector grad_rIdx = img->GetPixel( rIdx );
- TVector u_i1;
- u_i1.SetVnlVector( ( center - ( center + dir1 ) ).GetVnlVector( ) );
- u_i1.Normalize( );
- // dot product
- Flux1 = grad_rIdx * u_i1;
- }
-
- Flux += Flux1;
-
- } // rof
- //std::cout<<" radius:"<<radius<<std::endl;
- //std::cout<<"Center:"<<center[0]<<" "<<center[1]<<std::endl;
- //std::cout<<"edge:"<<center[0]+radius*std::cos( pi2n * double( 0 ) )<<std::endl;
- Flux /= this->m_RadialSampling;
- FluxFinal.push_back(Flux);
- radiusGenerated.push_back(radius);
- radius += this->m_RadiusStep;
-
- } //elihw
-
- dR= *( std::max_element( FluxFinal.begin(), FluxFinal.end() ) );
- optR= (dR>optR)? dR:optR;
-
- } // rof
-
- } // rof
- return( TScalar(optR) );
-}
-
-#endif // __FPA__IMAGE__FUNCTORS__FLUXMEDIALNESS__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__FUNCTORS__GAUSSIANMODELESTIMATORFUNCTION__H__
-#define __FPA__IMAGE__FUNCTORS__GAUSSIANMODELESTIMATORFUNCTION__H__
-
-#include <cpPlugins/Extensions/Algorithms/IterativeGaussianModelEstimator.h>
-#include <cpPlugins/Extensions/Algorithms/RGBToYPbPrFunction.h>
-#include <itkFunctionBase.h>
-
-namespace fpa
-{
- namespace Image
- {
- namespace Functors
- {
- /**
- */
- template< class I, class S >
- class GaussianModelEstimatorFunction
- : public itk::FunctionBase< typename I::PixelType, bool >
- {
- public:
- // Type-related and pointers
- typedef GaussianModelEstimatorFunction Self;
- typedef itk::FunctionBase< typename I::PixelType, bool > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- // Superclass' types
- typedef cpPlugins::Extensions::Algorithms::IterativeGaussianModelEstimator< S, 3 > TEstimator;
- typedef cpPlugins::Extensions::Algorithms::RGBToYPbPrFunction< S > TYPbPrFunction;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( GaussianModelEstimatorFunction, itkFunctionBase );
-
- itkGetConstMacro( ModelSupport, unsigned long );
-
- public:
- bool SaveModelToFile( const std::string& filename ) const;
- bool LoadModelFromFile( const std::string& filename );
-
- virtual void SetModelSupport( const unsigned long& s );
- virtual bool Evaluate( const typename I::PixelType& rgb ) const;
-
- protected:
- GaussianModelEstimatorFunction( );
- virtual ~GaussianModelEstimatorFunction( );
-
- private:
- // Purposely not implemented
- GaussianModelEstimatorFunction( const Self& );
- void operator=( const Self& );
-
- protected:
- typename TEstimator::Pointer m_Estimator;
- TYPbPrFunction m_YPbPrFunction;
-
- unsigned long m_ModelSupport;
- unsigned long m_RealModelSupport;
- mutable bool m_Estimating;
- };
-
- } // ecapseman
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Image/Functors/GaussianModelEstimatorFunction.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__IMAGE__FUNCTORS__GAUSSIANMODELESTIMATORFUNCTION__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__FUNCTORS__GAUSSIANMODELESTIMATORFUNCTION__HXX__
-#define __FPA__IMAGE__FUNCTORS__GAUSSIANMODELESTIMATORFUNCTION__HXX__
-
-// -------------------------------------------------------------------------
-template< class I, class S >
-bool fpa::Image::Functors::GaussianModelEstimatorFunction< I, S >::
-SaveModelToFile( const std::string& filename ) const
-{
- this->m_Estimator->SaveModelToFile( filename );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class S >
-bool fpa::Image::Functors::GaussianModelEstimatorFunction< I, S >::
-LoadModelFromFile( const std::string& filename )
-{
- this->m_Estimator->LoadModelFromFile( filename );
- this->m_RealModelSupport =
- this->m_ModelSupport + this->m_Estimator->GetNumberOfSamples( );
- this->m_Estimating = false;
- this->Modified( );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class S >
-void fpa::Image::Functors::GaussianModelEstimatorFunction< I, S >::
-SetModelSupport( const unsigned long& s )
-{
- this->m_ModelSupport = s;
- this->m_RealModelSupport = s;
- this->Modified( );
-}
-
-// -------------------------------------------------------------------------
-template< class I, class S >
-bool fpa::Image::Functors::GaussianModelEstimatorFunction< I, S >::
-Evaluate( const typename I::PixelType& rgb ) const
-{
- if( !this->m_Estimating && this->m_ModelSupport > 0 )
- {
- this->m_Estimator->AddSample( this->m_YPbPrFunction( rgb ) );
- if( this->m_Estimator->GetNumberOfSamples( ) == this->m_RealModelSupport )
- this->m_Estimating = true;
- return( true );
- }
- else
- {
- S p = this->m_Estimator->Probability( this->m_YPbPrFunction( rgb ) );
- return( p >= 0.3 );
-
- } // fi
-}
-
-// -------------------------------------------------------------------------
-template< class I, class S >
-fpa::Image::Functors::GaussianModelEstimatorFunction< I, S >::
-GaussianModelEstimatorFunction( )
- : Superclass( ),
- m_ModelSupport( 10 ),
- m_RealModelSupport( 10 )
-{
- this->m_Estimator = TEstimator::New( );
- this->m_Estimator->Clear( );
- this->m_Estimating = false;
-}
-
-// -------------------------------------------------------------------------
-template< class I, class S >
-fpa::Image::Functors::GaussianModelEstimatorFunction< I, S >::
-~GaussianModelEstimatorFunction( )
-{
-}
-
-#endif // __FPA__IMAGE__FUNCTORS__GAUSSIANMODELESTIMATORFUNCTION__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__FUNCTORS__GRADIENTIMAGEFUNCTIONBASE__H__
-#define __FPA__IMAGE__FUNCTORS__GRADIENTIMAGEFUNCTIONBASE__H__
-
-#include <itkImageFunction.h>
-
-namespace fpa
-{
- namespace Image
- {
- namespace Functors
- {
- /**
- * Base class to compute values based on image gradients (vector).
- * It allows incremental computation of the gradient.
- */
- template< class _TGradient >
- class GradientImageFunctionBase
- : public itk::ImageFunction< _TGradient, typename _TGradient::PixelType::ValueType, typename _TGradient::PixelType::ValueType >
- {
- public:
- // Types from input arguments
- typedef _TGradient TGradient;
- typedef typename _TGradient::PixelType TVector;
- typedef typename TVector::ValueType TScalar;
- itkStaticConstMacro( Dimension, unsigned int, _TGradient::ImageDimension );
-
- // Standard itk types
- typedef GradientImageFunctionBase Self;
- typedef itk::ImageFunction< _TGradient, TScalar, TScalar > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- // Types from base itk::ImageFunction
- typedef typename Superclass::InputType TInput;
- typedef typename Superclass::OutputType TOutput;
- typedef typename Superclass::PointType TPoint;
- typedef typename Superclass::ContinuousIndexType TContIndex;
- typedef typename Superclass::IndexType TIndex;
-
- public:
- itkTypeMacro( GradientImageFunctionBase, itkImageFunction );
-
- public:
- virtual void Prepare( ) const;
- virtual TOutput Evaluate( const TPoint& p ) const ITK_OVERRIDE;
- virtual TOutput EvaluateAtIndex( const TIndex& i ) const ITK_OVERRIDE;
- virtual TOutput EvaluateAtContinuousIndex( const TContIndex& i ) const ITK_OVERRIDE;
-
- protected:
- GradientImageFunctionBase( );
- virtual ~GradientImageFunctionBase( );
-
- virtual TOutput _Evaluate( const TIndex& i ) const = 0;
-
- private:
- // Purposely not implemented.
- GradientImageFunctionBase( const Self& );
- void operator=( const Self& );
- };
-
- } // ecapseman
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Image/Functors/GradientImageFunctionBase.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__IMAGE__FUNCTORS__GRADIENTIMAGEFUNCTIONBASE__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__FUNCTORS__GRADIENTIMAGEFUNCTIONBASE__HXX__
-#define __FPA__IMAGE__FUNCTORS__GRADIENTIMAGEFUNCTIONBASE__HXX__
-
-// -------------------------------------------------------------------------
-template< class _TGradient >
-void fpa::Image::Functors::GradientImageFunctionBase< _TGradient >::
-Prepare( ) const
-{
-}
-
-// -------------------------------------------------------------------------
-template< class _TGradient >
-typename fpa::Image::Functors::GradientImageFunctionBase< _TGradient >::
-TOutput fpa::Image::Functors::GradientImageFunctionBase< _TGradient >::
-Evaluate( const TPoint& p ) const
-{
- TIndex i;
- this->GetInputImage( )->TransformPhysicalPointToIndex( p, i );
- return( this->EvaluateAtIndex( i ) );
-}
-
-// -------------------------------------------------------------------------
-template< class _TGradient >
-typename fpa::Image::Functors::GradientImageFunctionBase< _TGradient >::
-TOutput fpa::Image::Functors::GradientImageFunctionBase< _TGradient >::
-EvaluateAtIndex( const TIndex& i ) const
-{
- return( this->_Evaluate( i ) );
-}
-
-// -------------------------------------------------------------------------
-template< class _TGradient >
-typename fpa::Image::Functors::GradientImageFunctionBase< _TGradient >::
-TOutput fpa::Image::Functors::GradientImageFunctionBase< _TGradient >::
-EvaluateAtContinuousIndex( const TContIndex& i ) const
-{
- TPoint p;
- this->GetInputImage( )->TransformContinuousIndexToPhysicalPoint( i, p );
- return( this->Evaluate( p ) );
-}
-
-// -------------------------------------------------------------------------
-template< class _TGradient >
-fpa::Image::Functors::GradientImageFunctionBase< _TGradient >::
-GradientImageFunctionBase( )
- : Superclass( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class _TGradient >
-fpa::Image::Functors::GradientImageFunctionBase< _TGradient >::
-~GradientImageFunctionBase( )
-{
-}
-
-#endif // __FPA__IMAGE__FUNCTORS__GRADIENTIMAGEFUNCTIONBASE__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__FUNCTORS__GULSUNTEKMEDIALNESS__H__
-#define __FPA__IMAGE__FUNCTORS__GULSUNTEKMEDIALNESS__H__
-
-#include <fpa/Image/Functors/GradientImageFunctionBase.h>
-
-namespace fpa
-{
- namespace Image
- {
- namespace Functors
- {
- /**
- */
- template< class _TGradient >
- class GulsunTekMedialness
- : public GradientImageFunctionBase< _TGradient >
- {
- public:
- typedef GulsunTekMedialness Self;
- typedef GradientImageFunctionBase< _TGradient > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- itkStaticConstMacro( Dimension, unsigned int, Superclass::Dimension );
-
- typedef typename Superclass::TOutput TOutput;
- typedef typename Superclass::TScalar TScalar;
- typedef typename Superclass::TIndex TIndex;
- typedef typename Superclass::TVector TVector;
- typedef typename Superclass::TPoint TPoint;
- typedef typename TIndex::OffsetType TOffset;
-
- typedef std::vector< double > TProfile;
- typedef std::vector< TOffset > TOffsets;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( GulsunTekMedialness, GradientImageFunctionBase );
-
- itkGetConstMacro( MinRadius, double );
- itkGetConstMacro( MaxRadius, double );
- itkGetConstMacro( ProfileSampling, unsigned int );
- itkGetConstMacro( RadialSampling, unsigned int );
-
- itkSetMacro( MinRadius, double );
- itkSetMacro( MaxRadius, double );
- itkSetMacro( ProfileSampling, unsigned int );
- itkSetMacro( RadialSampling, unsigned int );
-
- protected:
- GulsunTekMedialness( );
- virtual ~GulsunTekMedialness( );
-
- virtual TOutput _Evaluate( const TIndex& i ) const ITK_OVERRIDE;
-
- private:
- // Purposely not implemented.
- GulsunTekMedialness( const Self& );
- void operator=( const Self& );
-
- protected:
- double m_MinRadius;
- double m_MaxRadius;
- unsigned int m_ProfileSampling;
- unsigned int m_RadialSampling;
- };
-
- } // ecapseman
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Image/Functors/GulsunTekMedialness.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__IMAGE__FUNCTORS__GULSUNTEKMEDIALNESS__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__FUNCTORS__GULSUNTEKMEDIALNESS__HXX__
-#define __FPA__IMAGE__FUNCTORS__GULSUNTEKMEDIALNESS__HXX__
-
-#include <cmath>
-#include <vnl/vnl_math.h>
-#include <itkLineConstIterator.h>
-
-// -------------------------------------------------------------------------
-template< class _TGradient >
-fpa::Image::Functors::GulsunTekMedialness< _TGradient >::
-GulsunTekMedialness( )
- : Superclass( ),
- m_MinRadius( double( 0 ) ),
- m_MaxRadius( double( 1 ) ),
- m_ProfileSampling( 4 ),
- m_RadialSampling( 10 )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class _TGradient >
-fpa::Image::Functors::GulsunTekMedialness< _TGradient >::
-~GulsunTekMedialness( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class _TGradient >
-typename fpa::Image::Functors::GulsunTekMedialness< _TGradient >::
-TOutput fpa::Image::Functors::GulsunTekMedialness< _TGradient >::
-_Evaluate( const TIndex& i ) const
-{
- itk::Object::GlobalWarningDisplayOff( );
-
- // Various values
- const _TGradient* in = this->GetInputImage( );
- double pi2n =
- double( 2 ) * double( vnl_math::pi ) /
- double( this->m_ProfileSampling );
- double rOff = this->m_MaxRadius / double( this->m_RadialSampling - 1 );
- double optR = double( 0 );
- TPoint pnt;
- in->TransformIndexToPhysicalPoint( i, pnt );
-
- // Main loop
- for( unsigned int cx = 0; cx < Self::Dimension - 1; cx++ )
- {
- for( unsigned int cy = cx + 1; cy < Self::Dimension; cy++ )
- {
- TProfile maxProfile( this->m_RadialSampling, double( 0 ) );
- for( unsigned int p = 0; p < this->m_ProfileSampling; p++ )
- {
- double a = pi2n * double( p );
-
- // Direction of this profile
- TVector dir;
- dir.Fill( TScalar( 0 ) );
- dir[ cx ] = TScalar( std::cos( a ) );
- dir[ cy ] = TScalar( std::sin( a ) );
-
- double maxrise = double( 0 );
- double maxfall = double( -1 );
- TProfile profile;
- for( unsigned int r = 0; r < this->m_RadialSampling; r++ )
- {
- double radius = double( r ) * rOff;
- TIndex idx;
- typename TPoint::VectorType aux;
- aux.SetVnlVector( dir.GetVnlVector( ) );
- if(
- in->TransformPhysicalPointToIndex( pnt + ( aux * radius ), idx )
- )
- {
- TVector g = in->GetPixel( idx );
- double b = double( g.GetNorm( ) );
- if( double( g * dir ) < double( 0 ) )
- b *= double( -1 );
- maxrise = ( b > maxrise )? b: maxrise;
- if( radius >= this->m_MinRadius )
- maxfall = ( b < maxfall )? b: maxfall;
- profile.push_back( -b - maxrise );
- }
- else
- profile.push_back( double( 0 ) );
-
- } // rof
-
- for( unsigned int r = 0; r < this->m_RadialSampling; r++ )
- {
- double E = profile[ r ] / -maxfall;
- E = ( E < double( 0 ) )? double( 0 ): E;
- E = ( E > double( 1 ) )? double( 1 ): E;
- maxProfile[ r ] += E;
-
- } // rof
-
- } // rof
-
- for( unsigned int r = 0; r < this->m_RadialSampling; r++ )
- {
- double E = maxProfile[ r ] / double( this->m_RadialSampling );
- optR = ( E > optR )? E: optR;
-
- } // rof
-
- } // rof
-
- } // rof
- return( TScalar( optR ) );
-}
-
-#endif // __FPA__IMAGE__FUNCTORS__GULSUNTEKMEDIALNESS__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__FUNCTORS__IMAGEABSOLUTEDIFFERENCECOSTFUNCTION__H__
-#define __FPA__IMAGE__FUNCTORS__IMAGEABSOLUTEDIFFERENCECOSTFUNCTION__H__
-
-#include <fpa/Image/Functors/ImageCostFunction.h>
-
-namespace fpa
-{
- namespace Image
- {
- namespace Functors
- {
- /**
- */
- template< class I, class R >
- class ImageAbsoluteDifferenceCostFunction
- : public fpa::Image::Functors::ImageCostFunction< I, R >
- {
- public:
- /// Type-related and pointers
- typedef ImageAbsoluteDifferenceCostFunction Self;
- typedef fpa::Image::Functors::ImageCostFunction< I, R > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef typename Superclass::TInputImage TInputImage;
- typedef typename Superclass::TResult TResult;
- typedef typename Superclass::TIndex TIndex;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( ImageAbsoluteDifferenceCostFunction, itkObject );
-
- public:
- virtual R Evaluate( const TIndex& v, const TIndex& p ) const
- {
- typedef typename I::PixelType _TPixel;
- typedef typename itk::NumericTraits< _TPixel > _TTraits;
- typedef typename _TTraits::MeasurementVectorType _TVector;
- typedef typename _TTraits::ValueType _TValue;
-
- if( this->m_InputImage.IsNotNull( ) )
- {
- _TPixel pix = this->m_InputImage->GetPixel( v );
- pix -= this->m_InputImage->GetPixel( p );
- if( typeid( _TPixel ) != typeid( _TValue ) )
- {
- _TVector* a = reinterpret_cast< _TVector* >( &pix );
- unsigned int n =
- this->m_InputImage->GetNumberOfComponentsPerPixel( );
- double sum = double( 0 );
- for( unsigned int i = 0; i < n; ++i )
- sum += ( double( ( *a )[ i ] ) * double( ( *a )[ i ] ) );
- return( R( std::sqrt( sum ) ) );
- }
- else
- {
- double pix_val =
- double( *( reinterpret_cast< _TValue* >( &pix ) ) );
- return( R( std::fabs( pix_val ) ) );
- }
- }
- else
- return( std::numeric_limits< R >::max( ) );
- }
-
- protected:
- ImageAbsoluteDifferenceCostFunction( )
- : Superclass( )
- { }
- virtual ~ImageAbsoluteDifferenceCostFunction( )
- { }
-
- private:
- // Purposely not implemented
- ImageAbsoluteDifferenceCostFunction( const Self& );
- void operator=( const Self& );
- };
-
- } // ecapseman
-
- } // ecapseman
-
-} // ecapseman
-
-#endif // __FPA__IMAGE__FUNCTORS__IMAGEABSOLUTEDIFFERENCECOSTFUNCTION__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__FUNCTORS__IMAGECOSTFUNCTION__H__
-#define __FPA__IMAGE__FUNCTORS__IMAGECOSTFUNCTION__H__
-
-#include <limits>
-#include <itkNumericTraits.h>
-#include <itkObject.h>
-
-namespace fpa
-{
- namespace Image
- {
- namespace Functors
- {
- /**
- */
- template< class I, class R >
- class ImageCostFunction
- : public itk::Object
- {
- public:
- /// Type-related and pointers
- typedef ImageCostFunction Self;
- typedef itk::Object Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef I TInputImage;
- typedef R TResult;
- typedef typename I::IndexType TIndex;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( ImageCostFunction, itkObject );
-
- itkGetConstObjectMacro( InputImage, I );
- itkSetConstObjectMacro( InputImage, I );
-
- public:
- virtual R Evaluate( const TIndex& v, const TIndex& p ) const
- {
- typedef typename I::PixelType _TPixel;
- typedef typename itk::NumericTraits< _TPixel > _TTraits;
- typedef typename _TTraits::MeasurementVectorType _TVector;
- typedef typename _TTraits::ValueType _TValue;
-
- if( this->m_InputImage.IsNotNull( ) )
- {
- _TPixel pix = this->m_InputImage->GetPixel( v );
- if( typeid( _TPixel ) != typeid( _TValue ) )
- {
- _TVector* array = reinterpret_cast< _TVector* >( &pix );
- unsigned int n =
- this->m_InputImage->GetNumberOfComponentsPerPixel( );
- R sum = R( 0 );
- for( unsigned int i = 0; i < n; ++i )
- sum += R( ( *array )[ i ] );
- return( sum / R( n ) );
- }
- else
- return( R( *( reinterpret_cast< _TValue* >( &pix ) ) ) );
- }
- else
- return( std::numeric_limits< R >::max( ) );
- }
-
- protected:
- ImageCostFunction( )
- : Superclass( )
- { }
- virtual ~ImageCostFunction( )
- { }
-
- private:
- // Purposely not implemented
- ImageCostFunction( const Self& );
- void operator=( const Self& );
-
- protected:
- typename I::ConstPointer m_InputImage;
- };
-
- } // ecapseman
-
- } // ecapseman
-
-} // ecapseman
-
-#endif // __FPA__IMAGE__FUNCTORS__IMAGECOSTFUNCTION__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__FUNCTORS__MFLUXMEDIALNESS__H__
-#define __FPA__IMAGE__FUNCTORS__MFLUXMEDIALNESS__H__
-
-#include <fpa/Image/Functors/GradientImageFunctionBase.h>
-
-namespace fpa
-{
- namespace Image
- {
- namespace Functors
- {
- /**
- */
- template< class _TGradient >
- class MFluxMedialness
- : public GradientImageFunctionBase< _TGradient >
- {
- public:
- typedef MFluxMedialness Self;
- typedef GradientImageFunctionBase< _TGradient > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- itkStaticConstMacro( Dimension, unsigned int, Superclass::Dimension );
-
- typedef typename Superclass::TOutput TOutput;
- typedef typename Superclass::TScalar TScalar;
- typedef typename Superclass::TIndex TIndex;
- typedef typename Superclass::TVector TVector;
- typedef typename Superclass::TPoint TPoint;
-
- typedef std::vector< double > TRCandidates;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( MFluxMedialness, GradientImageFunctionBase );
-
- itkGetConstMacro( RadiusStep, double );
- itkGetConstMacro( MinRadius, double );
- itkGetConstMacro( MaxRadius, double );
- itkGetConstMacro( RadialSampling, unsigned int );
-
- itkSetMacro( RadiusStep, double );
- itkSetMacro( MinRadius, double );
- itkSetMacro( MaxRadius, double );
- itkSetMacro( RadialSampling, unsigned int );
-
- protected:
- MFluxMedialness( );
- virtual ~MFluxMedialness( );
-
- virtual TOutput _Evaluate( const TIndex& i ) const ITK_OVERRIDE;
-
- private:
- // Purposely not implemented.
- MFluxMedialness( const Self& );
- void operator=( const Self& );
-
- protected:
- double m_MinRadius;
- double m_MaxRadius;
- unsigned int m_RadialSampling;
- double m_RadiusStep;
- };
-
- } // ecapseman
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Image/Functors/MFluxMedialness.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__IMAGE__FUNCTORS__MFLUXMEDIALNESS__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__FUNCTORS__MFLUXMEDIALNESS__HXX__
-#define __FPA__IMAGE__FUNCTORS__MFLUXMEDIALNESS__HXX__
-
-#include <cmath>
-#include <vnl/vnl_math.h>
-#include <itkLineConstIterator.h>
-
-// -------------------------------------------------------------------------
-template< class _TGradient >
-fpa::Image::Functors::MFluxMedialness< _TGradient >::
-MFluxMedialness( )
- : Superclass( ),
- m_MinRadius( double( 0 ) ),
- m_MaxRadius( double( 1 ) ),
- m_RadialSampling( 4 ),
- m_RadiusStep( double( 1 ) )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class _TGradient >
-fpa::Image::Functors::MFluxMedialness< _TGradient >::
-~MFluxMedialness( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class _TGradient >
-typename fpa::Image::Functors::MFluxMedialness< _TGradient >::
-TOutput fpa::Image::Functors::MFluxMedialness< _TGradient >::
-_Evaluate( const TIndex& i ) const
-{
- itk::Object::GlobalWarningDisplayOff( );
-
- double pi2n = double( 2 ) * double( vnl_math::pi );
- pi2n /= int( this->m_RadialSampling );
- const _TGradient* img = this->GetInputImage( );
- //const itk::Image::SpacingType& input_spacing = img->GetSpacing( );
-
- double Flux1 = 0;
- double Flux2 = 0;
- double MFlux = 0;
-
- TRCandidates FluxFinal;
- TRCandidates radiusGenerated;
- double dR = double( 0 );
- double optR = double( 0 );
- TPoint center;
- img->TransformIndexToPhysicalPoint( i, center );
- double radius;
-
- for( unsigned int cx = 0; cx < Self::Dimension - 1; cx++ )
- {
- for( unsigned int cy = cx + 1; cy < Self::Dimension; cy++ )
- {
- dR = double( 0 );
- FluxFinal.clear();
- radiusGenerated.clear();
- radius = this->m_MinRadius;
- while( radius <= this->m_MaxRadius )
- {
- MFlux = 0;
- for( unsigned int I_radial = 0; I_radial < this->m_RadialSampling / 2; I_radial++ )
- {
- Flux1 = 0;
- Flux2 = 0;
-
- // Direction of first profile
- typename TPoint::VectorType dir1;
- dir1.Fill( double( 0 ) );
- dir1[ cx ] = std::cos( pi2n * double( I_radial ) );
- dir1[ cy ] = std::sin( pi2n * double( I_radial ) );
- //dir1 *= (radius);
-
- TIndex rIdx;
-
- if ( img->TransformPhysicalPointToIndex( center + (dir1*radius), rIdx ) )
- {
- TVector grad_rIdx = img->GetPixel( rIdx );
- TVector u_i1;
- u_i1.SetVnlVector( ( center - ( center + dir1 ) ).GetVnlVector( ) );
- u_i1.Normalize( );
- // dot product
- Flux1 = grad_rIdx * u_i1;
- }
- else
- {
- //if (Self::Dimension==3)
- //{
- //std::cout<<"Point Edge x:"<<center[0]+dir1[0] ;
- //std::cout<<" y:"<<center[1]+dir1[1]<<" z:"<<center[2]+dir1[2]<<std::endl;
- //}
- //else if (Self::Dimension==2)
- //{
- //std::cout<<"Point Edge x:"<<center[0]+dir1[0] ;
- //std::cout<<" y:"<<center[1]+dir1[1]<<std::endl;
- //}
- }
-
- // Direction of second profile
- // pi2n*Iradial + 180°
- typename TPoint::VectorType dir2;
- dir2.Fill( double( 0 ) );
- dir2[ cx ] = std::cos( (pi2n) * double( I_radial ) + double( vnl_math::pi ));
- dir2[ cy ] = std::sin( (pi2n) * double( I_radial ) + double( vnl_math::pi ));
-
- TIndex rIdx2;
-
- if ( img->TransformPhysicalPointToIndex( center + (dir2*radius), rIdx2 ) )
- {
- TVector grad_rIdx2 = img->GetPixel( rIdx2 );
- TVector u_i2;
- u_i2.SetVnlVector( ( center - ( center + dir2 ) ).GetVnlVector( ) );
- u_i2.Normalize( );
-
- Flux2 = grad_rIdx2 * u_i2;
- }
- else
- {
- //if (Self::Dimension==3)
- //{
- //std::cout<<"Point Edge x:"<<center[0]+dir2[0] ;
- //std::cout<<" y:"<<center[1]+dir2[1]<<" z:"<<center[2]+dir2[2]<<std::endl;
- //}
- //else if (Self::Dimension==2)
- //{
- //std::cout<<"Point Edge x:"<<center[0]+dir2[0] ;
- //std::cout<<" y:"<<center[1]+dir2[1]<<std::endl;
- //}
- }
-
- MFlux += std::min( Flux1, Flux2 );
- } // rof
-
- //std::cout<<Self::Dimension<<" radius:"<<radius<<std::endl;
- //std::cout<<"Center:"<<center[0]<<" "<<center[1]<<std::endl;
- //std::cout<<"edge:"<<center[0]+radius*std::cos( pi2n * double( 0 ) )<<std::endl;
-
- MFlux *= 2;
- MFlux /= this->m_RadialSampling;
- FluxFinal.push_back(MFlux);
- radiusGenerated.push_back(radius);
-
- radius += this->m_RadiusStep;
-
- } //elihw
-
- dR= *( std::max_element( FluxFinal.begin(), FluxFinal.end() ) );
- optR= (dR>optR)? dR:optR;
-
- } // rof
-
- } // rof
- return( TScalar(optR) );
-}
-
-#endif // __FPA__IMAGE__FUNCTORS__MFLUXMEDIALNESS__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__FUNCTORS__REGIONGROWALLBELONGSFUNCTION__H__
-#define __FPA__IMAGE__FUNCTORS__REGIONGROWALLBELONGSFUNCTION__H__
-
-#include <fpa/Base/Functors/TautologyFunction.h>
-
-namespace fpa
-{
- namespace Image
- {
- namespace Functors
- {
- /**
- */
- template< class I >
- class RegionGrowAllBelongsFunction
- : public fpa::Base::Functors::TautologyFunction< I, typename I::IndexType >
- {
- public:
- /// Type-related and pointers
- typedef RegionGrowAllBelongsFunction Self;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
- typedef fpa::Base::Functors::
- TautologyFunction< I, typename I::IndexType >
- Superclass;
-
- // Superclass' types
- typedef I TInputImage;
- typedef typename I::IndexType TIndex;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( RegionGrowAllBelongsFunction, itkImageFunction );
-
- public:
- virtual bool Evaluate( const TIndex& v ) const ITK_OVERRIDE
- { return( true ); }
-
- protected:
- RegionGrowAllBelongsFunction( )
- : Superclass( )
- { }
- virtual ~RegionGrowAllBelongsFunction( )
- { }
-
- private:
- // Purposely not implemented
- RegionGrowAllBelongsFunction( const Self& );
- void operator=( const Self& );
- };
-
- } // ecapseman
-
- } // ecapseman
-
-} // ecapseman
-
-#endif // __FPA__IMAGE__FUNCTORS__REGIONGROWALLBELONGSFUNCTION__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__FUNCTORS__REGIONGROWTHRESHOLDFUNCTION__H__
-#define __FPA__IMAGE__FUNCTORS__REGIONGROWTHRESHOLDFUNCTION__H__
-
-#include <itkNumericTraits.h>
-#include <fpa/Image/Functors/RegionGrowAllBelongsFunction.h>
-
-namespace fpa
-{
- namespace Image
- {
- namespace Functors
- {
- /**
- */
- template< class I >
- class RegionGrowThresholdFunction
- : public RegionGrowAllBelongsFunction< I >
- {
- public:
- /// Type-related and pointers
- typedef RegionGrowThresholdFunction Self;
- typedef RegionGrowAllBelongsFunction< I > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- // Superclass' types
- typedef I TInputImage;
- typedef typename I::IndexType TIndex;
- typedef typename I::PixelType TPixel;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro(
- RegionGrowThresholdFunction,
- RegionGrowAllBelongsFunction
- );
-
- itkGetConstMacro( LowerThreshold, TPixel );
- itkGetConstMacro( UpperThreshold, TPixel );
-
- itkSetMacro( LowerThreshold, TPixel );
- itkSetMacro( UpperThreshold, TPixel );
-
- public:
- virtual bool Evaluate( const TIndex& idx ) const ITK_OVERRIDE
- {
- const I* img = this->GetSpace( );
-
- if( img != NULL )
- {
- TPixel v = img->GetPixel( idx );
- return(
- !( v < this->m_LowerThreshold || this->m_UpperThreshold < v )
- );
-
- } // fi
- return( false );
- }
-
- protected:
- RegionGrowThresholdFunction( )
- : Superclass( )
- {
- itk::NumericTraits< TPixel >::min( this->m_LowerThreshold );
- itk::NumericTraits< TPixel >::max( this->m_UpperThreshold );
- }
- virtual ~RegionGrowThresholdFunction( )
- { }
-
- private:
- // Purposely not implemented
- RegionGrowThresholdFunction( const Self& );
- void operator=( const Self& );
-
- protected:
- TPixel m_LowerThreshold;
- TPixel m_UpperThreshold;
- };
-
- } // ecapseman
-
- } // ecapseman
-
-} // ecapseman
-
-#endif // __FPA__IMAGE__FUNCTORS__REGIONGROWTHRESHOLDFUNCTION__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__INCREMENTALREGIONGROW__H__
-#define __FPA__IMAGE__INCREMENTALREGIONGROW__H__
-
-#include <itkFunctionBase.h>
-#include <itkImageToImageFilter.h>
-#include <itkIndex.h>
-#include <fpa/Base/IncrementalRegionGrow.h>
-#include <fpa/Image/Algorithm.h>
-
-namespace fpa
-{
- namespace Image
- {
- /**
- * @param I Input image type
- * @param O Output image type
- */
- template< class I, class O >
- class IncrementalRegionGrow
- : public Algorithm< I, O, fpa::Base::IncrementalRegionGrow< typename I::IndexType, typename I::PixelType, typename O::PixelType, itk::Functor::IndexLexicographicCompare< I::ImageDimension >, itk::ImageToImageFilter< I, O > > >
- {
- public:
- typedef fpa::Base::IncrementalRegionGrow< typename I::IndexType, typename I::PixelType, typename O::PixelType, itk::Functor::IndexLexicographicCompare< I::ImageDimension >, itk::ImageToImageFilter< I, O > > TBaseAlgorithm;
-
- typedef IncrementalRegionGrow Self;
- typedef Algorithm< I, O, TBaseAlgorithm > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef typename Superclass::TInputImage TInputImage;
- typedef typename Superclass::TOutputImage TOutputImage;
- typedef typename Superclass::TVertex TVertex;
- typedef typename Superclass::TValue TValue;
- typedef typename Superclass::TResult TResult;
- typedef typename Superclass::TGrowingFunction TGrowingFunction;
-
- protected:
- typedef typename Superclass::_TVertices _TVertices;
- typedef typename Superclass::_TCollision _TCollision;
- typedef typename Superclass::_TCollisionsRow _TCollisionsRow;
- typedef typename Superclass::_TCollisions _TCollisions;
- typedef typename Superclass::_TNode _TNode;
- typedef typename Superclass::_TNodes _TNodes;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( IncrementalRegionGrow, Algorithm );
-
- protected:
- IncrementalRegionGrow( );
- virtual ~IncrementalRegionGrow( );
-
- virtual void _InitResults( );
-
- private:
- // Purposely not implemented
- IncrementalRegionGrow( const Self& other );
- Self& operator=( const Self& other );
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Image/IncrementalRegionGrow.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__IMAGE__INCREMENTALREGIONGROW__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__INCREMENTALREGIONGROW__HXX__
-#define __FPA__IMAGE__INCREMENTALREGIONGROW__HXX__
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-fpa::Image::IncrementalRegionGrow< I, O >::
-IncrementalRegionGrow( )
- : Superclass( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-fpa::Image::IncrementalRegionGrow< I, O >::
-~IncrementalRegionGrow( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-void fpa::Image::IncrementalRegionGrow< I, O >::
-_InitResults( )
-{
- this->Superclass::_InitResults( );
- this->GetOutput( )->FillBuffer( this->m_OutsideValue );
-}
-
-#endif // __FPA__IMAGE__INCREMENTALREGIONGROW__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__MINIMUMSPANNINGTREE__H__
-#define __FPA__IMAGE__MINIMUMSPANNINGTREE__H__
-
-#include <vector>
-#include <itkImage.h>
-#include <fpa/Base/MinimumSpanningTree.h>
-
-namespace fpa
-{
- namespace Image
- {
- template< unsigned int _NDim >
- struct MinimumSpanningTreeData
- {
- typedef itk::Offset< _NDim > TOffset;
- TOffset Parent;
- short FrontId;
- double GlobalCost;
- };
-
- /**
- */
- template< unsigned int _NDim >
- class MinimumSpanningTree
- : public fpa::Base::MinimumSpanningTree< itk::Image< MinimumSpanningTreeData< _NDim >, _NDim >, itk::Index< _NDim > >
- {
- public:
- typedef MinimumSpanningTreeData< _NDim > TInfo;
- typedef itk::Image< TInfo, _NDim > TBase;
- typedef itk::Index< _NDim > TVertex;
- typedef fpa::Base::MinimumSpanningTree< TBase, TVertex > Superclass;
- typedef MinimumSpanningTree Self;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef typename Superclass::TVertices TVertices;
- typedef typename Superclass::TPoint TPoint;
- typedef typename Superclass::TPoints TPoints;
- itkStaticConstMacro( Dimension, unsigned int, _NDim );
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( MinimumSpanningTree, _TSuperclass );
-
- public:
- void CopyMetaData( itk::ImageBase< _NDim >* infoImage );
- virtual void SetNode(
- const TVertex& v,
- const TVertex& p,
- const short& fid,
- const double& cost
- ) override;
- virtual void Clear( ) override;
-
- virtual TPoints GetEuclideanPath( const TVertex& a ) const override;
- virtual TPoints GetEuclideanPath(
- const TVertex& a, const TVertex& b
- ) const override;
- virtual bool IsDefinedInEuclideanSpace( ) const override;
-
- protected:
- MinimumSpanningTree( );
- virtual ~MinimumSpanningTree( );
-
- virtual bool _HasVertex( const TVertex& a ) const override;
- virtual short _FrontId( const TVertex& a ) const override;
- virtual void _Path( TVertices& path, const TVertex& a ) const override;
-
- private:
- // Purposely not implemented
- MinimumSpanningTree( const Self& other );
- Self& operator=( const Self& other );
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Image/MinimumSpanningTree.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__IMAGE__MINIMUMSPANNINGTREE__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__MINIMUMSPANNINGTREE__HXX__
-#define __FPA__IMAGE__MINIMUMSPANNINGTREE__HXX__
-
-#include <limits>
-
-// -------------------------------------------------------------------------
-template< unsigned int _NDim >
-void fpa::Image::MinimumSpanningTree< _NDim >::
-CopyMetaData( itk::ImageBase< _NDim >* infoImage )
-{
- this->SetLargestPossibleRegion( infoImage->GetLargestPossibleRegion( ) );
- this->SetRequestedRegion( infoImage->GetRequestedRegion( ) );
- this->SetBufferedRegion( infoImage->GetBufferedRegion( ) );
- this->SetDirection( infoImage->GetDirection( ) );
- this->SetOrigin( infoImage->GetOrigin( ) );
- this->SetSpacing( infoImage->GetSpacing( ) );
- this->Allocate( );
- this->Clear( );
-}
-
-// -------------------------------------------------------------------------
-template< unsigned int _NDim >
-void fpa::Image::MinimumSpanningTree< _NDim >::
-SetNode(
- const TVertex& v, const TVertex& p,
- const short& fid, const double& cost
- )
-{
- this->Superclass::SetNode( v, p, fid, cost );
- TInfo info;
- info.Parent = p - v;
- info.FrontId = fid;
- info.GlobalCost = cost;
- this->SetPixel( v, info );
-}
-
-// -------------------------------------------------------------------------
-template< unsigned int _NDim >
-void fpa::Image::MinimumSpanningTree< _NDim >::
-Clear( )
-{
- this->Superclass::Clear( );
- TInfo info;
- info.Parent.Fill( 0 );
- info.FrontId = std::numeric_limits< short >::max( );
- info.GlobalCost = double( 0 );
- this->FillBuffer( info );
-}
-
-// -------------------------------------------------------------------------
-template< unsigned int _NDim >
-typename fpa::Image::MinimumSpanningTree< _NDim >::
-TPoints fpa::Image::MinimumSpanningTree< _NDim >::
-GetEuclideanPath( const TVertex& a ) const
-{
- TPoints path;
- auto vertices = this->GetPath( a );
- for( auto vIt = vertices.begin( ); vIt != vertices.end( ); ++vIt )
- {
- TPoint pnt;
- this->TransformIndexToPhysicalPoint( *vIt, pnt );
- path.push_back( pnt );
-
- } // rof
- return( path );
-}
-
-// -------------------------------------------------------------------------
-template< unsigned int _NDim >
-typename fpa::Image::MinimumSpanningTree< _NDim >::
-TPoints fpa::Image::MinimumSpanningTree< _NDim >::
-GetEuclideanPath( const TVertex& a, const TVertex& b ) const
-{
- TPoints path;
- auto vertices = this->GetPath( a, b );
- for( auto vIt = vertices.begin( ); vIt != vertices.end( ); ++vIt )
- {
- TPoint pnt;
- this->TransformIndexToPhysicalPoint( *vIt, pnt );
- path.push_back( pnt );
-
- } // rof
- return( path );
-}
-
-// -------------------------------------------------------------------------
-template< unsigned int _NDim >
-bool fpa::Image::MinimumSpanningTree< _NDim >::
-IsDefinedInEuclideanSpace( ) const
-{
- return( true );
-}
-
-// -------------------------------------------------------------------------
-template< unsigned int _NDim >
-fpa::Image::MinimumSpanningTree< _NDim >::
-MinimumSpanningTree( )
- : Superclass( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< unsigned int _NDim >
-fpa::Image::MinimumSpanningTree< _NDim >::
-~MinimumSpanningTree( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< unsigned int _NDim >
-bool fpa::Image::MinimumSpanningTree< _NDim >::
-_HasVertex( const TVertex& a ) const
-{
- return( this->_FrontId( a ) < std::numeric_limits< short >::max( ) );
-}
-
-// -------------------------------------------------------------------------
-template< unsigned int _NDim >
-short fpa::Image::MinimumSpanningTree< _NDim >::
-_FrontId( const TVertex& a ) const
-{
- static const short MAX_ID = std::numeric_limits< short >::max( );
- if( this->GetRequestedRegion( ).IsInside( a ) )
- return( this->GetPixel( a ).FrontId );
- else
- return( MAX_ID );
-}
-
-// -------------------------------------------------------------------------
-template< unsigned int _NDim >
-void fpa::Image::MinimumSpanningTree< _NDim >::
-_Path( TVertices& path, const TVertex& a ) const
-{
- if( this->_HasVertex( a ) )
- {
- typename TVertex::OffsetType zero;
- zero.Fill( 0 );
- auto it = a;
- do
- {
- path.push_back( it );
- it += this->GetPixel( it ).Parent;
-
- } while( this->GetPixel( it ).Parent != zero );
- path.push_back( it );
-
- } // fi
-}
-
-#endif // __FPA__IMAGE__MINIMUMSPANNINGTREE__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__REGIONGROW__H__
-#define __FPA__IMAGE__REGIONGROW__H__
-
-#include <itkFunctionBase.h>
-#include <itkImageToImageFilter.h>
-#include <itkIndex.h>
-#include <fpa/Base/RegionGrow.h>
-#include <fpa/Image/Algorithm.h>
-
-namespace fpa
-{
- namespace Image
- {
- /**
- * @param I Input image type
- * @param O Output image type
- */
- template< class I, class O = I >
- class RegionGrow
- : public Algorithm< I, O, fpa::Base::RegionGrow< typename I::IndexType, typename I::PixelType, typename O::PixelType, I, itk::Functor::IndexLexicographicCompare< I::ImageDimension >, itk::ImageToImageFilter< I, O > > >
- {
- public:
- typedef fpa::Base::RegionGrow< typename I::IndexType, typename I::PixelType, typename O::PixelType, I, itk::Functor::IndexLexicographicCompare< I::ImageDimension >, itk::ImageToImageFilter< I, O > > TBaseAlgorithm;
-
- typedef RegionGrow Self;
- typedef Algorithm< I, O, TBaseAlgorithm > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef typename Superclass::TInputImage TInputImage;
- typedef typename Superclass::TOutputImage TOutputImage;
- typedef typename Superclass::TVertex TVertex;
- typedef typename Superclass::TValue TValue;
- typedef typename Superclass::TResult TResult;
- typedef typename Superclass::TSpace TSpace;
- typedef typename Superclass::TGrowingFunction TGrowingFunction;
-
- protected:
- typedef typename Superclass::_TVertices _TVertices;
- typedef typename Superclass::_TCollision _TCollision;
- typedef typename Superclass::_TCollisionsRow _TCollisionsRow;
- typedef typename Superclass::_TCollisions _TCollisions;
- typedef typename Superclass::_TNode _TNode;
- typedef typename Superclass::_TNodes _TNodes;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( RegionGrow, Algorithm );
-
- protected:
- RegionGrow( );
- virtual ~RegionGrow( );
-
- virtual void _InitResults( ) ITK_OVERRIDE;
-
- private:
- // Purposely not implemented
- RegionGrow( const Self& other );
- Self& operator=( const Self& other );
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Image/RegionGrow.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__IMAGE__REGIONGROW__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__REGIONGROW__HXX__
-#define __FPA__IMAGE__REGIONGROW__HXX__
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-fpa::Image::RegionGrow< I, O >::
-RegionGrow( )
- : Superclass( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-fpa::Image::RegionGrow< I, O >::
-~RegionGrow( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class I, class O >
-void fpa::Image::RegionGrow< I, O >::
-_InitResults( )
-{
- this->Superclass::_InitResults( );
- if( this->m_GrowingFunction.IsNotNull( ) )
- this->m_GrowingFunction->SetSpace( this->GetInput( ) );
- this->GetOutput( )->FillBuffer( this->m_OutsideValue );
-}
-
-#endif // __FPA__IMAGE__REGIONGROW__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__REGIONGROWWITHMULTIPLECRITERIA__H__
-#define __FPA__IMAGE__REGIONGROWWITHMULTIPLECRITERIA__H__
-
-#include <itkImageToImageFilter.h>
-#include <itkIndex.h>
-#include <fpa/Base/RegionGrowWithMultipleCriteria.h>
-#include <fpa/Image/Algorithm.h>
-#include <fpa/Image/Functors/ImageFunction.h>
-
-namespace fpa
-{
- namespace Image
- {
- /**
- * @param I Input image type
- */
- template< class I >
- class RegionGrowWithMultipleCriteria
- : public Algorithm< I, fpa::Base::RegionGrowWithMultipleCriteria< typename I::IndexType, typename I::PixelType, typename I::PixelType, itk::Functor::IndexLexicographicCompare< I::ImageDimension >, itk::ImageToImageFilter< I, I > > >
- {
- public:
- // Standard class typdedefs
- typedef typename I::IndexType TVertex;
- typedef typename I::PixelType TResult;
- typedef typename I::PixelType TVertexValue;
- typedef itk::ImageToImageFilter< I, I > TBaseFilter;
- typedef fpa::Base::RegionGrowWithMultipleCriteria< TVertex, TResult, TVertexValue, itk::Functor::IndexLexicographicCompare< I::ImageDimension >, TBaseFilter > TBaseAlgorithm;
-
- typedef RegionGrowWithMultipleCriteria Self;
- typedef Algorithm< I, TBaseAlgorithm > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef
- fpa::Image::Functors::ImageFunction< I, bool >
- TMembershipFunction;
- typedef typename Superclass::TFunctions TFunctions;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro(
- RegionGrowWithMultipleCriteria,
- fpaBaseRegionGrowWithMultipleCriteria
- );
-
- protected:
- RegionGrowWithMultipleCriteria( )
- : Superclass( )
- { }
- virtual ~RegionGrowWithMultipleCriteria( )
- { }
-
- private:
- // Purposely not implemented
- RegionGrowWithMultipleCriteria( const Self& );
- void operator=( const Self& );
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#endif // __FPA__IMAGE__REGIONGROWWITHMULTIPLECRITERIA__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__REGIONGROWWITHMULTIPLETHRESHOLDS__H__
-#define __FPA__IMAGE__REGIONGROWWITHMULTIPLETHRESHOLDS__H__
-
-#include <map>
-#include <set>
-#include <fpa/Image/RegionGrowWithMultipleCriteria.h>
-#include <fpa/Image/Functors/RegionGrowThresholdFunction.h>
-
-namespace fpa
-{
- namespace Image
- {
- /**
- * @param I Input image type
- */
- template< class I >
- class RegionGrowWithMultipleThresholds
- : public RegionGrowWithMultipleCriteria< I >
- {
- public:
- typedef RegionGrowWithMultipleThresholds Self;
- typedef RegionGrowWithMultipleCriteria< I > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef typename I::PixelType TPixel;
-
- typedef std::map< TPixel, unsigned long > THistogram;
- typedef typename Superclass::TBaseAlgorithm TBaseAlgorithm;
- typedef typename Superclass::TMembershipFunction TMembershipFunction;
- typedef typename Superclass::TFunctions TFunctions;
-
- typedef std::set< TPixel > TThresholds;
- typedef fpa::Image::Functors::RegionGrowThresholdFunction< I > TFunction;
-
- protected:
- typedef typename TBaseAlgorithm::_TNode _TNode;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( RegionGrowWithMultipleThresholds, RegionGrow );
-
- itkGetConstMacro( InsideValue, TPixel );
- itkGetConstMacro( OutsideValue, TPixel );
- itkGetConstMacro( DifferenceThreshold, double );
-
- itkSetMacro( InsideValue, TPixel );
- itkSetMacro( OutsideValue, TPixel );
- itkSetMacro( DifferenceThreshold, double );
-
- public:
- void AddThreshold( const TPixel& v );
- void AddThresholds(
- const TPixel& t0,
- const TPixel& t1,
- const unsigned int& s
- );
-
- protected:
- RegionGrowWithMultipleThresholds( );
- virtual ~RegionGrowWithMultipleThresholds( );
-
- virtual void _BeforeMainLoop( );
- virtual void _AfterMainLoop( );
- virtual void _AfterLoop( );
- virtual bool _UpdateResult( _TNode& n );
- virtual void _Mark( const _TNode& n );
- virtual bool _CheckStopCondition( );
-
- private:
- RegionGrowWithMultipleThresholds( const Self& ); // Not impl.
- void operator=( const Self& ); // Not impl.
-
- protected:
- TThresholds m_Thresholds;
- TPixel m_InsideValue;
- TPixel m_OutsideValue;
- double m_DifferenceThreshold;
- THistogram m_Histogram;
- unsigned long m_TotalCount;
- double m_LastDiff;
- bool m_StopForced;
- TPixel m_StopThreshold;
- };
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/Image/RegionGrowWithMultipleThresholds.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__IMAGE__REGIONGROWWITHMULTIPLETHRESHOLDS__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__IMAGE__REGIONGROWWITHMULTIPLETHRESHOLDS__HXX__
-#define __FPA__IMAGE__REGIONGROWWITHMULTIPLETHRESHOLDS__HXX__
-
-#include <limits>
-#include <itkBinaryThresholdImageFilter.h>
-#include <itkConstNeighborhoodIterator.h>
-
-// -------------------------------------------------------------------------
-template< class I >
-void fpa::Image::RegionGrowWithMultipleThresholds< I >::
-AddThreshold( const TPixel& v )
-{
- this->m_Thresholds.insert( v );
- this->Modified( );
-}
-
-// -------------------------------------------------------------------------
-template< class I >
-void fpa::Image::RegionGrowWithMultipleThresholds< I >::
-AddThresholds( const TPixel& t0, const TPixel& t1, const unsigned int& s )
-{
- for( TPixel t = t0; t <= t1; t += TPixel( s ) )
- this->AddThreshold( t );
-}
-
-// -------------------------------------------------------------------------
-template< class I >
-fpa::Image::RegionGrowWithMultipleThresholds< I >::
-RegionGrowWithMultipleThresholds( )
- : Superclass( ),
- m_InsideValue( TPixel( 1 ) ),
- m_OutsideValue( TPixel( 0 ) ),
- m_DifferenceThreshold( double( 3 ) ),
- m_TotalCount( 0 ),
- m_LastDiff( double( 0 ) ),
- m_StopForced( false ),
- m_StopThreshold( TPixel( 0 ) )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class I >
-fpa::Image::RegionGrowWithMultipleThresholds< I >::
-~RegionGrowWithMultipleThresholds( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class I >
-void fpa::Image::RegionGrowWithMultipleThresholds< I >::
-_BeforeMainLoop( )
-{
- const I* img = this->GetInput( );
-
- // Clear all states
- this->ClearMembershipFunctions( );
- this->m_Histogram.clear( );
- this->m_TotalCount = img->GetLargestPossibleRegion( ).GetNumberOfPixels( );
- this->m_LastDiff = double( -1 );
- this->m_StopForced = false;
-
- // Initialize thresholding functors
- typename TThresholds::const_iterator tIt = this->m_Thresholds.begin( );
- TPixel min_thr = std::numeric_limits< TPixel >::min( );
- for( ; tIt != this->m_Thresholds.end( ); ++tIt )
- {
- typename TFunction::Pointer function = TFunction::New( );
- function->SetInputImage( img );
- function->SetLowerThreshold( min_thr );
- function->SetUpperThreshold( *tIt );
- this->AddMembershipFunction( function );
-
- } // rof
-
- // Correct seeds
- typename I::SizeType radius;
- radius.Fill( 3 );
- itk::ConstNeighborhoodIterator< I > it(
- radius, img, img->GetRequestedRegion( )
- );
- for( unsigned int s = 0; s < this->m_Seeds.size( ); ++s )
- {
- _TNode seed = this->m_Seeds[ s ];
- it.SetLocation( seed.Vertex );
-
- typename I::SizeType size = it.GetSize( );
- unsigned int nN = 1;
- for( unsigned int d = 0; d < I::ImageDimension; ++d )
- nN *= size[ d ];
- TPixel min_value = img->GetPixel( seed.Vertex );
- for( unsigned int i = 0; i < nN; ++i )
- {
- if( it.GetPixel( i ) < min_value )
- {
- seed.Vertex = it.GetIndex( i );
- seed.Parent = seed.Vertex;
- min_value = it.GetPixel( i );
-
- } // fi
-
- } // rof
- this->m_Seeds[ s ] = seed;
-
- } // rof
-
- // Continue all initializations
- this->Superclass::_BeforeMainLoop( );
-}
-
-// -------------------------------------------------------------------------
-template< class I >
-void fpa::Image::RegionGrowWithMultipleThresholds< I >::
-_AfterMainLoop( )
-{
- typedef itk::BinaryThresholdImageFilter< I, I > _TBinFilter;
-
- // Binarize, inplace, the grown region
- if( this->m_Histogram.size( ) > 1 )
- {
- typename _TBinFilter::Pointer bin = _TBinFilter::New( );
- bin->SetInput( this->GetOutput( ) );
- bin->SetInsideValue( this->m_InsideValue );
- bin->SetOutsideValue( this->m_OutsideValue );
- bin->InPlaceOn( );
- if( this->m_StopForced )
- bin->SetUpperThreshold( this->m_StopThreshold );
- else
- bin->SetUpperThreshold( this->m_Histogram.rbegin( )->first );
- bin->GraftOutput( this->GetOutput( ) );
- bin->Update( );
- this->GraftOutput( bin->GetOutput( ) );
-
- } // fi
-
- this->Superclass::_AfterMainLoop( );
-}
-
-// -------------------------------------------------------------------------
-template< class I >
-void fpa::Image::RegionGrowWithMultipleThresholds< I >::
-_AfterLoop( )
-{
- if( this->m_ActualFunction != this->m_Functions.end( ) )
- {
- TFunction* f =
- dynamic_cast< TFunction* >( this->m_ActualFunction->GetPointer( ) );
- this->m_Histogram[ f->GetUpperThreshold( ) ] = this->m_Marks.size( );
-
- /* TODO: code to print the signal for demo purposes
- std::cout
- << f->GetUpperThreshold( ) << " "
- << this->m_Marks.size( )
- << std::endl;
- */
-
- // Get the two last complete count, if any, and compute last
- // finite difference
- if( this->m_Histogram.size( ) > 1 )
- {
- typename THistogram::const_reverse_iterator hIt =
- this->m_Histogram.rbegin( );
- typename THistogram::const_reverse_iterator gIt = hIt;
- gIt++;
-
- this->m_LastDiff = double( hIt->second ) - double( gIt->second );
- this->m_LastDiff /= double( hIt->first ) - double( gIt->first );
- this->m_LastDiff *= m_DifferenceThreshold;
- }
- else
- this->m_LastDiff = double( -1 );
-
- } // fi
- this->Superclass::_AfterLoop( );
-}
-
-// -------------------------------------------------------------------------
-template< class I >
-bool fpa::Image::RegionGrowWithMultipleThresholds< I >::
-_UpdateResult( _TNode& n )
-{
- // Here, the output is changed to the threshold used to compute the
- // growing condition of the actual vertex n
- bool ret = this->Superclass::_UpdateResult( n );
- if( this->m_ActualFunction != this->m_Functions.end( ) )
- {
- TFunction* f =
- dynamic_cast< TFunction* >( this->m_ActualFunction->GetPointer( ) );
- if( f != NULL )
- this->GetOutput( )->SetPixel( n.Vertex, f->GetUpperThreshold( ) );
-
- } // fi
- return( ret );
-}
-
-// -------------------------------------------------------------------------
-template< class I >
-void fpa::Image::RegionGrowWithMultipleThresholds< I >::
-_Mark( const _TNode& n )
-{
- this->Superclass::_Mark( n );
-
- // Check if the histogram's support is enough
- if( this->m_Histogram.size( ) < 2 )
- return;
- typename THistogram::const_reverse_iterator hIt =
- this->m_Histogram.rbegin( );
-
- // Get the actual function
- TFunction* f =
- dynamic_cast< TFunction* >( this->m_ActualFunction->GetPointer( ) );
- if( f == NULL )
- return;
-
- // Previous pixel count
- unsigned long prev_aCount = hIt->second;
- double prev_p = double( prev_aCount ) / double( this->m_TotalCount );
-
- // Actual pixel count
- unsigned long aCount = this->m_Marks.size( );
- double p = double( aCount ) / double( this->m_TotalCount );
-
- // Loop over, at least, 0.1% of the total number of pixels before
- // performing stop analysis
- if( double( 1e-3 ) < p && double( 1e-3 ) < prev_p )
- {
- // Does the difference is worthy to be analyzed?
- if( aCount > hIt->second )
- {
- // Compute finite difference and compare it to the previous one
- double diff = double( aCount ) - double( hIt->second );
- diff /= double( f->GetUpperThreshold( ) ) - double( hIt->first );
- if( diff > this->m_LastDiff )
- {
- /* TODO: comment this for demo purposes
- */
- this->m_StopForced = true;
- this->m_StopThreshold = hIt->first;
-
- } // fi
-
- } // fi
-
- } // fi
-}
-
-// -------------------------------------------------------------------------
-template< class I >
-bool fpa::Image::RegionGrowWithMultipleThresholds< I >::
-_CheckStopCondition( )
-{
- return( this->m_StopForced );
-}
-
-#endif // __FPA__IMAGE__REGIONGROWWITHMULTIPLETHRESHOLDS__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__VTK__IMAGESKELETONTOPOLYDATA__H__
-#define __FPA__VTK__IMAGESKELETONTOPOLYDATA__H__
-
-#include <vtkPolyDataAlgorithm.h>
-
-namespace fpa
-{
- namespace VTK
- {
- namespace Image
- {
- /**
- */
- template< class _TSkeleton >
- class ImageSkeletonToPolyData
- : public vtkPolyDataAlgorithm
- {
- public:
- typedef ImageSkeletonToPolyData Self;
- typedef _TSkeleton TSkeleton;
-
- public:
- vtkTypeMacro( ImageSkeletonToPolyData, vtkPolyDataAlgorithm );
-
- public:
- static Self* New( );
-
- const TSkeleton* GetInput( ) const;
- void SetInput( const TSkeleton* sk );
-
- protected:
- ImageSkeletonToPolyData( );
- virtual ~ImageSkeletonToPolyData( );
-
- int RequestData(
- vtkInformation* information,
- vtkInformationVector** input,
- vtkInformationVector* output
- );
- int RequestInformation(
- vtkInformation* information,
- vtkInformationVector** input,
- vtkInformationVector* output
- );
-
- private:
- // Purposely not implemented
- ImageSkeletonToPolyData( const Self& );
- void operator=( const Self& );
-
- protected:
- const TSkeleton* m_Skeleton;
- };
-
- } // ecapseman
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/VTK/Image/ImageSkeletonToPolyData.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__VTK__IMAGESKELETONTOPOLYDATA__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__VTK__IMAGESKELETONTOPOLYDATA__HXX__
-#define __FPA__VTK__IMAGESKELETONTOPOLYDATA__HXX__
-
-#include <vtkInformation.h>
-#include <vtkInformationVector.h>
-#include <vtkSmartPointer.h>
-
-// -------------------------------------------------------------------------
-template< class _TSkeleton >
-typename fpa::VTK::Image::ImageSkeletonToPolyData< _TSkeleton >::
-Self* fpa::VTK::Image::ImageSkeletonToPolyData< _TSkeleton >::
-New( )
-{
- return( new Self( ) );
-}
-
-// -------------------------------------------------------------------------
-template< class _TSkeleton >
-const _TSkeleton* fpa::VTK::Image::ImageSkeletonToPolyData< _TSkeleton >::
-GetInput( ) const
-{
- return( this->m_Skeleton );
-}
-
-// -------------------------------------------------------------------------
-template< class _TSkeleton >
-void fpa::VTK::Image::ImageSkeletonToPolyData< _TSkeleton >::
-SetInput( const _TSkeleton* sk )
-{
- if( this->m_Skeleton != sk )
- {
- this->m_Skeleton = sk;
- this->Modified( );
-
- } // fi
-}
-
-// -------------------------------------------------------------------------
-template< class _TSkeleton >
-fpa::VTK::Image::ImageSkeletonToPolyData< _TSkeleton >::
-ImageSkeletonToPolyData( )
- : vtkPolyDataAlgorithm( ),
- m_Skeleton( NULL )
-{
- this->SetNumberOfInputPorts( 0 );
-}
-
-// -------------------------------------------------------------------------
-template< class _TSkeleton >
-fpa::VTK::Image::ImageSkeletonToPolyData< _TSkeleton >::
-~ImageSkeletonToPolyData( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class _TSkeleton >
-int fpa::VTK::Image::ImageSkeletonToPolyData< _TSkeleton >::
-RequestData(
- vtkInformation* information,
- vtkInformationVector** input,
- vtkInformationVector* output
- )
-{
- typedef typename _TSkeleton::TVertex _TVertex;
- typedef typename _TSkeleton::TVertexCmp _TCmp;
- typedef itk::Point< double, _TVertex::Dimension > _TPoint;
- typedef
- std::map< _TVertex, std::map< _TVertex, bool, _TCmp >, _TCmp >
- _TMarks;
- static const unsigned int dim = _TVertex::Dimension;
-
- if( this->m_Skeleton == NULL )
- return( 0 );
-
- // Get output
- vtkInformation* info = output->GetInformationObject( 0 );
- vtkPolyData* out = vtkPolyData::SafeDownCast(
- info->Get( vtkDataObject::DATA_OBJECT( ) )
- );
-
- // Prepare points and cells
- vtkSmartPointer< vtkPoints > points =
- vtkSmartPointer< vtkPoints >::New( );
- vtkSmartPointer< vtkCellArray > lines =
- vtkSmartPointer< vtkCellArray >::New( );
-
- // Iterator over input data
- auto& sk = this->m_Skeleton->Get( );
- auto mst = this->m_Skeleton->GetMinimumSpanningTree( );
- _TMarks marks;
- for( auto i = sk.begin( ); i != sk.end( ); ++i )
- {
- for( auto j = i->second.begin( ); j != i->second.end( ); ++j )
- {
- if( !marks[ i->first ][ j->first ] )
- {
- auto path = j->second.GetPointer( );
- if( path != NULL )
- {
- auto vertices = path->GetVertexList( );
- for( unsigned int v = 0; v < vertices->Size( ); ++v )
- {
- auto idx = vertices->GetElement( v );
- _TPoint pnt;
- mst->TransformContinuousIndexToPhysicalPoint( idx, pnt );
- if( dim == 1 )
- points->InsertNextPoint( pnt[ 0 ], 0, 0 );
- else if( dim == 2 )
- points->InsertNextPoint( pnt[ 0 ], pnt[ 1 ], 0 );
- else
- points->InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
- if( v > 0 )
- {
- lines->InsertNextCell( 2 );
- lines->InsertCellPoint( points->GetNumberOfPoints( ) - 2 );
- lines->InsertCellPoint( points->GetNumberOfPoints( ) - 1 );
-
- } // fi
-
- } // rof
-
- } // fi
-
- // Mark path and its symmetric as visited
- marks[ i->first ][ j->first ] = true;
- marks[ j->first ][ i->first ] = true;
-
- } // fi
-
- } // rof
-
- } // rof
- out->SetPoints( points );
- out->SetLines( lines );
- return( 1 );
-}
-
-// -------------------------------------------------------------------------
-template< class _TSkeleton >
-int fpa::VTK::Image::ImageSkeletonToPolyData< _TSkeleton >::
-RequestInformation(
- vtkInformation* information,
- vtkInformationVector** input,
- vtkInformationVector* output
- )
-{
- vtkInformation* info = output->GetInformationObject( 0 );
- /* TODO
- info->Set(
- vtkStreamingDemandDrivenPipeline::MAXIMUM_NUMBER_OF_PIECES( ), -1
- );
- */
-
- if( this->m_Skeleton != NULL )
- {
- /* TODO
- typename C::TScalar len = this->m_RGC->GetTotalLength( );
- typename C::TScalar s0 = this->m_RGC->Gets0( );
- typename C::TPoint p0 = this->m_RGC->Axis( s0 );
- typename C::TPoint p1 = this->m_RGC->Axis( s0 + len );
-
- info->Set(
- vtkStreamingDemandDrivenPipeline::WHOLE_BOUNDING_BOX( ),
- double( p0[ 0 ] ), double( p1[ 0 ] ),
- double( p0[ 1 ] ), double( p1[ 1 ] ),
- double( p0[ 2 ] ), double( p1[ 2 ] )
- );
- */
-
- } // fi
- return( 1 );
-}
-
-#endif // __FPA__VTK__IMAGESKELETONTOPOLYDATA__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__VTK__IMAGE__OBSERVER2D__H__
-#define __FPA__VTK__IMAGE__OBSERVER2D__H__
-
-#include <set>
-#include <itkCommand.h>
-#include <vtkActor.h>
-#include <vtkImageActor.h>
-#include <vtkImageData.h>
-#include <vtkPolyData.h>
-#include <vtkSmartPointer.h>
-
-namespace fpa
-{
- namespace VTK
- {
- namespace Image
- {
- /**
- */
- template< class F, class R >
- class Observer2D
- : public itk::Command
- {
- public:
- typedef Observer2D Self;
- typedef itk::Command Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef F TFilter;
- typedef R TRenderWindow;
- typedef typename TFilter::TInputImage TImage;
- typedef typename TFilter::TVertex TVertex;
-
- typedef std::set< TVertex > TVertices;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( Observer2D, itkCommand );
-
- itkGetConstMacro( RenderPercentage, double );
- itkSetMacro( RenderPercentage, double );
-
- public:
- void SetRenderWindow( R* rw );
- void SetPixel(
- typename TImage::IndexType idx,
- unsigned char red,
- unsigned char green,
- unsigned char blue,
- unsigned char alpha
- );
- void Render( );
- void Execute( itk::Object* c, const itk::EventObject& e ) ITK_OVERRIDE
- { this->Execute( ( const itk::Object* )( c ), e ); }
- void Execute( const itk::Object* c, const itk::EventObject& e ) ITK_OVERRIDE;
-
- protected:
- Observer2D( );
- virtual ~Observer2D( );
-
- private:
- Observer2D( const Self& ); // Not impl.
- void operator=( const Self& ); // Not impl.
-
- protected:
- vtkSmartPointer< vtkImageData > m_Stencil;
- vtkSmartPointer< vtkImageActor > m_StencilActor;
-
- R* m_RenderWindow;
- unsigned long m_Count;
- unsigned long m_RenderCount;
- double m_RenderPercentage;
- };
-
- } // ecapseman
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/VTK/Image/Observer2D.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__VTK__IMAGE__OBSERVER2D__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__VTK__IMAGE__OBSERVER2D__HXX__
-#define __FPA__VTK__IMAGE__OBSERVER2D__HXX__
-
-#include <vtkCellArray.h>
-#include <vtkPolyDataMapper.h>
-#include <vtkPoints.h>
-#include <vtkPointData.h>
-#include <vtkProperty.h>
-#include <vtkRenderer.h>
-#include <vtkRendererCollection.h>
-
-// -------------------------------------------------------------------------
-template< class F, class R >
-void fpa::VTK::Image::Observer2D< F, R >::
-SetRenderWindow( R* rw )
-{
- this->m_RenderWindow = rw;
-}
-
-// -------------------------------------------------------------------------
-template< class F, class R >
-void fpa::VTK::Image::Observer2D< F, R >::
-SetPixel(
- typename TImage::IndexType idx,
- unsigned char red,
- unsigned char green,
- unsigned char blue,
- unsigned char alpha
- )
-{
- this->m_Stencil->SetScalarComponentFromDouble
- ( idx[ 0 ], idx[ 1 ], 0, 0, red );
- this->m_Stencil->SetScalarComponentFromDouble
- ( idx[ 0 ], idx[ 1 ], 0, 1, green );
- this->m_Stencil->SetScalarComponentFromDouble
- ( idx[ 0 ], idx[ 1 ], 0, 2, blue );
- this->m_Stencil->SetScalarComponentFromDouble
- ( idx[ 0 ], idx[ 1 ], 0, 3, alpha );
- this->m_Stencil->Modified( );
- this->m_StencilActor->Modified( );
-}
-
-// -------------------------------------------------------------------------
-template< class F, class R >
-void fpa::VTK::Image::Observer2D< F, R >::
-Render( )
-{
- if( this->m_RenderWindow != NULL )
- this->m_RenderWindow->Render( );
-}
-
-// -------------------------------------------------------------------------
-template< class F, class R >
-void fpa::VTK::Image::Observer2D< F, R >::
-Execute( const itk::Object* c, const itk::EventObject& e )
-{
- typedef typename F::TStartEvent _TStartEvent;
- typedef typename F::TStartLoopEvent _TStartLoopEvent;
- typedef typename F::TEndEvent _TEndEvent;
- typedef typename F::TEndLoopEvent _TEndLoopEvent;
- typedef typename F::TAliveEvent _TAliveEvent;
- typedef typename F::TFrontEvent _TFrontEvent;
- typedef typename F::TFreezeEvent _TFreezeEvent;
-
- typedef typename F::TStartBacktrackingEvent _TStartBacktrackingEvent;
- typedef typename F::TEndBacktrackingEvent _TEndBacktrackingEvent;
- typedef typename F::TBacktrackingEvent _TBacktrackingEvent;
-
- static unsigned char Colors[][4] =
- {
- { 0, 0, 127, 127 },
- { 0, 127, 127, 127 },
- { 127, 0, 127, 127 },
- { 127, 127, 0, 127 },
- { 0, 0, 63, 127 },
- { 0, 63, 63, 127 },
- { 63, 0, 63, 127 },
- { 63, 63, 0, 127 },
- { 63, 63, 127, 127 },
- { 63, 127, 127, 127 },
- { 127, 63, 127, 127 },
- { 127, 127, 63, 127 },
- { 127, 127, 63, 127 },
- { 127, 63, 63, 127 },
- { 63, 127, 63, 127 },
- { 63, 63, 127, 127 }
- };
-
- const F* filter = dynamic_cast< const F* >( c );
- if( this->m_RenderWindow == NULL || filter == NULL )
- return;
-
- const _TStartEvent* startEvt = dynamic_cast< const _TStartEvent* >( &e );
- const _TStartBacktrackingEvent* startBackEvt =
- dynamic_cast< const _TStartBacktrackingEvent* >( &e );
- if( startEvt != NULL || startBackEvt != NULL )
- {
- const typename F::TInputImage* img = filter->GetInput( );
- unsigned int minD = F::TInputImage::ImageDimension;
- minD = ( minD < 3 )? minD: 3;
-
- int e[ 6 ] = { 0 };
- typename F::TInputImage::RegionType reg = img->GetRequestedRegion( );
- for( unsigned int i = 0; i < minD; i++ )
- {
- e[ ( i << 1 ) + 0 ] = reg.GetIndex( )[ i ];
- e[ ( i << 1 ) + 1 ] = reg.GetIndex( )[ i ] + reg.GetSize( )[ i ] - 1;
-
- } // rof
-
- typename F::TInputImage::SpacingType spac = img->GetSpacing( );
- double s[ 3 ] = { 1, 1, 1 };
- for( unsigned int i = 0; i < minD; i++ )
- s[ i ] = double( spac[ i ] );
-
- typename F::TInputImage::PointType orig = img->GetOrigin( );
- double o[ 3 ] = { 0 };
- for( unsigned int i = 0; i < minD; i++ )
- o[ i ] = double( orig[ i ] );
-
- this->m_Stencil->SetExtent( e );
- this->m_Stencil->SetSpacing( s );
- this->m_Stencil->SetOrigin( o );
- this->m_Stencil->AllocateScalars( VTK_UNSIGNED_CHAR, 4 );
- for( unsigned int i = 0; i < 3; i++ )
- this->m_Stencil->GetPointData( )->
- GetScalars( )->FillComponent( i, 255 );
- this->m_Stencil->GetPointData( )->GetScalars( )->FillComponent( 3, 0 );
-
- this->m_StencilActor->SetInputData( this->m_Stencil );
- this->m_StencilActor->InterpolateOff( );
-
- this->m_Count = 0;
- this->m_RenderCount = reg.GetNumberOfPixels( );
-
- vtkRenderer* ren =
- this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
- ren->AddActor( this->m_StencilActor );
- return;
-
- } // fi
-
- const _TAliveEvent* aliveEvt = dynamic_cast< const _TAliveEvent* >( &e );
- const _TFrontEvent* frontEvt = dynamic_cast< const _TFrontEvent* >( &e );
- if( aliveEvt != NULL || frontEvt != NULL )
- {
- if( aliveEvt != NULL )
- this->SetPixel(
- aliveEvt->Vertex,
- Colors[ aliveEvt->FrontId ][ 0 ],
- Colors[ aliveEvt->FrontId ][ 1 ],
- Colors[ aliveEvt->FrontId ][ 2 ],
- Colors[ aliveEvt->FrontId ][ 3 ]
- );
- else if( frontEvt != NULL )
- this->SetPixel( frontEvt->Vertex, 255, 0, 0, 255 );
- this->m_Count++;
-
- // Render visual debug
- double per = double( this->m_RenderCount ) * this->m_RenderPercentage;
- if( double( this->m_Count ) >= per )
- this->Render( );
- if( double( this->m_Count ) >= per )
- this->m_Count = 0;
-
- return;
-
- } // fi
-
- const _TEndEvent* endEvt = dynamic_cast< const _TEndEvent* >( &e );
- if( endEvt != NULL )
- {
- vtkRenderer* ren =
- this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
- ren->RemoveActor( this->m_StencilActor );
- this->Render( );
- return;
-
- } // fi
-
- const _TBacktrackingEvent* backEvt =
- dynamic_cast< const _TBacktrackingEvent* >( &e );
- const _TEndBacktrackingEvent* endBackEvt =
- dynamic_cast< const _TEndBacktrackingEvent* >( &e );
- if( backEvt != NULL )
- {
- this->SetPixel( backEvt->Vertex, 0, 0, 255, 255 );
- return;
-
- } // fi
-
- if( endBackEvt != NULL )
- {
- this->m_RenderWindow->Render( );
- /* TODO: DEBUG
- std::cout << "Press enter: " << std::ends;
- int aux;
- std::cin >> aux;
- */
- return;
-
- } // fi
-}
-
-// -------------------------------------------------------------------------
-template< class F, class R >
-fpa::VTK::Image::Observer2D< F, R >::
-Observer2D( )
- : Superclass( ),
- m_RenderWindow( NULL ),
- m_RenderPercentage( double( 0.01 ) )
-{
- this->m_Stencil = vtkSmartPointer< vtkImageData >::New( );
- this->m_StencilActor = vtkSmartPointer< vtkImageActor >::New( );
-}
-
-// -------------------------------------------------------------------------
-template< class F, class R >
-fpa::VTK::Image::Observer2D< F, R >::
-~Observer2D( )
-{
-}
-
-#endif // __FPA__VTK__IMAGE__OBSERVER2D__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__VTK__IMAGE__OBSERVER3D__H__
-#define __FPA__VTK__IMAGE__OBSERVER3D__H__
-
-#include <map>
-
-#include <itkCommand.h>
-
-#include <vtkActor.h>
-#include <vtkPolyData.h>
-#include <vtkPolyDataMapper.h>
-#include <vtkSmartPointer.h>
-
-namespace fpa
-{
- namespace VTK
- {
- namespace Image
- {
- /**
- */
- template< class F, class R >
- class Observer3D
- : public itk::Command
- {
- public:
- typedef Observer3D Self;
- typedef itk::Command Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef F TFilter;
- typedef R TRenderWindow;
- typedef typename TFilter::TInputImage TImage;
- typedef typename TFilter::TVertex TVertex;
- typedef typename TFilter::TVertexCompare TVertexCompare;
-
- typedef std::set< TVertex > TVertices;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( Observer3D, itkCommand );
-
- itkGetConstMacro( RenderPercentage, double );
- itkSetMacro( RenderPercentage, double );
-
- public:
- void SetRenderWindow( R* rw );
- void Render( );
- void Execute( itk::Object* c, const itk::EventObject& e ) ITK_OVERRIDE
- { this->Execute( ( const itk::Object* )( c ), e ); }
- void Execute( const itk::Object* c, const itk::EventObject& e ) ITK_OVERRIDE;
-
- protected:
- Observer3D( );
- virtual ~Observer3D( );
-
- private:
- Observer3D( const Self& ); // Not impl.
- void operator=( const Self& ); // Not impl.
-
- protected:
- vtkSmartPointer< vtkPolyData > m_PolyData;
- vtkSmartPointer< vtkPolyDataMapper > m_PolyDataMapper;
- vtkSmartPointer< vtkActor > m_PolyDataActor;
- std::map< TVertex, unsigned long, TVertexCompare > m_PointsToReplace;
- std::map< TVertex, unsigned long, TVertexCompare > m_PointsInFront;
-
- R* m_RenderWindow;
- unsigned long m_Count;
- unsigned long m_RenderCount;
- double m_RenderPercentage;
- };
-
- } // ecapseman
-
- } // ecapseman
-
-} // ecapseman
-
-#ifndef ITK_MANUAL_INSTANTIATION
-#include <fpa/VTK/Observer3D.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __FPA__VTK__IMAGE__OBSERVER3D__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPA__VTK__IMAGE__OBSERVER3D__HXX__
-#define __FPA__VTK__IMAGE__OBSERVER3D__HXX__
-
-#include <vtkCellArray.h>
-#include <vtkPolyDataMapper.h>
-#include <vtkPoints.h>
-#include <vtkPointData.h>
-#include <vtkProperty.h>
-#include <vtkRenderer.h>
-#include <vtkRendererCollection.h>
-
-// -------------------------------------------------------------------------
-template< class F, class R >
-void fpa::VTK::Image::Observer3D< F, R >::
-SetRenderWindow( R* rw )
-{
- this->m_RenderWindow = rw;
-}
-
-// -------------------------------------------------------------------------
-template< class F, class R >
-void fpa::VTK::Image::Observer3D< F, R >::
-Render( )
-{
- if( this->m_RenderWindow != NULL )
- this->m_RenderWindow->Render( );
-}
-
-// -------------------------------------------------------------------------
-template< class F, class R >
-void fpa::VTK::Image::Observer3D< F, R >::
-Execute( const itk::Object* c, const itk::EventObject& e )
-{
- typedef typename F::TStartEvent _TStartEvent;
- typedef typename F::TStartLoopEvent _TStartLoopEvent;
- typedef typename F::TEndEvent _TEndEvent;
- typedef typename F::TEndLoopEvent _TEndLoopEvent;
- typedef typename F::TAliveEvent _TAliveEvent;
- typedef typename F::TFrontEvent _TFrontEvent;
- typedef typename F::TFreezeEvent _TFreezeEvent;
-
- typedef typename F::TStartBacktrackingEvent _TStartBacktrackingEvent;
- typedef typename F::TEndBacktrackingEvent _TEndBacktrackingEvent;
- typedef typename F::TBacktrackingEvent _TBacktrackingEvent;
-
- static unsigned char Colors[][4] =
- {
- { 0, 0, 127, 127 },
- { 0, 127, 127, 127 },
- { 127, 0, 127, 127 },
- { 127, 127, 0, 127 },
- { 0, 0, 63, 127 },
- { 0, 63, 63, 127 },
- { 63, 0, 63, 127 },
- { 63, 63, 0, 127 },
- { 63, 63, 127, 127 },
- { 63, 127, 127, 127 },
- { 127, 63, 127, 127 },
- { 127, 127, 63, 127 },
- { 127, 127, 63, 127 },
- { 127, 63, 63, 127 },
- { 63, 127, 63, 127 },
- { 63, 63, 127, 127 }
- };
-
- const F* filter = dynamic_cast< const F* >( c );
- if( this->m_RenderWindow == NULL || filter == NULL )
- return;
- auto image = filter->GetInput( );
- if( image == NULL )
- return;
-
- const _TStartEvent* startEvt = dynamic_cast< const _TStartEvent* >( &e );
- const _TStartBacktrackingEvent* startBackEvt =
- dynamic_cast< const _TStartBacktrackingEvent* >( &e );
- if( startEvt != NULL || startBackEvt != NULL )
- {
- this->m_Count = 0;
- this->m_RenderCount =
- image->GetLargestPossibleRegion( ).GetNumberOfPixels( );
- this->m_PointsToReplace.clear( );
- this->m_PointsInFront.clear( );
-
- vtkRenderer* ren =
- this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
- ren->AddActor( this->m_PolyDataActor );
- return;
-
- } // fi
-
- const _TFrontEvent* frontEvt = dynamic_cast< const _TFrontEvent* >( &e );
- if( frontEvt != NULL )
- {
- typename F::TInputImage::PointType pnt;
- image->TransformIndexToPhysicalPoint( frontEvt->Vertex, pnt );
- if( this->m_PointsToReplace.empty( ) )
- {
- unsigned long nPoints = this->m_PolyData->GetNumberOfPoints( );
- this->m_PolyData->GetPoints( )->
- InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
- this->m_PolyData->GetVerts( )->InsertNextCell( 1 );
- this->m_PolyData->GetVerts( )->InsertCellPoint( nPoints );
- this->m_PointsInFront[ frontEvt->Vertex ] = nPoints;
- }
- else
- {
- auto pIt = this->m_PointsToReplace.begin( );
- this->m_PolyData->GetPoints( )->
- SetPoint( pIt->second, pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
- this->m_PointsToReplace.erase( pIt );
-
- } // fi
- this->m_PolyData->Modified( );
- this->m_PolyDataMapper->Modified( );
- this->m_PolyDataActor->Modified( );
-
- // Render visual debug
- this->m_Count++;
- double per = double( this->m_RenderCount ) * this->m_RenderPercentage;
- if( double( this->m_Count ) >= per )
- this->Render( );
- if( double( this->m_Count ) >= per )
- this->m_Count = 0;
-
- return;
-
- } // fi
-
- const _TAliveEvent* aliveEvt = dynamic_cast< const _TAliveEvent* >( &e );
- if( aliveEvt != NULL )
- {
- auto pIt = this->m_PointsInFront.find( aliveEvt->Vertex );
- if( pIt != this->m_PointsInFront.end( ) )
- {
- this->m_PointsToReplace[ pIt->first ] = pIt->second;
- this->m_PointsInFront.erase( pIt );
-
- } // fi
- return;
-
- } // fi
-
- const _TEndEvent* endEvt = dynamic_cast< const _TEndEvent* >( &e );
- if( endEvt != NULL )
- {
- vtkRenderer* ren =
- this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
- ren->RemoveActor( this->m_PolyDataActor );
- this->Render( );
- return;
-
- } // fi
-
- const _TBacktrackingEvent* backEvt =
- dynamic_cast< const _TBacktrackingEvent* >( &e );
- const _TEndBacktrackingEvent* endBackEvt =
- dynamic_cast< const _TEndBacktrackingEvent* >( &e );
- if( backEvt != NULL )
- {
- // TODO:
- return;
-
- } // fi
-
- if( endBackEvt != NULL )
- {
- this->m_RenderWindow->Render( );
-
- /* TODO: DEBUG
- std::cout << "Press enter: " << std::ends;
- int aux;
- std::cin >> aux;
- */
- return;
-
- } // fi
-}
-
-// -------------------------------------------------------------------------
-template< class F, class R >
-fpa::VTK::Image::Observer3D< F, R >::
-Observer3D( )
- : Superclass( ),
- m_RenderWindow( NULL ),
- m_RenderPercentage( double( 0.001 ) )
-{
- this->m_PolyData = vtkSmartPointer< vtkPolyData >::New( );
- this->m_PolyDataMapper = vtkSmartPointer< vtkPolyDataMapper >::New( );
- this->m_PolyDataActor =vtkSmartPointer< vtkActor >::New( );
-
- vtkSmartPointer< vtkPoints > points =
- vtkSmartPointer< vtkPoints >::New( );
- vtkSmartPointer< vtkCellArray > verts =
- vtkSmartPointer< vtkCellArray >::New( );
- this->m_PolyData->SetPoints( points );
- this->m_PolyData->SetVerts( verts );
- this->m_PolyDataMapper->SetInputData( this->m_PolyData );
- this->m_PolyDataActor->SetMapper( this->m_PolyDataMapper );
- this->m_PolyDataActor->GetProperty( )->SetColor( 0, 1, 0 );
-}
-
-// -------------------------------------------------------------------------
-template< class F, class R >
-fpa::VTK::Image::Observer3D< F, R >::
-~Observer3D( )
-{
-}
-
-#endif // __FPA__VTK__IMAGE__OBSERVER3D__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-d #dims=2;3
-d #floats=float;double
-d #mst=fpa::Image::MinimumSpanningTree
-d #path=ExtractPathFromMinimumSpanningTree
-d #ebc=ExtractEndPointsAndBifurcationsFromMinimumSpanningTree
-
-f fpa_Instances/Instances.h
-
-i utility
-i vector
-t fpa/Base/#path.h
-t fpa/Base/#ebc.h
-t fpa/Image/#ebc.h
-t itkSimpleDataObjectDecorator.h
-
-c itk::SimpleDataObjectDecorator< std::vector< std::pair< itk::Index< #dims >, itk::Index< #dims > > > >
-c fpa::Base::#path< #mst< #dims > >
-c fpa::Base::#ebc< #mst< #dims > >
-c fpa::Image::#ebc< itk::Image< #floats, #dims >, #mst< #dims > >
-
-* eof - $RCSfile$
+++ /dev/null
-## =================================
-## == Compile instances libraries ==
-## =================================
-
-SET(pfx "fpa_")
-SET(arg ${pfx} ${prj_VER} ${prj_sVER})
-
-cpPlugins_WrapInstances(Instances ${arg} ${cpPlugins_LIBRARIES} ${ITK_LIBRARIES} ${VTK_LIBRARIES})
-cpPlugins_WrapInstances(Functors ${arg} ${pfx}Instances)
-cpPlugins_WrapInstances(Filters ${arg} ${pfx}Instances)
-cpPlugins_WrapInstances(Backtracking ${arg} ${pfx}Instances)
-cpPlugins_WrapInstances(Observers ${arg} ${pfx}Filters ${VTK_LIBRARIES})
-
-SET(
- fpa_LIBRARIES
- ${pfx}Instances
- ${pfx}Functors
- ${pfx}Filters
- ${pfx}Backtracking
- ${pfx}Observers
- CACHE INTERNAL "All valid instances." FORCE
- )
-
-## eof - $RCSfile$
+++ /dev/null
-f fpa_Instances/Instances.h
-
-t fpa/Base/Algorithm.h
-t fpa/Base/RegionGrow.h
-t fpa/Base/Dijkstra.h
-
-t fpa/Image/Algorithm.h
-t fpa/Image/RegionGrow.h
-t fpa/Image/Dijkstra.h
-
-d #dims=2;3
-d #int=char;short;int;long
-d #uint=unsigned #int
-d #float=float;double
-d #pixels=#int;#uint;#float
-d #b=fpa::Base
-d #i=fpa::Image
-d #mst=MinimumSpanningTree
-d #rg_ins=#pixels
-d #rg_outs=unsigned short;unsigned char
-d #d_ins=#pixels
-d #d_outs=#float
-d #inputs=#pixels
-d #outputs=#pixels
-
-* =====================
-* == Base algorithms ==
-* =====================
-
-c #b::Algorithm< itk::Index< #dims >, #inputs, #outputs, itk::Image< #inputs, #dims >, itk::Functor::IndexLexicographicCompare< #dims >, itk::ImageToImageFilter< itk::Image< #inputs, #dims >, itk::Image< #outputs, #dims > > >
-
-c #i::Algorithm< itk::Image< #rg_ins, #dims >, itk::Image< #rg_outs, #dims >, fpa::Base::RegionGrow< itk::Index< #dims >, #rg_ins, #rg_outs, itk::Image< #rg_ins, #dims >, itk::Functor::IndexLexicographicCompare< #dims >, itk::ImageToImageFilter< itk::Image< #rg_ins, #dims >, itk::Image< #rg_outs, #dims > > > >
-
-c #b::Dijkstra< itk::Index< #dims >, #d_ins, #d_outs, itk::Image< #d_ins, #dims >, itk::Functor::IndexLexicographicCompare< #dims >, #i::MinimumSpanningTree< #dims >, itk::ImageToImageFilter< itk::Image< #d_ins, #dims >, itk::Image< #d_outs, #dims > > >
-
-* ======================
-* == Image algorithms ==
-* ======================
-
-c #i::RegionGrow< itk::Image< #rg_ins, #dims >, itk::Image< #rg_outs, #dims > >
-c #i::Dijkstra< itk::Image< #d_ins, #dims >, itk::Image< #d_outs, #dims > >
-
-* eof - $RCSfile$
+++ /dev/null
-d #functors=GulsunTekMedialness;FluxMedialness;MFluxMedialness
-d #filter=cpExtensions::Algorithms::ImageFunctionFilter
-d #vectors=itk::CovariantVector
-d #k=itk::Image
-
-f fpa_Instances/Instances.h
-
-t itkImageFunction.h
-t fpa/Image/Functors/#functors.h
-t fpa/Image/Functors/GradientImageFunctionBase.h
-t cpExtensions/Algorithms/ImageFunctionFilter.h
-
-d #dims=2;3
-d #int=char;short;int;long
-d #uint=unsigned #int
-d #float=float;double
-d #pixels=#int;#uint;#float
-d #b=fpa::Base
-d #i=fpa::Image
-d #mst=MinimumSpanningTree
-d #rg_ins=#pixels
-d #rg_outs=unsigned short;unsigned char
-d #d_ins=#pixels
-d #d_outs=#float
-d #inputs=#pixels
-d #outputs=#pixels
-
-c #i::Functors::#functors< #k< #vectors< #float, #dims >, #dims > >
-c #filter< #k< #vectors< #float, #dims >, #dims >, #k< #float, #dims >, #i::Functors::#functors< #k< #vectors< #float, #dims >, #dims > > >
-
-* eof - $RCSfile$
+++ /dev/null
-f cpPlugins_Instances/ScalarImagesBaseFilters.h
-
-t fpa/Base/MinimumSpanningTree.h
-t fpa/Image/MinimumSpanningTree.h
-t fpa/IO/MinimumSpanningTreeReader.h
-t fpa/IO/MinimumSpanningTreeWriter.h
-t fpa/Base/ImageSkeleton.h
-t fpa/VTK/Image/ImageSkeletonToPolyData.h
-
-t itkImage.h
-t itkImportImageContainer.h
-t itkImageRegionConstIteratorWithIndex.h
-t itkImageConstIteratorWithIndex.h
-t itkSimpleDataObjectDecorator.h
-
-d #dims=2;3
-d #int=char;short;int;long
-d #uint=unsigned #int
-d #float=float;double
-d #pixels=#int;#uint;#float
-d #b=fpa::Base
-d #i=fpa::Image
-d #mst=MinimumSpanningTree
-d #rg_ins=#pixels
-d #rg_outs=unsigned short;unsigned char
-d #d_ins=#pixels
-d #d_outs=#float
-d #inputs=#pixels
-d #outputs=#pixels
-
-* ================
-* == Base types ==
-* ================
-
-c itk::ImportImageContainer< unsigned long, #i::{#mst}Data< #dims > >
-c itk::Image< #i::{#mst}Data< #dims >, #dims >
-c #b::#mst< itk::Image< #i::{#mst}Data< #dims >, #dims >, itk::Index< #dims > >
-c #i::#mst@{Data;{}}< #dims >
-c #b::ImageSkeleton< #i::#mst< #dims > >
-
-c itk::ImageConstIteratorWithIndex< #i::#mst< #dims > >
-c itk::ImageRegionConstIteratorWithIndex< #i::#mst< #dims > >
-c fpa::IO::MinimumSpanningTree@{Reader;Writer}< #i::#mst< #dims > >
-
-* ========================
-* == Conversion filters ==
-* ========================
-
-c fpa::VTK::Image::ImageSkeletonToPolyData< #b::ImageSkeleton< #i::#mst< #dims > > >
-
-* eof - $RCSfile$
+++ /dev/null
-d #dims=2;3
-d #int=char;short;int;long
-d #uint=unsigned #int
-d #float=float;double
-d #pixels=#int;#uint;#float
-d #rg_ins=#pixels
-d #rg_outs=unsigned short;unsigned char
-d #d_ins=#pixels
-d #d_outs=#float
-d #cls=fpa::VTK::Image::Observer
-d #i=fpa::Image
-d #k=itk::Image
-
-f fpa_Instances/Filters.h
-
-i vtkRenderWindow.h
-
-t fpa/VTK/Image/Observer2D.h
-t fpa/VTK/Image/Observer3D.h
-
-c {#cls}{#dims}D< #i::RegionGrow< #k< #rg_ins, #dims >, #k< #rg_outs, #dims > >, vtkRenderWindow >
-c {#cls}{#dims}D< #i::Dijkstra< #k< #d_ins, #dims >, #k< #d_outs, #dims > >, vtkRenderWindow >
-
-* eof - $RCSfile$
+++ /dev/null
-IF(BUILD_PLUGINS)
- SUBDIRS(
- fpa
- )
-ENDIF(BUILD_PLUGINS)
-
-## eof - $RCSfile$
+++ /dev/null
-#include "BaseImageFilter.h"
-#include <cpPlugins/Image.h>
-
-// -------------------------------------------------------------------------
-bool fpaPlugins::BaseImageFilter::
-IsInteractive( )
-{
- return( true );
-}
-
-// -------------------------------------------------------------------------
-void fpaPlugins::BaseImageFilter::
-SetInteractionObjects( const std::vector< void* >& objs )
-{
- if( objs.size( ) > 0 )
- this->m_SingleInteractor =
- reinterpret_cast< vtkRenderWindowInteractor* >( objs[ 0 ] );
- if( objs.size( ) > 1 )
- this->m_MPRViewer = reinterpret_cast< TMPRWidget* >( objs[ 1 ] );
-}
-
-// -------------------------------------------------------------------------
-fpaPlugins::BaseImageFilter::
-BaseImageFilter( )
- : Superclass( )
-{
- this->_AddInput( "Input" );
- this->_AddInput( "Seeds" );
- this->_AddOutput< cpPlugins::Image >( "Output" );
-
- this->m_Parameters.ConfigureAsBool( "VisualDebug" );
- this->m_Parameters.ConfigureAsBool( "StopAtOneFront" );
- this->m_Parameters.SetBool( "VisualDebug", false );
- this->m_Parameters.SetBool( "StopAtOneFront", false );
-
- std::vector< std::string > orders;
- orders.push_back( "1" );
- orders.push_back( "2" );
- this->m_Parameters.ConfigureAsChoices( "NeighborhoodOrder", orders );
- this->m_Parameters.SetSelectedChoice( "NeighborhoodOrder", "1" );
-}
-
-// -------------------------------------------------------------------------
-fpaPlugins::BaseImageFilter::
-~BaseImageFilter( )
-{
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPAPLUGINS__BASEIMAGEFILTER__H__
-#define __FPAPLUGINS__BASEIMAGEFILTER__H__
-
-#include <fpa/fpaPlugins_Export.h>
-#include <cpPlugins/ProcessObject.h>
-
-#include <cpExtensions/QT/SimpleMPRWidget.h>
-#include <vtkRenderWindowInteractor.h>
-
-namespace fpaPlugins
-{
- /**
- */
- class fpaPlugins_EXPORT BaseImageFilter
- : public cpPlugins::ProcessObject
- {
- public:
- typedef BaseImageFilter Self;
- typedef cpPlugins::ProcessObject Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- typedef cpExtensions::QT::SimpleMPRWidget TMPRWidget;
-
- public:
- itkTypeMacro( BaseImageFilter, cpPlugins::ProcessObject );
- cpPlugins_Id_Macro( BaseImageFilter, fpaImageAlgorithm );
-
- public:
- virtual bool IsInteractive( ) override;
- virtual void SetInteractionObjects(
- const std::vector< void* >& objs
- ) override;
-
- protected:
- BaseImageFilter( );
- virtual ~BaseImageFilter( );
-
- template< class _TFilter >
- inline _TFilter* _ConfigureFilter( );
-
- template< class _TFilter >
- inline void _ExecuteFilter( _TFilter* filter );
-
- template< class _TFilter >
- inline void _ConfigureDebugger( _TFilter* filter );
-
- template< class _TFilter >
- inline void _DeconfigureDebugger( _TFilter* filter );
-
- private:
- // Purposely not implemented.
- BaseImageFilter( const Self& other );
- Self& operator=( const Self& other );
-
- protected:
- TMPRWidget* m_MPRViewer;
- vtkRenderWindowInteractor* m_SingleInteractor;
- std::set< unsigned long > m_Observers;
- };
-
-} // ecapseman
-
-#include "BaseImageFilter.hxx"
-
-#endif // __FPAPLUGINS__BASEIMAGEFILTER__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPAPLUGINS__BASEIMAGEFILTER__HXX__
-#define __FPAPLUGINS__BASEIMAGEFILTER__HXX__
-
-#include <cpExtensions/DataStructures/ImageIndexesContainer.h>
-#include <fpa_Instances/Observers.h>
-
-// -------------------------------------------------------------------------
-template< class _TFilter >
-_TFilter* fpaPlugins::BaseImageFilter::
-_ConfigureFilter( )
-{
- typedef typename _TFilter::TInputImage _TImage;
- static const unsigned int Dim = _TImage::ImageDimension;
-
- auto image = this->GetInputData< _TImage >( "Input" );
- if( image == NULL )
- return( NULL );
- auto seeds = this->GetInputData< vtkPoints >( "Seeds" );
-
- // Create filter and connect input
- auto filter = this->_CreateITK< _TFilter >( );
- filter->SetInput( image );
-
- // Set numeric parameters
- filter->SetNeighborhoodOrder(
- this->m_Parameters.GetSelectedChoice( "NeighborhoodOrder" )[ 0 ] - '0'
- );
- filter->SetStopAtOneFront( this->m_Parameters.GetBool( "StopAtOneFront" ) );
-
- // Assign seeds
- filter->ClearSeeds( );
- if( seeds != NULL )
- {
- typename _TImage::PointType pnt;
- typename _TImage::IndexType idx;
- unsigned int dim =
- ( _TImage::ImageDimension < 3 )? _TImage::ImageDimension: 3;
- for( unsigned 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 ) )
- filter->AddSeed( idx, 0 );
-
- } // rof
-
- } // fi
-
- // Ok!
- return( filter );
-}
-
-// -------------------------------------------------------------------------
-template< class _TFilter >
-void fpaPlugins::BaseImageFilter::
-_ExecuteFilter( _TFilter* filter )
-{
- // Go!!!
- this->_ConfigureDebugger( filter );
- filter->Update( );
- this->_DeconfigureDebugger( filter );
-
- // Connect output
- this->GetOutput( "Output" )->SetITK( filter->GetOutput( ) );
-}
-
-// -------------------------------------------------------------------------
-template< class _TFilter >
-void fpaPlugins::BaseImageFilter::
-_ConfigureDebugger( _TFilter* filter )
-{
- typedef typename _TFilter::TInputImage _TImage;
- typedef fpa::VTK::Image::Observer2D< _TFilter, vtkRenderWindow > _2D;
- typedef fpa::VTK::Image::Observer3D< _TFilter, vtkRenderWindow > _3D;
-
- this->m_Observers.clear( );
- if( this->m_Parameters.GetBool( "VisualDebug" ) )
- {
- if( this->m_MPRViewer != NULL )
- {
- if( _TImage::ImageDimension == 2 )
- {
- auto iren = this->m_MPRViewer->GetInteractor( 2 );
- if( iren != NULL )
- {
- typename _2D::Pointer debugger = _2D::New( );
- debugger->SetRenderWindow( iren->GetRenderWindow( ) );
- debugger->SetRenderPercentage( 0.01 );
- this->m_Observers.insert(
- filter->AddObserver( itk::AnyEvent( ), debugger )
- );
- filter->ThrowEventsOn( );
-
- } // fi
- }
- else if( _TImage::ImageDimension == 3 )
- {
- auto iren = this->m_MPRViewer->GetInteractor( 3 );
- if( iren != NULL )
- {
- typename _3D::Pointer debugger = _3D::New( );
- debugger->SetRenderWindow( iren->GetRenderWindow( ) );
- debugger->SetRenderPercentage( 0.001 );
- this->m_Observers.insert(
- filter->AddObserver( itk::AnyEvent( ), debugger )
- );
- filter->ThrowEventsOn( );
-
- } // fi
-
- } // fi
-
- } // fi
-
- if( this->m_SingleInteractor != NULL )
- {
- if( _TImage::ImageDimension == 2 )
- {
- }
- else if( _TImage::ImageDimension == 3 )
- {
- } // fi
-
- } // fi
-
- } // fi
-}
-
-// -------------------------------------------------------------------------
-template< class F >
-void fpaPlugins::BaseImageFilter::
-_DeconfigureDebugger( F* filter )
-{
- if( filter != NULL )
- {
- auto oIt = this->m_Observers.begin( );
- for( ; oIt != this->m_Observers.end( ); ++oIt )
- filter->RemoveObserver( *oIt );
-
- } // fi
- this->m_Observers.clear( );
-}
-
-#endif // __FPAPLUGINS__BASEIMAGEFILTER__HXX__
-
-// eof - $RCSfile$
+++ /dev/null
-SET(lib_NAME fpaPlugins)
-SET(
- lib_HEADERS
- ${CMAKE_CURRENT_SOURCE_DIR}/GradientBaseImageFunctionSource.h
- ${CMAKE_CURRENT_SOURCE_DIR}/ImageRegionGrow.h
- ${CMAKE_CURRENT_SOURCE_DIR}/ImageDijkstra.h
- ${CMAKE_CURRENT_SOURCE_DIR}/MinimumSpanningTreeReader.h
- ${CMAKE_CURRENT_SOURCE_DIR}/MinimumSpanningTreeWriter.h
- ${CMAKE_CURRENT_SOURCE_DIR}/RegionGrowThresholdFunction.h
- ${CMAKE_CURRENT_SOURCE_DIR}/InvertCostFunction.h
- ${CMAKE_CURRENT_SOURCE_DIR}/ExtractPathFromMinimumSpanningTree.h
- ${CMAKE_CURRENT_SOURCE_DIR}/ExtractEndPointsAndBifurcationsFromMinimumSpanningTree.h
- )
-SET(
- lib_SOURCES
- ${CMAKE_CURRENT_SOURCE_DIR}/GradientBaseImageFunctionSource.cxx
- ${CMAKE_CURRENT_SOURCE_DIR}/ImageRegionGrow.cxx
- ${CMAKE_CURRENT_SOURCE_DIR}/ImageDijkstra.cxx
- ${CMAKE_CURRENT_SOURCE_DIR}/MinimumSpanningTreeReader.cxx
- ${CMAKE_CURRENT_SOURCE_DIR}/MinimumSpanningTreeWriter.cxx
- ${CMAKE_CURRENT_SOURCE_DIR}/RegionGrowThresholdFunction.cxx
- ${CMAKE_CURRENT_SOURCE_DIR}/InvertCostFunction.cxx
- ${CMAKE_CURRENT_SOURCE_DIR}/ExtractPathFromMinimumSpanningTree.cxx
- ${CMAKE_CURRENT_SOURCE_DIR}/ExtractEndPointsAndBifurcationsFromMinimumSpanningTree.cxx
- )
-SET(
- lib_OTHER_SOURCES
- ${CMAKE_CURRENT_SOURCE_DIR}/BaseImageFilter.h
- ${CMAKE_CURRENT_SOURCE_DIR}/BaseImageFilter.hxx
- ${CMAKE_CURRENT_SOURCE_DIR}/BaseImageFilter.cxx
- ${CMAKE_CURRENT_SOURCE_DIR}/MinimumSpanningTree.h
- ${CMAKE_CURRENT_SOURCE_DIR}/MinimumSpanningTree.cxx
- ${CMAKE_CURRENT_SOURCE_DIR}/ImageSkeleton.h
- ${CMAKE_CURRENT_SOURCE_DIR}/ImageSkeleton.cxx
- )
-SET(lib_QT4_HEADERS "")
-
-cpPlugins_WrapPlugins(
- ${lib_NAME} ${prj_VER} ${prj_sVER}
- "${lib_HEADERS}"
- "${lib_SOURCES}"
- "${lib_OTHER_SOURCES}"
- "${lib_QT4_HEADERS}"
- ${cpExtensions_LIBRARY}
- ${fpa_LIBRARIES}
- )
-
-## ========================
-## -- Installation rules --
-## ========================
-
-#INSTALL(
-# TARGETS ${lib_NAME}
-# RUNTIME DESTINATION bin
-# LIBRARY DESTINATION lib
-# ARCHIVE DESTINATION lib/static
-# )
-
-## eof - $RCSfile$
+++ /dev/null
-#include "ExtractEndPointsAndBifurcationsFromMinimumSpanningTree.h"
-
-#include <fpa_Instances/Backtracking.h>
-#include <cpPlugins/Image.h>
-#include <cpPlugins/ImageIndexesContainer.h>
-#include <plugins/fpa/ImageSkeleton.h>
-
-// -------------------------------------------------------------------------
-fpaPlugins::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree::
-ExtractEndPointsAndBifurcationsFromMinimumSpanningTree( )
- : Superclass( )
-{
- this->_AddInput( "CostsImage" );
- this->_AddInput( "DistanceMap" );
- this->_AddInput( "MST" );
- this->_AddOutput< cpPlugins::ImageIndexesContainer >( "EndPoints" );
- this->_AddOutput< cpPlugins::ImageIndexesContainer >( "Bifurcations" );
- this->_AddOutput< cpPlugins::ImageIndexesContainer >( "Collisions" );
- this->_AddOutput< fpaPlugins::ImageSkeleton >( "Skeleton" );
-
- this->m_Parameters.ConfigureAsBool( "SquaredDistanceMap" );
- this->m_Parameters.SetBool( "SquaredDistanceMap", false );
-}
-
-// -------------------------------------------------------------------------
-fpaPlugins::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree::
-~ExtractEndPointsAndBifurcationsFromMinimumSpanningTree( )
-{
-}
-
-// -------------------------------------------------------------------------
-void fpaPlugins::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree::
-_GenerateData( )
-{
- auto image = this->GetInputData< itk::DataObject >( "CostsImage" );
- cpPlugins_Image_Demangle_Pixel_AllFloats ( _GD0, image, 2 );
- else cpPlugins_Image_Demangle_Pixel_AllFloats( _GD0, image, 3 );
- else this->_Error( "Invalid input costs." );
-}
-
-// -------------------------------------------------------------------------
-template< class _TImage >
-void fpaPlugins::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree::
-_GD0( _TImage* image )
-{
- typedef fpa::Image::MinimumSpanningTree< _TImage::ImageDimension > _TMST;
- typedef fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST > _TFilter;
-
- // Check input objects' integrity
- auto dmap = this->GetInputData< _TImage >( "DistanceMap" );
- if( dmap == NULL )
- this->_Error( "Distance map does not have the same type as the costs image." );
- auto mst = this->GetInputData< _TMST >( "MST" );
- if( mst == NULL )
- this->_Error( "No valid input tree." );
-
- // Create filter and connect inputs
- _TFilter* filter = this->_CreateITK< _TFilter >( );
- filter->SetCostsImage( image );
- filter->SetDistanceMap( dmap );
- filter->SetMinimumSpanningTree( mst );
- filter->SetSquaredDistanceMap(
- this->m_Parameters.GetBool( "SquaredDistanceMap" )
- );
- filter->Update( );
-
- this->GetOutput( "EndPoints" )->SetITK( filter->GetEndPoints( ) );
- this->GetOutput( "Bifurcations" )->SetITK( filter->GetBifurcations( ) );
- this->GetOutput( "Collisions" )->SetITK( filter->GetCollisions( ) );
- this->GetOutput( "Skeleton" )->SetITK( filter->GetSkeleton( ) );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPAPLUGINS__EXTRACTENDPOINTSANDBIFURCATIONSFROMMINIMUMSPANNINGTREE__H__
-#define __FPAPLUGINS__EXTRACTENDPOINTSANDBIFURCATIONSFROMMINIMUMSPANNINGTREE__H__
-
-#include <fpa/fpaPlugins_Export.h>
-#include <cpPlugins/ProcessObject.h>
-
-namespace fpaPlugins
-{
- /**
- */
- class fpaPlugins_EXPORT ExtractEndPointsAndBifurcationsFromMinimumSpanningTree
- : public cpPlugins::ProcessObject
- {
- public:
- typedef ExtractEndPointsAndBifurcationsFromMinimumSpanningTree Self;
- typedef cpPlugins::ProcessObject Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro(
- ExtractEndPointsAndBifurcationsFromMinimumSpanningTree,
- cpPlugins::ProcessObject
- );
- cpPlugins_Id_Macro(
- ExtractEndPointsAndBifurcationsFromMinimumSpanningTree,
- fpaImageAlgorithm
- );
-
- protected:
- ExtractEndPointsAndBifurcationsFromMinimumSpanningTree( );
- virtual ~ExtractEndPointsAndBifurcationsFromMinimumSpanningTree( );
-
- virtual void _GenerateData( ) ITK_OVERRIDE;
-
- template< class _TImage >
- inline void _GD0( _TImage* image );
-
- private:
- // Purposely not implemented.
- ExtractEndPointsAndBifurcationsFromMinimumSpanningTree( const Self& other );
- Self& operator=( const Self& other );
- };
-
-} // ecapseman
-
-#endif // __FPAPLUGINS__EXTRACTENDPOINTSANDBIFURCATIONSFROMMINIMUMSPANNINGTREE__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#include "ExtractPathFromMinimumSpanningTree.h"
-#include <cpPlugins/Path.h>
-#include <cpExtensions/DataStructures/ImageIndexesContainer.h>
-#include <fpa_Instances/Backtracking.h>
-
-// -------------------------------------------------------------------------
-fpaPlugins::ExtractPathFromMinimumSpanningTree::
-ExtractPathFromMinimumSpanningTree( )
- : Superclass( )
-{
- this->_AddInput( "MST" );
- this->_AddInput( "Seeds" );
- this->_AddOutput< cpPlugins::Path >( "Output" );
-
- this->m_Parameters.ConfigureAsUint( "Vertex0" );
- this->m_Parameters.ConfigureAsUint( "Vertex1" );
- this->m_Parameters.SetUint( "Vertex0", 0 );
- this->m_Parameters.SetUint( "Vertex1", 1 );
-}
-
-// -------------------------------------------------------------------------
-fpaPlugins::ExtractPathFromMinimumSpanningTree::
-~ExtractPathFromMinimumSpanningTree( )
-{
-}
-
-// -------------------------------------------------------------------------
-void fpaPlugins::ExtractPathFromMinimumSpanningTree::
-_GenerateData( )
-{
- typedef fpa::Image::MinimumSpanningTree< 2 > _2DMST;
- typedef fpa::Image::MinimumSpanningTree< 3 > _3DMST;
-
- auto mst = this->GetInputData< itk::DataObject >( "MST" );
- auto mst2 = dynamic_cast< _2DMST* >( mst );
- auto mst3 = dynamic_cast< _3DMST* >( mst );
- if ( mst2 != NULL ) this->_GD0( mst2 );
- else if( mst3 != NULL ) this->_GD0( mst3 );
- else this->_Error( "Invalid input MST." );
-}
-
-// -------------------------------------------------------------------------
-template< class _TMST >
-void fpaPlugins::ExtractPathFromMinimumSpanningTree::
-_GD0( _TMST* mst )
-{
- typedef fpa::Base::ExtractPathFromMinimumSpanningTree< _TMST > _TFilter;
- auto vertices = this->GetInputData< vtkPoints >( "Seeds" );
- if( vertices == NULL )
- this->_Error( "No valid vertices." );
- if( vertices->GetNumberOfPoints( ) < 2 )
- this->_Error( "Not enough vertices." );
-
- double b0[ 3 ], b1[ 3 ];
- vertices->GetPoint( this->m_Parameters.GetUint( "Vertex0" ), b0 );
- vertices->GetPoint( this->m_Parameters.GetUint( "Vertex1" ), b1 );
-
- typename _TMST::PointType p0, p1;
- unsigned int dim = ( _TMST::ImageDimension < 3 )? _TMST::ImageDimension: 3;
- for( unsigned int d = 0; d < dim; ++d )
- {
- p0[ d ] = b0[ d ];
- p1[ d ] = b1[ d ];
-
- } // rof
- typename _TMST::TVertex v0, v1;
- mst->TransformPhysicalPointToIndex( p0, v0 );
- mst->TransformPhysicalPointToIndex( p1, v1 );
-
- // Create filter and connect input
- _TFilter* filter = this->_CreateITK< _TFilter >( );
- filter->SetInput( mst );
- filter->SetVertex0( v0 );
- filter->SetVertex1( v1 );
- filter->Update( );
-
- // Connect output and finish
- this->GetOutput( "Output" )->SetITK( filter->GetOutput( ) );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPAPLUGINS__EXTRACTPATHFROMMINIMUMSPANNINGTREE__H__
-#define __FPAPLUGINS__EXTRACTPATHFROMMINIMUMSPANNINGTREE__H__
-
-#include <fpa/fpaPlugins_Export.h>
-#include <cpPlugins/ProcessObject.h>
-
-namespace fpaPlugins
-{
- /**
- */
- class fpaPlugins_EXPORT ExtractPathFromMinimumSpanningTree
- : public cpPlugins::ProcessObject
- {
- public:
- typedef ExtractPathFromMinimumSpanningTree Self;
- typedef cpPlugins::ProcessObject Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro(
- ExtractPathFromMinimumSpanningTree, cpPlugins::ProcessObject
- );
- cpPlugins_Id_Macro(
- ExtractPathFromMinimumSpanningTree, fpaBaseAlgorithm
- );
-
- protected:
- ExtractPathFromMinimumSpanningTree( );
- virtual ~ExtractPathFromMinimumSpanningTree( );
-
- virtual void _GenerateData( ) ITK_OVERRIDE;
-
- template< class _TMST >
- inline void _GD0( _TMST* mst );
-
- private:
- // Purposely not implemented.
- ExtractPathFromMinimumSpanningTree( const Self& other );
- Self& operator=( const Self& other );
- };
-
-} // ecapseman
-
-#endif // __FPAPLUGINS__EXTRACTPATHFROMMINIMUMSPANNINGTREE__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#include "GradientBaseImageFunctionSource.h"
-
-#include <cpPlugins/Image.h>
-#include <fpa_Instances/Functors.h>
-
-// -------------------------------------------------------------------------
-fpaPlugins::GradientBaseImageFunctionSource::
-GradientBaseImageFunctionSource( )
- : Superclass( )
-{
- this->_AddInput( "Input" );
- this->_AddOutput< cpPlugins::Image >( "Output" );
-
- std::vector< std::string > choices;
- choices.push_back( "Gulsun&Tek" );
- choices.push_back( "Flux" );
- choices.push_back( "MFlux" );
- this->m_Parameters.ConfigureAsChoices( "FunctionType", choices );
- this->m_Parameters.SetSelectedChoice( "FunctionType", "Gulsun&Tek" );
-
- this->m_Parameters.ConfigureAsReal( "MinRadius" );
- this->m_Parameters.ConfigureAsReal( "MaxRadius" );
- this->m_Parameters.ConfigureAsUint( "ProfileSampling" );
- this->m_Parameters.ConfigureAsUint( "RadialSampling" );
- this->m_Parameters.SetReal( "MinRadius", 0 );
- this->m_Parameters.SetReal( "MaxRadius", 1 );
- this->m_Parameters.SetUint( "ProfileSampling", 4 );
- this->m_Parameters.SetUint( "RadialSampling", 10 );
-}
-
-// -------------------------------------------------------------------------
-fpaPlugins::GradientBaseImageFunctionSource::
-~GradientBaseImageFunctionSource( )
-{
-}
-
-// -------------------------------------------------------------------------
-void fpaPlugins::GradientBaseImageFunctionSource::
-_GenerateData( )
-{
- auto image = this->GetInputData< itk::DataObject >( "Input" );
- cpPlugins_Image_Demangle_VectorPixel_AllFloats ( _GD0, image, CovariantVector, 2 );
- else cpPlugins_Image_Demangle_VectorPixel_AllFloats( _GD0, image, CovariantVector, 3 );
- else this->_Error( "Invalid input image." );
-}
-
-// -------------------------------------------------------------------------
-template< class _TImage >
-void fpaPlugins::GradientBaseImageFunctionSource::
-_GD0( _TImage* image )
-{
- typedef fpa::Image::Functors::GulsunTekMedialness< _TImage > _TGT;
- typedef fpa::Image::Functors::FluxMedialness< _TImage > _TFl;
- typedef fpa::Image::Functors::MFluxMedialness< _TImage > _TMFl;
-
- auto ft = this->m_Parameters.GetSelectedChoice( "FunctionType" );
- if ( ft == "Gulsun&Tek" ) this->_GD1< _TImage, _TGT >( image );
- else if( ft == "Flux" ) this->_GD1< _TImage, _TFl >( image );
- else if( ft == "MFlux" ) this->_GD1< _TImage, _TMFl >( image );
- else this->_Error( "Invalid function type." );
-}
-
-// -------------------------------------------------------------------------
-template< class _TImage, class _TFunction >
-void fpaPlugins::GradientBaseImageFunctionSource::
-_GD1( _TImage* image )
-{
- typedef itk::Image< typename _TFunction::TOutput, _TImage::ImageDimension > _TOutImage;
- typedef cpExtensions::Algorithms::ImageFunctionFilter< _TImage, _TOutImage, _TFunction > _TFilter;
-
- _TFilter* filter = this->_CreateITK< _TFilter >( );
- filter->SetInput( image );
- _TFunction* function = filter->GetFunction( );
- if( function == NULL )
- {
- filter->SetFunction( _TFunction::New( ) );
- function = filter->GetFunction( );
-
- } // fi
- function->SetMinRadius( this->m_Parameters.GetReal( "MinRadius" ) );
- function->SetMaxRadius( this->m_Parameters.GetReal( "MaxRadius" ) );
- /*
- function->SetProfileSampling( this->m_Parameters.GetUint( "ProfileSampling" ) );
- function->SetRadialSampling( this->m_Parameters.GetUint( "RadialSampling" ) );
- */
-
- filter->Update( );
-
- // Connect output and finish
- this->GetOutput( "Output" )->SetITK( filter->GetOutput( ) );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPAPLUGINS__GRADIENTBASEIMAGEFUNCTIONSOURCE__H__
-#define __FPAPLUGINS__GRADIENTBASEIMAGEFUNCTIONSOURCE__H__
-
-#include <fpa/fpaPlugins_Export.h>
-#include <cpPlugins/ProcessObject.h>
-
-namespace fpaPlugins
-{
- /**
- */
- class fpaPlugins_EXPORT GradientBaseImageFunctionSource
- : public cpPlugins::ProcessObject
- {
- public:
- typedef GradientBaseImageFunctionSource Self;
- typedef cpPlugins::ProcessObject Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro(
- GradientBaseImageFunctionSource, cpPlugins::ProcessObject
- );
- cpPlugins_Id_Macro(
- GradientBaseImageFunctionSource, fpaImageAlgorithmFunctors
- );
-
- protected:
- GradientBaseImageFunctionSource( );
- virtual ~GradientBaseImageFunctionSource( );
-
- virtual void _GenerateData( ) ITK_OVERRIDE;
-
- template< class _TImage >
- inline void _GD0( _TImage* image );
-
- template< class _TImage, class _TFunction >
- inline void _GD1( _TImage* image );
-
- private:
- // Purposely not implemented.
- GradientBaseImageFunctionSource( const Self& other );
- Self& operator=( const Self& other );
- };
-
-} // ecapseman
-
-#endif // __FPAPLUGINS__GRADIENTBASEIMAGEFUNCTIONSOURCE__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#include "ImageDijkstra.h"
-#include "MinimumSpanningTree.h"
-
-#include <cpPlugins/Image.h>
-#include <fpa_Instances/Filters.h>
-
-// -------------------------------------------------------------------------
-fpaPlugins::ImageDijkstra::
-ImageDijkstra( )
- : Superclass( )
-{
- this->_AddInput( "CostFunctor", false );
- this->_AddOutput< fpaPlugins::MinimumSpanningTree >( "MST" );
- this->m_Parameters.ConfigureAsBool( "FillNodeQueue" );
- this->m_Parameters.SetBool( "FillNodeQueue", false );
-}
-
-// -------------------------------------------------------------------------
-fpaPlugins::ImageDijkstra::
-~ImageDijkstra( )
-{
-}
-
-// -------------------------------------------------------------------------
-void fpaPlugins::ImageDijkstra::
-_GenerateData( )
-{
- auto image = this->GetInputData< itk::DataObject >( "Input" );
- cpPlugins_Image_Demangle_Pixel_AllScalars ( _GD0, image, 2 );
- else cpPlugins_Image_Demangle_Pixel_AllScalars( _GD0, image, 3 );
- else this->_Error( "No valid input image." );
-}
-
-// -------------------------------------------------------------------------
-template< class _TImage >
-void fpaPlugins::ImageDijkstra::
-_GD0( _TImage* image )
-{
- typedef float _TPixel;
- typedef itk::Image< _TPixel, _TImage::ImageDimension > _TOutImage;
- typedef fpa::Image::Dijkstra< _TImage, _TOutImage > _TFilter;
- typedef typename _TFilter::TResult _TCost;
- typedef itk::FunctionBase< _TCost, _TCost > _TCostFunctor;
- typedef typename _TFilter::TMinimumSpanningTree _TMST;
-
- auto base_functor =
- this->GetInputData< itk::LightObject >( "CostFunctor" );
- _TCostFunctor* functor = NULL;
- if( base_functor != NULL )
- {
- functor = dynamic_cast< _TCostFunctor* >( base_functor );
- if( functor == NULL )
- this->_Error( "Given cost functor is invalid." );
-
- } // fi
-
- // Create filter
- _TFilter* filter = this->_ConfigureFilter< _TFilter >( );
- filter->SetFillNodeQueue( this->m_Parameters.GetBool( "FillNodeQueue" ) );
- filter->SetConversionFunction( functor );
-
- // Go!!!
- this->_ExecuteFilter( filter );
-
- // Connect remaining output
- this->GetOutput( "MST" )->SetITK( filter->GetMinimumSpanningTree( ) );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPAPLUGINS__IMAGEDIJKSTRA__H__
-#define __FPAPLUGINS__IMAGEDIJKSTRA__H__
-
-#include "BaseImageFilter.h"
-
-namespace fpaPlugins
-{
- /**
- */
- class fpaPlugins_EXPORT ImageDijkstra
- : public BaseImageFilter
- {
- public:
- typedef ImageDijkstra Self;
- typedef BaseImageFilter Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( ImageDijkstra, BaseImageFilter );
- cpPlugins_Id_Macro( ImageDijkstra, fpaImageAlgorithm );
-
- protected:
- ImageDijkstra( );
- virtual ~ImageDijkstra( );
-
- virtual void _GenerateData( ) ITK_OVERRIDE;
-
- template< class _TImage >
- inline void _GD0( _TImage* image );
-
- private:
- // Purposely not implemented.
- ImageDijkstra( const Self& other );
- Self& operator=( const Self& other );
- };
-
-} // ecapseman
-
-#endif // __FPAPLUGINS__IMAGEDIJKSTRA__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#include "ImageRegionGrow.h"
-
-#include <cpPlugins/Image.h>
-#include <fpa_Instances/Filters.h>
-
-// -------------------------------------------------------------------------
-fpaPlugins::ImageRegionGrow::
-ImageRegionGrow( )
- : Superclass( )
-{
- this->_AddInput( "GrowFunctor", false );
- this->m_Parameters.ConfigureAsUint( "InsideValue" );
- this->m_Parameters.ConfigureAsUint( "OutsideValue" );
- this->m_Parameters.SetUint( "InsideValue", 1 );
- this->m_Parameters.SetUint( "OutsideValue", 0 );
-}
-
-// -------------------------------------------------------------------------
-fpaPlugins::ImageRegionGrow::
-~ImageRegionGrow( )
-{
-}
-
-// -------------------------------------------------------------------------
-void fpaPlugins::ImageRegionGrow::
-_GenerateData( )
-{
- auto image = this->GetInputData< itk::DataObject >( "Input" );
- cpPlugins_Image_Demangle_Pixel_AllScalars ( _GD0, image, 2 );
- else cpPlugins_Image_Demangle_Pixel_AllScalars( _GD0, image, 3 );
- else this->_Error( "No valid input image." );
-}
-
-// -------------------------------------------------------------------------
-template< class _TImage >
-void fpaPlugins::ImageRegionGrow::
-_GD0( _TImage* image )
-{
- typedef unsigned short _TPixel;
- typedef itk::Image< _TPixel, _TImage::ImageDimension > _TOutImage;
- typedef fpa::Image::RegionGrow< _TImage, _TOutImage > _TFilter;
- typedef typename _TFilter::TGrowingFunction _TGrowFunctor;
- typedef typename _TFilter::TResult _TResult;
-
- // Create filter
- _TFilter* filter = this->_ConfigureFilter< _TFilter >( );
-
- typename _TGrowFunctor::Pointer functor;
- auto wrap_functor = this->GetInput( "GrowFunctor" );
- if( wrap_functor != NULL )
- functor = wrap_functor->GetITK< _TGrowFunctor >( );
- if( functor.IsNull( ) )
- filter->SetGrowingFunction( functor );
- filter->SetInsideValue(
- _TResult( this->m_Parameters.GetUint( "InsideValue" ) )
- );
- filter->SetOutsideValue(
- _TResult( this->m_Parameters.GetUint( "OutsideValue" ) )
- );
-
- // Go!!!
- this->_ExecuteFilter( filter );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPAPLUGINS__IMAGEREGIONGROW__H__
-#define __FPAPLUGINS__IMAGEREGIONGROW__H__
-
-#include "BaseImageFilter.h"
-
-namespace fpaPlugins
-{
- /**
- */
- class fpaPlugins_EXPORT ImageRegionGrow
- : public BaseImageFilter
- {
- public:
- typedef ImageRegionGrow Self;
- typedef BaseImageFilter Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( ImageRegionGrow, BaseImageFilter );
- cpPlugins_Id_Macro( ImageRegionGrow, fpaImageAlgorithm );
-
- protected:
- ImageRegionGrow( );
- virtual ~ImageRegionGrow( );
-
- virtual void _GenerateData( ) ITK_OVERRIDE;
-
- template< class _TImage >
- inline void _GD0( _TImage* image );
-
- private:
- // Purposely not implemented.
- ImageRegionGrow( const Self& other );
- Self& operator=( const Self& other );
- };
-
-} // ecapseman
-
-#endif // __FPAPLUGINS__IMAGEREGIONGROW__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#include <plugins/fpa/ImageSkeleton.h>
-#include <fpa_Instances/Instances.h>
-#include <fpa/VTK/Image/ImageSkeletonToPolyData.h>
-
-// -------------------------------------------------------------------------
-void fpaPlugins::ImageSkeleton::
-SetITK( itk::LightObject* o )
-{
- typedef
- fpa::Base::ImageSkeleton< fpa::Image::MinimumSpanningTree< 2 > > _I2;
- typedef
- fpa::Base::ImageSkeleton< fpa::Image::MinimumSpanningTree< 3 > > _I3;
-
- bool r = this->_SetITK< _I2 >( o );
- if( !r ) r = this->_SetITK< _I3 >( o );
- if( !r )
- this->Superclass::SetITK( NULL );
-}
-
-// -------------------------------------------------------------------------
-void fpaPlugins::ImageSkeleton::
-SetVTK( vtkObjectBase* o )
-{
- // Do nothing: this only has sense in ITK
-}
-
-// -------------------------------------------------------------------------
-fpaPlugins::ImageSkeleton::
-ImageSkeleton( )
- : Superclass( )
-{
-}
-
-// -------------------------------------------------------------------------
-fpaPlugins::ImageSkeleton::
-~ImageSkeleton( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class _TMST >
-bool fpaPlugins::ImageSkeleton::
-_SetITK( itk::LightObject* o )
-{
- typedef fpa::VTK::Image::ImageSkeletonToPolyData< _TMST > _TFilter;
-
- _TMST* mst = dynamic_cast< _TMST* >( o );
- if( mst != NULL )
- {
- _TFilter* f = dynamic_cast< _TFilter* >( this->m_ITKvVTK.GetPointer( ) );
- if( f == NULL )
- {
- vtkSmartPointer< _TFilter > nf = _TFilter::New( );
- this->m_ITKvVTK = nf.GetPointer( );
- f = nf.GetPointer( );
-
- } // fi
- f->SetInput( mst );
- f->Update( );
-
- // Keep object track
- this->m_ITKObject = o;
- this->m_VTKObject = f->GetOutput( );
- return( true );
- }
- else
- {
- this->Superclass::SetITK( NULL );
- this->Superclass::SetVTK( NULL );
- return( false );
-
- } // fi
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPAPLUGINS__IMAGESKELETON__H__
-#define __FPAPLUGINS__IMAGESKELETON__H__
-
-#include <fpa/fpaPlugins_Export.h>
-#include <cpPlugins/DataObject.h>
-#include <vtkPolyDataAlgorithm.h>
-#include <vtkSmartPointer.h>
-
-// -------------------------------------------------------------------------
-namespace fpaPlugins
-{
- /**
- */
- class fpaPlugins_EXPORT ImageSkeleton
- : public cpPlugins::DataObject
- {
- public:
- typedef ImageSkeleton Self;
- typedef cpPlugins::DataObject Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( ImageSkeleton, cpPlugins::DataObject );
- cpPlugins_Id_Macro( ImageSkeleton, ImageSkeleton );
-
- public:
- virtual void SetITK( itk::LightObject* o ) override;
- virtual void SetVTK( vtkObjectBase* o ) override;
-
- protected:
- ImageSkeleton( );
- virtual ~ImageSkeleton( );
-
- template< class _TMST >
- inline bool _SetITK( itk::LightObject* o );
-
- private:
- // Purposely not implemented
- ImageSkeleton( const Self& );
- Self& operator=( const Self& );
-
- protected:
- vtkSmartPointer< vtkPolyDataAlgorithm > m_ITKvVTK;
- };
-
-} // ecapseman
-
-#endif // __FPAPLUGINS__IMAGESKELETON__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#include "InvertCostFunction.h"
-
-#include <cpPlugins/Image.h>
-#include <fpa/Base/Functors/InvertCostFunction.h>
-
-// -------------------------------------------------------------------------
-fpaPlugins::InvertCostFunction::
-InvertCostFunction( )
- : Superclass( )
-{
- this->_AddOutput< cpPlugins::DataObject >( "Output" );
-
- this->m_Parameters.ConfigureAsReal( "Alpha" );
- this->m_Parameters.ConfigureAsReal( "Beta" );
-
- std::vector< std::string > choices;
- choices.push_back( "float" );
- choices.push_back( "double" );
- this->m_Parameters.ConfigureAsChoices( "ScalarType", choices );
-
- this->m_Parameters.SetReal( "Alpha", 1 );
- this->m_Parameters.SetReal( "Beta", 1 );
- this->m_Parameters.SetSelectedChoice( "ScalarType", "float" );
-}
-
-// -------------------------------------------------------------------------
-fpaPlugins::InvertCostFunction::
-~InvertCostFunction( )
-{
-}
-
-// -------------------------------------------------------------------------
-void fpaPlugins::InvertCostFunction::
-_GenerateData( )
-{
- auto choice = this->m_Parameters.GetSelectedChoice( "ScalarType" );
- if ( choice == "float" ) this->_GD0< float >( );
- else if( choice == "double" ) this->_GD0< double >( );
- else this->_Error( "Invalid scalar type." );
-}
-
-// -------------------------------------------------------------------------
-template< class _TScalar >
-void fpaPlugins::InvertCostFunction::
-_GD0( )
-{
- typedef fpa::Base::Functors::InvertCostFunction< _TScalar > _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->SetAlpha( this->m_Parameters.GetReal( "Alpha" ) );
- f->SetBeta( this->m_Parameters.GetReal( "Beta" ) );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPAPLUGINS__INVERTCOSTFUNCTION__H__
-#define __FPAPLUGINS__INVERTCOSTFUNCTION__H__
-
-#include <fpa/fpaPlugins_Export.h>
-#include <cpPlugins/ProcessObject.h>
-
-namespace fpaPlugins
-{
- /**
- */
- class fpaPlugins_EXPORT InvertCostFunction
- : public cpPlugins::ProcessObject
- {
- public:
- typedef InvertCostFunction Self;
- typedef cpPlugins::ProcessObject Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( InvertCostFunction, cpPlugins::ProcessObject );
- cpPlugins_Id_Macro( InvertCostFunction, fpaImageAlgorithmFunctors );
-
- protected:
- InvertCostFunction( );
- virtual ~InvertCostFunction( );
-
- virtual void _GenerateData( ) ITK_OVERRIDE;
-
- template< class _TScalar >
- inline void _GD0( );
-
- private:
- // Purposely not implemented.
- InvertCostFunction( const Self& other );
- Self& operator=( const Self& other );
- };
-
-} // ecapseman
-
-#endif // __FPAPLUGINS__INVERTCOSTFUNCTION__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#include <plugins/fpa/MinimumSpanningTree.h>
-#include <fpa_Instances/Instances.h>
-
-// -------------------------------------------------------------------------
-void fpaPlugins::MinimumSpanningTree::
-SetITK( itk::LightObject* o )
-{
- typedef fpa::Image::MinimumSpanningTree< 2 > _I2;
- typedef fpa::Image::MinimumSpanningTree< 3 > _I3;
-
- bool r = this->_SetITK< _I2 >( o );
- if( !r ) r = this->_SetITK< _I3 >( o );
- if( !r )
- this->Superclass::SetITK( NULL );
-}
-
-// -------------------------------------------------------------------------
-void fpaPlugins::MinimumSpanningTree::
-SetVTK( vtkObjectBase* o )
-{
- // Do nothing: this only has sense in ITK
-}
-
-// -------------------------------------------------------------------------
-fpaPlugins::MinimumSpanningTree::
-MinimumSpanningTree( )
- : Superclass( )
-{
-}
-
-// -------------------------------------------------------------------------
-fpaPlugins::MinimumSpanningTree::
-~MinimumSpanningTree( )
-{
-}
-
-// -------------------------------------------------------------------------
-template< class _TMST >
-bool fpaPlugins::MinimumSpanningTree::
-_SetITK( itk::LightObject* o )
-{
- _TMST* mst = dynamic_cast< _TMST* >( o );
- if( mst != NULL )
- {
- this->Superclass::SetITK( o );
- return( true );
- }
- else
- {
- this->Superclass::SetITK( NULL );
- this->Superclass::SetVTK( NULL );
- return( false );
-
- } // fi
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPAPLUGINS__MINIMUMSPANNINGTREE__H__
-#define __FPAPLUGINS__MINIMUMSPANNINGTREE__H__
-
-#include <fpa/fpaPlugins_Export.h>
-#include <cpPlugins/DataObject.h>
-
-// -------------------------------------------------------------------------
-namespace fpaPlugins
-{
- /**
- */
- class fpaPlugins_EXPORT MinimumSpanningTree
- : public cpPlugins::DataObject
- {
- public:
- typedef MinimumSpanningTree Self;
- typedef cpPlugins::DataObject Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( MinimumSpanningTree, cpPlugins::DataObject );
- cpPlugins_Id_Macro( MinimumSpanningTree, MinimumSpanningTree );
-
- public:
- virtual void SetITK( itk::LightObject* o ) override;
- virtual void SetVTK( vtkObjectBase* o ) override;
-
- protected:
- MinimumSpanningTree( );
- virtual ~MinimumSpanningTree( );
-
- template< class _TMST >
- inline bool _SetITK( itk::LightObject* o );
-
- private:
- // Purposely not implemented
- MinimumSpanningTree( const Self& );
- Self& operator=( const Self& );
- };
-
-} // ecapseman
-
-#endif // __FPAPLUGINS__MINIMUMSPANNINGTREE__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#include "MinimumSpanningTreeReader.h"
-#include "MinimumSpanningTree.h"
-
-#include <fpa_Instances/Instances.h>
-
-// -------------------------------------------------------------------------
-fpaPlugins::MinimumSpanningTreeReader::
-MinimumSpanningTreeReader( )
- : Superclass( )
-{
- this->_AddOutput< fpaPlugins::MinimumSpanningTree >( "Output" );
- this->m_Parameters.Clear( );
- this->m_Parameters.ConfigureAsOpenFileName( "FileName" );
- this->m_Parameters.SetAcceptedFileExtensions(
- "FileName",
- "Minimum spanning tree files (*.mst)"
- );
-}
-
-// -------------------------------------------------------------------------
-fpaPlugins::MinimumSpanningTreeReader::
-~MinimumSpanningTreeReader( )
-{
-}
-
-// -------------------------------------------------------------------------
-void fpaPlugins::MinimumSpanningTreeReader::
-_GenerateData( )
-{
- // Infere MST dimensions
- auto fname = this->m_Parameters.GetOpenFileName( "FileName" );
- std::ifstream input( fname.c_str( ) );
- if( !input )
- this->_Error(
- std::string( "MinimumSpanningTreeReader: Error opening file \"" ) +
- fname +
- std::string( "\"" )
- );
- unsigned int dim;
- input >> dim;
-
- // Real execution
- if ( dim == 2 ) this->_GD0< 2 >( fname );
- else if( dim == 3 ) this->_GD0< 3 >( fname );
- else this->_Error( "Invalid dimensions." );
-}
-
-// -------------------------------------------------------------------------
-template< unsigned int _NDim >
-void fpaPlugins::MinimumSpanningTreeReader::
-_GD0( const std::string& fname )
-{
- typedef fpa::Image::MinimumSpanningTree< _NDim > _TTree;
- typedef fpa::IO::MinimumSpanningTreeReader< _TTree > _TFilter;
-
- _TFilter* reader = this->_CreateITK< _TFilter >( );
- reader->SetFileName( this->m_Parameters.GetOpenFileName( "FileName" ) );
- try
- {
- reader->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- this->_Error( err.GetDescription( ) );
-
- } // yrt
- this->GetOutput( "Output" )->SetITK( reader->GetOutput( ) );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPAPLUGINS__MINIMUMSPANNINGTREEREADER__H__
-#define __FPAPLUGINS__MINIMUMSPANNINGTREEREADER__H__
-
-#include <fpa/fpaPlugins_Export.h>
-#include <cpPlugins/ProcessObject.h>
-
-namespace fpaPlugins
-{
- /**
- */
- class fpaPlugins_EXPORT MinimumSpanningTreeReader
- : public cpPlugins::ProcessObject
- {
- public:
- typedef MinimumSpanningTreeReader Self;
- typedef cpPlugins::ProcessObject Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( MinimumSpanningTreeReader, cpPlugins::ProcessObject );
- cpPlugins_Id_Macro( MinimumSpanningTreeReader, fpaIO );
-
- protected:
- MinimumSpanningTreeReader( );
- virtual ~MinimumSpanningTreeReader( );
-
- virtual void _GenerateData( ) ITK_OVERRIDE;
-
- template< unsigned int _NDim >
- inline void _GD0( const std::string& fname );
-
- private:
- // Purposely not implemented.
- MinimumSpanningTreeReader( const Self& other );
- Self& operator=( const Self& other );
- };
-
-} // ecapseman
-
-#endif // __FPAPLUGINS__MINIMUMSPANNINGTREEREADER__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#include "MinimumSpanningTreeWriter.h"
-#include "MinimumSpanningTree.h"
-
-#include <fpa_Instances/Instances.h>
-
-// -------------------------------------------------------------------------
-fpaPlugins::MinimumSpanningTreeWriter::
-MinimumSpanningTreeWriter( )
- : Superclass( )
-{
- this->_AddInput( "Input" );
- this->m_Parameters.Clear( );
- this->m_Parameters.ConfigureAsSaveFileName( "FileName" );
- this->m_Parameters.SetAcceptedFileExtensions(
- "FileName",
- "Minimum spanning tree files (*.mst)"
- );
-}
-
-// -------------------------------------------------------------------------
-fpaPlugins::MinimumSpanningTreeWriter::
-~MinimumSpanningTreeWriter( )
-{
-}
-
-// -------------------------------------------------------------------------
-void fpaPlugins::MinimumSpanningTreeWriter::
-_GenerateData( )
-{
- typedef fpa::Image::MinimumSpanningTree< 2 > _2D;
- typedef fpa::Image::MinimumSpanningTree< 3 > _3D;
-
- auto _2d = this->GetInputData< _2D >( "Input" );
- auto _3d = this->GetInputData< _3D >( "Input" );
-
- if ( _2d != NULL ) this->_GD0( _2d );
- else if( _3d != NULL ) this->_GD0( _3d );
- else this->_Error( "Not a valid MST." );
-}
-
-// -------------------------------------------------------------------------
-template< class _TTree >
-void fpaPlugins::MinimumSpanningTreeWriter::
-_GD0( _TTree* tree )
-{
- typedef fpa::IO::MinimumSpanningTreeWriter< _TTree > _TFilter;
-
- _TFilter* writer = this->_CreateITK< _TFilter >( );
- writer->SetInput( tree );
- writer->SetFileName( this->m_Parameters.GetSaveFileName( "FileName" ) );
- try
- {
- writer->Update( );
- }
- catch( itk::ExceptionObject& err )
- {
- this->_Error( err.GetDescription( ) );
-
- } // yrt
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPAPLUGINS__MINIMUMSPANNINGTREEWRITER__H__
-#define __FPAPLUGINS__MINIMUMSPANNINGTREEWRITER__H__
-
-#include <fpa/fpaPlugins_Export.h>
-#include <cpPlugins/ProcessObject.h>
-
-namespace fpaPlugins
-{
- /**
- */
- class fpaPlugins_EXPORT MinimumSpanningTreeWriter
- : public cpPlugins::ProcessObject
- {
- public:
- typedef MinimumSpanningTreeWriter Self;
- typedef cpPlugins::ProcessObject Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( MinimumSpanningTreeWriter, cpPlugins::ProcessObject );
- cpPlugins_Id_Macro( MinimumSpanningTreeWriter, fpaIO );
-
- protected:
- MinimumSpanningTreeWriter( );
- virtual ~MinimumSpanningTreeWriter( );
-
- virtual void _GenerateData( ) ITK_OVERRIDE;
-
- template< class _TTree >
- inline void _GD0( _TTree* tree );
-
- private:
- // Purposely not implemented.
- MinimumSpanningTreeWriter( const Self& other );
- Self& operator=( const Self& other );
- };
-
-} // ecapseman
-
-#endif // __FPAPLUGINS__MINIMUMSPANNINGTREEWRITER__H__
-
-// eof - $RCSfile$
+++ /dev/null
-#include "RegionGrowThresholdFunction.h"
-
-#include <cpPlugins/Image.h>
-#include <fpa/Image/Functors/RegionGrowThresholdFunction.h>
-
-// -------------------------------------------------------------------------
-fpaPlugins::RegionGrowThresholdFunction::
-RegionGrowThresholdFunction( )
- : Superclass( )
-{
- this->_AddInput( "ReferenceImage" );
- this->_AddOutput< cpPlugins::DataObject >( "Output" );
-
- this->m_Parameters.ConfigureAsReal( "LowerThreshold" );
- this->m_Parameters.ConfigureAsReal( "UpperThreshold" );
-
- this->m_Parameters.SetReal( "LowerThreshold", 0 );
- this->m_Parameters.SetReal( "UpperThreshold", 1 );
-}
-
-// -------------------------------------------------------------------------
-fpaPlugins::RegionGrowThresholdFunction::
-~RegionGrowThresholdFunction( )
-{
-}
-
-// -------------------------------------------------------------------------
-void fpaPlugins::RegionGrowThresholdFunction::
-_GenerateData( )
-{
- auto image = this->GetInputData< itk::DataObject >( "ReferenceImage" );
- cpPlugins_Image_Demangle_Pixel_AllScalars ( _GD0, image, 2 );
- else cpPlugins_Image_Demangle_Pixel_AllScalars( _GD0, image, 3 );
- else this->_Error( "No valid input image." );
-}
-
-// -------------------------------------------------------------------------
-template< class _TImage >
-void fpaPlugins::RegionGrowThresholdFunction::
-_GD0( _TImage* image )
-{
- typedef
- fpa::Image::Functors::RegionGrowThresholdFunction< _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
- f->SetLowerThreshold( this->m_Parameters.GetReal( "LowerThreshold" ) );
- f->SetUpperThreshold( this->m_Parameters.GetReal( "UpperThreshold" ) );
-}
-
-// eof - $RCSfile$
+++ /dev/null
-#ifndef __FPAPLUGINS__REGIONGROWTHRESHOLDFUNCTION__H__
-#define __FPAPLUGINS__REGIONGROWTHRESHOLDFUNCTION__H__
-
-#include <fpa/fpaPlugins_Export.h>
-#include <cpPlugins/ProcessObject.h>
-
-namespace fpaPlugins
-{
- /**
- */
- class fpaPlugins_EXPORT RegionGrowThresholdFunction
- : public cpPlugins::ProcessObject
- {
- public:
- typedef RegionGrowThresholdFunction Self;
- typedef cpPlugins::ProcessObject Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
-
- public:
- itkNewMacro( Self );
- itkTypeMacro( RegionGrowThresholdFunction, cpPlugins::ProcessObject );
- cpPlugins_Id_Macro(
- RegionGrowThresholdFunction, fpaImageAlgorithmFunctors
- );
-
- protected:
- RegionGrowThresholdFunction( );
- virtual ~RegionGrowThresholdFunction( );
-
- virtual void _GenerateData( ) ITK_OVERRIDE;
-
- template< class _TImage >
- inline void _GD0( _TImage* image );
-
- private:
- // Purposely not implemented.
- RegionGrowThresholdFunction( const Self& other );
- Self& operator=( const Self& other );
- };
-
-} // ecapseman
-
-#endif // __FPAPLUGINS__REGIONGROWTHRESHOLDFUNCTION__H__
-
-// eof - $RCSfile$