Python解析多帧dicom数据详解


Posted in Python onJanuary 13, 2020

概述

pydicom是一个常用python DICOM parser。但是,没有提供解析多帧图的示例。本文结合相关函数和DICOM知识做一个简单说明。

DICOM多帧数据存储

DICOM标准中关于多帧数据存储的最重要一部分说明是PS3.5 Annex A.4 A.4 Transfer Syntaxes For Encapsulation of Encoded Pixel Data。

无论何时,Pixel Data都存放在Pixel Data (7FE0,0010)中。有可能是直接存放的(native),也有可能是被打包存放的(encapsulated)。常见的多帧图一般采用打包存放的方式,特别是在数据存采用压缩格式的时候。

在打包存放时,数据被拆分成很多数据段(Data Stream Fragment),每个段保存成一个Tag为(FFFE,E000)的DICOM 项目(item)。其中第一个项目保存基础偏移表(Basic Offset Table),保存每个帧的起始偏移。然后,后面的数据段保存真正的数据。

**理论上,一帧(Frame)可以保存在多个数据段(Fragment)中。**但是,一个数据段不会保存两帧的数据。实际应用中,很少见到Frame跨数据段的情况,不过好的DICOM Parser应该支持这种情况。这就是导致有些DICOM库的接口看起来有点古怪的原因。

pydicom应用

以pydicom 1.2为例,pydicom.encaps封装了多帧有关的功能。解析最可能用到的几个函数

多帧使用 pydicom.encaps来处理

pydicom.encaps.decode_data_sequence 返回每个(FFFE,E000)组成的item,形式是byte string的list。这样一次拿到了所有fragment数据,可能比较耗内存。注意理论上拿到的不是帧(Frame)

pydicom.encaps.generate_pixel_data 生成一个generator。每次迭代,返回做成一个fragments tuple,每个fragment是一个bytes,每个tuple是一个Frame。如果一个Fame保存在一个Fragment中。tuple就只有一个元素。

pydicom.encaps.generate_pixel_data_frame 迭代每次返回一个bytes,这个bytes代表了帧的全部数据。这应该是最常用的函数。代码实现就是把generate_pixel_data生成的tuple给拼接起来了。

这几个方法的输入都是pixel_array。相应的Pydicom提供了用fp做参数的方法。

以上这篇Python解析多帧dicom数据详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python获取远程图片大小和尺寸的方法
Mar 26 Python
python使用wmi模块获取windows下硬盘信息的方法
May 15 Python
Python机器学习之SVM支持向量机
Dec 27 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
Apr 17 Python
PyQt5每天必学之布局管理
Apr 19 Python
python自动发送邮件脚本
Jun 20 Python
Python实现登陆文件验证方法
Oct 06 Python
树莓派+摄像头实现对移动物体的检测
Jun 22 Python
Pycharm新建模板默认添加个人信息的实例
Jul 15 Python
程序员的七夕用30行代码让Python化身表白神器
Aug 07 Python
Python操作Sqlite正确实现方法解析
Feb 05 Python
Python configparser模块常用方法解析
May 22 Python
python 将dicom图片转换成jpg图片的实例
Jan 13 #Python
基于Python和PyYAML读取yaml配置文件数据
Jan 13 #Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
Jan 13 #Python
利用python实现.dcm格式图像转为.jpg格式
Jan 13 #Python
如何基于Python + requests实现发送HTTP请求
Jan 13 #Python
python+tifffile之tiff文件读写方式
Jan 13 #Python
python读取tif图片时保留其16bit的编码格式实例
Jan 13 #Python
You might like
php循环语句 for()与foreach()用法区别介绍
2012/09/05 PHP
ThinkPHP模板自定义标签使用方法
2014/06/26 PHP
对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析
2014/07/04 PHP
PHP实现的限制IP投票程序IP来源分析
2016/05/04 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
2016/09/23 PHP
Thinkphp整合阿里云OSS图片上传实例代码
2019/04/28 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
2020/07/19 PHP
JS中彻底删除JSON对象组成的数组中的元素
2020/09/22 PHP
使用JavaScript switch case 另类写法
2010/03/14 Javascript
JavaScript setTimeout和setInterval的使用方法 说明
2010/03/25 Javascript
图片onload事件触发问题解决方法
2011/07/31 Javascript
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
jquery获取颜色在ie和ff下的区别示例介绍
2014/03/28 Javascript
jQuery的bind()方法使用详解
2015/07/15 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
2015/07/18 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
2016/11/18 Javascript
vue+vue-validator 表单验证功能的实现代码
2017/11/13 Javascript
nodeJS微信分享
2017/12/20 NodeJs
webpack+vuex+axios 跨域请求数据的示例代码
2018/03/06 Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
2018/05/31 Javascript
微信小程序url传参写变量的方法
2018/08/09 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
2018/09/04 Javascript
微信小程序当前时间时段选择器插件使用方法详解
2018/12/28 Javascript
jquery实现聊天机器人
2020/02/08 jQuery
基于element-ui封装可搜索的懒加载tree组件的实现
2020/05/22 Javascript
JavaScript实现HTML导航栏下拉菜单
2020/11/25 Javascript
[01:09]2014DOTA2国际邀请赛 TI4西雅图DOTA2 中国美女coser加油助威
2014/07/20 DOTA
使用Python脚本将Bing的每日图片作为桌面的教程
2015/05/04 Python
Python中文分词工具之结巴分词用法实例总结【经典案例】
2017/04/15 Python
在Python中定义一个常量的方法
2018/11/10 Python
细节决定成败演讲稿
2014/05/12 职场文书
学雷锋活动倡议书
2014/08/30 职场文书
2014年采购员工作总结
2014/11/18 职场文书
委托书格式要求
2015/01/28 职场文书
战马观后感
2015/06/08 职场文书
关于Numpy之repeat、tile的用法总结
2021/06/02 Python