Pydicom赋值PixelData后读取pixel_array报(3fff,3fff)标签错误求助
DICOM图像修改PixelData后读取pixel_array报错的解决方法
问题描述
按照Pydicom官方的图像降采样示例处理DICOM文件后,访问ds.pixel_array时触发错误:"Unexpected tag '(3fff, 3fff)' when parsing the Basic Table Offset item"。即使直接将原始ds.pixel_array转成字节赋值给ds.PixelData(代码如下),同样会触发该错误。用户怀疑原始DICOM文件存在损坏,但不清楚需要修改哪些标签才能正常读取。
复现代码
import pydicom ds = pydicom.dcmread(f) data = ds.pixel_array print(data.shape) ds.PixelData = data.tobytes() print(ds.pixel_array.shape)
解决方案
该错误源于VOI LUT(值查找表)相关元数据冲突或原始文件标签损坏,需要同步修改以下关键DICOM标签:
清理VOI LUT相关异常标签
错误中提到的(3fff, 3fff)是私有VOI LUT偏移表标签,原始文件的VOI LUT结构存在问题。重新赋值PixelData后,旧的VOI LUT元数据会导致解析冲突,需删除相关标签:# 删除冲突的VOI LUT标签 target_tags = ['VOILUTSequence', 'VOILUTDescriptor', '(3fff,3fff)'] for tag in target_tags: if tag in ds: del ds[tag]同步图像维度元数据
如果执行了降采样操作,必须同步更新Rows和Columns标签,确保与新像素数据的维度一致:# 假设降采样后的数据为downsampled_data ds.Rows = downsampled_data.shape[0] ds.Columns = downsampled_data.shape[1]重置传输语法为未压缩格式
若原始DICOM采用压缩传输语法(如JPEG),直接写入原始字节会导致解析错误,需强制设置为未压缩格式:from pydicom.uid import ImplicitVRLittleEndian ds.file_meta.TransferSyntaxUID = ImplicitVRLittleEndian保证像素数据格式匹配
赋值PixelData时,要确保数据的 dtype 与DICOM的PixelRepresentation(0为无符号,1为有符号)、BitsAllocated、BitsStored标签一致:# 保持数据类型与原始像素数据一致 ds.PixelData = data.astype(ds.pixel_array.dtype).tobytes()
内容的提问来源于stack exchange,提问作者anlarro
相关产品推荐
相关产品推荐

