vtk vtkPolyData 转 vtkImageData

 

 一、利用相应 api

  // Convert the image to a polydata
  vtkNew imageDataGeometryFilter;
  imageDataGeometryFilter->SetInputConnection(source1->GetOutputPort());
  imageDataGeometryFilter->Update();
    vtkNew filter;

    filter->SetInputConnection(reader->GetOutputPort());
    filter->SetOutputStyleToPolygonalize();
    filter->SetError(0);
    filter->DecimationOn();
    filter->SetDecimationError(0.0);
    filter->SetSubImageSize(25);
 
    vtkNew triFilter;
    triFilter->SetInputConnection(filter->GetOutputPort());
    vtkPolyData* poly = triFilter->GetOutput();
 

 二、自己处理实现



vtkSmartPointer polyDataToImageData(vtkSmartPointer polydata)
	{
		vtkSmartPointer imageData = vtkSmartPointer::New();
		double bounds[6];
		polydata->GetBounds(bounds);
		double spacing[3]; // desired volume spacing
		spacing[0] = 0.5;
		spacing[1] = 0.5;
		spacing[2] = 0.5;
		imageData->SetSpacing(spacing);

		// compute dimensions
		int dim[3];
		for (int i = 0; i < 3; i++)
		{
			dim[i] = static_cast(ceil((bounds[i * 2 + 1] - bounds[i * 2]) / spacing[i]));
		}
		imageData->SetDimensions(dim);
		imageData->SetExtent(0, dim[0] - 1, 0, dim[1] - 1, 0, dim[2] - 1);

		double origin[3];
		origin[0] = bounds[0] + spacing[0] / 2;
		origin[1] = bounds[2] + spacing[1] / 2;
		origin[2] = bounds[4] + spacing[2] / 2;
		imageData->SetOrigin(origin);

#if VTK_MAJOR_VERSION <= 5
		whiteImage->SetScalarTypeToUnsignedChar();
		whiteImage->AllocateScalars();
#else
		imageData->AllocateScalars(VTK_UNSIGNED_CHAR, 1);
#endif
		// fill the image with foreground voxels:
		unsigned char inval = 255;
		unsigned char outval = 0;
		vtkIdType count = imageData->GetNumberOfPoints();
		for (vtkIdType i = 0; i < count; ++i)
		{
			imageData->GetPointData()->GetScalars()->SetTuple1(i, inval);
		}

		//polygonal data --> image stencil:
		vtkSmartPointer pdtoImageStencil = vtkSmartPointer::New();
		pdtoImageStencil->SetInputData(polydata);
		pdtoImageStencil->SetOutputOrigin(origin);
		pdtoImageStencil->SetOutputSpacing(spacing);
		pdtoImageStencil->SetOutputWholeExtent(imageData->GetExtent());
		pdtoImageStencil->Update();

		//cut the corresponding white image and set the background:
		vtkSmartPointer imageStencil = vtkSmartPointer::New();
		imageStencil->SetInputData(imageData);
		imageStencil->SetStencilConnection(pdtoImageStencil->GetOutputPort());
		imageStencil->ReverseStencilOff();
		imageStencil->SetBackgroundValue(outval);
		imageStencil->Update();

		imageData->DeepCopy(imageStencil->GetOutput());
		return imageData;
	}

你可能感兴趣的:(VTK,vtk)