使用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
相关产品推荐
相关产品推荐

