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