ITK Фильтр на массиве поплавков - PullRequest
1 голос
/ 07 апреля 2020

Я хочу использовать ITK для фильтрации трехмерного тома, находящегося в непрерывном массиве с плавающей точкой. Я хочу применить фильтр потока кривизны, как показано в этом примере .

Я не знаю, как связать массив float с ITK, а затем вывести массив float на другой сторона. Будет ли это изменить данные на месте? Как это работает?

Вот код, демонстрирующий то, что я пытаюсь сделать.

#include "itkCurvatureFlowImageFilter.h"

int main(int argc, char *argv[])
{
    float *my_array; // I have an array I have generated elsewhere
    // This is a 3D volume in order XYZ with these dimensions along each axis
    size_t num_x = 125;
    size_t num_y = 250;
    size_t num_z = 125;
    size_t num_elements = num_x * num_y * num_z;
    float voxel_size = 8e-3; // 8 mm voxels

    constexpr unsigned int Dimension = 3;

    // convert to an itk image
    // itkimage = ???

    using InputPixelType = float;
    using InputImageType = itk::Image<InputPixelType, Dimension>;

    const int numberOfIterations = 10;
    const InputPixelType timeStep = 0.05;


    using FilterType = itk::CurvatureFlowImageFilter<InputImageType, InputImageType>;
    FilterType::Pointer filter = FilterType::New();
    filter->SetInput(itkimage);
    filter->SetNumberOfIterations(numberOfIterations);
    filter->SetTimeStep(timeStep);

    // now I want to put the filter result back in th array
    filter->GetOutput();
    // Is the data modified in place? How can I get a regular float array out??

    return EXIT_SUCCESS;
}

1 Ответ

1 голос
/ 07 апреля 2020

itk :: ImportImageFilter используется для представления некоторого массива в виде изображения. Посмотрите на примеры, ссылки на которые приведены в документации.

Поскольку CurvatureFlowImageFilter является производным от InPlaceImageFilter, и ваш тип входного и выходного пикселей одинаковый (с плавающей запятой), он может работать на месте. Но вам все равно нужно запросить:

itkimage = import...;
...
filter->SetInput(itkimage );
// set other parameters
filter->SetInPlace(true);
filter->Update();
itkimage = filter->GetOutput();
...