Overlay two images

Hello,

I have two medical scans in the .nrrd (and optional .nii) format and open them with simpleITK and vtkReader as vtkImageData. The first one is an MRI of the brain and the other is a segmented tumor. They both have the same extent and origin. I would like to overlay these two images. To show the first image I use vtkViewImage2D::SetImage(image).
How can I show the second image on top of the other one (in the best case colored in red)?
I tried vtkImageView::SetMaskImage(image, lut) and vtkImageView::SetOverlappingImage(image) but both did not work and nothing is shown.
I’m thankful for any help and advice!

if (_image_opened == true) {
cout << " there is already one image open" << endl;
addFile(); //addFile() openens the iamge the same way but this time it is the mask image.
}
else {
QFileDialog* fd = new QFileDialog(this, “Open Image”, 0, 0);
fd->setStyleSheet(“font-weight: bold; color: white”);
fd->setFileMode(QFileDialog::AnyFile);
fd->setViewMode(QFileDialog::Detail);
fd->setNameFilter(tr(“NRRD (.nrrd);; NII (.nii);; MHD (*.mhd *.mha)”));
fd->show();
if (fd->exec() == QDialog::Accepted) {
QStringList fileName = fd->selectedFiles();
this->ui->comboBox->clear();
for (int i = 0; i < fileName.size(); i++){
_Images[i] = vtkImageData::New();
// Read input
sitk::ImageFileReader reader;
reader.SetFileName(fileName[i].toStdString());
sitk::Image image = reader.Execute();
image = sitk::Cast(image, sitk::sitkFloat32);
_ImagesOriginal[i] = image;
std::vector im_size = image.GetSize();
std::vector im_origin = image.GetOrigin();
std::vector im_spacing = image.GetSpacing();
vtkSmartPointervtkreader=vtkSmartPointer::New();
vtkreader->SetWholeExtent(0, im_size[0] - 1, 0, im_size[1] - 1, 0, im_size[2] - 1);
vtkreader->SetDataExtent(0, im_size[0] - 1, 0, im_size[1] - 1, 0, im_size[2] - 1);
vtkreader->SetDataOrigin(im_origin[0], im_origin[1], im_origin[2]);
vtkreader->SetDataSpacing(im_spacing[0], im_spacing[1], im_spacing[2]);
sitk::PixelIDValueEnum pixel_type = image.GetPixelID();
switch (pixel_type){
case sitk::sitkUInt8:{
vtkreader->SetDataScalarType(VTK_UNSIGNED_CHAR);
uint8_t out = image.GetBufferAsUInt8();
vtkreader->SetImportVoidPointer((void
)out, im_size[0] * im_size[1] * im_size[2] * sizeof(char));
break;
}
case sitk::sitkInt8:{
int8_t out = image.GetBufferAsInt8();
vtkreader->SetImportVoidPointer((void
)out, im_size[0] * im_size[1] * im_size[2] * sizeof(char));
vtkreader->SetDataScalarType(VTK_CHAR);
break;
}
case sitk::sitkUInt16:{
uint16_t out = image.GetBufferAsUInt16();
vtkreader->SetImportVoidPointer((void
)out, im_size[0] * im_size[1] * im_size[2] * sizeof(unsigned short));
vtkreader->SetDataScalarType(VTK_UNSIGNED_SHORT);
break;
}
case sitk::sitkInt16:{
int16_t out = image.GetBufferAsInt16();
vtkreader->SetImportVoidPointer((void
)out, im_size[0] * im_size[1] * im_size[2] * sizeof(short));
vtkreader->SetDataScalarType(VTK_SHORT);
break;
}
case sitk::sitkInt32:{
int32_t out = image.GetBufferAsInt32();
vtkreader->SetImportVoidPointer((void
)out, im_size[0] * im_size[1] * im_size[2] * sizeof(int));
vtkreader->SetDataScalarType(VTK_INT);
break;
}
case sitk::sitkUInt32:{
uint32_t out = image.GetBufferAsUInt32();
vtkreader->SetImportVoidPointer((void
)out, im_size[0] * im_size[1] * im_size[2] * sizeof(unsigned int));
vtkreader->SetDataScalarType(VTK_UNSIGNED_INT);
break;
}
case sitk::sitkFloat32:{
float out = image.GetBufferAsFloat();
vtkreader->SetImportVoidPointer((void
)out, im_size[0] * im_size[1] * im_size[2] * sizeof(float));
vtkreader->SetDataScalarType(VTK_FLOAT);
break;
}
default:
std::cout << "unsupported image type: " << pixel_type << std::endl;
break;
}
vtkreader->Update();
_Images[i]->DeepCopy(vtkreader->GetOutput());
_Images[i]->SetOrigin(im_size[0] * im_spacing[0] * -0.5, im_size[1] * im_spacing[1] * -0.5, im_size[2] * im_spacing[2] * -0.5);
}
this->ui->comboBox->addItems(fileName);
// init 2D and 3D view
_view1->SetImage(_Images[0]);
_view2->SetImage(_Images[0]);
_view3->SetImage(_Images[0]);
_view4->SetImage(_Images[0]);
Initialize();
_view4->SetRenderingModeToPlanar();
_view1->SyncResetCurrentPoint();
_view1->SyncResetWindowLevel();