Отображение множества срезов МРТ в одном окне

Можно ли отображать все изображения МРТ рядом в одном VTK, или, может быть, даже в окне QT? До сих пор у меня есть все срезы MRI от реконструкции в матричном векторе, и я могу прокрутить их (напишите в C++). Я не знаю, смогу ли я поместить все эти изображения в одно окно и отобразить их. Ниже я прилагаю пример изображения с тем, чего я хочу достичь. Спасибо за любой ответ.

МРТ ломтики

1 ответ

Чтобы достичь того, чего вы хотите, вы можете разделить его на последовательность последовательных шагов:

  • Во-первых, вам нужно отсканировать и прочитать файлы МРТ dicom, что можно сделать через vtkDICOMDirectory а также vtkDICOMReader,
  • Предполагая, что у вас есть объем МРТ, вы можете извлечь каждый срез через vtkExtractVOIи сопоставьте эту информацию с vtkImageActor, который вы можете добавить к рендереру. В свою очередь, вам нужно установить область просмотра на рендере, чтобы вы могли отображать изображения рядом, как вам угодно.

Вот небольшой пример, пожалуйста, адаптируйте его под свои нужды:

//Use vtkDICOMDirectory to scan a directory with MRI images
vtkSmartPointer<vtkDICOMDirectory> dicomDir = vtkSmartPointer<vtkDICOMDirectory>::New();
dicomDir->SetDirectoryName("**Insert the path to your images here**");
dicomDir->RequirePixelDataOn();
dicomDir->Update();

int n = dicomDir->GetNumberOfSeries();

vtkSmartPointer<vtkDICOMReader> reader = vtkSmartPointer<vtkDICOMReader>::New();

if (n > 0){
    //Read the first series found (just for example)
    reader->SetFileNames(dicomDir->GetFileNamesForSeries(0));
    reader->Update();

    //Get the extent
    vtkImageData* mriVolume = reader->GetOutput();
    mriVolume->GetExtent(mriExtent);
    xmin = mriExtent[0];
    xmax = mriExtent[1];
    ymin = mriExtent[2];
    ymax = mriExtent[3];
    zmin = mriExtent[4];
    zmax = mriExtent[5];

    //Extract a slice of interest
    vtkSmartPointer<vtkExtractVOI> extractSlice = vtkSmartPointer<vtkExtractVOI>::New();
    extractSlice->SetInputData(mriVolume);

    // Define viewport ranges (Adapt here to it covers your entire range of slices. Here we only create 4 viewports, so 4 images in total)
    double xmins[4] = {0,.5,0,.5};
    double xmaxs[4] = {0.5,1,0.5,1};
    double ymins[4] = {0,0,.5,.5};
    double ymaxs[4]= {0.5,0.5,1,1};

    vtkImageData* slice;

    for(unsigned i = 0; i < 4; i++){
        extractSlice->SetVOI(xmin,xmax,ymin,ymax,i,i);
        extractSlice->Update();

        //Get the image data
        slice = extractSlice->GetOutput();

        //Image Actor
        vtkSmartPointer<vtkImageActor> imageActor = vtkSmartPointer<vtkImageActor>::New();
        imageActor->GetMapper()->SetInputData(slice);

        //Add a renderer
        vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
        renderer->SetViewport(xmins[i],ymins[i],xmaxs[i],ymaxs[i]);
        renderer->AddActor(imageActor);
        renderer->ResetCamera();

        //QT+VTK connection (assumes you have a QVTKWidget named mriWidget)
        ui->mriWidget->GetRenderWindow()->AddRenderer(renderer);
        ui->mriWidget->GetRenderWindow()->Render();
    }
} else {
    std::cerr << "No DICOM images in directory!" << std::endl;
}

Рекомендации:

Другие вопросы по тегам