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中文乱码的解决方法
Nov 04 Python
Python 字符串操作方法大全
Mar 11 Python
Python3基础之输入和输出实例分析
Aug 18 Python
Python中 map()函数的用法详解
Jul 10 Python
NumPy 基本切片和索引的具体使用方法
Apr 24 Python
python使用递归的方式建立二叉树
Jul 03 Python
django 多对多表的创建和插入代码实现
Sep 09 Python
大家都说好用的Python命令行库click的使用
Nov 07 Python
Python通过递归获取目录下指定文件代码实例
Nov 07 Python
wxPython修改文本框颜色过程解析
Feb 14 Python
Python实现哲学家就餐问题实例代码
Nov 09 Python
python爬取股票最新数据并用excel绘制树状图的示例
Mar 01 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
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
2016/05/09 PHP
PHP 爬取网页的主要方法
2018/07/13 PHP
ASP中用Join和Array,可以加快字符连接速度的代码
2007/08/22 Javascript
js 为label标签和div标签赋值的方法
2013/08/08 Javascript
javascript正则表达式参数/g与/i及/gi的使用指南
2014/08/27 Javascript
JS获取下拉框显示值和判断单选按钮的方法
2015/07/09 Javascript
jQuery基于ajax()使用serialize()提交form数据的方法
2015/12/08 Javascript
JS通过Cookie判断页面是否为首次打开
2016/02/05 Javascript
jQuery使用serialize()表单序列化时出现中文乱码问题的解决办法
2016/07/27 Javascript
js鼠标按键事件和键盘按键事件用法实例汇总
2016/10/03 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
jQuery延迟执行的实现方法
2016/12/21 Javascript
vue-cli 3.x配置跨域代理的实现方法
2019/04/12 Javascript
微信小程序中button去除默认的边框实例代码
2019/08/01 Javascript
vue组件创建的三种方式小结
2020/02/03 Javascript
解决python给列表里添加字典时被最后一个覆盖的问题
2019/01/21 Python
python版DDOS攻击脚本
2019/06/12 Python
基于Python的ModbusTCP客户端实现详解
2019/07/13 Python
python通过链接抓取网站详解
2019/11/20 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
如何用tempfile库创建python进程中的临时文件
2021/01/28 Python
canvas实现扭蛋机动画效果的示例代码
2018/10/17 HTML / CSS
非洲NO.1网上商店:Jumia肯尼亚
2016/08/18 全球购物
销售会计岗位职责
2014/03/15 职场文书
借款协议书范本
2014/04/22 职场文书
国旗下的演讲稿
2014/05/08 职场文书
2014年教师党员自我评价范文
2014/09/22 职场文书
师德师风整改措施
2014/10/24 职场文书
2014年团支部工作总结
2014/11/17 职场文书
使用pytorch实现线性回归
2021/04/11 Python
pandas中DataFrame重置索引的几种方法
2021/05/24 Python
Python自动化爬取天眼查数据的实现
2021/06/15 Python
JavaScript实现优先级队列
2021/12/06 Javascript
聊聊CSS粘性定位sticky案例解析
2022/06/01 HTML / CSS