如何使用Python转换DICOM文件中Deformable Registration Grid Sequence的二进制Vector Grid Data为有符号浮点数列表
二进制向量网格数据转有符号浮点数列表解决方案
默认你提供的Deformable Registration Grid Sequence矢量数据采用行业通用的32位单精度有符号浮点数存储,每个数值占4字节,你可根据实际数据格式调整精度参数。
方法1:使用Python标准库struct(无第三方依赖)
直接用Python自带的struct模块解析,适合轻量数据场景:
import struct # 你的二进制数据赋值给binary_data binary_data = b' dZ=\x00\x90\xb3=\x00\x18\x89\xbd \xe9}=\x00\xc0\xd6=\x00\xa0\xa5\xbd\xe0]\x93=\x00\x10\xfd=\x00\xa8\xc4\xbd\xc0\x8e\xa9=\x95\xf9\xbb\xbc\x00\x80\x06=\xc6\x88(=\xa9\xcb\x82\xbc\x00@\xa6<\xA\xce\xc6<\xc5\xd5\x19\xbc\x00\x00\x0e<k\xba\x17<\x02\x07i\xbb' # 计算浮点数总个数:总字节数 ÷ 单精度浮点数占4字节 float_num = len(binary_data) // 4 # 解析格式说明:< 代表小端字节序,f代表单精度浮点数;若数值范围异常可换成 > 试大端字节序 float_list = list(struct.unpack(f'<{float_num}f', binary_data))
方法2:使用NumPy解析(适合大数据量场景)
数据量大时用NumPy的缓冲区解析接口效率更高,也方便后续做网格形变相关的矩阵运算:
import numpy as np binary_data = b' dZ=\x00\x90\xb3=\x00\x18\x89\xbd \xe9}=\x00\xc0\xd6=\x00\xa0\xa5\xbd\xe0]\x93=\x00\x10\xfd=\x00\xa8\xc4\xbd\xc0\x8e\xa9=\x95\xf9\xbb\xbc\x00\x80\x06=\xc6\x88(=\xa9\xcb\x82\xbc\x00@\xa6<\xA\xce\xc6<\xc5\xd5\x19\xbc\x00\x00\x0e<k\xba\x17<\x02\x07i\xbb' # dtype参数说明:<f4 是小端32位单精度浮点,>f4是大端32位单精度浮点,若为双精度可替换为<f8/>f8 float_array = np.frombuffer(binary_data, dtype='<f4') # 按需转换为Python原生列表 float_list = float_array.tolist()
补充说明
- 配准网格序列一般存储的是每个空间位置的x/y/z三维偏移向量,解析完成后可按每3个元素为一组进行重排,得到对应位置的偏移向量。
- 若解析出来的数值范围明显不符合配准偏移的正常区间,优先调整字节序参数,再检查浮点数精度是否匹配你的原始数据。
内容的提问来源于stack exchange,提问作者Jhonalbert Aponte
相关产品推荐
相关产品推荐

