//--------------------------------------------------------------------
/*
Try to extract the LymphStations part of a thorax CT.
- Inputs :
- - Patient label image
- - Lungs label image
- - Bones label image
+ Need a set of Anatomical Features (AFDB)
*/
//--------------------------------------------------------------------
class ITK_EXPORT ExtractLymphStationsFilter:
public virtual clitk::FilterBase,
public clitk::FilterWithAnatomicalFeatureDatabaseManagement,
- public itk::ImageToImageFilter<TImageType, TImageType>
+ public itk::ImageToImageFilter<TImageType, itk::Image<uchar, 3> >
{
public:
/** Standard class typedefs. */
- typedef itk::ImageToImageFilter<TImageType, TImageType> Superclass;
+ typedef itk::ImageToImageFilter<TImageType, itk::Image<uchar, 3> > Superclass;
typedef ExtractLymphStationsFilter Self;
typedef itk::SmartPointer<Self> Pointer;
typedef itk::SmartPointer<const Self> ConstPointer;
itkNewMacro(Self);
/** Run-time type information (and related methods). */
- itkTypeMacro(ExtractLymphStationsFilter, InPlaceImageFilter);
- FILTERBASE_INIT;
+ itkTypeMacro(ExtractLymphStationsFilter, ImageToImageFilter);
/** Some convenient typedefs. */
typedef TImageType ImageType;
typedef typename ImageType::IndexType ImageIndexType;
typedef typename ImageType::PointType ImagePointType;
- /** Connect inputs */
- void SetInputMediastinumLabelImage(const TImageType * image, ImagePixelType bg=0);
- void SetInputTracheaLabelImage(const TImageType * image, ImagePixelType bg=0);
-
- /** ImageDimension constants */
- itkStaticConstMacro(ImageDimension, unsigned int, TImageType::ImageDimension);
+ typedef uchar MaskImagePixelType;
+ typedef itk::Image<MaskImagePixelType, 3> 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<MaskImagePixelType, 2> MaskSliceType;
+ typedef typename MaskSliceType::Pointer MaskSlicePointer;
- // Set all options at a time
- template<class ArgsInfoType>
- void SetArgsInfo(ArgsInfoType arg);
+ /** ImageDimension constants */
+ itkStaticConstMacro(ImageDimension, unsigned int, ImageType::ImageDimension);
+ FILTERBASE_INIT;
- // Background / Foreground
- itkSetMacro(BackgroundValueMediastinum, ImagePixelType);
- itkGetConstMacro(BackgroundValueMediastinum, ImagePixelType);
- //GGO_DefineOption(MediastinumBG, SetBackgroundValueMediastinum, ImagePixelType);
+ itkGetConstMacro(BackgroundValue, MaskImagePixelType);
+ itkGetConstMacro(ForegroundValue, MaskImagePixelType);
+ itkSetMacro(BackgroundValue, MaskImagePixelType);
+ itkSetMacro(ForegroundValue, MaskImagePixelType);
+
+ // Station 8
+ itkSetMacro(DistanceMaxToAnteriorPartOfTheSpine, double);
+ itkGetConstMacro(DistanceMaxToAnteriorPartOfTheSpine, double);
+ itkSetMacro(EsophagusDiltationForAnt, MaskImagePointType);
+ itkGetConstMacro(EsophagusDiltationForAnt, MaskImagePointType);
+ itkSetMacro(EsophagusDiltationForRight, MaskImagePointType);
+ itkGetConstMacro(EsophagusDiltationForRight, MaskImagePointType);
+ itkSetMacro(FuzzyThresholdForS8, double);
+ itkGetConstMacro(FuzzyThresholdForS8, double);
+
+ itkSetMacro(InjectedThresholdForS8, double);
+ itkGetConstMacro(InjectedThresholdForS8, double);
+
+ // Station 7
+ itkSetMacro(FuzzyThreshold, double);
+ itkGetConstMacro(FuzzyThreshold, double);
+ itkSetMacro(Station7Filename, std::string);
+ itkGetConstMacro(Station7Filename, std::string);
- itkSetMacro(BackgroundValueTrachea, ImagePixelType);
- itkGetConstMacro(BackgroundValueTrachea, ImagePixelType);
- //GGO_DefineOption(TracheaBG, SetBackgroundValueTrachea, ImagePixelType);
-
- itkGetConstMacro(BackgroundValue, ImagePixelType);
- itkGetConstMacro(ForegroundValue, ImagePixelType);
+ bool GetComputeStation(std::string s);
+ void AddComputeStation(std::string station) ;
- //itkSetMacro(CarinaZPositionInMM, double);
- void SetCarinaZPositionInMM(double d) { m_CarinaZPositionInMM = d; Modified(); m_CarinaZPositionInMMIsSet = true; }
- itkGetConstMacro(CarinaZPositionInMM, double);
- GGO_DefineOption(carenaZposition, SetCarinaZPositionInMM, double);
-
- itkSetMacro(MiddleLobeBronchusZPositionInMM, double);
- itkGetConstMacro(MiddleLobeBronchusZPositionInMM, double);
- GGO_DefineOption(middleLobeBronchusZposition, SetMiddleLobeBronchusZPositionInMM, double);
-
- itkSetMacro(IntermediateSpacing, double);
- itkGetConstMacro(IntermediateSpacing, double);
- GGO_DefineOption(spacing, SetIntermediateSpacing, double);
-
- itkSetMacro(FuzzyThreshold1, double);
- itkGetConstMacro(FuzzyThreshold1, double);
- GGO_DefineOption(fuzzy1, SetFuzzyThreshold1, double);
-
protected:
ExtractLymphStationsFilter();
virtual ~ExtractLymphStationsFilter() {}
virtual void GenerateOutputInformation();
virtual void GenerateInputRequestedRegion();
virtual void GenerateData();
-
- itkSetMacro(BackgroundValue, ImagePixelType);
- itkSetMacro(ForegroundValue, ImagePixelType);
- ImageConstPointer m_mediastinum;
- ImageConstPointer m_trachea;
- ImagePointer m_working_image;
- ImagePointer m_working_trachea;
- ImagePointer m_output;
-
- ImagePixelType m_BackgroundValueMediastinum;
- ImagePixelType m_BackgroundValueTrachea;
- ImagePixelType m_BackgroundValue;
- ImagePixelType m_ForegroundValue;
-
- double m_CarinaZPositionInMM;
- bool m_CarinaZPositionInMMIsSet;
- double m_MiddleLobeBronchusZPositionInMM;
- double m_IntermediateSpacing;
- double m_FuzzyThreshold1;
+ ImageConstPointer m_Input;
+ MaskImagePointer m_Mediastinum;
+ MaskImagePointer m_Working_Support;
+ std::map<std::string, MaskImagePointer> m_ListOfStations;
+ MaskImagePixelType m_BackgroundValue;
+ MaskImagePixelType m_ForegroundValue;
+ std::map<std::string, bool> m_ComputeStationMap;
+
+ bool CheckForStation(std::string station);
+
+ // Station 8
+ double m_DistanceMaxToAnteriorPartOfTheSpine;
+ double m_DiaphragmInferiorLimit;
+ double m_CarinaZ;
+ double m_OriginOfRightMiddleLobeBronchusZ;
+ double m_FuzzyThresholdForS8;
+ double m_InjectedThresholdForS8;
+ MaskImagePointer m_Esophagus;
+ MaskImagePointType m_EsophagusDiltationForAnt;
+ MaskImagePointType m_EsophagusDiltationForRight;
+ MaskImagePointer EnlargeEsophagusDilatationRadiusInferiorly(MaskImagePointer & eso);
+ void ExtractStation_8();
+ void ExtractStation_8_SetDefaultValues();
+ void ExtractStation_8_SI_Limits();
+ void ExtractStation_8_Post_Limits();
+ void ExtractStation_8_Ant_Sup_Limits();
+ void ExtractStation_8_Ant_Inf_Limits();
+ void ExtractStation_8_Ant_Injected_Limits();
+ void ExtractStation_8_LR_1_Limits();
+ void ExtractStation_8_LR_2_Limits();
+ void ExtractStation_8_Single_CCL_Limits();
+ void ExtractStation_8_LR_Limits();
+ void ExtractStation_8_Remove_Structures();
+ void ExtractStation_8_LR_Limits_old();
+ void ExtractStation_8_LR_Limits_old2();
+ // Station 3P
+ void ExtractStation_3P();
+ void ExtractStation_3P_SetDefaultValues();
+ void ExtractStation_3P_SI_Limits();
+ void ExtractStation_3P_Remove_Structures();
+ void ExtractStation_3P_Ant_Limits();
+ void ExtractStation_3P_Post_Limits();
+ void ExtractStation_3P_LR_sup_Limits();
+ void ExtractStation_3P_LR_inf_Limits();
+
+ // Station 7
+ void ExtractStation_7();
+ void ExtractStation_7_SI_Limits();
+ void ExtractStation_7_RL_Limits();
+ void ExtractStation_7_Posterior_Limits();
+ std::string m_Station7Filename;
+ MaskImagePointer m_working_trachea;
+ double m_FuzzyThreshold;
+ MaskImagePointer m_LeftBronchus;
+ MaskImagePointer m_RightBronchus;
+ MaskImagePointer m_Station7;
+ typedef std::vector<MaskImageType::PointType> ListOfPointsType;
+ ListOfPointsType m_RightMostInLeftBronchus;
+ ListOfPointsType m_AntMostInLeftBronchus;
+ ListOfPointsType m_PostMostInLeftBronchus;
+ ListOfPointsType m_LeftMostInRightBronchus;
+ ListOfPointsType m_AntMostInRightBronchus;
+ ListOfPointsType m_PostMostInRightBronchus;
+
+ void FindExtremaPointsInBronchus(MaskImagePointer input,
+ int direction,
+ double distance_max_from_center_point,
+ ListOfPointsType & LR,
+ ListOfPointsType & Ant,
+ ListOfPointsType & Post);
+ // Station 4RL
+ void ExtractStation_4RL();
+ void ExtractStation_4RL_SI_Limits();
+ void ExtractStation_4RL_LR_Limits();
+ void ExtractStation_4RL_AP_Limits();
+ MaskImagePointer m_RightSupport;
+ MaskImagePointer m_LeftSupport;
+
private:
ExtractLymphStationsFilter(const Self&); //purposely not implemented
void operator=(const Self&); //purposely not implemented
#ifndef ITK_MANUAL_INSTANTIATION
#include "clitkExtractLymphStationsFilter.txx"
+#include "clitkExtractLymphStation_8.txx"
+#include "clitkExtractLymphStation_3P.txx"
+#include "clitkExtractLymphStation_7.txx"
+#include "clitkExtractLymphStation_4RL.txx"
#endif
#endif