Python中如何通过pyexecjs执行开源JS项目来获取DICOM文件的压缩图像数据
如题,找了好久,ptrhon3 无法安装 gdcm,pydicom 无法直接导出含有压缩 jpg 图像的文件,其他模块也基本依赖 gdcm 处理压缩 dcm 文件,看到 github 上面好多 js 解压缩 dicom 压缩图像的开源项目如: https://github.com/cornerstonejs/cornerstone 是否可以通过 js 中转,把 dicom 文件里面的图像传给 python,后期再处理?
Python中如何通过pyexecjs执行开源JS项目来获取DICOM文件的压缩图像数据
为何不考虑 dcmtk ? js 那个解压缩的性能不行。
要使用 pyexecjs 执行开源JS项目来获取DICOM文件的压缩图像数据,核心思路是:1)找到处理DICOM的JS库(如 dicom-parser 或 cornerstone 相关工具),2)通过 pyexecjs 桥接Python和JS环境。这里以 dicom-parser 为例,演示如何解析DICOM并提取像素数据。
首先,确保安装 pyexecjs 和一个JS运行时(如Node.js):
pip install PyExecJS
然后,假设你有一个DICOM文件,以下代码展示了如何用JS库解析它并获取像素数组:
import execjs
import numpy as np
# 1. 读取DICOM文件为二进制数据
with open('example.dicom', 'rb') as f:
dicom_bytes = f.read()
# 2. 准备JS代码,使用dicom-parser库
js_code = """
// 模拟从Python传入的DICOM二进制数据
var byteArray = new Uint8Array(dicomData);
// 加载dicom-parser库(假设已通过npm安装并在此环境中可用)
// 在实际部署中,你需要确保dicom-parser的路径正确或通过其他方式引入
var dicomParser = require('dicom-parser');
// 解析DICOM文件
var dataSet = dicomParser.parseDicom(byteArray);
// 提取像素数据相关属性
var rows = dataSet.uint16('x00280010'); // 行数
var columns = dataSet.uint16('x00280011'); // 列数
var bitsAllocated = dataSet.uint16('x00280100'); // 每像素分配的位数
var pixelDataElement = dataSet.elements.x7fe00010; // 像素数据标签
// 获取像素数据的字节偏移和长度
var offset = pixelDataElement.dataOffset;
var length = pixelDataElement.length;
// 提取像素数据(根据编码可能需要解压,这里假设未压缩)
var pixelData = new Uint16Array(byteArray.buffer, offset, length / 2);
// 返回结果
return {
rows: rows,
columns: columns,
bitsAllocated: bitsAllocated,
pixelData: Array.from(pixelData) // 转换为普通数组以便传回Python
};
"""
# 3. 创建JS上下文并执行
ctx = execjs.compile(js_code)
# 注意:这里需要将二进制数据转换为JS可接受的格式(如列表)
result = ctx.call("", dicomData=list(dicom_bytes))
# 4. 在Python中处理结果
rows = result['rows']
columns = result['columns']
pixel_array = np.array(result['pixelData'], dtype=np.uint16).reshape((rows, columns))
print(f"图像尺寸: {rows} x {columns}")
print(f"像素数据示例:\n{pixel_array[:5, :5]}")
关键点说明:
- JS库依赖:你需要确保
dicom-parser在JS环境中可用。可以通过npm install dicom-parser安装,然后在execjs中设置正确的路径,或者直接将库代码嵌入JS字符串。 - 数据传递:
pyexecjs通过上下文将Python数据(如二进制列表)传递给JS,JS返回普通数组或对象。 - 压缩处理:如果DICOM图像数据是压缩的(如JPEG),
dicom-parser可能无法直接解码。你可能需要额外的JS库(如dicom-codec)或预处理步骤。这时JS代码会更复杂,涉及解压逻辑。 - 性能注意:对于大文件,二进制数据传递和JS执行可能较慢,考虑分块或优化。
简单总结:用 pyexecjs 调用 dicom-parser 解析DICOM,提取像素数据到NumPy数组。
dcmtk 调用需要编译,环境折腾了几次,不成功
py dicom 的 pixel array 不就是一个 bumpy array 吗,你用 opencv pil 之类的不能导出 jpg ?
numpy
据说可以用 numpy 或者 pil 解码可以,一直没有成功,我技术能力不行

