From fd058bfc44273f76b5a09f2ef62cd8297df1925c Mon Sep 17 00:00:00 2001 From: David Sarrut Date: Thu, 2 Feb 2012 15:44:55 +0100 Subject: [PATCH 1/1] Moved from repository clitk to clitk.private/tests_dav --- segmentation/clitkExtractAirwaysTreeInfo.cxx | 44 -- segmentation/clitkExtractAirwaysTreeInfo.ggo | 23 - .../clitkExtractAirwaysTreeInfoFilter.h | 188 ------ .../clitkExtractAirwaysTreeInfoFilter.txx | 590 ------------------ ...clitkExtractAirwaysTreeInfoGenericFilter.h | 72 --- ...itkExtractAirwaysTreeInfoGenericFilter.txx | 109 ---- 6 files changed, 1026 deletions(-) delete mode 100644 segmentation/clitkExtractAirwaysTreeInfo.cxx delete mode 100644 segmentation/clitkExtractAirwaysTreeInfo.ggo delete mode 100644 segmentation/clitkExtractAirwaysTreeInfoFilter.h delete mode 100644 segmentation/clitkExtractAirwaysTreeInfoFilter.txx delete mode 100644 segmentation/clitkExtractAirwaysTreeInfoGenericFilter.h delete mode 100644 segmentation/clitkExtractAirwaysTreeInfoGenericFilter.txx diff --git a/segmentation/clitkExtractAirwaysTreeInfo.cxx b/segmentation/clitkExtractAirwaysTreeInfo.cxx deleted file mode 100644 index f1c3f23..0000000 --- a/segmentation/clitkExtractAirwaysTreeInfo.cxx +++ /dev/null @@ -1,44 +0,0 @@ -/*========================================================================= - Program: vv http://www.creatis.insa-lyon.fr/rio/vv - - Authors belong to: - - University of LYON http://www.universite-lyon.fr/ - - Léon Bérard cancer center http://www.centreleonberard.fr - - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the copyright notices for more information. - - It is distributed under dual licence - - - BSD See included LICENSE.txt file - - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html -===========================================================================**/ - -// clitk -#include "clitkExtractAirwaysTreeInfo_ggo.h" -#include "clitkExtractAirwaysTreeInfoGenericFilter.h" - -//-------------------------------------------------------------------- -int main(int argc, char * argv[]) -{ - // Init command line - GGO(clitkExtractAirwaysTreeInfo, args_info); - CLITK_INIT; - - // Filter - typedef clitk::ExtractAirwaysTreeInfoGenericFilter FilterType; - FilterType::Pointer filter = FilterType::New(); - - filter->SetArgsInfo(args_info); - - try { - filter->Update(); - } catch(std::runtime_error e) { - std::cout << e.what() << std::endl; - } - - return EXIT_SUCCESS; -} // This is the end, my friend -//-------------------------------------------------------------------- diff --git a/segmentation/clitkExtractAirwaysTreeInfo.ggo b/segmentation/clitkExtractAirwaysTreeInfo.ggo deleted file mode 100644 index cb1701c..0000000 --- a/segmentation/clitkExtractAirwaysTreeInfo.ggo +++ /dev/null @@ -1,23 +0,0 @@ -#File clitkExtractAirwaysTreeInfos.ggo -package "clitkExtractAirwaysTreeInfos" -version "1.0" -purpose "From trachea binary image, extract skeleton and carena point." - -option "config" - "Config file" string no -option "imagetypes" - "Display allowed image types" flag off -option "verbose" v "Verbose" flag off -option "verboseStep" - "Verbose each step" flag off -option "writeStep" w "Write image at each step" flag off -option "verboseOption" - "Display options values" flag off -option "verboseWarningOff" - "Do not display warning" flag off - -section "I/O" - -option "input" i "Input trachea mask image filename" string yes -option "afdb" a "Output Anatomical Feature DB (Carina position)" string no -option "output" o "Output skeleton mask image filename" string yes - -section "Main options" - -option "writeSkeleton" - "Write skeleton" flag off -option "skeletonFilename" - "Skeleton filename" string no diff --git a/segmentation/clitkExtractAirwaysTreeInfoFilter.h b/segmentation/clitkExtractAirwaysTreeInfoFilter.h deleted file mode 100644 index f22b724..0000000 --- a/segmentation/clitkExtractAirwaysTreeInfoFilter.h +++ /dev/null @@ -1,188 +0,0 @@ -/*========================================================================= - Program: vv http://www.creatis.insa-lyon.fr/rio/vv - - Authors belong to: - - University of LYON http://www.universite-lyon.fr/ - - Léon Bérard cancer center http://www.centreleonberard.fr - - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the copyright notices for more information. - - It is distributed under dual licence - - - BSD See included LICENSE.txt file - - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html - ===========================================================================**/ - -#ifndef CLITKEXTRACTAIRWAYTREEINFOSFILTER_H -#define CLITKEXTRACTAIRWAYTREEINFOSFILTER_H - -// clitk -#include "clitkFilterBase.h" -#include "clitkDecomposeAndReconstructImageFilter.h" -#include "clitkExplosionControlledThresholdConnectedImageFilter.h" -#include "clitkSegmentationUtils.h" -#include "clitkFilterWithAnatomicalFeatureDatabaseManagement.h" -#include "tree.hh" - -// itk -#include "itkStatisticsImageFilter.h" - -namespace clitk { - - //-------------------------------------------------------------------- - /* - From a trachea binary image, compute the skeleton and track the - path to find the carena. - */ - //-------------------------------------------------------------------- - - - - class Bifurcation - { - public: - typedef itk::Index<3> IndexType; - typedef itk::Point PointType; - typedef double PixelType; - Bifurcation(IndexType _index, PixelType _l, PixelType _l1, PixelType _l2) { - index = _index; - _l = l; - _l1 = l1; - _l2 = l2; - } - - IndexType index; - PointType point; - double weight; - PixelType l; - PixelType l1; - PixelType l2; - typedef itk::Index<3> NodeType; - typedef tree TreeType; - typedef TreeType::iterator TreeIterator; - TreeIterator treeIter; - }; - //-------------------------------------------------------------------- - - - //-------------------------------------------------------------------- - template - class ITK_EXPORT ExtractAirwaysTreeInfoFilter: - public virtual clitk::FilterBase, - public clitk::FilterWithAnatomicalFeatureDatabaseManagement, - public itk::ImageToImageFilter - { - - public: - /** Standard class typedefs. */ - typedef itk::ImageToImageFilter Superclass; - typedef ExtractAirwaysTreeInfoFilter Self; - typedef itk::SmartPointer Pointer; - typedef itk::SmartPointer ConstPointer; - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - /** Run-time type information (and related methods). */ - itkTypeMacro(ExtractAirwaysTreeInfoFilter, ImageToImageFilter); - FILTERBASE_INIT; - - /** Some convenient typedefs */ - typedef TImageType ImageType; - typedef typename ImageType::ConstPointer ImageConstPointer; - typedef typename ImageType::Pointer ImagePointer; - typedef typename ImageType::RegionType ImageRegionType; - typedef typename ImageType::PixelType ImagePixelType; - typedef typename ImageType::SizeType ImageSizeType; - typedef typename ImageType::IndexType ImageIndexType; - typedef typename ImageType::PointType ImagePointType; - - typedef Bifurcation BifurcationType; - typedef ImageIndexType NodeType; - typedef tree TreeType; - typedef typename TreeType::iterator TreeIterator; - - itkStaticConstMacro(ImageDimension, unsigned int, ImageType::ImageDimension); - typedef int InternalPixelType; - typedef itk::Image InternalImageType; - typedef typename InternalImageType::Pointer InternalImagePointer; - typedef typename InternalImageType::IndexType InternalIndexType; - typedef LabelizeParameters LabelParamType; - - // Data Structures for trees - struct FullTreeNodeType { - ImageIndexType index; - ImagePointType point; - double weight; - }; - struct StructuralTreeNodeType { - ImageIndexType index; - ImagePointType point; - double weight; - }; - typedef tree FullTreeType; - typedef tree StructuralTreeType; - FullTreeType mFullSkeletonTree; - StructuralTreeType mStructuralSkeletonTree; - - /** Connect inputs */ - void SetInput(const ImageType * image); - - // Background / Foreground - itkGetConstMacro(BackgroundValue, ImagePixelType); - itkGetConstMacro(ForegroundValue, ImagePixelType); - - // Get results - itkGetConstMacro(FirstTracheaPoint, ImagePointType); - itkGetConstMacro(CarinaPoint, ImagePointType); - - protected: - ExtractAirwaysTreeInfoFilter(); - virtual ~ExtractAirwaysTreeInfoFilter() {} - - // Main members - ImageConstPointer input; - ImagePointer skeleton; - ImagePointer working_input; - - // Global options - itkSetMacro(BackgroundValue, ImagePixelType); - itkSetMacro(ForegroundValue, ImagePixelType); - ImagePixelType m_BackgroundValue; - ImagePixelType m_ForegroundValue; - - // Results - ImagePointType m_FirstTracheaPoint; - ImagePointType m_CarinaPoint; - - virtual void GenerateOutputInformation(); - virtual void GenerateData(); - - TreeType m_SkeletonTree; - void TrackFromThisIndex2(ImageIndexType index, ImagePointer skeleton, - ImagePixelType label, - typename FullTreeType::iterator currentNode, - typename StructuralTreeType::iterator currentSNode); - void TrackFromThisIndex(std::vector & listOfBifurcations, - ImagePointer skeleton, - ImageIndexType index, - ImagePixelType label, - TreeIterator currentNode); - private: - ExtractAirwaysTreeInfoFilter(const Self&); //purposely not implemented - void operator=(const Self&); //purposely not implemented - - }; // end class - //-------------------------------------------------------------------- - -} // end namespace clitk -//-------------------------------------------------------------------- - -#ifndef ITK_MANUAL_INSTANTIATION -#include "clitkExtractAirwaysTreeInfoFilter.txx" -#endif - -#endif diff --git a/segmentation/clitkExtractAirwaysTreeInfoFilter.txx b/segmentation/clitkExtractAirwaysTreeInfoFilter.txx deleted file mode 100644 index 65b6343..0000000 --- a/segmentation/clitkExtractAirwaysTreeInfoFilter.txx +++ /dev/null @@ -1,590 +0,0 @@ -/*========================================================================= - Program: vv http://www.creatis.insa-lyon.fr/rio/vv - - Authors belong to: - - University of LYON http://www.universite-lyon.fr/ - - Léon Bérard cancer center http://www.centreleonberard.fr - - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the copyright notices for more information. - - It is distributed under dual licence - - - BSD See included LICENSE.txt file - - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html - ===========================================================================**/ - -#ifndef CLITKEXTRACTAIRWAYSTREEINFOSFILTER_TXX -#define CLITKEXTRACTAIRWAYSTREEINFOSFILTER_TXX - -// clitk -#include "clitkImageCommon.h" -#include "clitkSetBackgroundImageFilter.h" -#include "clitkSegmentationUtils.h" -#include "clitkAutoCropFilter.h" -#include "clitkExtractSliceFilter.h" - -// itk -#include "itkBinaryThresholdImageFilter.h" -#include "itkConnectedComponentImageFilter.h" -#include "itkRelabelComponentImageFilter.h" -#include "itkOtsuThresholdImageFilter.h" -#include "itkBinaryThinningImageFilter3D.h" -#include "itkImageIteratorWithIndex.h" - - -//-------------------------------------------------------------------- -template -clitk::ExtractAirwaysTreeInfoFilter:: -ExtractAirwaysTreeInfoFilter(): - clitk::FilterBase(), - clitk::FilterWithAnatomicalFeatureDatabaseManagement(), - itk::ImageToImageFilter() -{ - // Default global options - this->SetNumberOfRequiredInputs(1); - SetBackgroundValue(0); - SetForegroundValue(1); -} -//-------------------------------------------------------------------- - - -//-------------------------------------------------------------------- -template -void -clitk::ExtractAirwaysTreeInfoFilter:: -SetInput(const ImageType * image) -{ - this->SetNthInput(0, const_cast(image)); -} -//-------------------------------------------------------------------- - - -//-------------------------------------------------------------------- -template -void -clitk::ExtractAirwaysTreeInfoFilter:: -GenerateOutputInformation() -{ - Superclass::GenerateOutputInformation(); - //this->GetOutput(0)->SetRequestedRegion(this->GetOutput(0)->GetLargestPossibleRegion()); - - // Get input pointer - input = dynamic_cast(itk::ProcessObject::GetInput(0)); - - // Try to load the DB - try { - LoadAFDB(); - } catch (clitk::ExceptionObject e) { - // Do nothing if not found, it will be used anyway to write the result - } - - -} -//-------------------------------------------------------------------- - - -//-------------------------------------------------------------------- -template -void -clitk::ExtractAirwaysTreeInfoFilter:: -GenerateData() -{ - - // Crop just abov lungs ? - - // read skeleton if already exist - bool foundSkeleton = true; - try { - skeleton = GetAFDB()->template GetImage ("skeleton"); - } - catch (clitk::ExceptionObject e) { - DD("did not found skeleton"); - foundSkeleton = false; - } - - // Extract skeleton - if (!foundSkeleton) { - StartNewStep("Thinning filter (skeleton)"); - typedef itk::BinaryThinningImageFilter3D ThinningFilterType; - typename ThinningFilterType::Pointer thinningFilter = ThinningFilterType::New(); - thinningFilter->SetInput(input); // input = trachea - thinningFilter->Update(); - skeleton = thinningFilter->GetOutput(); - StopCurrentStep(skeleton); - writeImage(skeleton, "skeleton.mhd"); - } - - // Find first point for tracking - StartNewStep("Find first point for tracking"); - typedef itk::ImageRegionConstIteratorWithIndex IteratorType; - IteratorType it(skeleton, skeleton->GetLargestPossibleRegion()); - it.GoToReverseBegin(); - while ((!it.IsAtEnd()) && (it.Get() == GetBackgroundValue())) { - --it; - } - if (it.IsAtEnd()) { - clitkExceptionMacro("first point in the trachea skeleton not found."); - } - typename ImageType::IndexType index = it.GetIndex(); - DD(index); - - if (0) { - // Initialize neighborhooditerator - typedef itk::NeighborhoodIterator NeighborhoodIteratorType; - typename NeighborhoodIteratorType::SizeType radius; - radius.Fill(1); - NeighborhoodIteratorType nit(radius, skeleton, skeleton->GetLargestPossibleRegion()); - } - - // Find a label number different from BG and FG - typename ImageType::PixelType label = GetForegroundValue()+1; - while ((label == GetBackgroundValue()) || (label == GetForegroundValue())) { label++; } - DD((int)label); - - /* - Tracking ? - Goal : find position of C, RUL, RML, RLL, LUL, LLL bronchus - Carina : ok "easy", track, slice by slice until 2 path into different label - -> follow at Right - - - -> follow at Left - */ - - // NEW Track from the first point - StartNewStep("Start tracking"); - FullTreeNodeType n; - n.index = index; - skeleton->TransformIndexToPhysicalPoint(n.index, n.point); // à mettre dans TrackFromThisIndex2 - mFullSkeletonTree.set_head(n); - StructuralTreeNodeType sn; - sn.index = index; - skeleton->TransformIndexToPhysicalPoint(sn.index, sn.point); - mStructuralSkeletonTree.set_head(sn); - TrackFromThisIndex2(index, skeleton, label, mFullSkeletonTree.begin(), mStructuralSkeletonTree.begin()); - StopCurrentStep(); - - // Reput FG instead of label in the skeleton image - skeleton = clitk::SetBackground(skeleton, skeleton, label, GetForegroundValue(), true); - - // Debug - typename StructuralTreeType::iterator sit = mStructuralSkeletonTree.begin(); - while (sit != mStructuralSkeletonTree.end()) { - DD(sit->point); - ++sit; - } - - // compute weight : n longueurs à chaque bifurfaction. - // parcours de FullTreeNodeType, à partir de leaf, remonter de proche en proche la distance eucl. - // par post order - - // Init - typename FullTreeType::iterator fit = mFullSkeletonTree.begin(); - while (fit != mFullSkeletonTree.end()) { - fit->weight = 0.0; - ++fit; - } - - DD("compute weight"); - typename FullTreeType::post_order_iterator pit = mFullSkeletonTree.begin_post(); - while (pit != mFullSkeletonTree.end_post()) { - //DD(pit->point); - /* - if (pit != mFullSkeletonTree.begin()) { - typename FullTreeType::iterator parent = mFullSkeletonTree.parent(pit); - double d = pit->point.EuclideanDistanceTo(parent->point); - // DD(parent->weight); - //DD(d); - parent->weight += d; - if (pit.number_of_children() > 1) { - DD(pit.number_of_children()); - DD(pit->point); - DD(pit->weight); - DD(parent->weight); - DD(mFullSkeletonTree.child(pit, 0)->weight); - DD(mFullSkeletonTree.child(pit, 1)->weight); - } - } - */ - double previous = pit->weight; - for(uint i=0; ipoint.EuclideanDistanceTo(mFullSkeletonTree.child(pit, i)->point); - // pit->weight = pit->weight + mFullSkeletonTree.child(pit, i)->weight + d; - if (i==0) - pit->weight = pit->weight + mFullSkeletonTree.child(pit, i)->weight + d; - if (i>0) { - DD(pit.number_of_children()); - DD(pit->point); - DD(pit->weight); - DD(mFullSkeletonTree.child(pit, 0)->weight); - DD(mFullSkeletonTree.child(pit, 1)->weight); - pit->weight = std::max(pit->weight, previous+mFullSkeletonTree.child(pit, i)->weight + d); - } - } - ++pit; - } - - DD("end"); - fit = mFullSkeletonTree.begin(); - while (fit != mFullSkeletonTree.end()) { - std::cout << "p = " << fit->point - << " " << fit->weight - << " child= " << fit.number_of_children() - << " -> "; - for(uint i=0; iweight; - } - std::cout << std::endl; - ++fit; - } - - /* Selection criteria ? - - at least 2 child - - from top to bottom - - equilibr ? - */ - DD("========================================="); - fit = mFullSkeletonTree.begin(); - while (fit != mFullSkeletonTree.end()) { - if (fit.number_of_children() > 1) { - std::cout << "ppp = " << fit->point - << " " << fit->weight << std::endl; - for(uint i=1; iweight; - double w2 = mFullSkeletonTree.child(fit, i)->weight; - // if (w1 <= 0.1) break; - // if (w2 <= 0.1) break; - DD(w1);DD(w2); - if (w1>w2) { - double sw=w1; - w1=w2; w2=sw; - } - DD(w1/w2); - if (w1/w2 > 0.7) { - DD("KEEP IT"); - } - } - } - ++fit; - } - - - if (0) { - // Track from the first point - StartNewStep("Start tracking OLD"); - std::vector listOfBifurcations; - m_SkeletonTree.set_head(index); - TrackFromThisIndex(listOfBifurcations, skeleton, index, label, m_SkeletonTree.begin()); - DD("end track"); - - // Convert index into physical point coordinates - for(unsigned int i=0; iTransformIndexToPhysicalPoint(listOfBifurcations[i].index, - listOfBifurcations[i].point); - } - - // Search for the first slice that separate the bronchus - // (carina). Labelize slice by slice, stop when the two points of - // the skeleton ar not in the same connected component - StartNewStep("Search for carina position"); - typedef clitk::ExtractSliceFilter ExtractSliceFilterType; - typename ExtractSliceFilterType::Pointer extractSliceFilter = ExtractSliceFilterType::New(); - extractSliceFilter->SetInput(input); - extractSliceFilter->SetDirection(2); - extractSliceFilter->Update(); - typedef typename ExtractSliceFilterType::SliceType SliceType; - std::vector mInputSlices; - extractSliceFilter->GetOutputSlices(mInputSlices); - DD(mInputSlices.size()); - - - DD("REDO !!!!!!!!!!!!"); - /** - => chercher la bif qui a les plus important sous-arbres - - iterate sur m_SkeletonTree depth first, remonter au parent, add value = distance - - NONNNNN m_SkeletonTree n'est pas la structure mais l'ensemble avec ts le skeleton - - TreeIterator itt = m_SkeletonTree.begin(); - while (itt != m_SkeletonTree.end()) { - itt->weight = 0.0; - ++itt; - } - - typename tree::post_order_iterator pit = m_SkeletonTree.begin_post(); - while (pit != m_SkeletonTree.end_post()) { - typename tree::iterator parent = m_SkeletonTree.parent(pit); - double d = pit->point.EuclideanDistanceTo(parent); - DD(parent.weight); - DD(d); - parent.weight += d; - ++it; - } - - itt = m_SkeletonTree.begin(); - while (itt != m_SkeletonTree.end()) { - DD(itt->weight); - ++itt; - } - **/ - - - // search for carina - bool stop = false; - int slice_index = listOfBifurcations[0].index[2]; // first slice from carina in skeleton - int i=0; - TreeIterator firstIter = m_SkeletonTree.child(listOfBifurcations[0].treeIter, 0); - TreeIterator secondIter = m_SkeletonTree.child(listOfBifurcations[0].treeIter, 1); - DD(firstIter.number_of_children()); - DD(secondIter.number_of_children()); - typename SliceType::IndexType in1; - typename SliceType::IndexType in2; - while (!stop) { - // Labelize the current slice - typename SliceType::Pointer temp = Labelize(mInputSlices[slice_index], - GetBackgroundValue(), - true, - 0); // min component size=0 - DD(*firstIter); - DD(*secondIter); - // Check the value of the two skeleton points; - in1[0] = (*firstIter)[0]; - in1[1] = (*firstIter)[1]; - typename SliceType::PixelType v1 = temp->GetPixel(in1); - in2[0] = (*secondIter)[0]; - in2[1] = (*secondIter)[1]; - typename SliceType::PixelType v2 = temp->GetPixel(in2); - - // Check the label value of the two points - DD(slice_index); - if (v1 != v2) { - stop = true; // We found it ! - } - else { - // Check error - if (slice_index == (int)(mInputSlices.size()-1)) { - clitkExceptionMacro("Error while searching for carina, the two skeleton points are always in the same CC ... ???"); - } - // Iterate - i++; - --slice_index; - ++firstIter; - ++secondIter; - } - } - ImageIndexType carina_index; // middle position in X/Y - carina_index[0] = lrint(in2[0] + in1[0])/2.0; - carina_index[1] = lrint(in2[1] + in1[1])/2.0; - carina_index[2] = slice_index; - // Get physical coordinates - ImagePointType carina_position; - skeleton->TransformIndexToPhysicalPoint(carina_index, - carina_position); - - // Set and save Carina position - if (GetVerboseStepFlag()) { - std::cout << "\t Found carina at " << carina_position << " mm" << std::endl; - } - GetAFDB()->SetPoint3D("carina", carina_position); - - // Write bifurcation (debug) - for(uint i=0; iSetPoint3D("Bif"+toString(i), listOfBifurcations[i].point); - } - } - - // Set the output (skeleton); - this->GraftOutput(skeleton); // not SetNthOutput -} -//-------------------------------------------------------------------- - - -//-------------------------------------------------------------------- -/** - Start from the pixel "index" in the image "skeleton" and track the - path from neighbor pixels. Put the tracked path in the tree at the - currentNode position. Label is used to mark the FG pixel as already - visited. Progress recursively when several neighbors are found. - **/ -template -void -clitk::ExtractAirwaysTreeInfoFilter:: -TrackFromThisIndex2(ImageIndexType index, ImagePointer skeleton, - ImagePixelType label, - typename FullTreeType::iterator currentNode, - typename StructuralTreeType::iterator currentSNode) -{ - // Create NeighborhoodIterator - typedef itk::NeighborhoodIterator NeighborhoodIteratorType; - typename NeighborhoodIteratorType::SizeType radius; - radius.Fill(1); - NeighborhoodIteratorType nit(radius, skeleton, skeleton->GetLargestPossibleRegion()); - - // Track - std::vector listOfTrackedPoint; - bool stop = false; - while (!stop) { - nit.SetLocation(index); - nit.SetCenterPixel(label); - listOfTrackedPoint.clear(); - for(unsigned int i=0; iTransformIndexToPhysicalPoint(n.index, n.point); - currentNode = mFullSkeletonTree.append_child(currentNode, n); - skeleton->SetPixel(n.index, label); // change label in skeleton image - } - else { - if (listOfTrackedPoint.size() >= 2) { - for(uint i=0; iTransformIndexToPhysicalPoint(n.index, n.point); - typename FullTreeType::iterator node = mFullSkeletonTree.append_child(currentNode, n); - StructuralTreeNodeType sn; - sn.index = listOfTrackedPoint[i]; - skeleton->TransformIndexToPhysicalPoint(sn.index, sn.point); - typename StructuralTreeType::iterator snode = mStructuralSkeletonTree.append_child(currentSNode, sn); - TrackFromThisIndex2(listOfTrackedPoint[i], skeleton, label, node, snode); - } - } - stop = true; // this it the end of the tracking - } // end else - } // end while stop -} -//-------------------------------------------------------------------- - -//-------------------------------------------------------------------- -template -void -clitk::ExtractAirwaysTreeInfoFilter:: -TrackFromThisIndex(std::vector & listOfBifurcations, - ImagePointer skeleton, - ImageIndexType index, - ImagePixelType label, - TreeIterator currentNode) -{ - // Create NeighborhoodIterator - typedef itk::NeighborhoodIterator NeighborhoodIteratorType; - typename NeighborhoodIteratorType::SizeType radius; - radius.Fill(1); - NeighborhoodIteratorType nit(radius, skeleton, skeleton->GetLargestPossibleRegion()); - - // Track - std::vector listOfTrackedPoint; - bool stop = false; - while (!stop) { - nit.SetLocation(index); - nit.SetCenterPixel(label); - listOfTrackedPoint.clear(); - for(unsigned int i=0; iSetPixel(index, label); // change label in skeleton image - } - else { - if (listOfTrackedPoint.size() == 2) { - // m_SkeletonTree->Add(listOfTrackedPoint[0], index); // the parent is 'index' - // m_SkeletonTree->Add(listOfTrackedPoint[1], index); // the parent is 'index' - DD("BifurcationType"); - DD(listOfTrackedPoint[0]); - DD(listOfTrackedPoint[1]); - BifurcationType bif(index, label, label+1, label+2); - bif.treeIter = currentNode; - listOfBifurcations.push_back(bif); - TreeIterator firstNode = m_SkeletonTree.append_child(currentNode, listOfTrackedPoint[0]); - TreeIterator secondNode = m_SkeletonTree.append_child(currentNode, listOfTrackedPoint[1]); - TrackFromThisIndex(listOfBifurcations, skeleton, listOfTrackedPoint[0], label+1, firstNode); - TrackFromThisIndex(listOfBifurcations, skeleton, listOfTrackedPoint[1], label+2, secondNode); - } - else { - //DD(listOfTrackedPoint.size()); - if (listOfTrackedPoint.size() > 2) { - //clitkExceptionMacro("error while tracking trachea bifurcation. Too much bifurcation points ... ?"); - stop = true; // this it the end of the tracking - } - // Else this it the end of the tracking - } - stop = true; - } - } -} -//-------------------------------------------------------------------- - -/*TrackFromThisIndex(std::vector & listOfBifurcations, - ImagePointer skeleton, - ImageIndexType index, - ImagePixelType label) - { - DD("TrackFromThisIndex"); - DD(index); - DD((int)label); - // Create NeighborhoodIterator - typedef itk::NeighborhoodIterator NeighborhoodIteratorType; - typename NeighborhoodIteratorType::SizeType radius; - radius.Fill(1); - NeighborhoodIteratorType nit(radius, skeleton, skeleton->GetLargestPossibleRegion()); - - // Track - std::vector listOfTrackedPoint; - bool stop = false; - while (!stop) { - nit.SetLocation(index); - // DD((int)nit.GetCenterPixel()); - nit.SetCenterPixel(label); - listOfTrackedPoint.clear(); - for(unsigned int i=0; i 2) { - std::cerr << "too much bifurcation points ... ?" << std::endl; - exit(0); - } - // Else this it the end of the tracking - } - stop = true; - } - } - } -*/ -//-------------------------------------------------------------------- - - -#endif //#define CLITKBOOLEANOPERATORLABELIMAGEFILTER_TXX diff --git a/segmentation/clitkExtractAirwaysTreeInfoGenericFilter.h b/segmentation/clitkExtractAirwaysTreeInfoGenericFilter.h deleted file mode 100644 index d41b079..0000000 --- a/segmentation/clitkExtractAirwaysTreeInfoGenericFilter.h +++ /dev/null @@ -1,72 +0,0 @@ -/*========================================================================= - Program: vv http://www.creatis.insa-lyon.fr/rio/vv - - Authors belong to: - - University of LYON http://www.universite-lyon.fr/ - - Léon Bérard cancer center http://www.centreleonberard.fr - - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the copyright notices for more information. - - It is distributed under dual licence - - - BSD See included LICENSE.txt file - - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html -===========================================================================**/ - -#ifndef CLITKEXTRACTAIRWAYTREEINFOSGENERICFILTER_H -#define CLITKEXTRACTAIRWAYTREEINFOSGENERICFILTER_H - -#include "clitkIO.h" -#include "clitkImageToImageGenericFilter.h" -#include "clitkExtractAirwaysTreeInfoFilter.h" - -//-------------------------------------------------------------------- -namespace clitk -{ - - template - class ITK_EXPORT ExtractAirwaysTreeInfoGenericFilter: - public ImageToImageGenericFilter > - { - - public: - //-------------------------------------------------------------------- - ExtractAirwaysTreeInfoGenericFilter(); - - //-------------------------------------------------------------------- - typedef ExtractAirwaysTreeInfoGenericFilter Self; - typedef ImageToImageGenericFilter > Superclass; - typedef itk::SmartPointer Pointer; - typedef itk::SmartPointer ConstPointer; - - //-------------------------------------------------------------------- - itkNewMacro(Self); - itkTypeMacro(ExtractAirwaysTreeInfoGenericFilter, LightObject); - - //-------------------------------------------------------------------- - template - void SetOptionsFromArgsInfoToFilter(FilterType * f); - void SetArgsInfo(const ArgsInfoType & a); - - //-------------------------------------------------------------------- - // Main function called each time the filter is updated - template - void UpdateWithInputImageType(); - - protected: - template void InitializeImageType(); - ArgsInfoType mArgsInfo; - - }; // end class - //-------------------------------------------------------------------- - -} // end namespace clitk - -#ifndef ITK_MANUAL_INSTANTIATION -#include "clitkExtractAirwaysTreeInfoGenericFilter.txx" -#endif - -#endif // #define CLITKEXTRACTAIRWAYTREEINFOSGENERICFILTER_H diff --git a/segmentation/clitkExtractAirwaysTreeInfoGenericFilter.txx b/segmentation/clitkExtractAirwaysTreeInfoGenericFilter.txx deleted file mode 100644 index a19aa8f..0000000 --- a/segmentation/clitkExtractAirwaysTreeInfoGenericFilter.txx +++ /dev/null @@ -1,109 +0,0 @@ -/*========================================================================= - Program: vv http://www.creatis.insa-lyon.fr/rio/vv - - Authors belong to: - - University of LYON http://www.universite-lyon.fr/ - - Léon Bérard cancer center http://www.centreleonberard.fr - - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the copyright notices for more information. - - It is distributed under dual licence - - - BSD See included LICENSE.txt file - - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html - ===========================================================================**/ - -#ifndef CLITKEXTRACTAIRWAYTREEINFOSGENERICFILTER_TXX -#define CLITKEXTRACTAIRWAYTREEINFOSGENERICFILTER_TXX - -#include "clitkImageCommon.h" - -//-------------------------------------------------------------------- -template -clitk::ExtractAirwaysTreeInfoGenericFilter::ExtractAirwaysTreeInfoGenericFilter(): - ImageToImageGenericFilter("ExtractAirwaysTreeInfo") -{ - this->SetFilterBase(NULL); - // Default values - cmdline_parser_clitkExtractAirwaysTreeInfo_init(&mArgsInfo); - InitializeImageType<3>(); -} -//-------------------------------------------------------------------- - - -//-------------------------------------------------------------------- -template -template -void clitk::ExtractAirwaysTreeInfoGenericFilter::InitializeImageType() -{ - ADD_IMAGE_TYPE(Dim, uchar); - // ADD_IMAGE_TYPE(Dim, int); - // ADD_IMAGE_TYPE(Dim, float); -} -//-------------------------------------------------------------------- - - -//-------------------------------------------------------------------- -template -void clitk::ExtractAirwaysTreeInfoGenericFilter::SetArgsInfo(const ArgsInfoType & a) -{ - mArgsInfo=a; - SetIOVerbose(mArgsInfo.verbose_flag); - if (mArgsInfo.imagetypes_flag) this->PrintAvailableImageTypes(); - if (mArgsInfo.input_given) AddInputFilename(mArgsInfo.input_arg); - if (mArgsInfo.output_given) AddOutputFilename(mArgsInfo.output_arg); -} -//-------------------------------------------------------------------- - - -//-------------------------------------------------------------------- -template -template -void clitk::ExtractAirwaysTreeInfoGenericFilter:: -SetOptionsFromArgsInfoToFilter(FilterType * f) -{ - f->SetVerboseOptionFlag(mArgsInfo.verboseOption_flag); - f->SetVerboseStepFlag(mArgsInfo.verboseStep_flag); - f->SetWriteStepFlag(mArgsInfo.writeStep_flag); - f->SetVerboseWarningFlag(!mArgsInfo.verboseWarningOff_flag); - if (mArgsInfo.afdb_given) - f->SetAFDBFilename(mArgsInfo.afdb_arg); -} -//-------------------------------------------------------------------- - - -//-------------------------------------------------------------------- -// Update with the number of dimensions and the pixeltype -//-------------------------------------------------------------------- -template -template -void clitk::ExtractAirwaysTreeInfoGenericFilter::UpdateWithInputImageType() -{ - // Reading input - typename ImageType::Pointer input = this->template GetInput(0); - - // Create filter - typedef clitk::ExtractAirwaysTreeInfoFilter FilterType; - typename FilterType::Pointer filter = FilterType::New(); - - // Set the filter (needed for example for threaded monitoring) - this->SetFilterBase(filter); - - // Set global Options - filter->SetInput(input); - SetOptionsFromArgsInfoToFilter(filter); - - // Go ! - filter->Update(); - - // Write/Save results - typename ImageType::Pointer output = filter->GetOutput(); - this->template SetNextOutput(output); - filter->WriteAFDB(); -} -//-------------------------------------------------------------------- - -#endif //#define CLITKEXTRACTAIRWAYTREEINFOSGENERICFILTER_TXX -- 2.46.1