00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef _itkKLMRegionGrowImageFilter_h
00018 #define _itkKLMRegionGrowImageFilter_h
00019
00020 #include "itkImage.h"
00021 #include "itkObject.h"
00022 #include "itkImageToImageFilter.h"
00023 #include "itkRegionGrowImageFilter.h"
00024 #include "itkKLMSegmentationRegion.h"
00025 #include "itkKLMSegmentationBorder.h"
00026 #include "itkImageRegionIterator.h"
00027 #include "itkImageRegionConstIterator.h"
00028 #include <algorithm>
00029 #include <functional>
00030
00031 namespace itk
00032 {
00033
00156 template <class TInputImage, class TOutputImage>
00157 class ITK_EXPORT KLMRegionGrowImageFilter : public RegionGrowImageFilter<TInputImage,TOutputImage>
00158 {
00159 public:
00161 typedef KLMRegionGrowImageFilter Self;
00162 typedef RegionGrowImageFilter<TInputImage,TOutputImage> Superclass;
00163 typedef SmartPointer<Self> Pointer;
00164 typedef SmartPointer<const Self> ConstPointer;
00165
00167 itkNewMacro(Self);
00168
00170 itkTypeMacro(KLMRegionGrowImageFilter,RegionGrowImageFilter);
00171
00173 typedef TInputImage InputImageType;
00174 typedef typename TInputImage::Pointer InputImagePointer;
00175 typedef typename TInputImage::ConstPointer InputImageConstPointer;
00176
00178 typedef typename TInputImage::PixelType InputImagePixelType;
00179
00181 typedef typename TInputImage::PixelType::VectorType InputImageVectorType;
00182
00184 typedef typename TInputImage::IndexType InputImageIndexType;
00185
00187 typedef typename TInputImage::OffsetType InputImageOffsetType;
00188
00190 typedef ImageRegionIterator< TInputImage > InputImageIterator;
00191 typedef ImageRegionConstIterator< TInputImage > InputImageConstIterator;
00192
00194 typedef TOutputImage OutputImageType;
00195 typedef typename TOutputImage::Pointer OutputImagePointer;
00196
00198 typedef typename TOutputImage::PixelType OutputImagePixelType;
00199
00201 typedef typename TOutputImage::IndexType OutputImageIndexType;
00202
00204 typedef typename TOutputImage::OffsetType OutputImageOffsetType;
00205
00207 typedef ImageRegionIterator< TOutputImage > OutputImageIterator;
00208
00210 typedef typename TOutputImage::PixelType::VectorType OutputImageVectorType;
00211
00213 itkStaticConstMacro(LabelImageDimension, unsigned int,
00214 TInputImage::ImageDimension);
00215
00217 typedef Image<unsigned short,itkGetStaticConstMacro(LabelImageDimension)> LabelImageType;
00218
00220 typedef typename LabelImageType::Pointer LabelImagePointer;
00221
00223 typedef typename LabelImageType::PixelType LabelImagePixelType;
00224
00226 typedef typename LabelImageType::IndexType LabelImageIndexType;
00227
00229 typedef typename LabelImageType::OffsetType LabelImageOffsetType;
00230
00232 typedef ImageRegionIterator< LabelImageType > LabelImageIterator;
00233
00235 typedef vnl_matrix<double> VecDblType;
00236
00238 typedef KLMSegmentationBorder BorderType;
00239
00241 typedef KLMDynamicBorderArray<BorderType> SegmentationBorderPtr;
00242
00246 itkSetMacro(MaxLambda, unsigned int);
00247
00249 itkGetMacro(MaxLambda, unsigned int);
00250
00251
00253 LabelImagePointer GetLabelledImage(void);
00254
00256 void PrintAlgorithmRegionStats(void);
00257
00259 void PrintAlgorithmBorderStats(void);
00260
00262 void PrintAlgorithmBorderStats(bool smartBorderPointerUseFlag);
00263
00269 virtual void CalculateInitRegionStats( int regionRowIndex,
00270 int regionColIndex,
00271 int regionRowGridSize,
00272 int regionColGridSize );
00273
00279 virtual void CalculateInitRegionStats( int regionRowIndex,
00280 int regionColIndex,
00281 int regionSliceIndex,
00282 int regionRowGridSize,
00283 int regionColGridSize,
00284 int regionSliceGridSize );
00285
00286 protected:
00287 KLMRegionGrowImageFilter();
00288 ~KLMRegionGrowImageFilter();
00289 void PrintSelf(std::ostream& os, Indent indent) const;
00290
00291 virtual void GenerateData();
00292 virtual void GenerateInputRequestedRegion();
00293 virtual void EnlargeOutputRequestedRegion( DataObject * );
00294 virtual void GenerateOutputInformation();
00295
00298 void ApplyRegionGrowImageFilter();
00299
00306 virtual void MergeRegions();
00307
00309 void GenerateOutputImage(unsigned int imgWidth,
00310 unsigned int imgHeight);
00311
00313 void GenerateOutputImage(unsigned int imgWidth,
00314 unsigned int imgHeight,
00315 unsigned int imgDepth);
00316
00317
00319 void ApplyKLM();
00320
00322 void InitializeKLM(unsigned int imgWidth,
00323 unsigned int imgHeight);
00324
00326 void InitializeKLM(unsigned int imgWidth,
00327 unsigned int imgHeight,
00328 unsigned int imgDepth );
00329
00331 LabelImagePointer localfn_generate_labeled2Dimage(
00332 LabelImageType *labelImagePtr );
00333
00335 LabelImagePointer localfn_generate_labeled3Dimage(
00336 LabelImageType *labelImagePtr );
00337
00338 private:
00339 KLMRegionGrowImageFilter(const Self&);
00340 void operator=(const Self&);
00341
00342 typedef typename TInputImage::SizeType InputImageSize;
00343 typedef typename KLMSegmentationRegion::Pointer KLMSegmentationRegionPtr;
00344
00345 typedef typename KLMSegmentationBorder::Pointer KLMSegmentationBorderPtr;
00346
00349 typedef std::vector< SegmentationBorderPtr > BordersDynamicPointerType;
00350
00352 typedef BordersDynamicPointerType::iterator BordersDynamicPointerIterator;
00353
00354
00355 unsigned int m_MaxLambda;
00356 unsigned int m_NumberOfBorders;
00357 unsigned int m_NumRegions;
00358 unsigned int m_InitRegionArea;
00359 SegmentationBorderPtr *m_BordersCandidateDynamicPointer;
00360 SegmentationBorder *m_BordersCandidatePointer;
00361 unsigned int m_ImgWidth;
00362 unsigned int m_ImgHeight;
00363 unsigned int m_ImgDepth;
00364
00365 unsigned int m_TotalBorderLength;
00366 double m_RegionLambda;
00367
00368 VecDblType m_InitRegionMean;
00369
00370
00371 std::vector< KLMSegmentationRegionPtr > m_RegionsPointer;
00372 std::vector< KLMSegmentationBorderPtr > m_BordersPointer;
00373 std::vector< SegmentationBorderPtr > m_BordersDynamicPointer;
00374
00375
00379 void UnionBorders(KLMSegmentationRegion *pRegion1,
00380 KLMSegmentationRegion *pRegion2);
00381
00385 void UpdateBordersDynamicPointer();
00386
00389 void ResolveRegionLabels(unsigned int imgWidth,
00390 unsigned int imgHeight);
00391
00394 void ResolveRegionLabels(unsigned int imgWidth,
00395 unsigned int imgHeight,
00396 unsigned int imgDepth);
00397
00398 };
00399
00400 }
00401
00402 #ifndef ITK_MANUAL_INSTANTIATION
00403 #include "itkKLMRegionGrowImageFilter.txx"
00404 #endif
00405
00406
00407
00408 #endif