]> Creatis software - clitk.git/blob - itk/clitkAddRelativePositionConstraintToLabelImageFilter.h
correction orientation, add 'keep object' option
[clitk.git] / itk / clitkAddRelativePositionConstraintToLabelImageFilter.h
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to: 
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
9   This software is distributed WITHOUT ANY WARRANTY; without even
10   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11   PURPOSE.  See the copyright notices for more information.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17   ======================================================================-====*/
18
19 #ifndef CLITKADDRELATIVEPOSITIONCONSTRAINTTOLABELIMAGEFILTER_H
20 #define CLITKADDRELATIVEPOSITIONCONSTRAINTTOLABELIMAGEFILTER_H
21
22 // clitk
23 #include "clitkFilterBase.h"
24
25 // itk
26 #include <itkPasteImageFilter.h>
27
28 // itk ENST
29 #include "RelativePositionPropImageFilter.h"
30
31 namespace clitk {
32   
33   //--------------------------------------------------------------------
34   /*
35     Let A be an initial label image.
36     Let B be a label image with an object. 
37     Let o be an orientation relatively to the B object (for example RightTo, AntTo, InferiorTo ...)
38
39     This filter removes (=set background) from A all points that are
40     not in the wanted o orientation. It uses downsampled version for
41     faster processing, and (try to) take into account discretization
42     problem. Uses [Bloch 1999].
43   */
44   //--------------------------------------------------------------------
45   
46   template <class ImageType>
47   class ITK_EXPORT AddRelativePositionConstraintToLabelImageFilter:
48     public clitk::FilterBase, 
49     public itk::ImageToImageFilter<ImageType, ImageType> 
50   {
51
52   public:
53     /** Standard class typedefs. */
54     typedef itk::ImageToImageFilter<ImageType, ImageType>      Superclass;
55     typedef AddRelativePositionConstraintToLabelImageFilter    Self;
56     typedef itk::SmartPointer<Self>                            Pointer;
57     typedef itk::SmartPointer<const Self>                      ConstPointer;
58        
59     /** Method for creation through the object factory. */
60     itkNewMacro(Self);
61     
62     /** Run-time type information (and related methods). */
63     itkTypeMacro(AddRelativePositionConstraintToLabelImageFilter, ImageToImageFilter);
64     FILTERBASE_INIT;
65
66     /** Some convenient typedefs. */
67     typedef typename ImageType::ConstPointer ImageConstPointer;
68     typedef typename ImageType::Pointer      ImagePointer;
69     typedef typename ImageType::RegionType   RegionType; 
70     typedef typename ImageType::PixelType    PixelType;
71     typedef typename ImageType::SpacingType  SpacingType;
72     typedef typename ImageType::SizeType     SizeType;
73     typedef typename ImageType::IndexType    IndexType;
74     typedef typename ImageType::PointType    PointType;
75     
76     /** ImageDimension constants */
77     itkStaticConstMacro(ImageDimension, unsigned int, ImageType::ImageDimension);
78     typedef itk::Image<float, ImageDimension> FloatImageType;
79
80     /** Orientation types */
81     typedef enum { RightTo = 0, LeftTo = 1,
82                    AntTo = 2,   PostTo = 3, 
83                    InfTo = 4,   SupTo = 5, Angle = 6
84     } OrientationTypeEnumeration;
85
86     /** Input : initial image and object */
87     void SetInput(const ImageType * image);
88     void SetInputObject(const ImageType * image);
89     
90     // Options
91     void AddOrientationType(OrientationTypeEnumeration orientation);
92     void AddOrientationTypeString(std::string s);
93     void ClearOrientationType();
94     void AddAngles(double a, double b);
95     int GetNumberOfAngles();
96     std::string GetOrientationTypeString(int i) { return m_OrientationTypeString[i]; }
97     std::vector<std::string> & GetOrientationTypeString() { return m_OrientationTypeString; }
98
99     itkGetConstMacro(ResampleBeforeRelativePositionFilter, bool);
100     itkSetMacro(ResampleBeforeRelativePositionFilter, bool);
101     itkBooleanMacro(ResampleBeforeRelativePositionFilter);
102
103     itkGetConstMacro(IntermediateSpacing, double);
104     itkSetMacro(IntermediateSpacing, double);
105
106     itkGetConstMacro(FuzzyThreshold, double);
107     itkSetMacro(FuzzyThreshold, double);
108
109     itkGetConstMacro(BackgroundValue, PixelType);
110     itkSetMacro(BackgroundValue, PixelType);
111
112     itkGetConstMacro(ObjectBackgroundValue, PixelType);
113     itkSetMacro(ObjectBackgroundValue, PixelType);
114
115     itkGetConstMacro(AutoCropFlag, bool);
116     itkSetMacro(AutoCropFlag, bool);
117     itkBooleanMacro(AutoCropFlag);
118
119     itkGetConstMacro(InverseOrientationFlag, bool);
120     itkSetMacro(InverseOrientationFlag, bool);
121     itkBooleanMacro(InverseOrientationFlag);
122
123     itkGetConstMacro(RemoveObjectFlag, bool);
124     itkSetMacro(RemoveObjectFlag, bool);
125     itkBooleanMacro(RemoveObjectFlag);
126
127     itkGetConstMacro(CombineWithOrFlag, bool);
128     itkSetMacro(CombineWithOrFlag, bool);
129     itkBooleanMacro(CombineWithOrFlag);
130
131   protected:
132     AddRelativePositionConstraintToLabelImageFilter();
133     virtual ~AddRelativePositionConstraintToLabelImageFilter() {}
134     
135     std::vector<OrientationTypeEnumeration> m_OrientationType;
136     std::vector<std::string> m_OrientationTypeString;
137     double m_IntermediateSpacing;
138     double m_FuzzyThreshold;
139     PixelType m_BackgroundValue;
140     PixelType m_ObjectBackgroundValue;
141     std::vector<double> m_Angle1;
142     std::vector<double> m_Angle2;
143     bool m_ResampleBeforeRelativePositionFilter;
144     bool m_AutoCropFlag;
145     bool m_InverseOrientationFlag;
146     bool m_RemoveObjectFlag;
147     bool m_CombineWithOrFlag;
148
149     virtual void GenerateOutputInformation();
150     virtual void GenerateInputRequestedRegion();
151     virtual void GenerateData();
152
153     typedef itk::PasteImageFilter<ImageType,ImageType> PadFilterType;
154     typename ImageType::Pointer working_image;
155     typename ImageType::Pointer object_resampled;
156     typename FloatImageType::Pointer relPos;
157     ImagePointer input;
158     ImagePointer object;
159
160   private:
161     AddRelativePositionConstraintToLabelImageFilter(const Self&); //purposely not implemented
162     void operator=(const Self&); //purposely not implemented
163     
164   }; // end class
165   //--------------------------------------------------------------------
166
167 } // end namespace clitk
168 //--------------------------------------------------------------------
169
170 #ifndef ITK_MANUAL_INSTANTIATION
171 #include "clitkAddRelativePositionConstraintToLabelImageFilter.txx"
172 #endif
173
174 #endif