ITK和VTK读取DICOM图像文件

ITK和VTK读取DICOM图像文件

ITK读取DICOM图像

相比于VTK类库中vtkDICOMImageReader类读取DICOM序列图像,借助ITK类库实现对DICOM序列图像的读取要复杂许多。但是,使用ITK类库读取图像不像使用VTK类库那么功能局限,VTK类库对每种图像格式都有着专门的读写类,像vtkDICOMImageReader类只能读取普通的DICOM图像,对于压缩后的DICOM图像则只能通过ITK类库来实现读取。
在这里插入图片描述
当系统使用ITK来进行读取DICOM格式文件时,基于ITK类库中itkGDCMSeriesFileNames.h头文件,创建一个itk::GDCMSeriesFileNames类型的智能指针,该指针可用于读取并保存DICOM序列图像的文件夹路径,通过该类中的静态函数SetDirectory()实现。基于itkImageSeriesReader.h头文件,声明和实例化读写 DICOM 序列图像的itk::ImageSeriesReader对象,该指针主要负责在指定的文件夹路径下读取DICOM序列图像,通过该类中的静态函数SetFileNames()实现。基于itkImageToVTKImageFilter.h头文件,声明和实例化ITK到VTK转换通道的itk::ImageToVTKImageFilter对象,借助该类中的静态函数SetInput()和Update()实现。基于vtkImageFlip类,负责将从ITK转换到VTK的数据保存供下一步操作,借助该类中的静态函数SetInputData()和Update()实现。

代码实现

头文件

#include "itkImageToVTKImageFilter.h"
#include "itkImage.h"
#include "itkGDCMImageIO.h"
#include "itkGDCMSeriesFileNames.h"
#include "itkImageSeriesReader.h"

宏定义

using namespace std;
typedef short PixelType;
const unsigned int   Dimension = 2;
typedef itk::Image< PixelType, Dimension > Input2dImageType;
typedef itk::Image< PixelType, 3 > Input3dImageType;

typedef itk::Image< PixelType, Dimension > Output2dImageType;
typedef itk::Image< PixelType, 3 > Output3dImageType;

typedef itk::GDCMImageIO   ImageIOType;//GDCMImageIO读DICOM
ImageIOType::Pointer gdcmImageIO = ImageIOType::New();

using ReaderType3d = itk::ImageSeriesReader< Input3dImageType >;
ReaderType3d::Pointer reader3d = ReaderType3d::New();

typedef itk::ImageFileReader< Input2dImageType > ReaderType2d;
ReaderType2d::Pointer reader2d = ReaderType2d::New();

using NamesGeneratorType = itk::GDCMSeriesFileNames;
NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New();

主要实现

   reader3d->SetImageIO(gdcmImageIO);
	nameGenerator->SetUseSeriesDetails(true);
	nameGenerator->SetDirectory(file_path_str);

	using SeriesIdContainer = std::vector< std::string >;
	const SeriesIdContainer& seriesUID = nameGenerator->GetSeriesUIDs();
	auto seriesItr = seriesUID.begin();
	auto seriesEnd = seriesUID.end();

	using FileNamesContainer = std::vector< std::string >;
	FileNamesContainer fileNames;
	std::string seriesIdentifier;
	while (seriesItr != seriesEnd)
	{
		seriesIdentifier = seriesItr->c_str();
		fileNames = nameGenerator->GetFileNames(seriesIdentifier);
		++seriesItr;
	}
	reader3d->SetFileNames(fileNames);
	reader3d->Update();

	typedef itk::ImageToVTKImageFilter< Input3dImageType> itkTovtkFilterType;
	itkTovtkFilterType::Pointer itkTovtkImageFilter = itkTovtkFilterType::New();
	itkTovtkImageFilter->SetInput(reader3d->GetOutput());//设置图像数据从ITK转向VTK
	itkTovtkImageFilter->Update();

	vtkSmartPointer< vtkImageFlip > reader1 = vtkSmartPointer< vtkImageFlip >::New();
	reader1->SetInputData(itkTovtkImageFilter->GetOutput());
	reader1->SetFilteredAxes(1);
	reader1->Update();

VTK读取DICOM

VTK作为适用于图像处理和三维重建的开源可视化软件包,在其类库中封装了很多种格式图像的读取类。但由于上节描述可知,使用VTK类库读取DICOM序列图像存在着一些功能局限。VTK类库对每种图像格式都有着专门的读写类,像vtkDICOMImageReader类只能读取普通的DICOM图像,针对压缩后的DICOM格式图像则无法有效读取,使用VTK类库实现图像读取实现简单。
基于VTK类库中图像的读取类实现对DICOM图像的读取。首先,通过vtkDICOMImageReader类中的静态函数SetDirectoryName()读取在磁盘中存储DICOM格式文件的相对路径。使用vtkImageViewer2类中的静态函数获取系统读取的DICOM图像给显示窗口,定义显示窗口的窗位和窗宽大小,进而实现对DICOM图像的可视化任务。对DICOM单张图像的读取和显示效果图如图所示,对DICOM序列图像的读取会在下章节三维重建算法实现中详细表述。
在这里插入图片描述

代码实现

VTK关于DICOM图像文件的读取实现相比于ITK要简单很多。

vtkSmartPointer<vtkDICOMImageReader> DICOMreader = vtkSmartPointer<vtkDICOMImageReader>::New();
	DICOMreader->SetDirectoryName(file_path_str);//DICOM所在文件夹
	DICOMreader->Update();
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值