python - 如何在 Python 3 中解码和可视化 DICOM 曲线数据?
问题描述
我正在尝试使用 Python 3 和 pyDicom 可视化一个 DICOM 文件,该文件应该包含一个黑色的 100x100 图像,其中绘制了一些曲线。像素数据是从标题 (7fe0,0010) 中提取的,打印时显示b'\x00\x00\x00...'
. 我可以轻松地将其转换为 100x100 的 numpy 数组。
但是,(5000,3000) 中的曲线数据显示我b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0H@\x00\x00\x00\x00\x00\xc0X@\x00\x00\x00\x00\x00\xc0H@'
无法将其转换为 100x100 像素图像中的 x,y 坐标。在 DICOM 文件中它说
- 曲线尺寸:2
- 点数:2
- 数据类型:聚
- 数据值表示:3
- 曲线标签:横轴
- 曲线数据:32个元素
主要问题是:如何解码在 100x100 图像中回溯曲线所需的坐标?我主要关心的是应该有 32 个元素,但输出中只有 26 个十六进制值。我也不知道如何处理\xc0H@
and \xc0X@
。当我打印这些时,它会产生192 72 64
和192 88 64
. python如何将这2个十六进制代码解码为6个数字?这些数字代表什么?
编辑:
显然数据值表示 3 意味着数据表示为浮点双精度。另一方面,数据中应该有两个点,那么每个点用16个元素表示?我看不出这两个语句是如何兼容的。有趣的是,\xc0H@
如前所述,第一个转换为 3 个数字,并通过这样做完成了曲线数据的前 16 个元素。如何将其转换为 2D 图像中的一个点?
解决方案
曲线数据自 2004 年起已在 DICOM 中停用,因此您将在2004 年起的 DICOM 标准中找到相关信息(感谢@kritzel_sw 提供链接)。
正如您已经发现的那样,Data Value Representation
3 表示数据条目是双重格式,并且使用Type of Data
多边形,您的数据中有 x/y 元组。由于双精度值保存在 8 个字节中,因此每个点有 16 个字节——在您的情况下(32 个字节的数据)总共 2 个点。
Pydicom 不(也可能不会)直接支持已退役的 Curve 模块(尽管在 pydicom 2.1 中添加了对当前等效的 Waveform 模块的支持),因此您必须自己解码数据。你可以做这样的事情(给定双数):
from struct import unpack
from pydicom import dcm_read
ds = dcm_read(filename)
data = ds[0x50003000].value
# unpack('d') unpacks 8 bytes into a double
numbers = [unpack('d', data[i:i+8])[0] for i in range(0, len(data), 8)]
# I'm sure there is a nicer way for this...
coords = [(numbers[i], numbers[i+1]) for i in range(0, len(numbers), 2)]
在您的示例数据中,这将返回:
[(0.0, 49.5), (99.0, 49.5)]
例如 x/y 坐标 (0, 49.9) 和 (99.0, 49.5),对应于图像中间的水平线。
至于 26 个十六进制元素与 32 个字节的不匹配:一个字节串表示只显示了十六进制字符串表示法中不能转换为 ASCII 的字节,其余的只是显示为对应的 ASCII 字符的表示。因此,例如,您的字节字符串的这一部分:\x00\xc0H@
4 个字节长,也可以\x00\xc0\x48\x40
用十六进制字符串表示法表示。
推荐阅读
- sap-web-ide - SAP Web-IDE Full Stack:如何处理配置文件
- android - Android中的ObjectBox实体列表?
- legend - 如何使用 ArcGIS JavaScript 中字段的唯一值显示类别的动态图例?
- javascript - 如何在引导弹出窗口中创建许多内容
- java - java8中.distinct()和.sum()的组合
- javascript - Webpack Uncaught TypeError:无法读取未定义的属性“调用”
- powerbi - Power BI - 堆栈条形图
- python - 找不到pip已经安装的模块
- c# - ReactiveUI 同步 ReactiveCommand 调用导致 System.InvalidOperationException
- java - 需要一个找不到的“com.example.Resources.UserRepository”类型的 bean