解决Python pydicom库读取DICOM文件AttributeError: 'int' object has no attribute 'offset'错误

在使用Python pydicom库读取DICOM文件时,可能会遇到以下错误:

AttributeError: 'int' object has no attribute 'offset'

这个错误提示是因为在 pydicom 库中,PixelData 属性是一个二进制字符串,而不是一个对象,所以不能像普通的属性一样访问其 offset 属性。

解决方法:

  1. 直接读取 PixelData 属性:

    将以下代码:

pixel_offset = ds.PixelData[0].offset


   替换为:

   ```python
pixel_offset = 0
  1. 使用 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' 错误。

解决Python pydicom库读取DICOM文件AttributeError: 'int' object has no attribute 'offset'错误

原文地址: https://www.cveoy.top/t/topic/ncsH 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录