vtk vtkPolyData 转 vtkImageData

 

 一、利用相应 api

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

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

 二、自己处理实现



vtkSmartPointer<vtkImageData> polyDataToImageData(vtkSmartPointer<vtkPolyData> polydata)
	{
		vtkSmartPointer<vtkImageData> imageData = vtkSmartPointer<vtkImageData>::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<int>(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<vtkPolyDataToImageStencil> pdtoImageStencil = vtkSmartPointer<vtkPolyDataToImageStencil>::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<vtkImageStencil> imageStencil = vtkSmartPointer<vtkImageStencil>::New();
		imageStencil->SetInputData(imageData);
		imageStencil->SetStencilConnection(pdtoImageStencil->GetOutputPort());
		imageStencil->ReverseStencilOff();
		imageStencil->SetBackgroundValue(outval);
		imageStencil->Update();

		imageData->DeepCopy(imageStencil->GetOutput());
		return imageData;
	}
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恋恋西风

up up up

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值