1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
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
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.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ======================================================================-====*/
19 #ifndef CLITKSEGMENTATIONUTILS_H
20 #define CLITKSEGMENTATIONUTILS_H
23 #include "clitkCommon.h"
24 #include "clitkAutoCropFilter.h"
25 #include "clitkLabelizeParameters.h"
28 #include <itkBoundingBox.h>
29 #include <itkJoinSeriesImageFilter.h>
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.
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);
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);
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,
66 //--------------------------------------------------------------------
69 //--------------------------------------------------------------------
70 template<class ImageType>
71 int GetNumberOfConnectedComponentLabels(const ImageType * input,
72 typename ImageType::PixelType BG,
73 bool isFullyConnected);
74 //--------------------------------------------------------------------
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,
89 //--------------------------------------------------------------------
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 //--------------------------------------------------------------------
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();
113 //--------------------------------------------------------------------
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,
125 //--------------------------------------------------------------------
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);
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);
146 //--------------------------------------------------------------------
147 template<class MaskImageType>
148 typename MaskImageType::Pointer
149 SliceBySliceRelativePosition(const MaskImageType * input,
150 const MaskImageType * object,
153 std::string orientation,
154 bool uniqueConnectedComponent=false,
156 bool autocropflag=true,
157 bool singleObjectCCL=true);
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>
165 FindExtremaPointInAGivenDirection(const ImageType * input,
166 typename ImageType::PixelType bg,
167 int direction, bool opposite,
168 typename ImageType::PointType & p);
170 //--------------------------------------------------------------------
172 //--------------------------------------------------------------------
173 // Same as above but check that the found point is not more than
174 // 'distanceMax' away from 'refPoint'
175 template<class ImageType>
177 FindExtremaPointInAGivenDirection(const ImageType * input,
178 typename ImageType::PixelType bg,
179 int direction, bool opposite,
180 typename ImageType::PointType refPoint,
182 typename ImageType::PointType & p);
184 //--------------------------------------------------------------------
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 //--------------------------------------------------------------------
206 //--------------------------------------------------------------------
207 template<class ImageType>
209 ComputeCentroids(const ImageType * image,
210 typename ImageType::PixelType BG,
211 std::vector<typename ImageType::PointType> & centroids);
212 //--------------------------------------------------------------------
215 //--------------------------------------------------------------------
216 template<class ImageType>
218 ExtractSlices(const ImageType * image, int dim,
219 std::vector< typename itk::Image<typename ImageType::PixelType,
220 ImageType::ImageDimension-1>::Pointer > & slices);
221 //--------------------------------------------------------------------
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,
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]);
239 joinFilter->Update();
240 return joinFilter->GetOutput();
242 //--------------------------------------------------------------------
245 //--------------------------------------------------------------------
246 // Set of tools to manage 3D points and 2D points in slices
247 template<class ImageType>
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;
259 typedef std::map<int, PointType2D> MapPoint2DType;
260 typedef std::vector<PointType3D> VectorPoint3DType;
262 static void Convert2DTo3D(const PointType2D & p2D,
263 const ImageType * image,
266 static void Convert2DTo3DList(const MapPoint2DType & map,
267 const ImageType * image,
268 VectorPoint3DType & list);
271 //--------------------------------------------------------------------
272 template<class ImageType>
274 WriteListOfLandmarks(std::vector<typename ImageType::PointType> points,
275 std::string filename);
276 //--------------------------------------------------------------------
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,
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,
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,
298 //--------------------------------------------------------------------
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 //--------------------------------------------------------------------
309 //--------------------------------------------------------------------
310 template<class ImageType>
312 SliceBySliceSetBackgroundFromLineSeparation(ImageType * input,
313 std::vector<typename ImageType::PointType> & lA,
314 std::vector<typename ImageType::PointType> & lB,
315 typename ImageType::PixelType BG,
317 double offsetToKeep);
318 //--------------------------------------------------------------------
321 //--------------------------------------------------------------------
322 template<class ImageType>
323 void AndNot(ImageType * input,
324 const ImageType * object,
325 typename ImageType::PixelType BG=0);
326 //--------------------------------------------------------------------
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 //--------------------------------------------------------------------
340 //--------------------------------------------------------------------
341 template<class ImageType>
343 GetMinMaxPointPosition(const ImageType * input,
344 typename ImageType::PointType & min,
345 typename ImageType::PointType & max);
346 //--------------------------------------------------------------------
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,
356 //--------------------------------------------------------------------
359 //--------------------------------------------------------------------
360 template<class PointType>
362 IsOnTheSameLineSide(PointType C, PointType A, PointType B, PointType like);
363 //--------------------------------------------------------------------
366 //--------------------------------------------------------------------
367 template<class ImageType>
369 SliceBySliceBuildLineSegmentAccordingToExtremaPosition(const ImageType * input,
370 typename ImageType::PixelType BG,
372 int extremaDirection,
373 bool extremaOppositeFlag,
376 std::vector<typename ImageType::PointType> & A,
377 std::vector<typename ImageType::PointType> & B);
378 //--------------------------------------------------------------------
383 #include "clitkSegmentationUtils.txx"