Python DICOM 文件读取与图像处理:解析 DICOM 文件信息并显示图像
import os
import pydicom
import numpy as np
import matplotlib.pyplot as plt
# 打开 DICOM 文件
filename = 'C:\Users\lenovo\Desktop\数据结构与算法C++\20084125-张亭-数据结构算法实验1\dicom\Dicomread\11.dcm'
ds = pydicom.dcmread(filename)
# 判断文件是否为 DICOM 格式
if ds.file_meta.MediaStorageSOPClassUID != '1.2.840.10008.5.1.4.1.1.2':
print('Not a DICOM file!')
exit()
# 获取基本信息
file_name = os.path.basename(filename)
file_path = os.path.dirname(filename)
file_size = os.path.getsize(filename) # 文件大小
# 获取患者信息
patient_id = ds.PatientID
patient_name = ds.PatientName
patient_sex = ds.PatientSex
# patient_age = ds.PatientAge
# 获取检查信息
study_id = ds.StudyID # 检查 ID
study_date = ds.StudyDate # 检查日期
study_time = ds.StudyTime # 检查时间
study_type = ds.Modality # 检查类型
# 获取图像信息
pixel_data = ds.pixel_array # 像素数据
pixel_offset = ds.data_element('PixelData').value[0] # 像素数据偏移量
rows = ds.Rows # 图像行数
columns = ds.Columns # 图像列数
pixel_size = (ds.PixelSpacing[0], ds.PixelSpacing[1]) # 像素尺寸
pixel_spacing = (ds.SliceThickness, ds.PixelSpacing[0], ds.PixelSpacing[1]) # 像素间距
image_position = ds.ImagePositionPatient # 图像位置
image_orientation = ds.ImageOrientationPatient # 图像方向
# 获取窗位窗宽
window_center = ds.WindowCenter
window_width = ds.WindowWidth
# 获取序列信息
sequence_number = ds.InstanceNumber # 序列号
sequence_description = ds.SeriesDescription # 序列描述
sequence_type = ds.Modality # 序列类型
sequence_uid = ds.SeriesInstanceUID # 序列标识
# 输出结果
print('File name: %s' % file_name)
print('File path: %s' % file_path)
print('File size: %s bytes' % file_size)
print('Patient ID: %s' % patient_id)
print('Patient name: %s' % patient_name)
print('Patient sex: %s' % patient_sex)
# print('Patient age: %s' % patient_age)
print('Study ID: %s' % study_id)
print('Study date: %s' % study_date)
print('Study time: %s' % study_time)
print('Study type: %s' % study_type)
print('Pixel data offset: %s bytes' % pixel_offset)
print('Rows: %d' % rows)
print('Columns: %d' % columns)
print('Pixel size: %s' % str(pixel_size))
print('Pixel spacing: %s' % str(pixel_spacing))
print('Image position: %s' % str(image_position))
print('Image orientation: %s' % str(image_orientation))
print('Window center: %s' % str(window_center))
print('Window width: %s' % str(window_width))
print('Sequence number: %s' % sequence_number)
print('Sequence description: %s' % sequence_description)
print('Sequence type: %s' % sequence_type)
print('Sequence UID: %s' % sequence_uid)
# 获取图像基本属性
pixel_type = ds.pixel_array.dtype # 无符号 16 位整数,即每个像素的值可以在 0 到 65535 之间。
image_size = ds.pixel_array.shape
channels = 1 if len(image_size) == 2 else image_size[2]
# 输出结果
print('Pixel type: %s' % pixel_type)
print('Image size: %s' % str(image_size))
print('Channels: %d' % channels)
# 实现功能 1:将像素值转换为灰度值
if pixel_type == np.uint16:
# 先将像素值缩放到 0-1 之间
pixel_data = pixel_data.astype(np.float32) / 65535
# 再将像素值映射到 0-255 之间
pixel_data = pixel_data * 255
pixel_data = pixel_data.astype(np.uint8)
# 实现功能 2:根据窗宽窗位进行线性变换
if window_width is not None and window_center is not None:
# 转换窗宽窗位为浮点数
window_center = float(window_center)
window_width = float(window_width)
# 计算窗口的最小值和最大值
window_min = window_center - window_width/2
window_max = window_center + window_width/2
# 对像素值进行线性变换
pixel_data = (pixel_data - window_min) / (window_max - window_min)
pixel_data[pixel_data < 0] = 0
pixel_data[pixel_data > 1] = 1
# 将像素值映射到 0-255 之间
pixel_data = pixel_data * 255
pixel_data = pixel_data.astype(np.uint8)
# 实现功能 3:将灰度值转换为 8 位灰度图像或 3 通道彩色图像,并将图像显示在窗口中
if channels == 1:
# 如果是单通道图像,将灰度值转换为 8 位灰度图像
plt.imshow(pixel_data, cmap='gray')
else:
# 如果是三通道图像,将灰度值转换为 RGB 图像
rgb_data = np.zeros((rows, columns, 3), dtype=np.uint8)
rgb_data[:,:,0] = pixel_data[:,:,0]
rgb_data[:,:,1] = pixel_data[:,:,0]
rgb_data[:,:,2] = pixel_data[:,:,0]
plt.imshow(rgb_data)
# 显示图像
plt.show()
# 补充说明
# 如果代码出现 “TypeError: unsupported operand type(s) for /: 'MultiValue' and 'int'” 的错误,
# 说明窗宽和窗位参数是 MultiValue 类型,需要先将其转换为 float 类型再进行数学运算。
# 可以使用以下代码进行转换:
# window_center = float(ds.WindowCenter)
# window_width = float(ds.WindowWidth)
# 然后再进行窗宽窗位的计算即可。
本代码提供了详细的步骤和注释,帮助您理解如何读取 DICOM 文件、提取信息以及处理图像数据。 您可以在代码中修改文件路径,以读取您自己的 DICOM 文件。
使用示例:
- 安装必要的库:
pip install pydicom numpy matplotlib - 将您的 DICOM 文件路径替换为
filename变量的值。 - 运行代码,查看输出结果和图像。
相关资源:
注意:
- 本代码示例仅供参考。实际应用中,您可能需要根据具体情况进行调整。
- 强烈建议您仔细阅读 DICOM 标准和相关库的文档,以便更深入地理解和使用 DICOM 文件。
希望本教程能够帮助您更好地理解 DICOM 文件的处理过程。如有任何问题或建议,请随时提出。
原文地址: https://www.cveoy.top/t/topic/ncAU 著作权归作者所有。请勿转载和采集!