00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __vtkImageEMAtlasSegmenter_h
00018 #define __vtkImageEMAtlasSegmenter_h
00019
00020 #include "vtkImageEMGeneral.h"
00021 #include "vtkEMSegment.h"
00022 #include "vtkImageData.h"
00023 #include "vtkImageEMAtlasSuperClass.h"
00024
00025
00026
00027
00028
00029 typedef struct {
00030 int id ;
00031 float **w_m_input;
00032 unsigned char *MapVector;
00033 float *cY_M;
00034 int imgX;
00035 int imgY;
00036 int imgXY;
00037 int StartVoxel;
00038 int EndVoxel;
00039 int NumClasses;
00040 int NumTotalTypeCLASS;
00041 int* NumChildClasses;
00042 int NumInputImages;
00043 double Alpha;
00044 double ***MrfParams;
00045 void ** ProbDataPtr;
00046 int *ProbDataIncY;
00047 int *ProbDataIncZ;
00048 float *ProbDataWeight;
00049 float *ProbDataMinusWeight;
00050 int ProbDataType;
00051 double **LogMu;
00052 double ***InvLogCov;
00053 double *InvSqrtDetLogCov;
00054 double *TissueProbability;
00055 int *VirtualNumInputImages;
00056 float **w_m_output;
00057 } EMAtlas_MF_Approximation_Work_Private;
00058
00059
00060 class VTK_EMSEGMENT_EXPORT vtkImageEMAtlasSegmenter : public vtkImageEMGeneral
00061 {
00062 public:
00063
00064
00065
00066 static vtkImageEMAtlasSegmenter *New();
00067 vtkTypeMacro(vtkImageEMAtlasSegmenter,vtkObject);
00068 void PrintSelf(ostream& os, vtkIndent indent);
00069
00070
00071
00072 vtkSetMacro(NumIter, int);
00073 vtkGetMacro(NumIter, int);
00074
00075 vtkSetMacro(NumRegIter, int);
00076 vtkGetMacro(NumRegIter, int);
00077
00078 vtkSetMacro(Alpha, double);
00079 vtkGetMacro(Alpha, double);
00080
00081 vtkSetMacro(SmoothingWidth, int);
00082 vtkGetMacro(SmoothingWidth, int);
00083
00084 vtkSetMacro(SmoothingSigma, int);
00085 vtkGetMacro(SmoothingSigma, int);
00086
00087 void SetNumberOfTrainingSamples(int Number) {this->NumberOfTrainingSamples = Number;}
00088 vtkGetMacro(NumberOfTrainingSamples, int);
00089
00090 int* GetSegmentationBoundaryMin();
00091 int* GetSegmentationBoundaryMax();
00092
00093 int* GetExtent(){return this->Extent;}
00094
00095
00096
00097
00098 vtkGetStringMacro(PrintDir);
00099 vtkSetStringMacro(PrintDir);
00100
00101
00102
00103
00104
00105
00106 void SetNumInputImages(int number);
00107 int GetNumInputImages() {return this->NumInputImages;}
00108
00109 void SetImageInput(int index, vtkImageData *image) {this->SetInput(index,image);}
00110
00111 vtkGetMacro(ImageProd, int);
00112
00113
00114
00115 int GetDimensionX();
00116 int GetDimensionY();
00117 int GetDimensionZ();
00118
00119
00120
00121
00122
00123
00124 static void DetermineLabelMap(short *LabelMap, int NumTotalTypeCLASS, int* NumChildClasses, vtkImageEMAtlasSuperClass* head, short* ROI,int ImageMax, float **w_m);
00125
00126
00127
00128 int MF_Approx_Workpile(float **w_m_input,unsigned char* MapVector, float *cY_M, int imgXY,double ***InvLogCov,
00129 double *InvSqrtDetLogCov, int NumTotalTypeCLASS, int* NumChildClasses, int NumClasses, void** ProbDataPtr,
00130 int* ProbDataIncY, int* ProbDataIncZ, float* ProbDataWeight, float *ProbDataMinusWeight, double** LogMu,
00131 double* TissueProbability, int *VirtualNumInputImages, vtkImageEMAtlasSuperClass* head, float **_m_output);
00132
00133
00134
00135
00136 void PrintIntermediateResultsToFile(int iter, float **w_m, short *ROI, unsigned char* OutputVector, int NumTotalTypeCLASS, int* NumChildClasses,
00137 vtkImageEMAtlasSuperClass* actSupCl, char* LevelName, void **ClassList, classType *ClassListType, int* LabelList, FILE** QualityFile);
00138
00139
00140
00141
00142
00143
00144 vtkImageEMAtlasSuperClass* GetActiveSuperClass() {return this->activeSuperClass;}
00145 vtkImageEMAtlasSuperClass* GetHeadClass() {return this->HeadClass;}
00146
00147 int HierarchicalSegmentation(vtkImageEMAtlasSuperClass* head, float** InputVector,short *ROI, short *OutputVector, EMTriVolume & iv_m, EMVolume *r_m, char* LevelName);
00148
00149
00150 void PrintSuperClass () {
00151 printf("Current: %f Prob: %f Label: %d Parent: %f \n", activeSuperClass, activeSuperClass->GetTissueProbability(), activeSuperClass->GetLabel(), activeSuperClass->GetParentClass());
00152 }
00153
00154
00155
00156 void SetHeadClass(vtkImageEMAtlasSuperClass *InitHead) {
00157 InitHead->Update();
00158 if (InitHead->GetErrorFlag()) {
00159
00160 vtkErrorMacro(<<"Cannot set HeadClass because the class given has its ErrorFlag activated !");
00161 return;
00162 }
00163 this->HeadClass = InitHead;
00164 this->activeClass = (void*) InitHead;
00165 this->activeClassType = SUPERCLASS;
00166 }
00167
00168
00169
00170 char* GetErrorMessages() {return this->ErrorMessage.GetMessages(); }
00171 int GetErrorFlag() {return this->ErrorMessage.GetFlag();}
00172 void ResetErrorMessage() {this->ErrorMessage.ResetParameters();}
00173
00174 ProtocolMessages* GetErrorMessagePtr(){return &this->ErrorMessage;}
00175
00176 char* GetWarningMessages() {return this->WarningMessage.GetMessages(); }
00177 int GetWarningFlag() {return this->WarningMessage.GetFlag();}
00178 void ResetWarningMessage() {this->WarningMessage.ResetParameters();}
00179 ProtocolMessages* GetWarningMessagePtr(){return &this->WarningMessage;}
00180 protected:
00181 vtkImageEMAtlasSegmenter();
00182 vtkImageEMAtlasSegmenter(const vtkImageEMAtlasSegmenter&) {};
00183 ~vtkImageEMAtlasSegmenter();
00184 void DeleteVariables();
00185
00186 void operator=(const vtkImageEMAtlasSegmenter&) {};
00187 void ExecuteData(vtkDataObject *);
00188
00189
00190
00191
00192
00193
00194
00195 int CheckInputImage(vtkImageData * inData,int DataTypeOrig, vtkFloatingPointType DataSpacingOrig[3], int num);
00196
00197
00198
00199 void ResetMessageSettings();
00200
00201 int NumIter;
00202 int NumRegIter;
00203 double Alpha;
00204
00205 int SmoothingWidth;
00206 int SmoothingSigma;
00207
00208 int NumInputImages;
00209
00210
00211 char* PrintDir;
00212
00213
00214 int ImageProd;
00215
00216 int Extent[6];
00217
00218 int NumberOfTrainingSamples;
00219
00220 vtkImageEMAtlasSuperClass *activeSuperClass;
00221 classType activeClassType;
00222
00223 vtkImageEMAtlasSuperClass *HeadClass;
00224
00225 void *activeClass;
00226
00227 ProtocolMessages ErrorMessage;
00228 ProtocolMessages WarningMessage;
00229
00230 };
00231 #endif
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242