ITK笔记--读取3D NIFTI图像并用VTK可视化

版本:ITK-5.2.1,VTK-9.1
注意:在编译 ITK 时,需要编译 ITK 的 module_vtkGlue 模块

我们使用 ITK 读取一个 3D 的 NIFTI 图像,并将其转换为 VTK 图像以可视化图像。代码中主要涉及到的类和函数如下:
在这里插入图片描述

C++代码如下:

#include <itkImage.h>
#include <itkImageFileReader.h>
#include <itkImageToVTKImageFilter.h>
#include <itkNiftiImageIO.h>
#include <vtkActor.h>
#include <vtkAutoInit.h>
#include <vtkDiscreteMarchingCubes.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);


int main()
{
	// File name settings
	const char* fileName = "image.nii.gz";
	

	// Define ImageType, ReaderType, ImageIOType and read file
	using PixelType = short;
	constexpr unsigned int Dimension = 3;
	using ImageType = itk::Image<PixelType, Dimension>;
	using ReaderType = itk::ImageFileReader<ImageType>;
	using ImageIOType = itk::NiftiImageIO;
	ReaderType::Pointer reader = ReaderType::New();
	ImageIOType::Pointer niftiIO = ImageIOType::New();
	reader -> SetImageIO(niftiIO);
	reader -> SetFileName(fileName);
	reader -> Update();


	// Print img size
	ImageType::SizeType imgSize = reader -> GetOutput() -> GetLargestPossibleRegion().GetSize();
	std::cout << "read done! img size: " << imgSize << std::endl;


	// Convert itkImage to vtkImage
	using ConvertFilter = itk::ImageToVTKImageFilter<ImageType>;
	ConvertFilter::Pointer convertFilter = ConvertFilter::New();
	convertFilter -> SetInput(reader -> GetOutput());
	convertFilter -> Update();


	// Extract vtkImageData contour to vtkPolyData
	vtkNew<vtkDiscreteMarchingCubes> contour;
	contour -> SetInputData(convertFilter -> GetOutput());


	// Define colors, mapper, actor, renderer, renderWindow, renderWindowInteractor
	vtkNew<vtkNamedColors> colors;

	vtkNew<vtkPolyDataMapper> mapper;
	mapper -> SetInputConnection(contour -> GetOutputPort());

	vtkNew<vtkActor> actor;
	actor -> SetMapper(mapper);

	vtkNew<vtkRenderer> renderer;
	renderer -> AddActor(actor);
	renderer -> SetBackground(colors -> GetColor3d("SteelBlue").GetData());

	vtkNew<vtkRenderWindow> renderWindow;
	renderWindow -> AddRenderer(renderer);

	vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
	renderWindowInteractor -> SetRenderWindow(renderWindow);
	renderWindowInteractor -> Initialize();
	renderWindowInteractor -> Start();

	return 0;
}

Python代码如下:

import argparse
import itk
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkFiltersGeneral import vtkDiscreteMarchingCubes
from vtkmodules.vtkRenderingCore import vtkActor, vtkPolyDataMapper, vtkRenderer, \
		vtkRenderWindow, vtkRenderWindowInteractor


def get_argument():
    parser = argparse.ArgumentParser()

    # Data settings
    parser.add_argument('--nifti_file_name', default='image.nii.gz')

    args = parser.parse_args()
    return args


def main():
    args = get_argument()

    # Read NIFTI file
    itk_img = itk.imread(filename=args.nifti_file_name)
    print(itk_img)

    # Convert itk to vtk
    vtk_img = itk.vtk_image_from_image(l_image=itk_img)
    print(vtk_img)

    # Extract vtkImageData contour to vtkPolyData
    contour = vtkDiscreteMarchingCubes()
    contour.SetInputData(vtk_img)

    # Define colors, mapper, actor, renderer, renderWindow, renderWindowInteractor
    colors = vtkNamedColors()

    mapper = vtkPolyDataMapper()
    mapper.SetInputConnection(contour.GetOutputPort())

    actor = vtkActor()
    actor.SetMapper(mapper)

    renderer = vtkRenderer()
    renderer.AddActor(actor)
    renderer.SetBackground(colors.GetColor3d("SteelBlue"))

    renderWindow = vtkRenderWindow()
    renderWindow.AddRenderer(renderer)

    renderWindowInteractor = vtkRenderWindowInteractor()
    renderWindowInteractor.SetRenderWindow(renderWindow)
    renderWindowInteractor.Initialize()
    renderWindowInteractor.Start()


if __name__ == '__main__':
    main()
  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值