]> Creatis software - clitk.git/blob - itk/clitkSegmentationUtils.h
changes in license header
[clitk.git] / itk / clitkSegmentationUtils.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://www.centreleonberard.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 CLITKSEGMENTATIONUTILS_H
20 #define CLITKSEGMENTATIONUTILS_H
21
22 // clitk
23 #include "clitkCommon.h"
24 #include "clitkAutoCropFilter.h"
25 #include "clitkLabelizeParameters.h"
26
27 // itk
28 #include <itkBoundingBox.h>
29 #include <itkJoinSeriesImageFilter.h>
30
31 /*
32   According to 
33   http://answerpot.com/showthread.php?357451-Itk::SmartPointer%20-%20problem%20making%20code%20const-correct
34   it is better to take raw pointer as argument instead of SmartPointer.
35 */
36
37 namespace clitk {
38
39   //--------------------------------------------------------------------
40   template<class ImageType>
41   void ComputeBBFromImageRegion(const ImageType * image, 
42                                 typename ImageType::RegionType region,
43                                 typename itk::BoundingBox<unsigned long, 
44                                                           ImageType::ImageDimension>::Pointer bb);
45   
46   //--------------------------------------------------------------------
47   template<int Dimension>
48   void ComputeBBIntersection(typename itk::BoundingBox<unsigned long, Dimension>::Pointer bbo, 
49                              typename itk::BoundingBox<unsigned long, Dimension>::Pointer bbi1, 
50                              typename itk::BoundingBox<unsigned long, Dimension>::Pointer bbi2);
51
52   //--------------------------------------------------------------------
53   template<class ImageType>
54   void ComputeRegionFromBB(const ImageType * image, 
55                            const typename itk::BoundingBox<unsigned long, 
56                                                            ImageType::ImageDimension>::Pointer bb, 
57                            typename ImageType::RegionType & region);
58   //--------------------------------------------------------------------
59   template<class TInternalImageType, class TMaskInternalImageType>
60   typename TInternalImageType::Pointer
61   SetBackground(const TInternalImageType * input,
62                 const TMaskInternalImageType * mask, 
63                 typename TMaskInternalImageType::PixelType maskBG, 
64                 typename TInternalImageType::PixelType outValue, 
65                 bool inPlace);
66   //--------------------------------------------------------------------
67
68
69   //--------------------------------------------------------------------
70   template<class ImageType>
71   int GetNumberOfConnectedComponentLabels(const ImageType * input, 
72                                           typename ImageType::PixelType BG, 
73                                           bool isFullyConnected);
74   //--------------------------------------------------------------------
75
76
77   //-------------------------------------------------------------------- 
78   template<class TImageType>
79   typename TImageType::Pointer
80   Labelize(const TImageType * input, typename TImageType::PixelType BG, 
81            bool isFullyConnected, int minimalComponentSize);
82   template<class TImageType>
83   typename TImageType::Pointer
84   LabelizeAndCountNumberOfObjects(const TImageType * input, 
85                                   typename TImageType::PixelType BG, 
86                                   bool isFullyConnected, 
87                                   int minimalComponentSize, 
88                                   int & nb);
89   //--------------------------------------------------------------------
90
91
92   //--------------------------------------------------------------------
93   template<class ImageType>
94   typename ImageType::Pointer
95   RemoveLabels(const ImageType * input, 
96                typename ImageType::PixelType BG, 
97                std::vector<typename ImageType::PixelType> & labelsToRemove);
98   //--------------------------------------------------------------------
99
100
101   //--------------------------------------------------------------------
102   template<class ImageType>
103   typename ImageType::Pointer
104   AutoCrop(const ImageType * input, 
105            typename ImageType::PixelType BG) {
106     typedef clitk::AutoCropFilter<ImageType> AutoCropFilterType;
107     typename AutoCropFilterType::Pointer autoCropFilter = AutoCropFilterType::New();
108     autoCropFilter->SetInput(input);
109     autoCropFilter->SetBackgroundValue(BG);
110     autoCropFilter->Update();   
111     return autoCropFilter->GetOutput();
112   }
113   //--------------------------------------------------------------------
114
115
116   //--------------------------------------------------------------------
117   template<class TImageType>
118   typename TImageType::Pointer
119   KeepLabels(const TImageType * input,
120              typename TImageType::PixelType BG, 
121              typename TImageType::PixelType FG,  
122              typename TImageType::PixelType firstKeep, 
123              typename TImageType::PixelType lastKeep, 
124              bool useLastKeep);
125   //--------------------------------------------------------------------
126
127
128   //--------------------------------------------------------------------
129   template<class TImageType>
130   typename TImageType::Pointer
131   LabelizeAndSelectLabels(const TImageType * input,
132                           typename TImageType::PixelType BG, 
133                           typename TImageType::PixelType FG, 
134                           bool isFullyConnected,
135                           int minimalComponentSize,
136                           LabelizeParameters<typename TImageType::PixelType> * param);
137
138   //--------------------------------------------------------------------
139   template<class ImageType>
140   typename ImageType::Pointer
141   ResizeImageLike(const ImageType * input,
142                   const itk::ImageBase<ImageType::ImageDimension> * like, 
143                   typename ImageType::PixelType BG);
144
145
146   //--------------------------------------------------------------------
147   template<class MaskImageType>
148   typename MaskImageType::Pointer
149   SliceBySliceRelativePosition(const MaskImageType * input,
150                                const MaskImageType * object,
151                                int direction, 
152                                double threshold, 
153                                std::string orientation, 
154                                bool uniqueConnectedComponent=false, 
155                                double spacing=-1, 
156                                bool autocropflag=true, 
157                                bool singleObjectCCL=true);
158
159   //--------------------------------------------------------------------
160   // In a binary image, search for the point belonging to the FG that
161   // is the most exterma in the direction 'direction' (or in the
162   // opposite if notFlag is given). 
163   template<class ImageType>
164   bool
165   FindExtremaPointInAGivenDirection(const ImageType * input, 
166                                     typename ImageType::PixelType bg, 
167                                     int direction, bool opposite, 
168                                     typename ImageType::PointType & p);
169
170   //--------------------------------------------------------------------
171
172   //--------------------------------------------------------------------
173   // Same as above but check that the found point is not more than
174   // 'distanceMax' away from 'refPoint'
175   template<class ImageType>
176   bool
177   FindExtremaPointInAGivenDirection(const ImageType * input, 
178                                     typename ImageType::PixelType bg, 
179                                     int direction, bool opposite, 
180                                     typename ImageType::PointType refPoint,
181                                     double distanceMax, 
182                                     typename ImageType::PointType & p);
183
184   //--------------------------------------------------------------------
185
186   //--------------------------------------------------------------------
187   template<class ImageType>
188   typename ImageType::Pointer
189   CropImageAlongOneAxis(const ImageType * image, 
190                         int dim, double min, double max, 
191                         bool autoCrop = false,
192                         typename ImageType::PixelType BG=0);
193   template<class ImageType>
194   typename ImageType::Pointer
195   CropImageAbove(const ImageType * image, 
196                  int dim, double min, bool autoCrop = false,
197                  typename ImageType::PixelType BG=0);
198   template<class ImageType>
199   typename ImageType::Pointer
200   CropImageBelow(const ImageType * image, 
201                  int dim, double max,bool autoCrop = false,
202                  typename ImageType::PixelType BG=0);
203   //--------------------------------------------------------------------
204
205
206   //--------------------------------------------------------------------
207   template<class ImageType>
208   void
209   ComputeCentroids(const ImageType * image, 
210                    typename ImageType::PixelType BG, 
211                    std::vector<typename ImageType::PointType> & centroids);
212   //--------------------------------------------------------------------
213
214
215   //--------------------------------------------------------------------
216   template<class ImageType>
217   void
218   ExtractSlices(const ImageType * image, int dim, 
219                 std::vector< typename itk::Image<typename ImageType::PixelType, 
220                                                  ImageType::ImageDimension-1>::Pointer > & slices);
221   //--------------------------------------------------------------------
222
223
224   //--------------------------------------------------------------------
225   template<class ImageType>
226   typename ImageType::Pointer
227   JoinSlices(std::vector<typename itk::Image<typename ImageType::PixelType, 
228                                              ImageType::ImageDimension-1>::Pointer > & slices, 
229              const ImageType * input, 
230              int direction) {
231     typedef typename itk::Image<typename ImageType::PixelType, ImageType::ImageDimension-1> SliceType;
232     typedef itk::JoinSeriesImageFilter<SliceType, ImageType> JoinSeriesFilterType;
233     typename JoinSeriesFilterType::Pointer joinFilter = JoinSeriesFilterType::New();
234     joinFilter->SetOrigin(input->GetOrigin()[direction]);
235     joinFilter->SetSpacing(input->GetSpacing()[direction]);
236     for(unsigned int i=0; i<slices.size(); i++) {
237       joinFilter->PushBackInput(slices[i]);
238     }
239     joinFilter->Update();
240     return joinFilter->GetOutput();
241   }
242   //--------------------------------------------------------------------
243
244
245   //--------------------------------------------------------------------
246   // Set of tools to manage 3D points and 2D points in slices  
247   template<class ImageType>
248   class PointsUtils
249   {
250     typedef typename ImageType::PointType PointType3D;
251     typedef typename ImageType::IndexType IndexType3D;
252     typedef typename ImageType::PixelType PixelType;
253     typedef typename ImageType::Pointer ImagePointer;
254     typedef typename ImageType::ConstPointer ImageConstPointer;
255     typedef itk::Image<PixelType, 2> SliceType;
256     typedef typename SliceType::PointType PointType2D;
257     typedef typename SliceType::IndexType IndexType2D;
258     
259     typedef std::map<int, PointType2D> MapPoint2DType;
260     typedef std::vector<PointType3D> VectorPoint3DType;
261   public:
262     static void Convert2DTo3D(const PointType2D & p2D, 
263                               const ImageType * image, 
264                               const int slice, 
265                               PointType3D & p3D);
266     static void Convert2DTo3DList(const MapPoint2DType & map, 
267                                   const ImageType * image, 
268                                   VectorPoint3DType & list);
269   };
270
271   //--------------------------------------------------------------------
272   template<class ImageType>
273   void 
274   WriteListOfLandmarks(std::vector<typename ImageType::PointType> points, 
275                        std::string filename);
276   //--------------------------------------------------------------------
277
278
279   //--------------------------------------------------------------------
280   template<class ImageType>
281   typename ImageType::Pointer
282   Dilate(const ImageType * image, double radiusInMM,               
283          typename ImageType::PixelType BG, 
284          typename ImageType::PixelType FG, 
285          bool extendSupport);
286   template<class ImageType>
287   typename ImageType::Pointer
288   Dilate(const ImageType * image, typename ImageType::SizeType radius, 
289          typename ImageType::PixelType BG, 
290          typename ImageType::PixelType FG, 
291          bool extendSupport);
292   template<class ImageType>
293   typename ImageType::Pointer  
294   Dilate(const ImageType * image, typename ImageType::PointType radiusInMM, 
295          typename ImageType::PixelType BG, 
296          typename ImageType::PixelType FG, 
297          bool extendSupport);
298   //--------------------------------------------------------------------
299
300   //--------------------------------------------------------------------
301   template<class ValueType, class VectorType>
302   void ConvertOption(std::string optionName, uint given, 
303                      ValueType * values, VectorType & p, 
304                      uint dim, bool required);
305 #define ConvertOptionMacro(OPTIONNAME, VAR, DIM, REQUIRED)              \
306   ConvertOption(#OPTIONNAME, OPTIONNAME##_given, OPTIONNAME##_arg, VAR, DIM, REQUIRED);
307   //--------------------------------------------------------------------
308
309   //--------------------------------------------------------------------
310   template<class ImageType>
311   void 
312   SliceBySliceSetBackgroundFromLineSeparation(ImageType * input, 
313                                               std::vector<typename ImageType::PointType> & lA, 
314                                               std::vector<typename ImageType::PointType> & lB, 
315                                               typename ImageType::PixelType BG, 
316                                               int mainDirection, 
317                                               double offsetToKeep);
318   //--------------------------------------------------------------------
319
320
321   //--------------------------------------------------------------------
322   template<class ImageType>
323   void AndNot(ImageType * input, 
324               const ImageType * object, 
325               typename ImageType::PixelType BG=0);
326   //--------------------------------------------------------------------
327  
328
329   //--------------------------------------------------------------------
330   template<class ImageType>
331   typename ImageType::Pointer
332   Binarize(const ImageType * input, 
333            typename ImageType::PixelType lower, 
334            typename ImageType::PixelType upper, 
335            typename ImageType::PixelType BG=0,
336            typename ImageType::PixelType FG=1);
337   //--------------------------------------------------------------------
338  
339   
340   //--------------------------------------------------------------------
341   template<class ImageType>
342   void
343   GetMinMaxPointPosition(const ImageType * input, 
344                          typename ImageType::PointType & min,
345                          typename ImageType::PointType & max);
346   //--------------------------------------------------------------------
347
348   //--------------------------------------------------------------------
349   template<class ImageType>
350   typename ImageType::PointType
351   FindExtremaPointInAGivenLine(const ImageType * input, 
352                                int dimension, bool inverse, 
353                                typename ImageType::PointType p, 
354                                typename ImageType::PixelType BG, 
355                                double distanceMax);
356   //--------------------------------------------------------------------
357
358   
359   //--------------------------------------------------------------------
360   template<class PointType>
361   bool
362   IsOnTheSameLineSide(PointType C, PointType A, PointType B, PointType like);
363   //--------------------------------------------------------------------
364
365
366   //--------------------------------------------------------------------
367   template<class ImageType>
368   void 
369   SliceBySliceBuildLineSegmentAccordingToExtremaPosition(const ImageType * input, 
370                                                          typename ImageType::PixelType BG, 
371                                                          int sliceDimension, 
372                                                          int extremaDirection, 
373                                                          bool extremaOppositeFlag, 
374                                                          int lineDirection,
375                                                          double margin,
376                                                          std::vector<typename ImageType::PointType> & A, 
377                                                          std::vector<typename ImageType::PointType> & B);  
378   //--------------------------------------------------------------------
379
380
381 }
382
383 #include "clitkSegmentationUtils.txx"
384
385 #endif