From 22f9a65075ca86a805d06f3a1a65151150d570d3 Mon Sep 17 00:00:00 2001 From: dsarrut Date: Mon, 2 May 2011 11:16:06 +0200 Subject: [PATCH] Extract vessels v0.1 --- .../clitkExtractMediastinalVessels.cxx | 45 ++ .../clitkExtractMediastinalVessels.ggo | 21 + .../clitkExtractMediastinalVesselsFilter.h | 139 ++++++ .../clitkExtractMediastinalVesselsFilter.txx | 402 ++++++++++++++++++ ...tkExtractMediastinalVesselsGenericFilter.h | 80 ++++ ...ExtractMediastinalVesselsGenericFilter.txx | 109 +++++ 6 files changed, 796 insertions(+) create mode 100644 segmentation/clitkExtractMediastinalVessels.cxx create mode 100644 segmentation/clitkExtractMediastinalVessels.ggo create mode 100644 segmentation/clitkExtractMediastinalVesselsFilter.h create mode 100644 segmentation/clitkExtractMediastinalVesselsFilter.txx create mode 100644 segmentation/clitkExtractMediastinalVesselsGenericFilter.h create mode 100644 segmentation/clitkExtractMediastinalVesselsGenericFilter.txx diff --git a/segmentation/clitkExtractMediastinalVessels.cxx b/segmentation/clitkExtractMediastinalVessels.cxx new file mode 100644 index 0000000..4171f05 --- /dev/null +++ b/segmentation/clitkExtractMediastinalVessels.cxx @@ -0,0 +1,45 @@ +/*========================================================================= + 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://oncora1.lyon.fnclcc.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 "clitkExtractMediastinalVessels_ggo.h" +#include "clitkExtractMediastinalVesselsGenericFilter.h" + +//-------------------------------------------------------------------- +int main(int argc, char * argv[]) +{ + + // Init command line + GGO(clitkExtractMediastinalVessels, args_info); + CLITK_INIT; + + // Filter + typedef clitk::ExtractMediastinalVesselsGenericFilter 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/clitkExtractMediastinalVessels.ggo b/segmentation/clitkExtractMediastinalVessels.ggo new file mode 100644 index 0000000..718c24e --- /dev/null +++ b/segmentation/clitkExtractMediastinalVessels.ggo @@ -0,0 +1,21 @@ +#File clitkExtractMediastinalVessels.ggo +package "clitkExtractMediastinalVessels" +version "1.0" +purpose "Extract MediastinalVessels" + +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 +option "verboseMemory" - "Display memory usage" flag off + +section "I/O" + +option "afdb" a "Input Anatomical Feature DB" string yes +option "input" i "Input CT filename" string yes +option "output" o "Output folder" string yes + +option "threshold" t "Initial threshold" double default="140" no diff --git a/segmentation/clitkExtractMediastinalVesselsFilter.h b/segmentation/clitkExtractMediastinalVesselsFilter.h new file mode 100644 index 0000000..665f79c --- /dev/null +++ b/segmentation/clitkExtractMediastinalVesselsFilter.h @@ -0,0 +1,139 @@ +/*========================================================================= + 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://oncora1.lyon.fnclcc.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 CLITKEXTRACTLYMPHSTATIONSFILTER_H +#define CLITKEXTRACTLYMPHSTATIONSFILTER_H + +// clitk +#include "clitkFilterBase.h" +#include "clitkFilterWithAnatomicalFeatureDatabaseManagement.h" + +namespace clitk { + + //-------------------------------------------------------------------- + /* + Try to extract the some Mediastinal Vessels in a thorax CT. + Need a set of Anatomical Features (AFDB) + */ + //-------------------------------------------------------------------- + + template + class ITK_EXPORT ExtractMediastinalVesselsFilter: + public virtual clitk::FilterBase, + public clitk::FilterWithAnatomicalFeatureDatabaseManagement, + public itk::ImageToImageFilter > + { + + public: + /** Standard class typedefs. */ + typedef itk::ImageToImageFilter > Superclass; + typedef ExtractMediastinalVesselsFilter 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(ExtractMediastinalVesselsFilter, ImageToImageFilter); + + /** 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 uchar MaskImagePixelType; + typedef itk::Image MaskImageType; + typedef typename MaskImageType::Pointer MaskImagePointer; + typedef typename MaskImageType::RegionType MaskImageRegionType; + typedef typename MaskImageType::SizeType MaskImageSizeType; + typedef typename MaskImageType::IndexType MaskImageIndexType; + typedef typename MaskImageType::PointType MaskImagePointType; + + typedef itk::Image MaskSliceType; + typedef typename MaskSliceType::Pointer MaskSlicePointer; + typedef typename MaskSliceType::PointType MaskSlicePointType; + + typedef long LabelType; + /** ImageDimension constants */ + itkStaticConstMacro(ImageDimension, unsigned int, ImageType::ImageDimension); + FILTERBASE_INIT; + + itkGetConstMacro(BackgroundValue, MaskImagePixelType); + itkSetMacro(BackgroundValue, MaskImagePixelType); + + itkGetConstMacro(ForegroundValue, MaskImagePixelType); + itkSetMacro(ForegroundValue, MaskImagePixelType); + + itkGetConstMacro(TemporaryForegroundValue, MaskImagePixelType); + itkSetMacro(TemporaryForegroundValue, MaskImagePixelType); + + itkGetConstMacro(OutputFolder, std::string); + itkSetMacro(OutputFolder, std::string); + + itkGetConstMacro(Threshold, ImagePixelType); + itkSetMacro(Threshold, ImagePixelType); + + protected: + ExtractMediastinalVesselsFilter(); + virtual ~ExtractMediastinalVesselsFilter() {} + + virtual void GenerateOutputInformation(); + virtual void GenerateInputRequestedRegion(); + virtual void GenerateData(); + + std::string m_OutputFolder; + ImagePointer m_Input; + MaskImagePointer m_Working_Support; + MaskImagePointer m_Mediastinum; + MaskImagePointer m_Mask; + MaskImagePixelType m_BackgroundValue; + MaskImagePixelType m_ForegroundValue; + MaskImagePixelType m_TemporaryForegroundValue; + ImagePixelType m_Threshold; + + std::vector m_slice_recon; + + void CropSupInf(); + //void SearchBrachioCephalicArtery(int & BCA_first_slice, LabelType & BCA_first_label); + void TrackBifurcationFromPoint(MaskImagePointer & recon, + std::vector & slices_recon, + MaskImagePointType BCA_p, + LabelType newLabel, + std::vector & bif); + + private: + ExtractMediastinalVesselsFilter(const Self&); //purposely not implemented + void operator=(const Self&); //purposely not implemented + + }; // end class + //-------------------------------------------------------------------- + +} // end namespace clitk +//-------------------------------------------------------------------- + +#ifndef ITK_MANUAL_INSTANTIATION +#include "clitkExtractMediastinalVesselsFilter.txx" +#endif + +#endif diff --git a/segmentation/clitkExtractMediastinalVesselsFilter.txx b/segmentation/clitkExtractMediastinalVesselsFilter.txx new file mode 100644 index 0000000..02576f4 --- /dev/null +++ b/segmentation/clitkExtractMediastinalVesselsFilter.txx @@ -0,0 +1,402 @@ +/*========================================================================= + 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://oncora1.lyon.fnclcc.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 CLITKEXTRACTLYMPHSTATIONSFILTER_TXX +#define CLITKEXTRACTLYMPHSTATIONSFILTER_TXX + +// clitk +#include "clitkCommon.h" +#include "clitkExtractMediastinalVesselsFilter.h" +#include "clitkAutoCropFilter.h" +#include "clitkSegmentationUtils.h" +#include "clitkMorphoMathFilter.h" + +// itk +#include +#include +#include + +//-------------------------------------------------------------------- +template +clitk::ExtractMediastinalVesselsFilter:: +ExtractMediastinalVesselsFilter(): + clitk::FilterBase(), + clitk::FilterWithAnatomicalFeatureDatabaseManagement(), + itk::ImageToImageFilter() +{ + this->SetNumberOfRequiredInputs(1); + SetBackgroundValue(0); + SetForegroundValue(1); + SetThreshold(140); + SetTemporaryForegroundValue(1); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void +clitk::ExtractMediastinalVesselsFilter:: +GenerateOutputInformation() { + // Get inputs + LoadAFDB(); + m_Input = dynamic_cast(itk::ProcessObject::GetInput(0)); + + // ------------------------------------------------------------------ + // Sup-Inf crop -> Carina + CropSupInf(); + + // ------------------------------------------------------------------ + // Binarize + StartNewStep("Binarize with treshold = "+toString(GetThreshold())); + typedef itk::BinaryThresholdImageFilter BinarizeFilterType; + typename BinarizeFilterType::Pointer binarizeFilter = BinarizeFilterType::New(); + binarizeFilter->SetInput(m_Input); + binarizeFilter->SetLowerThreshold(GetThreshold()); + binarizeFilter->SetInsideValue(GetTemporaryForegroundValue()); + binarizeFilter->SetOutsideValue(GetBackgroundValue()); + binarizeFilter->Update(); + m_Mask = binarizeFilter->GetOutput(); + clitk::writeImage(m_Mask, "m.mhd"); + StopCurrentStep(m_Mask); + + // Keep main CCL ? + m_Mask = clitk::Labelize(m_Mask, GetBackgroundValue(), false, 10); + m_Mask = KeepLabels(m_Mask, GetBackgroundValue(), GetTemporaryForegroundValue(), 1, 1, true); + clitk::writeImage(m_Mask, "m2.mhd"); + + // ------------------------------------------------------------------ + // Extract slices + StartNewStep("Detect vessels (slice by slice reconstruction)"); + std::vector slices_mask; + clitk::ExtractSlices(m_Mask, 2, slices_mask); + + DD(slices_mask.size()); + + std::vector debug_eroded; + std::vector debug_labeled; + std::vector debug_slabeled; + + int radius = 3; + DD(radius); // TO PUT IN OPTION + + // ------------------------------------------------------------------ + // Loop Slice by Slice -> erode find CCL and reconstruct + clitk::MorphoMathFilter::Pointer f= clitk::MorphoMathFilter::New(); + for(uint i=0; iSetInput(slices_mask[i]); + f->SetBackgroundValue(GetBackgroundValue()); + f->SetForegroundValue(GetTemporaryForegroundValue()); + f->SetRadius(radius); + f->SetOperationType(0); // Erode + f->VerboseFlagOff(); + f->Update(); + MaskSlicePointer eroded = f->GetOutput(); + // writeImage(eroded, "er-"+toString(i)+".mhd"); + debug_eroded.push_back(eroded); + + // CCL + int nb; + MaskSlicePointer labeled = + clitk::LabelizeAndCountNumberOfObjects(eroded, GetBackgroundValue(), false, 1, nb); + + // Relabel, large CCL with large label number + for(int n=nb; n>0; n--) { + // DD(n); + int li = n; + int lo = 2*(nb+1)-li; + labeled = clitk::SetBackground(labeled, labeled, li, lo, true); + } + debug_labeled.push_back(labeled); + + // Create kernel for GrayscaleDilateImageFilter + typedef itk::BinaryBallStructuringElement KernelType; + KernelType k; + k.SetRadius(radius+1); + k.CreateStructuringElement(); + + // Keep the MAX -> we prefer the opposite su change the label + typedef itk::GrayscaleDilateImageFilter FilterType; + FilterType::Pointer m = FilterType::New(); + m->SetKernel(k); + m->SetInput(labeled); + // DD(m->GetAlgorithm()); + // m->SetAlgorithm(3); + m->Update(); + MaskSlicePointer s = m->GetOutput(); + + + // Remove Initial BG + s = clitk::SetBackground(s, slices_mask[i], + GetBackgroundValue(), GetBackgroundValue(), true); + + m_slice_recon.push_back(s); + } // end loop + DD("end loop"); + + MaskImageType::Pointer eroded = clitk::JoinSlices(debug_eroded, m_Mask, 2); + clitk::writeImage(eroded, "eroded.mhd"); + + DD("l"); + MaskImageType::Pointer l = clitk::JoinSlices(debug_labeled, m_Mask, 2); + clitk::writeImage(l, "labeled.mhd"); + + DD("r"); + MaskImageType::Pointer r = clitk::JoinSlices(m_slice_recon, m_Mask, 2); + clitk::writeImage(r, "recon.mhd"); + + // ------------------------------------------------------------------ + // Loop Slice by Slice -> BCA not found yet + /* MaskImagePointType BCA_p; + GetAFDB()->GetPoint3D("BrachioCephalicArteryFirstInferiorPoint", BCA_p); + DD(BCA_p); + MaskImagePointType bif1; + MaskImagePointType bif2; + TrackBifurcationFromPoint(r, BCA_p, bif1, bif2); + DD(bif1); + DD(bif2); + */ + // Find max label + typedef itk::MinimumMaximumImageCalculator MinMaxFilterType; + MinMaxFilterType::Pointer ff = MinMaxFilterType::New(); + ff->SetImage(r); + ff->ComputeMaximum(); + LabelType newLabel = ff->GetMaximum()+1; + DD(newLabel); + + // Get all centroids of the first slice + std::vector centroids2D; + clitk::ComputeCentroids(m_slice_recon[0], GetBackgroundValue(), centroids2D); + DD(centroids2D.size()); + std::vector bifurcations; + clitk::PointsUtils::Convert2DListTo3DList(centroids2D, 0, r, bifurcations); + DD(bifurcations.size()); + for(uint i=1; i(m_slice_recon, m_Mask, 2); + clitk::writeImage(rr, "recon"+toString(i)+".mhd"); + } + +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void +clitk::ExtractMediastinalVesselsFilter:: +GenerateInputRequestedRegion() { + //DD("GenerateInputRequestedRegion (nothing?)"); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void +clitk::ExtractMediastinalVesselsFilter:: +GenerateData() { + DD("GenerateData"); + // Final Step -> graft output (if SetNthOutput => redo) + MaskImagePointer BrachioCephalicArtery = + GetAFDB()->template GetImage("BrachioCephalicArtery"); + this->GraftNthOutput(0, BrachioCephalicArtery); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void +clitk::ExtractMediastinalVesselsFilter:: +CropSupInf() { + StartNewStep("Inf/Sup limits (carina) and crop with mediastinum"); + // Get Trachea and Carina + MaskImagePointer Trachea = GetAFDB()->template GetImage ("Trachea"); + + // Get or compute Carina + double m_CarinaZ; + // Get Carina Z position + MaskImagePointer Carina = GetAFDB()->template GetImage("Carina"); + + std::vector centroids; + clitk::ComputeCentroids(Carina, GetBackgroundValue(), centroids); + m_CarinaZ = centroids[1][2]; + // DD(m_CarinaZ); + // add one slice to include carina ? + m_CarinaZ += Carina->GetSpacing()[2]; + // We dont need Carina structure from now + Carina->Delete(); + GetAFDB()->SetDouble("CarinaZ", m_CarinaZ); + + // Crop + m_Input = clitk::CropImageRemoveLowerThan(m_Input, 2, + m_CarinaZ, false, GetBackgroundValue()); + + // Crop not post to centroid + double m_CarinaY = centroids[1][1]; + DD(m_CarinaY); + m_Input = clitk::CropImageRemoveGreaterThan(m_Input, 1, // OLD ABOVE + m_CarinaY, false, GetBackgroundValue()); + // Crop not ant to centroid + m_Input = clitk::CropImageRemoveLowerThan(m_Input, 1, + m_CarinaY-80, false, GetBackgroundValue()); + + // AutoCrop with Mediastinum + m_Mediastinum = GetAFDB()->template GetImage("Mediastinum"); + // Resize like input (sup to carina) + m_Mediastinum = clitk::ResizeImageLike(m_Mediastinum, m_Input, GetBackgroundValue()); + // Auto crop + m_Mediastinum = clitk::AutoCrop(m_Mediastinum, GetBackgroundValue()); + // Resize input + m_Input = clitk::ResizeImageLike(m_Input, m_Mediastinum, GetBackgroundValue()); + + // End + StopCurrentStep(m_Input); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void +clitk::ExtractMediastinalVesselsFilter:: +//SearchBrachioCephalicArtery(int & BCA_first_slice, LabelType & BCA_first_label) { +TrackBifurcationFromPoint(MaskImagePointer & recon, + std::vector & slices_recon, + MaskImagePointType point3D, + LabelType newLabel, + std::vector & bifurcations) { + StartNewStep("Search for BCA first slice and label"); + DD(newLabel); + + // Extract slices + // std::vector slices_recon; + //clitk::ExtractSlices(recon, 2, slices_recon); + + // Find first slice + MaskImageIndexType index; + recon->TransformPhysicalPointToIndex(point3D, index); + DD(point3D); + DD(index); + + uint i=index[2]; + bool found = false; + LabelType previous_largest_label=recon->GetPixel(index); + DD(previous_largest_label); + do { + DD(i); + // Consider current reconstructed slice + MaskSlicePointer s = slices_recon[i]; + MaskSlicePointer previous; + if (i==index[2]) previous = s; + else previous = slices_recon[i-1]; + + // Get centroids of the labels in the current slice + typedef typename MaskSliceType::PointType SlicePointType; + static const unsigned int Dim = MaskSliceType::ImageDimension; + typedef itk::ShapeLabelObject< LabelType, Dim > LabelObjectType; + typedef itk::LabelMap< LabelObjectType > LabelMapType; + typedef itk::LabelImageToLabelMapFilter ImageToMapFilterType; + typename ImageToMapFilterType::Pointer imageToLabelFilter = ImageToMapFilterType::New(); + typedef itk::ShapeLabelMapFilter ShapeFilterType; + typename ShapeFilterType::Pointer statFilter = ShapeFilterType::New(); + imageToLabelFilter->SetBackgroundValue(GetBackgroundValue()); + imageToLabelFilter->SetInput(s); + statFilter->SetInput(imageToLabelFilter->GetOutput()); + statFilter->Update(); + typename LabelMapType::Pointer labelMap = statFilter->GetOutput(); + + // Look what centroid inside the previous largest one + std::vector centroids; + std::vector centroids_label; + for(uint c=0; cGetNumberOfLabelObjects(); c++) { + int label = labelMap->GetLabels()[c]; + DD(label); + SlicePointType center = labelMap->GetLabelObject(label)->GetCentroid(); + SlicePointType center_previous = center; + center_previous[2] -= m_Input->GetSpacing()[2]; + // Get label into previous slice + typename MaskSliceType::IndexType index; + previous->TransformPhysicalPointToIndex(center_previous, index); + LabelType l = previous->GetPixel(index); + DD(l); + if (l == previous_largest_label) { + centroids.push_back(center); + centroids_label.push_back(label); + } + } + DD(centroids.size()); + + // If several centroids, we found a bifurcation + if (centroids.size() > 1) { + found = true; + for(uint c=0; c::Convert2DTo3D(centroids[c], m_Mask, i, bif); + bifurcations.push_back(bif); + s = clitk::SetBackground(s, s, centroids_label[c], newLabel+c+1, true); + // slices_recon[i] = s; // (useful ?) + } + DD("FOUND"); + } + + // if only one centroids, we change the current image with the current label + if (centroids.size() == 1) { + s = clitk::SetBackground(s, s, centroids_label[0], newLabel, true); + previous_largest_label = newLabel; + /*typedef itk::BinaryThresholdImageFilter BinarizeFilterType; + typename BinarizeFilterType::Pointer binarizeFilter = BinarizeFilterType::New(); + binarizeFilter->SetInput(s); + binarizeFilter->SetLowerThreshold(centroids_label[0]); + binarizeFilter->SetUpperThreshold(centroids_label[0]+1); + binarizeFilter->SetInsideValue(previous_largest_label); + binarizeFilter->SetOutsideValue(GetBackgroundValue()); + binarizeFilter->Update(); + s = binarizeFilter->GetOutput();*/ + slices_recon[i] = s; // (not useful ?) + } + + if (centroids.size() == 0) { + DD("no centroid, I stop"); + found = true; + } + + if (i == slices_recon.size()-1) found = true; + + // iterate + ++i; + } while (!found); + + + //MaskImageType::Pointer rr = clitk::JoinSlices(slices_recon, m_Mask, 2); + //clitk::writeImage(rr, "recon2.mhd"); + + // End + StopCurrentStep(); +} +//-------------------------------------------------------------------- + + + +#endif //#define CLITKEXTRACTMEDIASTINALVESSELSFILTER_TXX diff --git a/segmentation/clitkExtractMediastinalVesselsGenericFilter.h b/segmentation/clitkExtractMediastinalVesselsGenericFilter.h new file mode 100644 index 0000000..9e53d7a --- /dev/null +++ b/segmentation/clitkExtractMediastinalVesselsGenericFilter.h @@ -0,0 +1,80 @@ +/*========================================================================= + 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://oncora1.lyon.fnclcc.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 CLITKEXTRACTLYMPHSTATIONSSGENERICFILTER_H +#define CLITKEXTRACTLYMPHSTATIONSSGENERICFILTER_H + +#include "clitkIO.h" +#include "clitkImageToImageGenericFilter.h" +#include "clitkExtractMediastinalVesselsFilter.h" + +//-------------------------------------------------------------------- +namespace clitk +{ + + template + class ITK_EXPORT ExtractMediastinalVesselsGenericFilter: + public ImageToImageGenericFilter > + { + + public: + //-------------------------------------------------------------------- + ExtractMediastinalVesselsGenericFilter(); + + //-------------------------------------------------------------------- + typedef ImageToImageGenericFilter > Superclass; + typedef ExtractMediastinalVesselsGenericFilter Self; + typedef itk::SmartPointer Pointer; + typedef itk::SmartPointer ConstPointer; + + //-------------------------------------------------------------------- + itkNewMacro(Self); + itkTypeMacro(ExtractMediastinalVesselsGenericFilter, LightObject); + + //-------------------------------------------------------------------- + // Options for the GenericFilter + void SetArgsInfo(const ArgsInfoType & a); + + //-------------------------------------------------------------------- + // Options for the Filter + template + void SetOptionsFromArgsInfoToFilter(FilterType * f) ; + + //-------------------------------------------------------------------- + // Main function called each time the filter is updated + template + void UpdateWithInputImageType(); + + protected: + template void InitializeImageType(); + ArgsInfoType mArgsInfo; + + private: + ExtractMediastinalVesselsGenericFilter(const Self&); //purposely not implemented + void operator=(const Self&); //purposely not implemented + + }; // end class + //-------------------------------------------------------------------- + +} // end namespace clitk + +#ifndef ITK_MANUAL_INSTANTIATION +#include "clitkExtractMediastinalVesselsGenericFilter.txx" +#endif + +#endif // #define CLITKEXTRACTLYMPHSTATIONSSGENERICFILTER_H diff --git a/segmentation/clitkExtractMediastinalVesselsGenericFilter.txx b/segmentation/clitkExtractMediastinalVesselsGenericFilter.txx new file mode 100644 index 0000000..b85da27 --- /dev/null +++ b/segmentation/clitkExtractMediastinalVesselsGenericFilter.txx @@ -0,0 +1,109 @@ +/*========================================================================= + 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://oncora1.lyon.fnclcc.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 CLITKEXTRACTLYMPHSTATIONSSGENERICFILTER_TXX +#define CLITKEXTRACTLYMPHSTATIONSSGENERICFILTER_TXX + +#include "clitkImageCommon.h" + +//-------------------------------------------------------------------- +template +clitk::ExtractMediastinalVesselsGenericFilter::ExtractMediastinalVesselsGenericFilter(): + ImageToImageGenericFilter("ExtractMediastinalVessels") +{ + // Default values + cmdline_parser_clitkExtractMediastinalVessels_init(&mArgsInfo); + InitializeImageType<3>(); // Only for 3D images +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +template +void clitk::ExtractMediastinalVesselsGenericFilter::InitializeImageType() +{ + ADD_IMAGE_TYPE(Dim, short); // Can add float later +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void clitk::ExtractMediastinalVesselsGenericFilter::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::ExtractMediastinalVesselsGenericFilter:: +SetOptionsFromArgsInfoToFilter(FilterType * f) +{ + f->SetVerboseOptionFlag(mArgsInfo.verbose_flag); + f->SetVerboseStepFlag(mArgsInfo.verboseStep_flag); + f->SetWriteStepFlag(mArgsInfo.writeStep_flag); + f->SetVerboseMemoryFlag(mArgsInfo.verboseMemory_flag); + f->SetAFDBFilename(mArgsInfo.afdb_arg); + f->SetOutputFolder(mArgsInfo.output_arg); + + f->SetThreshold(mArgsInfo.threshold_arg); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +// Update with the number of dimensions and the pixeltype +//-------------------------------------------------------------------- +template +template +void clitk::ExtractMediastinalVesselsGenericFilter::UpdateWithInputImageType() +{ + // Reading input + typename ImageType::Pointer input = this->template GetInput(0); + + // Create filter + typedef clitk::ExtractMediastinalVesselsFilter FilterType; + typename FilterType::Pointer filter = FilterType::New(); + + // Set global Options + filter->SetInput(input); + SetOptionsFromArgsInfoToFilter(filter); + + // Go ! + filter->Update(); + + // Write/Save results + for(uint i=0; iGetNumberOfOutputs(); i++) { + typedef uchar MaskImagePixelType; + typedef itk::Image OutputImageType; + typename OutputImageType::Pointer output = filter->GetOutput(i); + this->template SetNextOutput(output); + } +} +//-------------------------------------------------------------------- + +#endif //#define CLITKEXTRACTLYMPHSTATIONSSGENERICFILTER_TXX -- 2.47.1