1. Implemented with vtkImageBlend
vtkLookupTable implements the mapping of grayscale images to color images, and vtkImageBlend overlays grayscale images and color images.
The specific code is as follows:
//Segmented image vtkSmartPointer<vtkLookupTable> pColorTable = vtkSmartPointer<vtkLookupTable>::New(); pColorTable->SetNumberOfColors(2); pColorTable->SetTableRange(0, 255); pColorTable->SetTableValue(0, 0.0, 0.0, 0.0, 0.0); pColorTable->SetTableValue(1, 0, 1, 0, 1.0); pColorTable->Build(); vtkSmartPointer<vtkImageMapToColors> colorMap = vtkSmartPointer<vtkImageMapToColors>::New(); colorMap->SetInputData(outImage); colorMap->SetLookupTable(pColorTable); colorMap->Update(); //Original picture vtkSmartPointer<vtkLookupTable> pLookupTable = vtkSmartPointer<vtkLookupTable>::New(); pLookupTable->SetRange(-1000, 3095); pLookupTable->SetValueRange(0.0, 1.0); pLookupTable->SetSaturationRange(0.0, 0.0); pLookupTable->SetRampToLinear(); pLookupTable->Build(); vtkSmartPointer<vtkImageMapToColors> colorMap1 = vtkSmartPointer<vtkImageMapToColors>::New(); colorMap1->SetInputData(inImage); colorMap1->SetLookupTable(pLookupTable); colorMap1->Update(); //merge vtkSmartPointer< vtkImageBlend> imageBlend = vtkSmartPointer<vtkImageBlend>::New(); imageBlend->AddInputData(colorMap1->GetOutput()); imageBlend->AddInputData(colorMap->GetOutput()); imageBlend->SetOpacity(0, 0.8); imageBlend->SetOpacity(1, 0.4); imageBlend->Update();
2. Implemented with vtkImageMask
The specific code is as follows:
// Apply mask vtkNew<vtkImageMask> masker; masker->SetImageInputData(input); //masker->SetMaskInputData(resampledMask); masker->SetMaskInputData(padder->GetOutput()); //masker->SetMaskInputData(mask); masker->SetMaskedOutputValue(fillValue); masker->Update();
The running effect is as follows:
Complete code, displayed using vtkImageViewer2
#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2); VTK_MODULE_INIT(vtkInteractionStyle); VTK_MODULE_INIT(vtkRenderingFreeType); #include "itkImageFileReader.h" #include "itkImageFileWriter.h" #include "itkScalarToRGBPixelFunctor.h" #include "itkUnaryFunctorImageFilter.h" #include "itkVectorGradientAnisotropicDiffusionImageFilter.h" #include "itkWatershedImageFilter.h" #include "itkRescaleIntensityImageFilter.h" #include "itkScalarToRGBColormapImageFilter.h" #include "itkGradientMagnitudeImageFilter.h" #include "itkGradientMagnitudeRecursiveGaussianImageFilter.h" #include "itkImage.h" #include "itkImageFileReader.h"//Read the header file #include "itkGDCMImageIO.h"//ImageIo subclass header file #include "itkImageFileWriter.h" #include "itkNrrdImageIO.h" //Color mapping //#include "itkBinaryImageToLabelMapFilter.h" //#include "itkLabelMapToLabelImageFilter.h" //#include "itkLabelOverlayImageFilter.h" //#include "itkRescaleIntensityImageFilter.h" //#include "itkScalarToRGBColormapImageFilter.h" #include "itkVTKImageToImageFilter.h" #include "itkImageToVTKImageFilter.h" #include <vtkImageBlend.h> #include <vtkLookupTable.h> #include <vtkImageMapToColors.h> #include <vtkImageViewer2.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkInteractorStyleImage.h> #include <vtkTextMapper.h> using namespace std; class StatusMessage { public: static std::string Format(int slice, int maxSlice) { std::stringstream tmp; tmp << "Slice Number " << slice + 1 << "/" << maxSlice + 1; return tmp.str(); } }; // Define own interation style; class myVtkInteractorStyleImage : public vtkInteractorStyleImage { public: static myVtkInteractorStyleImage* New(); vtkTypeMacro(myVtkInteractorStyleImage, vtkInteractorStyleImage); protected: vtkImageViewer2* _ImageViewer; vtkTextMapper* _StatusMapper; int _Slice; int _MinSlice; int _MaxSlice; public: void SetImageViewer(vtkImageViewer2* imageViwer) { _ImageViewer = imageViwer; _MinSlice = imageViwer->GetSliceMin(); _MaxSlice = imageViwer->GetSliceMax(); _Slice = _MinSlice; cout << "Slice : Min = " << _MinSlice << ", Max = " << _MaxSlice << endl; } //void SetStatusMapper(vtkTextMapper* statusMapper) //{ // _StatusMapper = statusMapper; //} protected: void MoveSliceForward() { if (_Slice < _MaxSlice) { _Slice + = 1; cout << " MoveSliceForward::Slice = " << _Slice << endl; _ImageViewer->SetSlice(_Slice); // std::string msg = StatusMessage::Format(_Slice, _MaxSlice); // _StatusMapper->SetInput(msg.c_str()); _ImageViewer->Render(); } } void MoveSliceBackward() { if (_Slice > _MinSlice) { _Slice -= 1; cout << "MoveSliceBackward::Slice = " << _Slice << endl; _ImageViewer->SetSlice(_Slice); // std::string msg = StatusMessage::Format(_Slice, _MaxSlice); // _StatusMapper->SetInput(msg.c_str()); _ImageViewer->Render(); } } virtual void OnKeyDown() { string key = this->GetInteractor()->GetKeySym(); if (key.compare("Up") == 0) { MoveSliceForward(); } else if (key.compare("Down") == 0) { MoveSliceBackward(); } vtkInteractorStyleImage::OnKeyDown(); } virtual void OnMouseWheelForward() { MoveSliceForward(); } virtual void OnMouseWheelBackward() { if (_Slice > _MinSlice) { MoveSliceBackward(); } } }; vtkStandardNewMacro(myVtkInteractorStyleImage); int main() { typedef float InternalPixelType; const unsigned int Dimension = 3; typedef itk::Image< InternalPixelType, Dimension > InternalImageType; typedef int OutputPixelType; typedef itk::Image< OutputPixelType, Dimension > OutputImageType; //Image reading and image writing type definitions typedef itk::ImageFileReader<OutputImageType>ReaderType; //Image reading and image writing object instantiation ReaderType::Pointer nrrdReader = ReaderType::New(); typedef itk::NrrdImageIO ImageIOType; ImageIOType::Pointer nnrdImageIO = ImageIOType::New();//Create gdcmImageIO object nrrdReader->SetImageIO(nnrdImageIO); //reader->SetFileName( "BrainProtonDensitySlice.png" ); nrrdReader->SetFileName("colormapImageFilter.nrrd"); nrrdReader->Update(); ReaderType::Pointer reader = ReaderType::New(); typedef itk::GDCMImageIO GImageIOType; GImageIOType::Pointer gdcmImageIO = GImageIOType::New();//Create gdcmImageIO object reader->SetImageIO(gdcmImageIO); reader->SetFileName("C:/I3.dcm"); reader->Update(); typedef itk::VTKImageToImageFilter<OutputImageType> vtkToitkFilterType; typedef itk::ImageToVTKImageFilter<OutputImageType> itkTovtkFilterType; //convert original image to vtk itkTovtkFilterType::Pointer itkTovtkImageFilter = itkTovtkFilterType::New(); itkTovtkImageFilter->SetInput(reader->GetOutput());//Set image data from ITK to VTK itkTovtkImageFilter->Update(); itkTovtkFilterType::Pointer itkTovtkImageFilter1 = itkTovtkFilterType::New(); itkTovtkImageFilter1->SetInput(nrrdReader->GetOutput());//Set image data from ITK to VTK itkTovtkImageFilter1->Update(); vtkSmartPointer<vtkLookupTable> pColorTable = vtkSmartPointer<vtkLookupTable>::New(); pColorTable->SetNumberOfColors(2); pColorTable->SetTableRange(0, 1); pColorTable->SetTableValue(0, 0.0, 0.0, 0.0, 0.0); pColorTable->SetTableValue(1, 0, 1, 0, 1.0); pColorTable->Build(); vtkSmartPointer<vtkImageMapToColors> colorMap = vtkSmartPointer<vtkImageMapToColors>::New(); colorMap->SetInputData(itkTovtkImageFilter1->GetOutput()); colorMap->SetLookupTable(pColorTable); colorMap->Update(); vtkSmartPointer<vtkLookupTable> pLookupTable = vtkSmartPointer<vtkLookupTable>::New(); pLookupTable->SetRange(-1000, 3095); pLookupTable->SetValueRange(0.0, 1.0); pLookupTable->SetSaturationRange(0.0, 0.0); pLookupTable->SetRampToLinear(); pLookupTable->Build(); vtkSmartPointer<vtkImageMapToColors> colorMap1 = vtkSmartPointer<vtkImageMapToColors>::New(); colorMap1->SetInputData(itkTovtkImageFilter->GetOutput()); colorMap1->SetLookupTable(pLookupTable); colorMap1->Update(); vtkSmartPointer< vtkImageBlend> imageBlend = vtkSmartPointer<vtkImageBlend>::New(); imageBlend->AddInputData(colorMap1->GetOutput()); imageBlend->AddInputData(colorMap->GetOutput()); imageBlend->SetOpacity(0, 0.8); imageBlend->SetOpacity(1, 0.4); imageBlend->Update(); vtkSmartPointer<myVtkInteractorStyleImage> myInteractorStyle = vtkSmartPointer<myVtkInteractorStyleImage>::New(); vtkSmartPointer<vtkImageViewer2> imageViewer = vtkSmartPointer<vtkImageViewer2>::New(); imageViewer->SetInputData(imageBlend->GetOutput()); vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); imageViewer->SetupInteractor(renderWindowInteractor); //imageViewer->SetColorLevel(500);//Set the window level to 500 //imageViewer->SetColorWindow(2000);//Set the window width to 2000 imageViewer->SetSlice(80);//Set slice index imageViewer->SetSliceOrientationToXY();//Set the slice direction imageViewer->Render(); myInteractorStyle->SetImageViewer(imageViewer); //imageViewer->GetRenderer()->SetBackground(1.0, 1.0, 1.0); imageViewer->SetSize(640, 480); imageViewer->GetRenderWindow()->SetWindowName("DisplayImageExample"); renderWindowInteractor->SetInteractorStyle(myInteractorStyle); renderWindowInteractor->Start(); return 0; }