解决Python pydicom库读取DICOM文件AttributeError: 'int' object has no attribute 'offset'错误
解决Python pydicom库读取DICOM文件AttributeError: 'int' object has no attribute 'offset'错误
在使用Python pydicom库读取DICOM文件时,可能会遇到以下错误:
AttributeError: 'int' object has no attribute 'offset'
这个错误提示是因为在 pydicom 库中,PixelData 属性是一个二进制字符串,而不是一个对象,所以不能像普通的属性一样访问其 offset 属性。
解决方法:
-
直接读取 PixelData 属性:
将以下代码:
pixel_offset = ds.PixelData[0].offset
替换为:
```python
pixel_offset = 0
-
使用 np.frombuffer 函数获取像素数据:
将以下代码:
计算像素值
if bits_allocated == 8: pixel_data = pixel_data.astype(np.uint8) pixel_data = pixel_data * (2 ** (8 - bits_stored)) else: pixel_data = pixel_data.astype(np.uint16) pixel_data = pixel_data * (2 ** (16 - bits_stored))
替换为:
```python
# 计算像素值
if bits_allocated == 8:
pixel_data = np.frombuffer(ds.PixelData, dtype=np.uint8, offset=pixel_offset)
pixel_data = pixel_data * (2 ** (8 - bits_stored))
else:
pixel_data = np.frombuffer(ds.PixelData, dtype=np.uint16, offset=pixel_offset)
pixel_data = pixel_data * (2 ** (16 - bits_stored))
示例代码:
import pydicom
import numpy as np
import matplotlib.pyplot as plt
# 读取DICOM文件
ds = pydicom.read_file('C:\Users\lenovo\Desktop\数据结构与算法C++\20084125-张亭-数据结构算法实验1\dicom\Dicomread\11.dcm')
# 获取图像数据
pixel_data = ds.pixel_array
# 获取像素类型
pixel_type = ds.pixel_array.dtype
# 获取像素数据长度和偏移量
bits_allocated = ds.BitsAllocated
bits_stored = ds.BitsStored
# pixel_offset = ds.PixelData[0].offset # 错误代码
pixel_offset = 0 # 正确代码
# 计算像素值
if bits_allocated == 8:
# pixel_data = pixel_data.astype(np.uint8) # 错误代码
# pixel_data = pixel_data * (2 ** (8 - bits_stored)) # 错误代码
pixel_data = np.frombuffer(ds.PixelData, dtype=np.uint8, offset=pixel_offset) # 正确代码
pixel_data = pixel_data * (2 ** (8 - bits_stored)) # 正确代码
else:
# pixel_data = pixel_data.astype(np.uint16) # 错误代码
# pixel_data = pixel_data * (2 ** (16 - bits_stored)) # 错误代码
pixel_data = np.frombuffer(ds.PixelData, dtype=np.uint16, offset=pixel_offset) # 正确代码
pixel_data = pixel_data * (2 ** (16 - bits_stored)) # 正确代码
# 转换颜色空间
if ds.PhotometricInterpretation == 'MONOCHROME1':
pixel_data = np.max(pixel_data) - pixel_data
# 显示图像
if ds.SamplesPerPixel == 1:
plt.imshow(pixel_data, cmap='gray')
else:
plt.imshow(pixel_data)
# 调整窗位窗宽
if 'WindowWidth' in ds and 'WindowCenter' in ds:
window_width = ds.WindowWidth
window_center = ds.WindowCenter
pixel_data = np.clip(pixel_data, window_center-window_width/2, window_center+window_width/2)
pixel_data = (pixel_data - (window_center - 0.5)) / (window_width - 1.0)
# 显示图像
if ds.SamplesPerPixel == 1:
plt.imshow(pixel_data, cmap='gray')
else:
plt.imshow(pixel_data)
plt.show()
注意:
- 以上代码中,
pixel_offset的值应根据具体情况进行调整,一般情况下为 0。 - 在使用
np.frombuffer函数获取像素数据时,需要根据bits_allocated属性设置数据类型,例如np.uint8或np.uint16。
通过以上方法,就可以解决 Python pydicom 库读取 DICOM 文件时遇到的 AttributeError: 'int' object has no attribute 'offset' 错误。
原文地址: https://www.cveoy.top/t/topic/ncsH 著作权归作者所有。请勿转载和采集!