填充三角面片的内部空间 vtkpolydata 转换为vtkimageData

vtkSmartPointer<vtkImageData> polyDataToImageData(vtkSmartPointer<vtkPolyData> polydata, vtkSmartPointer<vtkImageData> imageData)
{
    double origin[3];
    double spacing[3]; // desired volume spacing
    if (imageData)
    {
        imageData->GetOrigin(origin);
        imageData->GetSpacing(spacing);
    }else
    {
        imageData = vtkSmartPointer<vtkImageData>::New();
        double bounds[6];
        polydata->GetBounds(bounds);
        
        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);

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

        imageData->AllocateScalars(VTK_UNSIGNED_CHAR, 1);

        // fill the image with foreground voxels:
        unsigned char inval = 1;
        
        vtkIdType count = imageData->GetNumberOfPoints();
        for (vtkIdType i = 0; i < count; ++i)
        {
            imageData->GetPointData()->GetScalars()->SetTuple1(i, inval);
        }
    }
    unsigned char outval = 0;

    //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;
};
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值