You need to enable JavaScript to run this app. 使用Python将DICOM转为PNG时输出全黑但像素数组值正常怎么解决
优惠活动
大模型
产品
解决方案
定价
更多

使用Python将DICOM转为PNG时输出全黑但像素数组值正常怎么解决

问题原因

你导出的PNG全黑的核心原因是:DICOM文件读取到的像素数组为16位灰度值,你提供的样例数组取值范围在550860之间,远高于8位PNG的标准灰度范围0255。直接调用cv2.imwrite保存时,高于255的像素值会被默认截断,最终所有像素值都变为0,生成全黑图片。

解决方案

方案1:全局线性归一化(通用场景)

将像素数组线性映射到0~255的8位灰度范围后再保存即可,代码如下:

import pydicom
import cv2
import numpy as np
import os

dicom = pydicom.dcmread(os.path.join(inputdir, f))
img = dicom.pixel_array

# 线性归一化到0-255范围,转8位无符号整型
img_normalized = cv2.normalize(img, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)

cv2.imwrite(os.path.join(outdir, f.replace('.dcm','.png')), img_normalized)

方案2:使用DICOM自带窗宽窗位调整(医学影像专业场景)

如果需要符合医学影像阅片的标准显示效果,可以直接读取DICOM元数据中的窗宽(WindowWidth)、窗位(WindowCenter)参数做灰度映射,效果比全局归一化更贴合临床需求:

import pydicom
import cv2
import numpy as np
import os

dicom = pydicom.dcmread(os.path.join(inputdir, f))
img = dicom.pixel_array

# 读取DICOM自带的窗宽窗位参数
window_center = dicom.WindowCenter
window_width = dicom.WindowWidth

# 计算灰度映射的上下限
min_val = window_center - window_width / 2
max_val = window_center + window_width / 2

# 截断超出范围的像素值后归一化到0-255
img = np.clip(img, min_val, max_val)
img_normalized = ((img - min_val) / (max_val - min_val) * 255).astype(np.uint8)

cv2.imwrite(os.path.join(outdir, f.replace('.dcm','.png')), img_normalized)

内容的提问来源于stack exchange,提问作者Saksham Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 20:57:00