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