DICOM 图像

20 世纪 70 年代,在 CT 引入之后,数字诊断图像模式例如 MRI 和电脑在临床应用的增加,美国放射医学学会 (ACR) 和国家电子制造学会 (NEMA) 认为有设置一个标准的需要,以便为不同的厂商制造的装置之间传递信息和图像带来方便。大多数医学领域的图像存储和传递都用的是 DICOM 标准DICOM 文件由一个头文件和一个图像数据体构成。头文件包括标准和自由形成域。

这个例子介绍了如何读一个单独的 DICOM 切片以及把它写作另一个 DICOM 切片。在处理过程中应用亮度变化

为了读和写切片,我们这里使用 itk::GDCMImageIO 类, itk::GDCMImageIO 类压缩了一个优先的 GDCM 库的连接。用这种方法我们就可以进行从 ITK 到 GDCM 提供的 DICOM 的范函性的存取。 GDCMImageIO 对象被作为 itk::ImageFileWriter 使用的 ImageIO 的对象连接。

基于ITK的读、写一幅 2D 的DICOM图像

#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkRescaleIntensityImageFilter.h"
#include "itkGDCMImageIO.h"#include <list>
#include <fstream>
//reader:读取DICOM格式图像  IM3
//writer1:将读取的DICOM图像再另存为DICOM图像  writer1.dcm
//writer2:读取的DICOM图像进行像素亮度改变调节后写出保存   writer2.png
//writer3:将亮度调节后的数据写成DICOM格式图像输出   writer3.dcmint main( int argc, char* argv[] )
{/* if( argc < 5 ){std::cerr << "Usage: " << std::endl;std::cerr << argv[0] << " DicomImage OutputDicomImage ";std::cerr << " OutputImage RescaleDicomImage\n";return EXIT_FAILURE;}*///声明像素类型和图像维数,并用它们实例化被读的图像类型typedef signed short InputPixelType;const unsigned int   InputDimension = 2;typedef itk::Image< InputPixelType, InputDimension > InputImageType;//用图像类型实例化 reader 的类型,创建它并设置被读的图像的文件名:typedef itk::ImageFileReader< InputImageType > ReaderType;ReaderType::Pointer reader = ReaderType::New();reader->SetFileName( "IM3" );//GDCMImageIO 是一个读取和写入 DICOM V3 和 ACR/NEMA 图像的 ImageIO 类。在这里//GDCMImageIO 对象被创建并与 ImageFileReader 相连。typedef itk::GDCMImageIO ImageIOType;ImageIOType::Pointer gdcmImageIO = ImageIOType::New();reader->SetImageIO( gdcmImageIO );/*调用 Update() 来触发读取过程。因为这个读取过程可能会导致异常,我们放置一个问询在 try / catch 模块中*/try{reader->Update();//reader:读取DICOM格式图像}catch (itk::ExceptionObject & e){std::cerr << "exception in file reader " << std::endl;std::cerr << e << std::endl;return EXIT_FAILURE;}/*现在图像在内存中,通过 GetOutput() 我们可以对它进行存取。在当前例子的维护中,焦点放在我们如何再一次将图像在新文件中保存成 DICOM 格式。首先,我们必须实例化一个 ImageFileWriter 类型。这时,我们创建它并设置用于写的文件名,连接被写的输入图像。在这个例子中,我们用不同的方法写图像,每种情况下我们用不同的 writer ,我们列举 writer 对象的变量名及其类型*/typedef itk::ImageFileWriter< InputImageType >  Writer1Type;Writer1Type::Pointer writer1 = Writer1Type::New();writer1->SetFileName( "writer1.dcm" );writer1->SetInput( reader->GetOutput() );//我们需要明确地设置对于 writer 滤波器的合适的图像IO ,因为输入的 DICOM 是沿着写入//过程被传递的。这个名称包含所有有效的 DICOM 文件应该包含的所有信息,像病人名字、//病人ID 、机构名等等writer1->SetImageIO( gdcmImageIO );/*通过调用 Update() 来触发写入程序。因为执行会导致异常情况出现,我们放 Update() 问询在一个 try / catch 模块里*/try{writer1->Update();//writer1:将读取的DICOM图像再另存为DICOM图像}catch (itk::ExceptionObject & e){std::cerr << "exception in file writer " << std::endl;std::cerr << e << std::endl;return EXIT_FAILURE;}/*现在我们使用重新调节亮度图像滤波器对图像进行重新调节。为了这个目的,我们使用一个更适合的像素类型:无符字符型代替有符短型。输出图像的最小值和最大值在缩放滤波器中明确定义*/typedef unsigned char WritePixelType;typedef itk::Image< WritePixelType, 2 > WriteImageType;typedef itk::RescaleIntensityImageFilter<InputImageType, WriteImageType > RescaleFilterType;RescaleFilterType::Pointer rescaler = RescaleFilterType::New();//改变图像的像素范围(亮度调节)rescaler->SetOutputMinimum(   0 );rescaler->SetOutputMaximum( 255 );/*我们现在创建第二个 writer 对象,保存图像到一个文件中。这时不是 DICOM 格式。做这个只是为了校验图像,对照在这个例子里以后被保存成 DICOM 的格式*/typedef itk::ImageFileWriter< WriteImageType >  Writer2Type;Writer2Type::Pointer writer2 = Writer2Type::New();writer2->SetFileName("writer2.png");rescaler->SetInput(reader->GetOutput());writer2->SetInput(rescaler->GetOutput());//writer 能够通过调用 try/catch 模块里的 Update( ) 来执行try{writer2->Update();//writer2:读取的DICOM图像进行像素亮度改变调节后写出保存}catch (itk::ExceptionObject & e){std::cerr << "exception in file writer " << std::endl;std::cerr << e << std::endl;return EXIT_FAILURE;}/*我们现在保存同一个重新调节的图像到一个 DICOM 格式的文件中。为此我们仅仅需要设置 itk::ImageFileWriter ,并传递给它重新调节的图像作为输入*/typedef itk::ImageFileWriter< WriteImageType >  Writer3Type;Writer3Type::Pointer writer3 = Writer3Type::New();writer3->SetFileName( "writer3.dcm" );writer3->SetInput( rescaler->GetOutput() );/*我们现在需要明确地设置合适的图像 IO(GDCMImageIO) ,所以我们必须告诉ImageFileWriter 不要从输入中用 MetaDataDictionary 而是从 GDCMImageIO 中用,因为 IO 包含DICOM 的精确信息。GDCMImageIO对象将会自动地探测像素类型,这种情况下无符字符串和GDCMImageIO 对象将会更新 DICOM 头文件信息。*/writer3->UseInputMetaDataDictionaryOff ();writer3->SetImageIO( gdcmImageIO );//写成DICOM 格式//最后我们调用一个 try/catch 模块的 Update( ) 来触发 DICOM writer 的执行try{writer3->Update();//writer3将亮度调节后的数据写成DICOM格式图像输出}catch (itk::ExceptionObject & e){std::cerr << "Exception in file writer " << std::endl;std::cerr << e << std::endl;return EXIT_FAILURE;}return EXIT_SUCCESS;}

//IM3:读取的输入DICOM格式图像  
//writer1:将读取的DICOM图像再另存为DICOM图像  writer1.dcm
//writer2:读取的DICOM图像进行像素亮度改变调节后写出保存   writer2.png
//writer3:将亮度调节后的数据写成DICOM格式图像输出   writer3.dcm

      

输入MR图像:IM3                        输出DCM图像:writer1.dcm     

       

 输出png图像:writer2.png

      

    输出DCM图像:writer3.dcm

基于ITK的读并写 2D的DICOM 图像相关推荐

  1. 计算机英语冯敏课后题答案,(中学篇)2020年第10期:例谈基于协同效应的读后续写教学(浙江:冯敏)一文涉及的读后续写试题...

    2020年1月浙江高考读后续写试题 阅读下面短文,根据所给情节进行续写,使之构成一个完整的故事. "I'm going to miss you so much, Poppy," s ...

  2. 基于模板匹配的手写字体数字识别-含Matlab代码

    目录 一.引言 二.系统知识的表示与组织 2.1 规则前提条件的描述 2.2 规则结论的表示 2.3 知识库的组织 三.手写字体数字识别算法流程 四.识别结果 五.参考文献 六.Matlab代码获取 ...

  3. 如何基于LSM-tree架构实现一写多读

    简介:传统MySQL基于binlog复制的主备架构有它的局限性,包括存储空间有限,备份恢复慢,主备复制延迟等问题,为了解决用户对于云上RDS(X-Engine)大容量存储,以及弹性伸缩的诉求,Pola ...

  4. 基于51单片机的串口中断读头写尾法接收NMEA0183经纬度信息 1602显示(循环接收)

    51单片机 串口接收导航电文 设计方案 硬件构成 软件构成 测试情况 接收承载能力测试 传统接收方式测试 程序代码 传统程序中断部分代码 采用了读头写尾方法的程序 结论 传统的串口接收程序是采用设立中 ...

  5. CH376的串口模式操作U盘(读、写、txt文件、csv文件、串口调试讲解、stm32程序)

    文中介绍的可能有一些繁琐,因为也是想解释的更清楚一些,但是小弟希望大家能认真看完. 市面上关于ch376串口的知识介绍不多,可以说基本没有,博主当时也废了一些力气,在此希望给大家一些帮助,认真看完绝对 ...

  6. [Android L]SEAndroid开放设备文件结点权限(读或写)方法(涵盖常用操作:sys/xxx、proc/xxx、SystemProperties)热门干货

    点击打开链接 温馨提示      建议你先了解一下上一篇博文([Android L]SEAndroid增强Androd安全性背景概要及带来的影响)所讲的内容,先对SEAndroid窥个全貌,然后再继续 ...

  7. blp模型 上读下写_Java高并发编程(三):Java内存模型

    1 Java内存模型的基础 在并发编程里,需要处理两个问题: 线程之间如何通信 线程之间如何同步. 通信指的是线程之间以何种机制来交换信息.在命令式编程里中,线程之间的通信机制有两种:共享内存和消息传 ...

  8. Java实现excel的读与写(Apache POI)

    本文将讨论利用Apache POI提供的类实现Excel文件的读与写操作. 整个项目的目录结构基于前面的一篇文章:<java读取pdf内容> 1.pom.xml <dependenc ...

  9. linux flash擦除命令,Linux下flash操作读、写、擦除步骤

    描述 1. 背景介绍 在板上,ZYNQ PL部分通过EMC连接一片NOR FLASH,地址空间如下: 可以看到NOR FLASH的起始地址为0x80000000,这是物理地址,可以把数据存放在以该地址 ...

最新文章

  1. Ubuntu 14.04 64bit上使用IPython玩转Docker
  2. 机器学习中有哪些形式简单却很巧妙的 idea?
  3. 驱动阿里云的高性能网络引擎- 飞天洛神
  4. 彩虹物语服务器维护,11.19《彩虹物语》服务器维护及数据互通公告
  5. Could not get lock /var/lib/dpkg/lock-frontend
  6. 阿里内核月报2014年4月
  7. JAVA——使用Spring Boot Scheduled时注入simple-robot Bot解决方案
  8. python中excel制作成绩报表_python制作简单excel统计报表2之操作excel的模块openpyxl简单用法...
  9. 机箱硬盘指示灯不亮_安钛克DF600 FLUX机箱:FLUX平台第一款机箱,为全民电竞热“降温”...
  10. C语言怎么输出百分号%
  11. 242. 有效的字母异位词 golang
  12. 2. OD-爆破exe验证程序
  13. 【今日CV 视觉论文速览】 17 Dec 2018
  14. Nginx-Web管理系统
  15. mybatis插入时间_深入分析MyBatis源码
  16. 计算机网络-01-计算机网络体系结构
  17. SAP License:实例讲解SAP与金税接口
  18. PDF文件不能正常显示问题的原因及解决方法(图文)
  19. python关系图谱_利用Python+Gephi构建LOL全英雄间的关联图谱
  20. 如何辨别u盘是否为缩水,并恢复u盘真实容量

热门文章

  1. Vue 生成海报图的方法
  2. 【kafka】二、kafka安装
  3. 【易通慧谷】科技赋能金融,三新理念全面解读新金融
  4. google地图标记
  5. 计算机软考初级网络管理员——计算机科学基础笔记
  6. SQLZOOL练习题答案和解析 第1关 SELECT name
  7. 龙年贺词成语-龙字成语
  8. 学习笔记(3):PS教程-【和东东一起学PS】Photoshop 2020小白到高手(任务驱动式基础+实战教学)-【免费试看】PS软件的必要首选项设置
  9. 珍藏的PS技巧(可以尝试一下哦)(转载)
  10. 抖音新手常犯的几个雷区,你知道几个?