00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00066
#ifndef __vtkImageToPolyDataFilter_h
00067
#define __vtkImageToPolyDataFilter_h
00068
00069
#include "vtkStructuredPointsToPolyDataFilter.h"
00070
00071 #define VTK_STYLE_PIXELIZE 0
00072 #define VTK_STYLE_POLYGONALIZE 1
00073 #define VTK_STYLE_RUN_LENGTH 2
00074
00075 #define VTK_COLOR_MODE_LUT 0
00076 #define VTK_COLOR_MODE_LINEAR_256 1
00077
00078
class vtkAppendPolyData;
00079
class vtkDataArray;
00080
class vtkEdgeTable;
00081
class vtkIdTypeArray;
00082
class vtkIntArray;
00083
class vtkScalarsToColors;
00084
class vtkStructuredPoints;
00085
class vtkTimeStamp;
00086
class vtkUnsignedCharArray;
00087
00088 class VTK_HYBRID_EXPORT vtkImageToPolyDataFilter :
public vtkStructuredPointsToPolyDataFilter
00089 {
00090
public:
00091 vtkTypeRevisionMacro(vtkImageToPolyDataFilter,
vtkStructuredPointsToPolyDataFilter);
00092
void PrintSelf(ostream& os,
vtkIndent indent);
00093
00095
static vtkImageToPolyDataFilter*
New();
00096
00098
00104 vtkSetClampMacro(OutputStyle,
int,VTK_STYLE_PIXELIZE,VTK_STYLE_RUN_LENGTH);
00105 vtkGetMacro(OutputStyle,
int);
00106 void SetOutputStyleToPixelize()
00107 {this->SetOutputStyle(
VTK_STYLE_PIXELIZE);};
00108 void SetOutputStyleToPolygonalize()
00109 {this->SetOutputStyle(
VTK_STYLE_POLYGONALIZE);};
00110 void SetOutputStyleToRunLength()
00111 {this->SetOutputStyle(
VTK_STYLE_RUN_LENGTH);};
00113
00115
00116 vtkSetClampMacro(ColorMode,
int,VTK_COLOR_MODE_LUT,VTK_COLOR_MODE_LINEAR_256);
00117 vtkGetMacro(ColorMode,
int);
00118 void SetColorModeToLUT()
00119 {this->SetColorMode(
VTK_COLOR_MODE_LUT);};
00120 void SetColorModeToLinear256()
00121 {this->SetColorMode(
VTK_COLOR_MODE_LINEAR_256);};
00123
00125
00127
virtual void SetLookupTable(
vtkScalarsToColors*);
00128 vtkGetObjectMacro(LookupTable,
vtkScalarsToColors);
00130
00132
00134 vtkSetMacro(Smoothing,
int);
00135 vtkGetMacro(Smoothing,
int);
00136 vtkBooleanMacro(Smoothing,
int);
00138
00140
00142 vtkSetClampMacro(NumberOfSmoothingIterations,
int,0,VTK_LARGE_INTEGER);
00143 vtkGetMacro(NumberOfSmoothingIterations,
int);
00145
00147
00149 vtkSetMacro(Decimation,
int);
00150 vtkGetMacro(Decimation,
int);
00151 vtkBooleanMacro(Decimation,
int);
00153
00155
00159 vtkSetClampMacro(DecimationError,
double,0.0,VTK_DOUBLE_MAX);
00160 vtkGetMacro(DecimationError,
double);
00162
00164
00167 vtkSetClampMacro(Error,
int,0,VTK_LARGE_INTEGER);
00168 vtkGetMacro(Error,
int);
00170
00172
00177 vtkSetClampMacro(SubImageSize,
int,10,VTK_LARGE_INTEGER);
00178 vtkGetMacro(SubImageSize,
int);
00180
00181
protected:
00182 vtkImageToPolyDataFilter();
00183 ~vtkImageToPolyDataFilter();
00184
00185
void Execute();
00186
00187 int OutputStyle;
00188 int ColorMode;
00189 int Smoothing;
00190 int NumberOfSmoothingIterations;
00191 int Decimation;
00192 double DecimationError;
00193 int Error;
00194 int SubImageSize;
00195 vtkScalarsToColors *LookupTable;
00196
00197
virtual void PixelizeImage(
vtkUnsignedCharArray *pixels,
int dims[3],
00198
double origin[3],
double spacing[3],
00199
vtkPolyData *output);
00200
virtual void PolygonalizeImage(
vtkUnsignedCharArray *pixels,
int dims[3],
00201
double origin[3],
double spacing[3],
00202
vtkPolyData *output);
00203
virtual void RunLengthImage(
vtkUnsignedCharArray *pixels,
int dims[3],
00204
double origin[3],
double spacing[3],
00205
vtkPolyData *output);
00206
private:
00207
vtkUnsignedCharArray *Table;
00208
vtkTimeStamp TableMTime;
00209
int *Visited;
00210
vtkUnsignedCharArray *PolyColors;
00211
vtkEdgeTable *EdgeTable;
00212
vtkEdgeTable *EdgeUseTable;
00213
vtkIntArray *EdgeUses;
00214
00215
00216
vtkAppendPolyData *Append;
00217
00218
void BuildTable(
unsigned char *inPixels);
00219
vtkUnsignedCharArray *QuantizeImage(
vtkDataArray *inScalars,
int numComp,
00220
int type,
int dims[3],
int ext[4]);
00221
int ProcessImage(
vtkUnsignedCharArray *pixels,
int dims[2]);
00222
int BuildEdges(
vtkUnsignedCharArray *pixels,
int dims[3],
double origin[3],
00223
double spacing[3],
vtkUnsignedCharArray *pointDescr,
00224
vtkPolyData *edges);
00225
void BuildPolygons(
vtkUnsignedCharArray *pointDescr,
vtkPolyData *edges,
00226
int numPolys,
vtkUnsignedCharArray *polyColors);
00227
void SmoothEdges(
vtkUnsignedCharArray *pointDescr,
vtkPolyData *edges);
00228
void DecimateEdges(
vtkPolyData *edges,
vtkUnsignedCharArray *pointDescr,
00229
double tol2);
00230
void GeneratePolygons(
vtkPolyData *edges,
int numPolys,
vtkPolyData *output,
00231
vtkUnsignedCharArray *polyColors,
00232
vtkUnsignedCharArray *pointDescr);
00233
00234
int GetNeighbors(
unsigned char *ptr,
int &i,
int &j,
int dims[3],
00235
unsigned char *neighbors[4],
int mode);
00236
00237
void GetIJ(
int id,
int &i,
int &j,
int dims[3]);
00238
unsigned char *GetColor(
unsigned char *rgb);
00239
int IsSameColor(
unsigned char *p1,
unsigned char *p2);
00240
00241
private:
00242 vtkImageToPolyDataFilter(
const vtkImageToPolyDataFilter&);
00243
void operator=(
const vtkImageToPolyDataFilter&);
00244 };
00245
00246
#endif
00247