# Overlay two images

**URL:** https://discourse.vtk.org/t/overlay-two-images/2412
**Category:** Support
**Created:** [January 11, 2020, 3:32pm UTC](https://discourse.vtk.org/t/overlay-two-images/2412 "2020-01-11T15:32:05Z")
**Posts on this page:** 1
**Page:** 1

<div class="post-metadata">

### Author: ![Hello\_World](https://discourse.vtk.org/letter_avatar_proxy/v4/letter/h/ac91a4/32.png) [@Hello\_World](https://discourse.vtk.org/u/Hello_World)
#### Post date: [January 11, 2020, 3:32pm UTC](https://discourse.vtk.org/t/overlay-two-images/2412/1 "2020-01-11T15:32:05Z")

</div>

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();
