]> Creatis software - clitk.git/blobdiff - segmentation/clitkExtractLungFilter.h
With ITK 5, add itkReadRawBytesAfterSwappingMacro and itkWriteRawBytesAfterSwappingMacro
[clitk.git] / segmentation / clitkExtractLungFilter.h
index 6a316d2c81f9d219f8a30187c10c1da5f108dc6c..6c50b1c2d96c85e3c9b8485d970d9ad6e0a261b3 100644 (file)
@@ -3,7 +3,7 @@
 
   Authors belong to: 
   - University of LYON              http://www.universite-lyon.fr/
-  - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.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
@@ -14,7 +14,7 @@
 
   - BSD        See included LICENSE.txt file
   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
-  ======================================================================-====*/
+  ===========================================================================**/
 
 #ifndef CLITKEXTRACTLUNGSFILTER_H
 #define CLITKEXTRACTLUNGSFILTER_H
@@ -24,6 +24,7 @@
 #include "clitkDecomposeAndReconstructImageFilter.h"
 #include "clitkExplosionControlledThresholdConnectedImageFilter.h"
 #include "clitkSegmentationUtils.h"
+#include "clitkFilterWithAnatomicalFeatureDatabaseManagement.h"
 
 // itk
 #include "itkStatisticsImageFilter.h"
@@ -54,36 +55,18 @@ namespace clitk {
   */
   //--------------------------------------------------------------------
   
-
-  //--------------------------------------------------------------------
-template<class IndexType, class PixelType>
-class Bifurcation
-{
-public:
-  Bifurcation(IndexType _index, PixelType _l, PixelType _l1, PixelType _l2) {
-    index = _index;
-    _l = l;
-    _l1 = l1;
-    _l2 = l2;
-  }
-  IndexType index;
-  PixelType l;
-  PixelType l1;
-  PixelType l2;
-};
-  //--------------------------------------------------------------------
-
-
   //--------------------------------------------------------------------
-  template <class TImageType, class TMaskImageType>
+  template <class TImageType>
   class ITK_EXPORT ExtractLungFilter: 
-    public clitk::FilterBase, 
-    public itk::ImageToImageFilter<TImageType, TMaskImageType> 
+    public virtual clitk::FilterBase, 
+    public clitk::FilterWithAnatomicalFeatureDatabaseManagement,
+    public itk::ImageToImageFilter<TImageType, itk::Image<uchar, TImageType::ImageDimension> > 
   {
     
   public:
     /** Standard class typedefs. */
-    typedef itk::ImageToImageFilter<TImageType, TMaskImageType> Superclass;
+    typedef itk::Image<uchar, TImageType::ImageDimension> MaskImageType;
+    typedef itk::ImageToImageFilter<TImageType, MaskImageType> Superclass;
     typedef ExtractLungFilter              Self;
     typedef itk::SmartPointer<Self>        Pointer;
     typedef itk::SmartPointer<const Self>  ConstPointer;
@@ -103,17 +86,19 @@ public:
     typedef typename ImageType::PixelType    InputImagePixelType; 
     typedef typename ImageType::SizeType     InputImageSizeType; 
     typedef typename ImageType::IndexType    InputImageIndexType; 
+    typedef typename ImageType::PointType    InputImagePointType; 
         
-    typedef TMaskImageType                       MaskImageType;
     typedef typename MaskImageType::ConstPointer MaskImageConstPointer;
     typedef typename MaskImageType::Pointer      MaskImagePointer;
     typedef typename MaskImageType::RegionType   MaskImageRegionType; 
     typedef typename MaskImageType::PixelType    MaskImagePixelType; 
     typedef typename MaskImageType::SizeType     MaskImageSizeType; 
     typedef typename MaskImageType::IndexType    MaskImageIndexType; 
+    typedef typename MaskImageType::PointType    MaskImagePointType; 
 
     itkStaticConstMacro(ImageDimension, unsigned int, ImageType::ImageDimension);
-    typedef int InternalPixelType;
+    //    typedef int InternalPixelType;
+    typedef uchar InternalPixelType;
     typedef itk::Image<InternalPixelType, ImageType::ImageDimension> InternalImageType;
     typedef typename InternalImageType::Pointer                      InternalImagePointer;
     typedef typename InternalImageType::IndexType                    InternalIndexType;
@@ -121,14 +106,15 @@ public:
     
     /** Connect inputs */
     void SetInput(const ImageType * image);
-    void SetInputPatientMask(MaskImageType * mask, MaskImagePixelType BG);
     itkSetMacro(PatientMaskBackgroundValue, MaskImagePixelType);
     itkGetConstMacro(PatientMaskBackgroundValue, MaskImagePixelType);
-    GGO_DefineOption(patientBG, SetPatientMaskBackgroundValue, MaskImagePixelType);
 
-    // Set all options at a time
-    template<class ArgsInfoType>
-      void SetArgsInfo(ArgsInfoType arg);
+    // Output filename  (for AFBD)
+    itkSetMacro(OutputLungFilename, std::string);
+    itkGetMacro(OutputLungFilename, std::string);
+
+    itkSetMacro(OutputTracheaFilename, std::string);
+    itkGetMacro(OutputTracheaFilename, std::string);
 
     // Get output (only availabe after update !)
     typename MaskImageType::Pointer GetTracheaImage() { return trachea; }
@@ -140,85 +126,109 @@ public:
     // For common segmentation processes
     itkSetMacro(MinimalComponentSize, int);
     itkGetConstMacro(MinimalComponentSize, int);
-    GGO_DefineOption(minSize, SetMinimalComponentSize, int);
 
     // Step 1 options RemoveAir
     itkSetMacro(UpperThreshold, InputImagePixelType);
     itkGetConstMacro(UpperThreshold, InputImagePixelType);
-    GGO_DefineOption(upper, SetUpperThreshold, InputImagePixelType);
 
     itkSetMacro(NumberOfSlicesToSkipBeforeSearchingSeed, int);
     itkGetConstMacro(NumberOfSlicesToSkipBeforeSearchingSeed, int);
-    GGO_DefineOption(skipslices, SetNumberOfSlicesToSkipBeforeSearchingSeed, int);
     
     itkSetMacro(LowerThreshold, InputImagePixelType);
     itkGetConstMacro(LowerThreshold, InputImagePixelType);
     itkSetMacro(UseLowerThreshold, bool);
     itkGetConstMacro(UseLowerThreshold, bool);
     itkBooleanMacro(UseLowerThreshold);
-    GGO_DefineOption_WithTest(lower, SetLowerThreshold, InputImagePixelType, UseLowerThreshold);
 
     void SetLabelizeParameters1(LabelParamType * a) { m_LabelizeParameters1 = a; }
     itkGetConstMacro(LabelizeParameters1, LabelParamType*);
-    GGO_DefineOption_LabelParam(1, SetLabelizeParameters1, LabelParamType);
+    
+    itkSetMacro(TracheaSeedAlgorithm, int);
+    itkGetConstMacro(TracheaSeedAlgorithm, int);
 
     // Step 2 options FindTrachea
     itkSetMacro(UpperThresholdForTrachea, InputImagePixelType);
     itkGetConstMacro(UpperThresholdForTrachea, InputImagePixelType);
-    GGO_DefineOption(upperThresholdForTrachea, SetUpperThresholdForTrachea, InputImagePixelType);
 
     itkSetMacro(MultiplierForTrachea, double);
     itkGetConstMacro(MultiplierForTrachea, double);
-    GGO_DefineOption(multiplierForTrachea, SetMultiplierForTrachea, double);
 
     itkSetMacro(ThresholdStepSizeForTrachea, InputImagePixelType);
     itkGetConstMacro(ThresholdStepSizeForTrachea, InputImagePixelType);
-    GGO_DefineOption(thresholdStepSizeForTrachea, SetThresholdStepSizeForTrachea, InputImagePixelType);
 
-    void AddSeed(InternalIndexType s);
+    // options FindTrachea2
+    itkSetMacro(NumSlices, int);
+    itkGetConstMacro(NumSlices, int);
+    itkSetMacro(MaxElongation, double);
+    itkGetConstMacro(MaxElongation, double);
+    itkSetMacro(SeedPreProcessingThreshold, int);
+    itkGetConstMacro(SeedPreProcessingThreshold, int);
+
+    void AddSeedInPixels(InternalIndexType s);
+    void AddSeed(InputImagePointType s);
     std::vector<InternalIndexType> & GetSeeds() { return  m_Seeds; }
-    GGO_DefineOption_Vector(seed, AddSeed, InternalIndexType, ImageType::ImageDimension, true);
+
+    itkSetMacro(TracheaVolumeMustBeCheckedFlag, bool);
+    itkGetConstMacro(TracheaVolumeMustBeCheckedFlag, bool);
+    itkBooleanMacro(TracheaVolumeMustBeCheckedFlag);    
+
+    itkSetMacro(VerboseRegionGrowingFlag, bool);
+    itkGetConstMacro(VerboseRegionGrowingFlag, bool);
+    itkBooleanMacro(VerboseRegionGrowingFlag);    
+
+    itkSetMacro(RemoveSmallLabelBeforeSeparationFlag, bool);
+    itkGetConstMacro(RemoveSmallLabelBeforeSeparationFlag, bool);
+    itkBooleanMacro(RemoveSmallLabelBeforeSeparationFlag);    
 
     // Step 3 options ExtractLung
     itkSetMacro(NumberOfHistogramBins, int);
     itkGetConstMacro(NumberOfHistogramBins, int);
-    GGO_DefineOption(bins, SetNumberOfHistogramBins, int);
 
     void SetLabelizeParameters2(LabelParamType* a) { m_LabelizeParameters2 = a; }
     itkGetConstMacro(LabelizeParameters2, LabelParamType*);
-    GGO_DefineOption_LabelParam(2, SetLabelizeParameters2, LabelParamType);
 
     // Step 4 options RemoveTrachea
     itkSetMacro(RadiusForTrachea, int);
     itkGetConstMacro(RadiusForTrachea, int);
-    GGO_DefineOption(radius, SetRadiusForTrachea, int);
     
     void SetLabelizeParameters3(LabelParamType * a) { m_LabelizeParameters3 = a; }
     itkGetConstMacro(LabelizeParameters3, LabelParamType*);
-    GGO_DefineOption_LabelParam(3, SetLabelizeParameters3, LabelParamType);
 
-    // Step 5 options LungSeparation
-    //     itkSetMacro(FinalOpenClose, bool);
-    //     itkGetConstMacro(FinalOpenClose, bool);
-    //     itkBooleanMacro(FinalOpenClose);
-
-    // Bronchial bifurcations
-    itkSetMacro(FindBronchialBifurcations, bool);
-    itkGetConstMacro(FindBronchialBifurcations, bool);
-    itkBooleanMacro(FindBronchialBifurcations);
+    // Step 5 final openclose
+    itkSetMacro(OpenCloseFlag, bool);
+    itkGetConstMacro(OpenCloseFlag, bool);
+    itkBooleanMacro(OpenCloseFlag);
 
+    itkSetMacro(OpenCloseRadius, int);
+    itkGetConstMacro(OpenCloseRadius, int);
+    
+    // Step 6 fill holes
+    itkSetMacro(FillHolesFlag, bool);
+    itkGetConstMacro(FillHolesFlag, bool);
+    itkBooleanMacro(FillHolesFlag);
+
+    // Separate lungs
+    itkSetMacro(SeparateLungsFlag, bool);
+    itkGetConstMacro(SeparateLungsFlag, bool);
+    itkBooleanMacro(SeparateLungsFlag);
+
+    // Step Auto Crop
+    itkSetMacro(AutoCrop, bool);
+    itkGetConstMacro(AutoCrop, bool);
+    itkBooleanMacro(AutoCrop);
+    
   protected:
     ExtractLungFilter();
     virtual ~ExtractLungFilter() {}
 
     // Main members
     InputImageConstPointer input;
-    MaskImageConstPointer patient;
+    MaskImagePointer patient;
     InputImagePointer working_input;
-    typename InternalImageType::Pointer working_image;  
-    typename InternalImageType::Pointer trachea_tmp;
+    std::string m_OutputLungFilename;
+    std::string m_OutputTracheaFilename;
+    MaskImagePointer working_mask;  
     MaskImagePointer trachea;
-    MaskImagePointer output;
     unsigned int m_MaxSeedNumber;
 
     // Global options
@@ -228,6 +238,8 @@ public:
     MaskImagePixelType m_BackgroundValue;
     MaskImagePixelType m_ForegroundValue;
     int m_MinimalComponentSize;
+    bool m_AutoCrop;
+    bool m_RemoveSmallLabelBeforeSeparationFlag;
 
     // Step 1
     InputImagePixelType m_UpperThreshold;
@@ -236,11 +248,18 @@ public:
     LabelParamType* m_LabelizeParameters1;
 
     // Step 2
+    int m_TracheaSeedAlgorithm;
     InputImagePixelType m_UpperThresholdForTrachea;
     InputImagePixelType m_ThresholdStepSizeForTrachea;
     double m_MultiplierForTrachea;
     std::vector<InternalIndexType> m_Seeds;
+    std::vector<InputImagePointType> m_SeedsInMM;
     int m_NumberOfSlicesToSkipBeforeSearchingSeed;
+    bool m_TracheaVolumeMustBeCheckedFlag;
+    bool m_VerboseRegionGrowingFlag;
+    int m_NumSlices;
+    double m_MaxElongation;
+    int m_SeedPreProcessingThreshold;
 
     // Step 3
     int m_NumberOfHistogramBins;
@@ -251,21 +270,23 @@ public:
     LabelParamType* m_LabelizeParameters3;
 
     // Step 5
-    //     bool m_FinalOpenClose;
-    
-    bool m_FindBronchialBifurcations;
+    bool m_OpenCloseFlag;    
+    int m_OpenCloseRadius;
+
+    // Step 6
+    bool m_FillHolesFlag;    
+    InputImageSizeType m_FillHolesDirections;
+
+    bool m_SeparateLungsFlag;
     
+    // Main functions
     virtual void GenerateOutputInformation();
+    virtual void GenerateInputRequestedRegion();
     virtual void GenerateData();
-
-    typedef Bifurcation<MaskImageIndexType,MaskImagePixelType> BifurcationType;
-    void TrackFromThisIndex(std::vector<BifurcationType> & listOfBifurcations, 
-                            MaskImagePointer skeleton, 
-                            MaskImageIndexType index,
-                            MaskImagePixelType label);
-        
-
+    
+    // Functions for trachea extraction
     bool SearchForTracheaSeed(int skip);
+    bool SearchForTracheaSeed2(int numberOfSlices);
     void SearchForTrachea();
     void TracheaRegionGrowing();
     double ComputeTracheaVolume();