前言

  • 使用c++版的itk读取存储在文件夹中的dicom序列
  • 工具:visual studio 2022 community

代码

CommonF.h

#pragma once
#include<itkImage.h>
#include<string>using PixelType = unsigned short;
using ImageType = itk::Image<PixelType, 3>;
using ImageStyle = ImageType::Pointer;class CommonF
{public:/// <summary>/// 读取dicom文件夹序列/// </summary>/// <param name="dicom_dir">dicom文件夹路径</param>/// <param name="OutImage">读到的图像</param>void read_dicom_series(const std::string& dicom_dir,ImageStyle& OutImage);};

CommonF.cpp

#include "CommonF.h"
#include<itkGDCMImageIO.h>
#include<itkGDCMSeriesFileNames.h>
#include<itkImageSeriesReader.h>
#include<vector>void CommonF::read_dicom_series(const std::string& dicom_dir, ImageStyle& OutImage)
{using ImageIOType = itk::GDCMImageIO;ImageIOType::Pointer DicomIO = ImageIOType::New();using ImageReaderType3D = itk::ImageSeriesReader<ImageType>;ImageReaderType3D::Pointer ImageReader3D = ImageReaderType3D::New();ImageReader3D->SetImageIO(DicomIO);using NamesGeneratorType = itk::GDCMSeriesFileNames;NamesGeneratorType::Pointer NameGenerator = NamesGeneratorType::New();NameGenerator->SetDirectory(dicom_dir);using SeriesIdContainer = std::vector<std::string>;const SeriesIdContainer& SeriesUID = NameGenerator->GetSeriesUIDs();SeriesIdContainer::const_iterator SeriesItr_begin = SeriesUID.begin();SeriesIdContainer::const_iterator SeriesItr_end = SeriesUID.end();while (SeriesItr_begin != SeriesItr_end){std::cout << SeriesItr_begin->c_str() << std::endl;SeriesItr_begin++;}std::string SeriesIdentifier;SeriesIdentifier = SeriesUID.begin()->c_str();using FileNamesContainer = std::vector<std::string>;FileNamesContainer filenames;filenames = NameGenerator->GetFileNames(SeriesIdentifier);ImageReader3D->SetFileNames(filenames);try{ImageReader3D->Update();}catch (itk::ExceptionObject& err){std::cerr << "error, exception object caught!" << std::endl;}OutImage = ImageReader3D->GetOutput();
}

main.cpp

#include"CommonF.h"int main()
{using std::cout;using std::endl;CommonF common_f;ImageStyle input_image;common_f.read_dicom_series("D:/test/004HeRuiPing_CT",input_image);ImageType::SizeType size = input_image->GetLargestPossibleRegion().GetSize();cout << "org_size = " << size << endl;return 0;
}

结果

读取单张dicom

void RigisterClass::read_one_dicom(const std::string& file_path,XrayStyle& out_xray)
{// readerusing ReaderType = itk::ImageFileReader<XrayType>;auto reader = ReaderType::New();// IOusing ImageIOType = itk::GDCMImageIO;auto dcmIO = ImageIOType::New();reader->SetImageIO(dcmIO);reader->SetFileName(file_path);try {reader->Update();}catch (const itk::ExceptionObject& e) {std::cout << "error in reading xray" << std::endl;std::cerr << e.what() << std::endl;throw "error in reading xray";}out_xray = reader->GetOutput();
}

读单张tif

void RigisterClass::read_tif(const std::string& file_path,XrayStyle& out_xray)
{using ImageReaderType2D = itk::ImageFileReader<XrayType>;ImageReaderType2D::Pointer imageReader2D = ImageReaderType2D::New();// IOusing TIFFIOType = itk::TIFFImageIO;TIFFIOType::Pointer tiffIO = TIFFIOType::New();imageReader2D->SetImageIO(tiffIO);imageReader2D->SetFileName(file_path);try {imageReader2D->Update();}catch (const itk::ExceptionObject& e) {std::cerr << e << std::endl;}out_xray = imageReader2D->GetOutput();
}

写入单张tif

void RigisterClass::write_tif_image(const OutputImageStyle& writed_image,const std::string& file_path)
{// writerusing WriterType = itk::ImageFileWriter<OutputImageType>;WriterType::Pointer writer = WriterType::New();// IOusing TIFFIOType = itk::TIFFImageIO;TIFFIOType::Pointer tiffIO = TIFFIOType::New();writer->SetImageIO(tiffIO);writer->SetFileName(file_path);writer->SetInput(writed_image);try{std::cout << "Writing image: " << file_path << std::endl;writer->Update();}catch (itk::ExceptionObject& err){std::cerr << "error in saveing out-xray !" << std::endl;std::cerr << err << std::endl;throw "error in saveing out-xray.";}
}

写单张dicom

void RigisterClass::write_one_dcm(const OutputImageStyle& writed_image,const std::string& file_path)
{using WriterType = itk::ImageFileWriter<OutputImageType>;auto writer = WriterType::New();using ImageIOType = itk::GDCMImageIO;auto dcmIO = ImageIOType::New();writer->SetImageIO(dcmIO);writer->SetFileName(file_path);writer->UseInputMetaDataDictionaryOff();writer->SetInput(writed_image);try {writer->Update();}catch (const itk::ExceptionObject& e) {std::cout << "error in saveing out dcm" << std::endl;std::cerr << e.what() << std::endl;}
}

itk和c++读取dicom序列相关推荐

  1. ITK安装与读取DICOM序列

    一:ITK功能 ITK 与 OpenCV 主打功能相似,都是面向于图像处理,但是两者在领域应用方面有一定的差别:ITK主要用于医学图像的分割与配准(有c++与python版本).OPENCV是计算机视 ...

  2. DCMTK、ITK、VTK读取dicom信息

    DCMTK.ITK.VTK读取dicom影像数据的方法 直接上代码,调用不同的医学影像库读取dicom影像信息 1. DCMTK读取影像中的pixelData //参数 list:为输入的图像文件名列 ...

  3. python读取dicom序列_python读取dicom图像(SimpleITK和dicom包实现)

    1. 用SimpleITK读取dicom序列: import SimpleITK as sitk import numpy as np img_path='F:\\dataset\\pancreas\ ...

  4. VTK读取dicom序列,并保存成vtk和obj格式的3D格式文件

    在vs中配置好vtk之后,新建项目,然后加入如下代码. #include "stdafx.h" #include <vtkAutoInit.h> VTK_MODULE_ ...

  5. python读取dicom序列_用原生Python解析DICOM文件

    如果你想了解DICOM格式,Oleg Pianykh的<医学数字成像与通信(DICOM):实用介绍与生存指南>(DICOM:A Practical Introduction and Sur ...

  6. vue + vtk.js读取CT序列,显示3d影像(三个面显示)

    vtk.js官网示例中,显示CT序列,都是以vti文件格式为例进行读取.但是在实际项目中,一般都是以.dcm为后缀的dicom影像,目前在vtk.js官网中,没有找到直接读取dicom序列的API.故 ...

  7. pydicom读取头文件_python读取dicom图像(SimpleITK和dicom包实现)_愿十四亿神州尽舜尧-CSDN博客_python读取dicom...

    1. 用SimpleITK读取dicom序列:import SimpleITK as sitkimport numpy as npimg_path='F:\\dataset\\pancreas\\Ou ...

  8. 使用ITK读写DICOM序列

    版本:ITK 5.1.1 关键类: itk::ImageSeriesReader           用于读取图像序列: itk::ImageSeriesWriter             用于写入 ...

  9. ITK:读取DICOM系列并写入3D图像

    ITK:读取DICOM系列并写入3D图像 内容提要 C++实现代码 内容提要 本示例读取给定文件夹argv [1]中的所有DICOM系列,并将它们写入具有以下文件模式的同一文件夹中:seriesIde ...

最新文章

  1. MySQL技术内幕 InnoDB存储引擎 之 InnoDB体系架构
  2. ACM错误提示/错误原因
  3. python中的模块原则_python 的模块与包
  4. vscode 新建cpp文件_利用vscode搭建c
  5. MyBatis的association示例
  6. iOS MBProgressHUD 之带底板的加载提示
  7. 【BZOJ4547】【HDU5171】小奇的集合,暴力+矩阵乘法
  8. Kotlin 知识梳理(9) 委托属性
  9. 第12周Python学习周记
  10. BOOST1.54简化编译
  11. H5学习从0到1-H5的新特性(1)
  12. bitnami_redmine3.3.0-1 问题及备份恢复
  13. 计算机考研复试难,艰难与快乐:2008年重庆邮电大学计算机考研复试经历
  14. 在ajax中幸运抽奖,JS实现幸运抽奖页面
  15. 新概念英语第三册单词
  16. 在线教育APP的功能和优势
  17. 图形化开发(五)041-Three.js之Camera相机——target焦点和lookAt()方法、OrthographicCamera正交相机、PerspectiveCamera透视相机、相机插件
  18. spring boot 配置文件properties,yml语法学习及属性获取@ConfigurationProperties和@Value
  19. 初学Web:计算机气质个人主页
  20. java 生成临时目录_如何在Java中创建临时目录/文件夹?

热门文章

  1. 中国银联(霸面—面试经验)
  2. 重塑价值:新一代ITSM平台的建设、咨询与实施
  3. Darknet 轻量级深度学习训练框架
  4. atthesametime啥意思_at the same time和on the same time有什么区别吗
  5. Office宏——打印PPT
  6. 计算机制图公开课,信息工程大学公开课:地图文化(6集全)
  7. Python 常用模块总结
  8. Java 汉语转拼音
  9. 构造方法的”和用private修饰的权限
  10. 小米手机qq或者微信分享时 不能选取双开应用。提示任何个人应用都无法打开此内容解决办法!