使用 vtkPolyDataToImageStencil 为自定义体积体素着色

问题描述 投票:0回答:0

我创建了一个 3D 多数据套索,然后我使用 vtkPolyDataToImageStencil 将其转换为 ImageStencil。 我有一个自定义体积,我有它的短数据,它有宽度、高度、深度。现在我想为由多数据标记的体积中的体素着色。 我检查当前图像模板的值是否为白色,然后我将体素标记为白色,但它不起作用。 我看到结果是一个立方体!

这就是应用套索后的结果

完整的流水线代码:

finalPolyData->SetPoints(closedSurfacePoints.GetPointer());
finalPolyData->SetStrips(closedSurfaceStrips.GetPointer());
finalPolyData->SetPolys(closedSurfacePolys.GetPointer());
//ActorFinalPolyData->VisibilityOn();


vtkNew<vtkImageData> whiteImage;
double bounds[6];
finalPolyData->GetBounds(bounds);
double spacing[3]; // desired volume spacing
spacing[0] = 0.5;
spacing[1] = 0.5;
spacing[2] = 0.5;
whiteImage->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]));
}
whiteImage->SetDimensions(dim);
whiteImage->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;
whiteImage->SetOrigin(origin);
whiteImage->AllocateScalars(VTK_UNSIGNED_CHAR, 1);

// fill the image with foreground voxels:
unsigned char inval = 255;
unsigned char outval = 0;
vtkIdType count = whiteImage->GetNumberOfPoints();
for (vtkIdType i = 0; i < count; ++i)
{
    whiteImage->GetPointData()->GetScalars()->SetTuple1(i, inval);
}
// polygonal data --> image stencil:
vtkNew<vtkPolyDataToImageStencil> pol2stenc;
pol2stenc->SetInputData(finalPolyData);
pol2stenc->SetOutputOrigin(origin);
pol2stenc->SetOutputSpacing(spacing);
pol2stenc->SetOutputWholeExtent(whiteImage->GetExtent());
pol2stenc->Update();

// cut the corresponding white image and set the background:
imgstenc->SetInputData(whiteImage);
imgstenc->SetStencilConnection(pol2stenc->GetOutputPort());
imgstenc->ReverseStencilOff();
imgstenc->SetBackgroundValue(outval);
imgstenc->Update();


vtkNew<vtkMetaImageWriter> imageWriter;
imageWriter->SetFileName("labelImage.mhd");
imageWriter->SetInputConnection(imgstenc->GetOutputPort());
imageWriter->Write();

DVertex origin_ = mVolume->GetOrigin();
double maSpacing[3]; /// Image spacing
maSpacing[0] = mVolume->GetXSpacing();
maSpacing[1] = mVolume->GetYSpacing();
maSpacing[2] = mVolume->GetZSpacing();
auto mask = std::make_shared<DNA_Mask>(140, mVolume->GetWidth(), mVolume->GetHeight(), mVolume->GetDepth());
mask->SetSpacing(maSpacing[0], maSpacing[1], maSpacing[2]);
mask->SetOrigin(origin_);

vtkImageData* data = imgstenc->GetOutput();
int dims[3];
data->GetDimensions(dims);

//#pragma omp parallel for
short* volumeData = mVolume->GetData().get();
for (int z = 0; z < dims[2]; z++)
{
    for (int y = 0; y < dims[1]; y++)
    {
        for (int x = 0; x < dims[0]; x++)
        {
            unsigned char* pPixel = static_cast<unsigned char*>(data->GetScalarPointer(x, y, z));
            if (*pPixel == 255)
            {   
                int image_linear_index = z * dims[0] * dims[1] + y * dims[0] + x;

                volumeData[image_linear_index] = 255;
            }
        }
    }
}
c++ graphics vtk volume-rendering
© www.soinside.com 2019 - 2024. All rights reserved.