ValueError: The length of the pixel data in the dataset doesn’t match the expected length 已解决

ValueError: The length of the pixel data in the dataset doesn’t match the expected length

问题:使用pydicom读取dcm数据时报错ValueError: The length of the pixel data in the dataset (248244 bytes) doesn't match the expected length (524288 bytes). The dataset may be corrupted or there may be an issue with the pixel data handler.
原使用代码如下:

import pydicom
path = "demo.dcm"
ds = pydicom.dcmread(path, force=True)
ds.file_meta.TransferSyntaxUID = pydicom.uid.ImplicitVRLittleEndian # or whatever is the correct transfer syntax for the file
data_array = ds.pixel_array # 此处报上述错误

原因:
经排查是ds.file_meta.TransferSyntaxUID = pydicom.uid.ImplicitVRLittleEndian这行错误的问题, 以前使用pydicom读取文件报错时,百度别人说加上这句就好, 确实当时解决了问题, 但后续没想到会导致别的问题, 这句意思是在dcm文件缺少TransferSyntaxUID这个属性的时候, 给赋默认值, 这个属性标识dcm是否被压缩, 应该使用什么handler去读取数据, 关于该属性的值对应的意思详见TransferSyntax, 那么使用如下代码判断文件是否被压缩

import pydicom
path = "demo.dcm"
ds = pydicom.dcmread(path, force=True)
TransferSyntaxUID = getattr(dicom.file_meta, 'TransferSyntaxUID', None) # 如果 TransferSyntaxUID 不是 None, 
# 且  TransferSyntaxUID == '1.2.840.10008.1.2', 那么就是没压缩的数据, 如果 TransferSyntaxUID == '1.2.840.10008.1.2.4.70', 那么就代表数据是经过压缩的

修改后代码:

# 1. 安装 python-gdcm, 用于解析压缩dcm数据
pip install python-gdcm 
# 2. 使用下述代码读取文件
import pydicom
path = "demo.dcm"
ds = pydicom.dcmread(path, force=True)
TransferSyntaxUID = getattr(dicom.file_meta, 'TransferSyntaxUID', None) 
if TransferSyntaxUID: # 我遇到的数据中, 压缩后的dcm会有此标识, 未压缩过的数据没有此标识, 故如果此代码不适用你的场景, 还需再排查下别的问题
        pass
else:
    dicom.file_meta.TransferSyntaxUID = pydicom.uid.ImplicitVRLittleEndian 
data_array = ds.pixel_array
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值