37 #include "vtkExtractVOI.h"
40 #include "vtkMarchingSquares.h"
42 #include "vtkStripper.h"
43 #include "vtkCellArray.h"
45 #include "vtkContourFilter.h"
46 #include "vtkFeatureEdges.h"
47 #include "vtkFillHolesFilter.h"
48 #include "vtkPolyDataConnectivityFilter.h"
49 #include "vtkWindowedSincPolyDataFilter.h"
56 #include "vtkDecimatePro.h"
64 :
QObject( iParent ), m_Decimate(true),
65 m_NumberOfPoints(100), m_AlgoWidget(NULL)
84 std::vector<vtkImageData*>
86 const std::vector<double>& iBounds,
87 const std::vector< vtkSmartPointer< vtkImageData > > & iImages)
89 assert( iBounds.size() == 6 );
92 std::vector<vtkImageData*> listOfImages;
95 std::vector< vtkSmartPointer< vtkImageData > >::const_iterator
98 while( it != iImages.end())
112 const vtkSmartPointer< vtkImageData > & iImage)
115 assert( iBounds.size() == 6 );
118 iImage->GetOrigin( org );
121 iImage->GetSpacing( spacing );
123 std::vector< int > bounds_idx(6);
126 for(
int i = 0; i < 3; i++ )
128 bounds_idx[k] = vtkMath::Round( ( iBounds[k] - org[i] ) / spacing[i] );
130 bounds_idx[k] = vtkMath::Round( ( iBounds[k] - org[i] ) / spacing[i] );
134 vtkSmartPointer<vtkExtractVOI> extractVOI =
135 vtkSmartPointer<vtkExtractVOI>::New();
136 extractVOI->SetInput( iImage );
137 extractVOI->SetVOI( bounds_idx[0], bounds_idx[1],
138 bounds_idx[2], bounds_idx[3],
139 bounds_idx[4], bounds_idx[5]);
140 extractVOI->Update();
142 vtkImageData* temp_image = vtkImageData::New();
143 temp_image->DeepCopy( extractVOI->GetOutput() );
150 std::vector<vtkPolyData*>
153 std::vector<vtkImageData*>& iInputImage,
154 const double & iThreshold)
157 std::vector<vtkPolyData*> listOfPolys;
160 std::vector<vtkImageData*>::iterator it = iInputImage.begin();
162 while( it != iInputImage.end())
165 if( extractedPolyData )
167 listOfPolys.push_back( extractedPolyData );
177 vtkSmartPointer<vtkPolyData>
182 assert( iInputImage );
186 iInputImage->GetExtent( extent );
190 for(
int i = 0; i < 3; i++ )
192 if( extent[2*i] == extent[2*i+1] )
205 std::cout <<
"dimension unknown (Reconstruct polydata)" << std::endl;
216 vtkSmartPointer<vtkPolyData>
218 ExtractContour( vtkSmartPointer<vtkImageData> iInputImage,
const double & iThreshold)
221 vtkSmartPointer<vtkMarchingSquares> contours =
222 vtkSmartPointer<vtkMarchingSquares>::New();
224 contours->SetInput(iInputImage);
225 contours->GenerateValues (1, iThreshold, iThreshold);
233 vtkSmartPointer<vtkPolyData>
241 vtkStripper *stripper = vtkStripper::New();
243 stripper->SetInput(iInputImage);
245 stripper->SetMaximumLength(999);
249 stripper->GetOutput()->GetLines()->InitTraversal();
254 vtkIdType *pts = NULL;
256 stripper->GetOutput()->GetLines()->GetNextCell(npts, pts);
257 vtkPoints *points = vtkPoints::New();
259 vtkCellArray *lines = vtkCellArray::New();
260 vtkIdType * lineIndices =
new vtkIdType[
static_cast< int >( npts + 1 )];
262 for (
int k = 0; k < static_cast< int >( npts ); k++ )
264 points->InsertPoint( k, stripper->GetOutput()->GetPoints()->GetPoint(pts[k]) );
268 lineIndices[
static_cast< int >( npts )] = 0;
269 lines->InsertNextCell(npts + 1, lineIndices);
270 delete[] lineIndices;
272 vtkSmartPointer<vtkPolyData> output = vtkSmartPointer<vtkPolyData>::New();
273 output->SetPoints(points);
274 output->SetLines(lines);
280 vtkPolyData* output2 = vtkPolyData::New();
281 output2->DeepCopy(output);
289 vtkSmartPointer<vtkPolyData>
291 ExtractMesh(vtkSmartPointer<vtkImageData> iInputImage,
const double & iThreshold)
293 vtkSmartPointer< vtkContourFilter > contours = vtkSmartPointer< vtkContourFilter >::New();
294 contours->SetInput(iInputImage);
295 contours->SetComputeGradients(0);
296 contours->SetComputeNormals(0);
297 contours->SetComputeScalars(0);
298 contours->SetNumberOfContours(1);
299 contours->SetValue(0, iThreshold);
302 std::cout <<
"Number Of Points: " << iInputImage->GetNumberOfPoints()
305 vtkSmartPointer< vtkFeatureEdges > feature =
306 vtkSmartPointer< vtkFeatureEdges >::New();
307 feature->SetInputConnection( contours->GetOutputPort() );
308 feature->BoundaryEdgesOn();
309 feature->FeatureEdgesOff();
310 feature->NonManifoldEdgesOn();
311 feature->ManifoldEdgesOff();
314 vtkSmartPointer< vtkFillHolesFilter > fillFilter =
315 vtkSmartPointer< vtkFillHolesFilter >::New();
317 vtkSmartPointer< vtkPolyDataConnectivityFilter > connectivityFilter =
318 vtkSmartPointer< vtkPolyDataConnectivityFilter >::New();
319 connectivityFilter->SetExtractionModeToLargestRegion();
322 if ( feature->GetOutput()->GetNumberOfCells() > 0 )
325 fillFilter->SetInputConnection( contours->GetOutputPort() );
326 fillFilter->Update();
328 connectivityFilter->SetInputConnection( fillFilter->GetOutputPort() );
332 connectivityFilter->SetInputConnection( contours->GetOutputPort() );
336 connectivityFilter->Update();
358 vtkPolyData* output = vtkPolyData::New();
359 output->DeepCopy( connectivityFilter->GetOutput() );
366 vtkSmartPointer<vtkPolyData>
369 vtkSmartPointer<vtkPolyData>& iPolyData,
370 const unsigned int& iNumberOfPoints)
379 double* bounds = iPolyData->GetBounds();
382 for(
int i = 0; i < 3; i++ )
384 if( bounds[2*i] == bounds[2*i+1] )
397 itkGenericExceptionMacro( <<
"dimension unknown (Reconstruct polydata)" );
405 vtkSmartPointer<vtkPolyData>
407 DecimateContour( vtkSmartPointer<vtkPolyData> iPolyData,
unsigned int iNumberOfPoints)
410 unsigned int numberOfPoints = iPolyData->GetNumberOfPoints();
412 double target = 1 - (double)iNumberOfPoints/(
double)numberOfPoints;
414 vtkSmartPointer<vtkPolylineDecimation> decimator =
415 vtkSmartPointer<vtkPolylineDecimation>::New();
416 decimator->SetInput(iPolyData);
417 decimator->SetTargetReduction(target);
420 return decimator->GetOutput();
425 vtkSmartPointer<vtkPolyData>
427 DecimateMesh( vtkSmartPointer<vtkPolyData> iPolyData,
unsigned int iNumberOfPoints)
430 unsigned int numberOfPoints = iPolyData->GetNumberOfPoints();
432 double target = 1 - (double)iNumberOfPoints/(
double)numberOfPoints;
434 vtkSmartPointer<vtkDecimatePro> decimator =
435 vtkSmartPointer<vtkDecimatePro>::New();
436 decimator->SetInput(iPolyData);
437 decimator->SetTargetReduction(target);
444 return decimator->GetOutput();
virtual ~QGoSegmentationAlgo()
vtkSmartPointer< vtkPolyData > ReorganizeContour(vtkSmartPointer< vtkPolyData > iInputImage)
QGoAlgorithmWidget * m_AlgoWidget
vtkSmartPointer< vtkPolyData > DecimateContour(vtkSmartPointer< vtkPolyData > iPolyData, unsigned int iNumberOfPoints)
unsigned int GetNumberOfPoints() const
std::vector< vtkPolyData * > ExtractPolyData(std::vector< vtkImageData * > &iInputImage, const double &iThreshold)
std::vector< vtkImageData * > VTKExtractROI(const std::vector< double > &iBounds, const std::vector< vtkSmartPointer< vtkImageData > > &iImages)
return the vtkpolydata created by the algorithm
vtkSmartPointer< vtkPolyData > DecimatePolyData(vtkSmartPointer< vtkPolyData > &iPolyData, const unsigned int &iNumberOfPoints)
vtkSmartPointer< vtkPolyData > DecimateMesh(vtkSmartPointer< vtkPolyData > iPolyData, unsigned int iNumberOfPoints)
unsigned int m_NumberOfPoints
QGoAlgorithmWidget * GetAlgoWidget()
return the algowidget
void SetNumberOfPoints(const unsigned int &iNumberOfPoints)
QGoSegmentationAlgo(QWidget *iParent=0)
vtkSmartPointer< vtkPolyData > ExtractContour(vtkSmartPointer< vtkImageData > iInputImage, const double &iThreshold)
vtkSmartPointer< vtkPolyData > ExtractMesh(vtkSmartPointer< vtkImageData > iInputImage, const double &iThreshold)
void SetDecimate(bool &iDecimate)