#include "clitkFilterBase.h"
#include "clitkDecomposeAndReconstructImageFilter.h"
#include "clitkExplosionControlledThresholdConnectedImageFilter.h"
-#include "clitkSegmentationFunctions.h"
+#include "clitkSegmentationUtils.h"
// itk
#include "itkStatisticsImageFilter.h"
*/
//--------------------------------------------------------------------
- template <class TInputImageType, class TMaskImageType>
+ //--------------------------------------------------------------------
+ template <class TImageType, class TMaskImageType>
class ITK_EXPORT ExtractLungFilter:
- public clitk::FilterBase,
- public itk::ImageToImageFilter<TInputImageType, TMaskImageType>
+ public virtual clitk::FilterBase,
+ public itk::ImageToImageFilter<TImageType, TMaskImageType>
{
public:
/** Standard class typedefs. */
- typedef itk::ImageToImageFilter<TInputImageType, TMaskImageType> Superclass;
+ typedef itk::ImageToImageFilter<TImageType, TMaskImageType> Superclass;
typedef ExtractLungFilter Self;
typedef itk::SmartPointer<Self> Pointer;
typedef itk::SmartPointer<const Self> ConstPointer;
FILTERBASE_INIT;
/** Some convenient typedefs */
- typedef TInputImageType InputImageType;
- typedef typename InputImageType::ConstPointer InputImageConstPointer;
- typedef typename InputImageType::Pointer InputImagePointer;
- typedef typename InputImageType::RegionType InputImageRegionType;
- typedef typename InputImageType::PixelType InputImagePixelType;
- typedef typename InputImageType::SizeType InputImageSizeType;
- typedef typename InputImageType::IndexType InputImageIndexType;
+ typedef TImageType ImageType;
+ typedef typename ImageType::ConstPointer InputImageConstPointer;
+ typedef typename ImageType::Pointer InputImagePointer;
+ typedef typename ImageType::RegionType InputImageRegionType;
+ 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::PixelType MaskImagePixelType;
typedef typename MaskImageType::SizeType MaskImageSizeType;
typedef typename MaskImageType::IndexType MaskImageIndexType;
+ typedef typename MaskImageType::PointType MaskImagePointType;
- itkStaticConstMacro(ImageDimension, unsigned int, InputImageType::ImageDimension);
+ itkStaticConstMacro(ImageDimension, unsigned int, ImageType::ImageDimension);
typedef int InternalPixelType;
- typedef itk::Image<InternalPixelType, InputImageType::ImageDimension> InternalImageType;
- typedef typename InternalImageType::Pointer InternalImagePointer;
- typedef typename InternalImageType::IndexType InternalIndexType;
- typedef LabelizeParameters<InternalPixelType> LabelParamType;
+ typedef itk::Image<InternalPixelType, ImageType::ImageDimension> InternalImageType;
+ typedef typename InternalImageType::Pointer InternalImagePointer;
+ typedef typename InternalImageType::IndexType InternalIndexType;
+ typedef LabelizeParameters<InternalPixelType> LabelParamType;
/** Connect inputs */
- void SetInput(const InputImageType * image);
+ void SetInput(const ImageType * image);
void SetInputPatientMask(MaskImageType * mask, MaskImagePixelType BG);
itkSetMacro(PatientMaskBackgroundValue, MaskImagePixelType);
itkGetConstMacro(PatientMaskBackgroundValue, MaskImagePixelType);
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);
void AddSeed(InternalIndexType s);
std::vector<InternalIndexType> & GetSeeds() { return m_Seeds; }
- GGO_DefineOption_Vector(seed, AddSeed, InternalIndexType, InputImageType::ImageDimension, true);
+ GGO_DefineOption_Vector(seed, AddSeed, InternalIndexType, ImageType::ImageDimension, true);
// Step 3 options ExtractLung
itkSetMacro(NumberOfHistogramBins, int);
itkGetConstMacro(LabelizeParameters3, LabelParamType*);
GGO_DefineOption_LabelParam(3, SetLabelizeParameters3, LabelParamType);
- // Step 5 options LungSeparation
- // itkSetMacro(FinalOpenClose, bool);
- // itkGetConstMacro(FinalOpenClose, bool);
- // itkBooleanMacro(FinalOpenClose);
+ // Step 5 final openclose
+ itkSetMacro(FinalOpenClose, bool);
+ itkGetConstMacro(FinalOpenClose, bool);
+ itkBooleanMacro(FinalOpenClose);
+ GGO_DefineOption_Flag(openclose, SetFinalOpenClose);
- // virtual void Update();
+ itkSetMacro(FinalOpenCloseRadius, int);
+ itkGetConstMacro(FinalOpenCloseRadius, int);
+ GGO_DefineOption(opencloseRadius, SetFinalOpenCloseRadius, int);
protected:
ExtractLungFilter();
virtual ~ExtractLungFilter() {}
-
+
+ // Main members
+ InputImageConstPointer input;
+ MaskImageConstPointer patient;
+ InputImagePointer working_input;
+ typename InternalImageType::Pointer working_image;
+ typename InternalImageType::Pointer trachea_tmp;
+ MaskImagePointer trachea;
+ MaskImagePointer output;
+ unsigned int m_MaxSeedNumber;
+
// Global options
itkSetMacro(BackgroundValue, MaskImagePixelType);
itkSetMacro(ForegroundValue, MaskImagePixelType);
InputImagePixelType m_ThresholdStepSizeForTrachea;
double m_MultiplierForTrachea;
std::vector<InternalIndexType> m_Seeds;
+ int m_NumberOfSlicesToSkipBeforeSearchingSeed;
// Step 3
int m_NumberOfHistogramBins;
LabelParamType* m_LabelizeParameters3;
// Step 5
- // bool m_FinalOpenClose;
-
+ bool m_FinalOpenClose;
+ int m_FinalOpenCloseRadius;
+
+ // Main functions
virtual void GenerateOutputInformation();
virtual void GenerateData();
+
+ // Functions for trachea extraction
+ bool SearchForTracheaSeed(int skip);
+ void SearchForTrachea();
+ void TracheaRegionGrowing();
+ double ComputeTracheaVolume();
- // Steps
- void RemoveAir();
- void FindTrachea();
- void ExtractLung();
- void RemoveTrachea();
- void LungSeparation();
- InputImageConstPointer input;
- MaskImageConstPointer patient;
- InputImagePointer working_input;
- typename InternalImageType::Pointer working_image;
- typename InternalImageType::Pointer trachea_tmp;
- MaskImagePointer trachea;
-
private:
ExtractLungFilter(const Self&); //purposely not implemented
void operator=(const Self&); //purposely not implemented