TensorFlow IO DICOM Reader读取值翻倍问题求助
DICOM文件读取数值异常问题排查与解决建议
从TCIA获取的DICOM文件,使用TensorFlow 2.3和TensorFlow IO 0.16,通过以下代码读取后,图像数值为正确值的两倍,需手动除以2才能恢复正常。可正常读取教程中的胸片,但无法确认当前DICOM是否存在同类问题,寻求解决办法:
image_bytes = tf.io.read_file(fname ) image = tfio.image.decode_dicom_image(image_bytes, dtype=tf.uint16, on_error = 'lossy') im = image.numpy () [0, :, :, 0].astype (np.uint16)
排查与解决方向:
- 检查DICOM元数据的Rescale Slope和Rescale Intercept标签:部分DICOM会通过这两个参数校准像素值,TensorFlow IO的
decode_dicom_image默认未自动应用这些参数,可能导致数值偏差。用pydicom读取元数据确认:
若Rescale Slope为2,需将读取后的像素值除以该斜率得到真实值。import pydicom ds = pydicom.dcmread(fname) print(f"Rescale Slope: {ds.RescaleSlope}, Rescale Intercept: {ds.RescaleIntercept}") - 升级TensorFlow IO版本:0.16属于较旧版本,可能存在DICOM解码bug,尝试升级到0.20+版本,新版本对DICOM标签处理更完善。
- 验证数据类型匹配:检查DICOM原始像素数据类型,若为uint8但代码指定
dtype=tf.uint16,可能导致数值自动缩放,可改为dtype=tf.uint8测试。 - 对比标准工具结果:用pydicom读取校准后的值,与TensorFlow IO读取结果对比,确认偏差来源:
# pydicom读取校准后的值 im_pydicom = ds.pixel_array * ds.RescaleSlope + ds.RescaleIntercept # 对比TensorFlow IO读取的im print(np.allclose(im / 2, im_pydicom))
内容的提问来源于stack exchange,提问作者balcony
相关产品推荐
相关产品推荐

