Is it possible to display all MRI images side by side in one VTK , or maybe even QT window? So far I've got all MRI slices from reconstruction in a matrix vector and I can scroll them (write in c++). I don't know if I can put all these images in one window and display them. Below I enclose example image with what i want to achieve. Thanks for any response.
Asked
Active
Viewed 734 times
1 Answers
1
In order to achieve what you want, you can divide it as a series of sequential steps:
- First, you need to scan and read MRI dicom files, which can be done through
vtkDICOMDirectory
andvtkDICOMReader
. - Assuming you have an MRI volume, you can extract each slice through
vtkExtractVOI
, and map this information to avtkImageActor
, which you can add to a renderer. In turn, you need to set the viewport on the renderer, so that you can display images side by side, as you want.
Here is a small example, please adapt it to your needs:
//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;
}
References:

MrPedru22
- 1,324
- 1
- 13
- 28