3D-бинарное изображение в 3D-сетку с использованием itk

MGM спросил: 11 июня 2018 в 10:55 в: itk

Я пытаюсь создать 3d-сетку, используя трехмерную двоичную маску RLE. В itk я нахожу класс с именем itkBinaryMask3DMeshSourceit на основе алгоритмического примера MarchingCubes, используйте этот класс ExtractIsoSurface et ExtractIsoSurface

в моем случае , У меня есть трехмерная трехмерная бинарная маска, но представленная в 1d векторном формате. Я пишу функцию для этой задачи.

Моя функция принимает в качестве параметров:

  1. Входы: crle 1d vector (вычисляемый rle), размер Int3
  2. Выход: координаты + координаты (или генерируют один файл, содержащий оба этих массива, а затем я могу использовать их для визуализации сетки)

как первый шаг, я декодировал этот вычисленный rle.next, я использую imageIterator для создания изображения, совместимого с BinaryMask3DMeshSource.

Я заблокирован на последнем шаге.

Это мой код:

void GenerateMeshFromCrle(const std::vector<int>& crle, const Int3 & dim,
        std::vector<float>* coords, std::vector<int>*coord_indices, int* nodes,
        int* cells, const char* outputmeshfile) {    std::vector<int> mask(crle.back());
    CrleDecode(crle, mask.data());    //  here we define our itk Image type with a 3 dimension
    using ImageType = itk::Image< unsigned char, 3 >;
    ImageType::Pointer image = ImageType::New();    // an Image is defined by start index and size for each axes
    // By default, we set the first start index from x=0,y=0,z=0
    ImageType::IndexType start;
    start[0] = 0;  // first index on X
    start[1] = 0;  // first index on Y
    start[2] = 0;  // first index on Z    // until here, no problem    // We set the image size on x,y,z from the dim input parameters
    // itk takes Z Y X
    ImageType::SizeType size;
    size[0] = dim.z;  // size along X
    size[1] = dim.y;  // size along Y
    size[2] = dim.x;  // size along Z    ImageType::RegionType region;
    region.SetSize(size);
    region.SetIndex(start);    image->SetRegions(region);
    image->Allocate();    // Set the pixels to value from rle
    // This is a fast way
    itk::ImageRegionIterator<ImageType> imageIterator(image, region);    int n = 0;
    while (!imageIterator.IsAtEnd() && n < mask.size()) {
        // Set the current pixel to the value from rle
        imageIterator.Set(mask[n]);
        ++imageIterator;
        ++n;
    }    // In this step, we launch itkBinaryMask3DMeshSource    using BinaryThresholdFilterType = itk::BinaryThresholdImageFilter< ImageType, ImageType >;
    BinaryThresholdFilterType::Pointer threshold =
            BinaryThresholdFilterType::New();
    threshold->SetInput(image->GetOutput()); // here it's an error, since no GetOutput member for image
    threshold->SetLowerThreshold(0);
    threshold->SetUpperThreshold(1);
    threshold->SetOutsideValue(0);    using MeshType = itk::Mesh< double, 3 >;    using FilterType = itk::BinaryMask3DMeshSource< ImageType, MeshType >;
    FilterType::Pointer filter = FilterType::New();
    filter->SetInput(threshold->GetOutput());
    filter->SetObjectValue(1);    using WriterType = itk::MeshFileWriter< MeshType >;
    WriterType::Pointer writer = WriterType::New();
    writer->SetFileName(outputmeshfile);
    writer->SetInput(filter->GetOutput());
}

любая идея

Я ценю ваше время.

0 ответов