34 #ifndef __QGoSegmentationAlgo_h
35 #define __QGoSegmentationAlgo_h
38 #include "QGoGUILibConfigure.h"
39 #include "vtkSmartPointer.h"
40 #include "vtkPolyData.h"
41 #include "vtkImageData.h"
42 #include "QGoGUILibConfigure.h"
46 #include "itkVTKImageImport.h"
47 #include "vtkImageExport.h"
54 #include "itkRegionOfInterestImageFilter.h"
57 #include "itkExtractImageFilter.h"
60 #include "itkChangeInformationImageFilter.h"
98 std::vector<vtkImageData*> VTKExtractROI(
99 const std::vector<double>& iBounds,
100 const std::vector< vtkSmartPointer< vtkImageData > >& iImages);
107 vtkImageData* VTKExtractROI(
108 const std::vector<double>& iBounds,
109 const vtkSmartPointer< vtkImageData > & iImage);
120 template<
class PixelType,
unsigned int VImageDimension >
121 typename itk::Image< PixelType, VImageDimension >::Pointer
128 vtkSmartPointer<vtkImageExport> exporter =
129 vtkSmartPointer<vtkImageExport>::New();
130 exporter->SetInput(iInput);
134 typedef itk::Image< PixelType, VImageDimension > ImageType;
136 typedef itk::VTKImageImport< ImageType > ImageImportType;
137 typedef typename ImageImportType::Pointer ImageImportPointer;
138 ImageImportPointer importer = ImageImportType::New();
140 ConnectPipelines< vtkImageExport, ImageImportPointer >(
144 typename ImageType::Pointer itkImage = importer->GetOutput();
145 itkImage->DisconnectPipeline();
159 template<
class PixelType,
unsigned int VImageDimension >
161 ConvertITK2VTK(
typename itk::Image< PixelType, VImageDimension >::Pointer iInput)
163 typedef itk::Image< PixelType, VImageDimension > InternalImageType;
165 typedef typename ConverterType::Pointer ConverterPointer;
167 ConverterPointer converter = ConverterType::New();
168 converter->SetInput(iInput);
174 catch (itk::ExceptionObject & err)
176 std::cerr <<
"converter Exception:" << err << std::endl;
179 vtkImageData* output_image = vtkImageData::New();
180 output_image->DeepCopy( converter->GetOutput() );
186 template<
class PixelType,
unsigned int VImageDimension >
187 typename itk::Image< PixelType, VImageDimension >::Pointer
189 const std::vector< double > & iBounds,
190 typename itk::Image< PixelType, VImageDimension >::Pointer iInput )
192 typedef itk::Image< PixelType, VImageDimension > ImageType;
193 typedef typename ImageType::PointType ImagePointType;
194 typedef typename ImageType::IndexType ImageIndexType;
195 typedef typename ImageType::IndexValueType ImageIndexValueType;
196 typedef typename ImageType::SizeType ImageSizeType;
197 typedef typename ImageType::SizeValueType ImageSizeValueType;
198 typedef typename ImageType::RegionType ImageRegionType;
199 typedef typename ImageType::SpacingType ImageSpacingType;
201 assert( iBounds.size() == 2 * VImageDimension );
203 if ( iInput.IsNull() )
205 std::cerr <<
"iInput is Null" << std::endl;
208 ImagePointType t_min, t_max;
211 for(
unsigned int dim = 0; dim < VImageDimension; dim++ )
213 t_min[dim] = iBounds[k++];
214 t_max[dim] = iBounds[k++];
217 ImageIndexType startOfROI, endOfROI;
218 iInput->TransformPhysicalPointToIndex( t_min, startOfROI );
219 iInput->TransformPhysicalPointToIndex( t_max, endOfROI );
221 ImageSizeType sizeOfLargeImage =
222 iInput->GetLargestPossibleRegion().GetSize();
227 for(
unsigned int dim = 0; dim < VImageDimension; dim++ )
229 if( startOfROI[dim] < 0 )
233 if( static_cast< ImageSizeValueType >( startOfROI[dim] ) > sizeOfLargeImage[dim] )
235 startOfROI[dim] = sizeOfLargeImage[dim] - 1;
238 if( endOfROI[dim] < 0 )
242 if( static_cast< ImageSizeValueType >( endOfROI[dim] ) > sizeOfLargeImage[dim] )
244 endOfROI[dim] = sizeOfLargeImage[dim] - 1;
247 if( endOfROI[dim] - startOfROI[dim] < 0 )
253 size[dim] = endOfROI[dim] - startOfROI[dim];
257 ImageRegionType region;
258 region.SetSize(size);
259 region.SetIndex(startOfROI);
261 typedef itk::RegionOfInterestImageFilter< ImageType, ImageType > ROIFilterType;
262 typedef typename ROIFilterType::Pointer ROIFilterPointer;
264 ROIFilterPointer roi = ROIFilterType::New();
265 roi->SetInput(iInput);
266 roi->SetRegionOfInterest(region);
271 catch (itk::ExceptionObject & err)
273 std::cerr <<
"roi Exception:" << err << std::endl;
275 return roi->GetOutput();
278 template<
class PixelType>
279 typename itk::Image< PixelType, 2>::Pointer
281 const std::vector< double > & iBounds,
282 typename itk::Image< PixelType, 3 >::Pointer iInput )
284 typedef itk::Image< PixelType, 3 > InputImageType;
285 typedef itk::Image< PixelType, 2 > OutputImageType;
287 typedef typename InputImageType::PointType ImagePointType;
288 typedef typename InputImageType::IndexType ImageIndexType;
289 typedef typename InputImageType::IndexValueType ImageIndexValueType;
290 typedef typename InputImageType::SizeType ImageSizeType;
291 typedef typename InputImageType::SizeValueType ImageSizeValueType;
292 typedef typename InputImageType::RegionType ImageRegionType;
293 typedef typename InputImageType::SpacingType ImageSpacingType;
295 typedef typename OutputImageType::PointType oImagePointType;
296 typedef typename OutputImageType::OffsetType oImageOffsetType;
298 ImagePointType t_min, t_max;
299 oImagePointType new_origin;
303 for(
unsigned int dim = 0; dim < 3; dim++ )
305 t_min[dim] = iBounds[k++];
306 t_max[dim] = iBounds[k++];
309 ImageIndexType startOfROI, endOfROI;
310 iInput->TransformPhysicalPointToIndex( t_min, startOfROI );
311 iInput->TransformPhysicalPointToIndex( t_max, endOfROI );
313 ImageSizeType sizeOfLargeImage =
314 iInput->GetLargestPossibleRegion().GetSize();
319 oImageOffsetType new_offset;
321 long int* new_offset =
new long int[3];
327 for(
unsigned int dim = 0; dim < 3; dim++ )
329 if( startOfROI[dim] < 0 )
333 if( static_cast< ImageSizeValueType >( startOfROI[dim] ) > sizeOfLargeImage[dim] )
335 startOfROI[dim] = sizeOfLargeImage[dim] - 1;
338 if( endOfROI[dim] < 0 )
342 if( static_cast< ImageSizeValueType >( endOfROI[dim] ) > sizeOfLargeImage[dim] )
344 endOfROI[dim] = sizeOfLargeImage[dim] - 1;
347 size[dim] = endOfROI[dim] - startOfROI[dim];
357 new_origin[l] = t_min[dim];
358 double sizeTest = startOfROI[dim];
359 new_offset[l] = -sizeTest;
364 ImageRegionType region;
365 region.SetSize(size);
366 region.SetIndex(startOfROI);
368 typedef itk::ExtractImageFilter< InputImageType, OutputImageType > FilterType;
369 typedef typename FilterType::Pointer FilterTypePointer;
370 FilterTypePointer filter = FilterType::New();
371 filter->SetExtractionRegion( region );
372 filter->SetInput( iInput );
374 filter->SetDirectionCollapseToIdentity();
381 catch (itk::ExceptionObject & err)
383 std::cerr <<
"extract slice Exception:" << err << std::endl;
387 typedef typename itk::ChangeInformationImageFilter<OutputImageType > CenterFilterType;
388 typedef typename CenterFilterType::Pointer CenterFilterTypePointer;
390 CenterFilterTypePointer center = CenterFilterType::New();
391 center->SetInput(filter->GetOutput());
392 center->ChangeOriginOn();
393 center->SetOutputOrigin(new_origin);
394 center->ChangeRegionOn();
395 center->SetOutputOffset(new_offset);
401 catch (itk::ExceptionObject & err)
403 std::cerr <<
"change information slice Exception:" << err << std::endl;
405 return center->GetOutput();
414 std::vector<vtkPolyData*> ExtractPolyData(
415 std::vector<vtkImageData*>& iInputImage,
416 const double & iThreshold);
423 vtkSmartPointer<vtkPolyData> ExtractPolyData(
424 vtkImageData *iInputImage,
425 const double & iThreshold);
433 vtkSmartPointer<vtkPolyData> DecimatePolyData(
434 vtkSmartPointer<vtkPolyData>& iPolyData,
435 const unsigned int& iNumberOfPoints);
441 void SetDecimate(
bool& iDecimate);
452 void SetNumberOfPoints(
const unsigned int& iNumberOfPoints);
457 unsigned int GetNumberOfPoints()
const;
467 vtkSmartPointer<vtkPolyData> ExtractContour(
468 vtkSmartPointer<vtkImageData> iInputImage,
469 const double & iThreshold);
478 vtkSmartPointer<vtkPolyData> ReorganizeContour(
479 vtkSmartPointer<vtkPolyData> iInputImage);
487 vtkSmartPointer<vtkPolyData> ExtractMesh(
488 vtkSmartPointer<vtkImageData> iInputImage,
489 const double & iThreshold);
497 vtkSmartPointer<vtkPolyData> DecimateContour(
498 vtkSmartPointer<vtkPolyData> iPolyData,
unsigned int iNumberOfPoints);
506 vtkSmartPointer<vtkPolyData> DecimateMesh(
507 vtkSmartPointer<vtkPolyData> iPolyData,
unsigned int iNumberOfPoints);
518 virtual void SetAlgoWidget(
QWidget* iParent = 0) = 0;
523 virtual void DeleteParameters() = 0;
QGoAlgorithmWidget * m_AlgoWidget
abstract class to be the interface between the algorithms for meshes and contours and GoFigure ...
itk::Image< PixelType, VImageDimension >::Pointer ConvertVTK2ITK(vtkImageData *iInput)
Converts an ITK image into a VTK image and plugs a itk data pipeline to a VTK datapipeline.
itk::Image< PixelType, 2 >::Pointer ITKExtractSlice(const std::vector< double > &iBounds, typename itk::Image< PixelType, 3 >::Pointer iInput)
unsigned int m_NumberOfPoints
itk::Image< PixelType, VImageDimension >::Pointer ITKExtractROI(const std::vector< double > &iBounds, typename itk::Image< PixelType, VImageDimension >::Pointer iInput)
Interface between image reader and vtkImageData.
vtkImageData * ConvertITK2VTK(typename itk::Image< PixelType, VImageDimension >::Pointer iInput)