ITK和VTK读取DICOM图像文件

2023-05-16

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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ITK和VTK读取DICOM图像文件 的相关文章

随机推荐

  • mysql执行错误#1251 (mysql-front连接)解决方案

    这两天把mysql的版本换成了8 0 xff0c 用mysql front连接的时候突然出现执行错误 1251 xff0c 查询了一下方法顺便把解决方法记录下来 第一步 xff1a 首先进入控制台输入mysql u root p xff08
  • 流标和废标区别

    流标与废标是招标领域中经常出现的两个基本术语 但时常被混用 xff0c 导致采购与招标过程中产生一些混乱现象 流标 xff1a 是指政府采购活动中 xff0c 由于有效投标人不足三家或对招标文件实质性响应的不足三家 xff0c 而不得不重新
  • 红黑树详解一

    文章目录 说在前面一 2 3 树二 2 3 树如何维护绝对的平衡三 红黑树与 2 3 树的等价性四 红黑树的基本性质和复杂度分析 说在前面 算法导论 中的红黑树 每个节点或者是红色的 xff0c 或者是黑色的根节点是黑色的每一个叶子节点 x
  • 蒙特卡洛树搜索 MCTS 入门

    引言 你如果是第一次听到蒙特卡洛 xff0c 可能会认为这是一个人名 那么你就大错特错 xff0c 蒙特卡洛不是一个人名 xff0c 而是一个地方 xff0c 还一个赌场名 xff01 xff01 xff01 但是这不是我们的重点 我们今天
  • 76-高斯核函数

    高斯核函数 上一篇博客详细的介绍了什么是核函数 xff0c 并且主要以多项式核函数为例 这篇博客主要学习一种特殊的核函数 xff0c 而且它也是 SVM 算法使用最多的一种核函数 xff1a 高斯核函数 核函数我们通常表示成 xff1a 那
  • 数仓实践:总线矩阵架构设计

    如何设计一套切实可行的数据仓库呢 xff1f 我们要明白 xff0c 对于数据仓库的设计是不能完全依赖于业务的需求 xff0c 但往往又必须要服务于业务的价值 因此 xff0c 在构建数据仓库前 xff0c 我们往往会通过总线矩阵设计 xf
  • 05 反向传播

    反向传播 上一篇博客介绍了从输入 X 样本开始 xff0c 通过一组 w w w 参数 xff0c 得到了一个得分值 xff0c 然后又将得分值经过 y 61
  • 07 神经网络整体架构

    神经网络整体架构 我们先看看神经网络是什么样子的 xff0c 如下图 可以说神经网络是一个层次的结构 xff0c 有一个输入层 xff0c 隐层 1 xff0c 隐层 2 和输出层 可以说是由多个层组成了一个完整的神经网络 输入层相当于输入
  • 地震勘探原理(一)之地震波的基本概念

    绪论 一 石油勘探的主要方法 地质法 岩石露头物探法 覆盖区 连续测量 间接钻井法 一点 直接勘探 二 地球物理勘探方法 重力法 岩石密度差异磁法 演示磁性差异电法 岩石电性差异地震勘探方法 岩石弹性差异 xff08 用得最多 xff0c
  • 地震勘探原理(二)之时距曲线

    文章目录 什么是时距曲线 xff1f 直达波的时距曲线水平界面的共炮点反射波时距曲线方程 xff08 一个分界面 xff09 倾斜界面的共炮点反射波时距曲线正常时差倾角时差 xff08 dip moveout xff09 时局曲面和时间场的
  • 地震勘探原理(四)之频谱分析概述

    文章目录 一 频谱的基本概念二 频谱的主要特征 振幅谱和相位谱三 获取频谱的方法四 傅里叶展式的重要性质五 地震波频谱特征及其应用六 线性时不变系统的滤波方程七 频率滤波参数的选择 一 频谱的基本概念 频谱 xff08 Spectrum S
  • 模糊C均值聚类算法

    学习了一下模糊聚类中的模糊 C 均值聚类算法 Fuzzy C Means Clustering Fuzzy 意为模糊 xff0c 其中包括几种模糊的方式 xff0c 这里使用的是最简单的方式 xff0c 它是基于概率的概念 我们把每一个点属
  • 数据建模之查文献找数据以及数据预处理

    1 查文献 知网 xff1a 先看硕博士论文谷歌学术镜像 xff1a http scholar scqylaw com Open Access Library xff1a https www oalib com 2 找数据 优先 xff1a
  • 数学建模之论文

    一篇完整的数模论文 包括摘要 最重要 问题重述 模型假设和符号说明 模型建立与求解 最长 模型的优缺点与改进方法 参考文献和附录 1 摘要 最重要 论文研究的问题 43 使用的方法 43 得到的结果 43 每一部分的大致步骤 2 问题重述
  • Deformable Convolution 可变形卷积

    可变形卷积概念出自2017年论文 xff1a Deformable Convolutional Networks 顾名思义 xff0c 可变形卷积的是相对于标准卷积的概念而来 a 一个经典的 3 3 3 times3 3 3
  • 模块化

    模块化 遵守固定的规则 xff0c 把一个 大文件 拆成 独立并互相依赖 的 多个小模块 优点 xff1a 提高了代码的 复用性 提高了代码的 可维护性 可以实现 按需加载 模块化规范 xff1a 降低沟通成本 xff0c 方便模块间的相互
  • 栈的应用:左右符号匹配

    说明 xff1a 在编译器中 xff0c 都有这么一个左右符号匹配的功能 xff0c 这里通过栈来模拟实现这一功能 xff1b 这里采用了代码复用的方法 xff0c 即使用了LinkStack链栈 xff0c 详见 LinkStack链栈
  • windows安装gcc

    完整报错 xff1a RuntimeError Error building extension 39 fused 39 1 3 C Program Files NVIDIA GPU Computing Toolkit CUDA v11 4
  • openstack-mitaka(一) 架构简介

    官网 xff1a OpenStack Docs 概况 1 openstack概况 OpenStack是一个云操作系统 xff0c 它控制整个数据中心的计算 存储和网络资源的大型池 OpenStack通过各种补充服务提供基础设施即服务 Inf
  • ITK和VTK读取DICOM图像文件

    ITK和VTK读取DICOM图像文件 ITK读取DICOM图像 相比于VTK类库中vtkDICOMImageReader类读取DICOM序列图像 xff0c 借助ITK类库实现对DICOM序列图像的读取要复杂许多 但是 xff0c 使用IT