00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
#ifndef _itkMRFImageFilter_h
00018
#define _itkMRFImageFilter_h
00019
00020
00021
#include "vnl/vnl_vector.h"
00022
#include "vnl/vnl_matrix.h"
00023
00024
#include "itkImageClassifierBase.h"
00025
00026
#include "itkImageToImageFilter.h"
00027
#include "itkImageRegionIterator.h"
00028
00029
#include "itkConstNeighborhoodIterator.h"
00030
#include "itkNeighborhoodIterator.h"
00031
#include "itkNeighborhoodAlgorithm.h"
00032
#include "itkNeighborhood.h"
00033
#include "itkSize.h"
00034
00035
00036
00037
namespace itk
00038 {
00039
00130
template <
class TInputImage,
class TClassifiedImage>
00131 class ITK_EXPORT MRFImageFilter :
00132
public ImageToImageFilter<TInputImage,TClassifiedImage>
00133 {
00134
public:
00136 typedef MRFImageFilter
Self;
00137 typedef ImageToImageFilter<TInputImage,TClassifiedImage> Superclass;
00138 typedef SmartPointer<Self> Pointer;
00139 typedef SmartPointer<const Self> ConstPointer;
00140 typedef typename Superclass::OutputImagePointer
OutputImagePointer;
00141
00143
itkNewMacro(
Self);
00144
00146
itkTypeMacro(MRFImageFilter,
Object);
00147
00149 typedef TInputImage
InputImageType;
00150 typedef typename TInputImage::Pointer
InputImagePointer;
00151 typedef typename TInputImage::ConstPointer
InputImageConstPointer;
00152
00154 typedef typename TInputImage::PixelType
InputImagePixelType;
00155
00157 typedef typename TInputImage::RegionType
InputImageRegionType;
00158
00160 typedef ImageRegionIterator<TInputImage> InputImageRegionIterator;
00161 typedef ImageRegionConstIterator<TInputImage> InputImageRegionConstIterator;
00162
00164
itkStaticConstMacro(InputImageDimension,
unsigned int,
00165 TInputImage::ImageDimension);
00166
00168 typedef typename TClassifiedImage::Pointer
TrainingImagePointer;
00169
00171 typedef typename TClassifiedImage::PixelType
TrainingImagePixelType;
00172
00175 typedef typename TClassifiedImage::Pointer
LabelledImagePointer;
00176
00179 typedef typename TClassifiedImage::PixelType
LabelledImagePixelType;
00180
00183 typedef typename TClassifiedImage::RegionType
LabelledImageRegionType;
00184
00186 typedef typename TClassifiedImage::IndexType
LabelledImageIndexType;
00187 typedef typename LabelledImageIndexType::IndexValueType
IndexValueType;
00188
00190 typedef typename TClassifiedImage::OffsetType
LabelledImageOffsetType;
00191
00193
typedef ImageRegionIterator<TClassifiedImage>
00194 LabelledImageRegionIterator;
00195
00197
itkStaticConstMacro(ClassifiedImageDimension,
unsigned int,
00198 TClassifiedImage::ImageDimension);
00199
00201 typedef ImageClassifierBase<TInputImage,TClassifiedImage> ClassifierType;
00202
00204 typedef typename TInputImage::SizeType
SizeType;
00205
00207 typedef typename TInputImage::SizeType
NeighborhoodRadiusType;
00208
00210
typedef ConstNeighborhoodIterator< TInputImage >
00211 InputImageNeighborhoodIterator;
00212
00213
typedef typename InputImageNeighborhoodIterator::RadiusType
00214 InputImageNeighborhoodRadiusType;
00215
00216
typedef NeighborhoodAlgorithm::ImageBoundaryFacesCalculator< TInputImage >
00217 InputImageFacesCalculator;
00218
00219
typedef typename InputImageFacesCalculator::FaceListType
00220 InputImageFaceListType;
00221
00222
typedef typename InputImageFaceListType::iterator
00223 InputImageFaceListIterator;
00224
00226
typedef NeighborhoodIterator< TClassifiedImage >
00227 LabelledImageNeighborhoodIterator;
00228
00229
typedef typename LabelledImageNeighborhoodIterator::RadiusType
00230 LabelledImageNeighborhoodRadiusType;
00231
00232
typedef NeighborhoodAlgorithm::ImageBoundaryFacesCalculator< TClassifiedImage >
00233 LabelledImageFacesCalculator;
00234
00235
typedef typename LabelledImageFacesCalculator::FaceListType
00236 LabelledImageFaceListType;
00237
00238
typedef typename LabelledImageFaceListType::iterator
00239 LabelledImageFaceListIterator;
00240
00242
void SetClassifier(
typename ClassifierType::Pointer ptrToClassifier );
00243
00245
itkSetMacro(NumberOfClasses,
unsigned int);
00246
itkGetMacro(NumberOfClasses,
unsigned int);
00247
00250
itkSetMacro(MaximumNumberOfIterations,
unsigned int);
00251
itkGetMacro(MaximumNumberOfIterations,
unsigned int);
00252
00255
itkSetMacro(ErrorTolerance,
double);
00256
itkGetMacro(ErrorTolerance,
double);
00257
00260
itkSetMacro(SmoothingFactor,
double);
00261
itkGetMacro(SmoothingFactor,
double);
00262
00264
void SetNeighborhoodRadius(
const NeighborhoodRadiusType &);
00265
00269
void SetNeighborhoodRadius(
const unsigned long );
00270
void SetNeighborhoodRadius(
const unsigned long *radiusArray );
00271
00273
const NeighborhoodRadiusType GetNeighborhoodRadius()
const
00274
{
00275
NeighborhoodRadiusType radius;
00276
00277 for(
int i=0; i<InputImageDimension; ++i)
00278 radius[i] = m_InputImageNeighborhoodRadius[i];
00279
00280
return radius;
00281 }
00282
00288
virtual void SetMRFNeighborhoodWeight( std::vector<double> BetaMatrix );
00289
virtual std::vector<double> GetMRFNeighborhoodWeight()
00290 {
00291
return m_MRFNeighborhoodWeight;
00292 }
00293
00294
protected:
00295 MRFImageFilter();
00296 ~MRFImageFilter();
00297
void PrintSelf(std::ostream& os,
Indent indent)
const;
00298
00300
void Allocate();
00301
00306
virtual void ApplyMRFImageFilter();
00307
00309
virtual void MinimizeFunctional();
00310
00311
typedef Image<int,itkGetStaticConstMacro(InputImageDimension) > LabelStatusImageType;
00312
typedef typename LabelStatusImageType::IndexType
LabelStatusIndexType;
00313
typedef typename LabelStatusImageType::RegionType
LabelStatusRegionType;
00314
typedef typename LabelStatusImageType::Pointer
LabelStatusImagePointer;
00315
typedef ImageRegionIterator< LabelStatusImageType >
00316 LabelStatusImageIterator;
00317
00319 typedef NeighborhoodIterator< LabelStatusImageType >
00320
LabelStatusImageNeighborhoodIterator;
00321
00322
00323
virtual void DoNeighborhoodOperation(
const InputImageNeighborhoodIterator &imageIter,
00324
LabelledImageNeighborhoodIterator &labelledIter,
00325 LabelStatusImageNeighborhoodIterator &labelStatusIter );
00326
00327
virtual void GenerateData();
00328
virtual void GenerateInputRequestedRegion();
00329
virtual void EnlargeOutputRequestedRegion(
DataObject * );
00330
virtual void GenerateOutputInformation();
00331
00332
private:
00333 MRFImageFilter(
const Self&);
00334
void operator=(
const Self&);
00335
00336
typedef typename TInputImage::SizeType InputImageSizeType;
00337
00338
typedef typename LabelStatusImageNeighborhoodIterator::RadiusType
00339 LabelStatusImageNeighborhoodRadiusType;
00340
00341
typedef NeighborhoodAlgorithm::ImageBoundaryFacesCalculator< LabelStatusImageType >
00342
LabelStatusImageFacesCalculator;
00343
00344
typedef typename LabelStatusImageFacesCalculator::FaceListType
00345 LabelStatusImageFaceListType;
00346
00347
typedef typename LabelStatusImageFaceListType::iterator
00348 LabelStatusImageFaceListIterator;
00349
00350
InputImageNeighborhoodRadiusType m_InputImageNeighborhoodRadius;
00351
LabelledImageNeighborhoodRadiusType m_LabelledImageNeighborhoodRadius;
00352 LabelStatusImageNeighborhoodRadiusType m_LabelStatusImageNeighborhoodRadius;
00353
00354
unsigned int m_NumberOfClasses;
00355
unsigned int m_MaximumNumberOfIterations;
00356
unsigned int m_KernelSize;
00357
00358
int m_ErrorCounter;
00359
int m_NeighborhoodSize;
00360
int m_TotalNumberOfValidPixelsInOutputImage;
00361
int m_TotalNumberOfPixelsInInputImage;
00362
double m_ErrorTolerance;
00363
double m_SmoothingFactor;
00364
double *m_ClassProbability;
00365
00366
LabelStatusImagePointer m_LabelStatusImage;
00367
00368 std::vector<double> m_MRFNeighborhoodWeight;
00369 std::vector<double> m_NeighborInfluence;
00370 std::vector<double> m_MahalanobisDistance;
00371 std::vector<double> m_DummyVector;
00372
00374
typename ClassifierType::Pointer m_ClassifierPtr;
00375
00376
00380
virtual void SetDefaultMRFNeighborhoodWeight( );
00381
00382
00383
void ApplyICMLabeller();
00384
00385 };
00386
00387
00388 }
00389
00390
#ifndef ITK_MANUAL_INSTANTIATION
00391
#include "itkMRFImageFilter.txx"
00392
#endif
00393
00394
#endif
00395