Python3中如何解码和可视化DICOM曲线数据?

How to decode and visualize DICOM curve data in Python 3?

我正在尝试用 Python 3 和 pyDicom 可视化一个 DICOM 文件,它应该包含一个黑色的 100x100 图像,其中绘制了一些曲线。像素数据是从 header (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 文件中它说

主要问题是:如何解码在我的 100x100 图像中回溯曲线所需的坐标?我主要关心的是应该有 32 个元素,但是输出中只有 26 个十六进制值。我也不知道如何处理 \xc0H@\xc0X@。当我打印这些时,它会产生 192 72 64192 88 64。 python 如何将这 2 个十六进制代码解码为 6 个数字?这些数字代表什么?

编辑: 显然,数据值表示形式 3 表示数据表示为浮点双精度数。另一方面,数据中应该有两个点,那么每个点用16个元素表示?我看不出这两个陈述如何兼容。有趣的是,第一个\xc0H@如前所述转化为3个数字,这样就完成了曲线数据的前16个元素。如何将其转换为二维图像中的一个点?

曲线数据自 2004 年起已在 DICOM 中退役,因此您可以在 DICOM standard from 2004 中找到相关信息(感谢 @kritzel_sw 提供 link)。

正如您已经发现的那样,Data Value Representation 3 表示数据条目为双格式,并且具有 Type of Data 多边形,数据中有 x/y 元组。由于 double 值保存在 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)]

在您的示例数据中,这将 return:

[(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