vtk implements two methods of segmenting images and overlaying display of original images

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;
}