Python 代码:DICOM 图像处理和轮廓提取
import os import dicom import numpy as np import cv2
初始化计数器
pngno = 1
获取切片数量
NumOfCTSlice = len(CT_Slice)
获取所有切片的 SliceLocation
slice_locations = [slice.SliceLocation for slice in CT_Slice]
根据 SliceLocation 降序排序切片索引
sorted_slices = sorted(range(NumOfCTSlice), key=lambda x: slice_locations[x], reverse=True)
遍历每个切片
for gio in range(NumOfCTSlice): # 获取排序后的切片索引 qq = sorted_slices[gio]
# 获取当前切片的 Organ 信息
mm = CT_Slice[qq].Organ
# 如果 Organ 信息为空,则跳过该切片
if not mm:
continue
# 初始化变量
len = 0
a = []
b = []
# 获取 Organ 信息的数量
NumOfOrgan = len(mm)
# 读取 DICOM 文件信息
ak = dicom.read_file(CT_Slice[qq].name)
# 获取当前目录
filepath = os.getcwd()
# 读取 DICOM 图像像素数据
L = dicom.read_file(CT_Slice[qq].name).pixel_array
# 尺寸本来就是 512*512,无需修改
# 保存图像使用 imwrite 代替 print 与 getframe,因为 getframe 不会改变保存的图像尺寸
cd('D:\hzx\datawinnoxyf\train1')
# 使用 RescaleSlope 和 RescaleIntercept 转换像素值
L1 = L * ak.RescaleSlope + ak.RescaleIntercept
# 归一化像素值到 [-5, 75] 之间
M = cv2.normalize(L1, None, -5, 75, cv2.NORM_MINMAX)
# 保存图像
cv2.imwrite(ak.PatientID + '_' + str(pngno) + '.png', M)
# 初始化一个 512*512 的全零矩阵,用于存储轮廓信息
ggsv = np.zeros((512, 512))
# 显示 CT 图像
cv2.imshow('CT Image', L)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 遍历每个 Organ
for g in range(NumOfOrgan):
# 判断 Organ 名称是否为 'OR TP Lobe-L' 或 'TemporalLobe_L'
if mm['Item_' + str(g)].name == 'OR TP Lobe-L' or mm['Item_' + str(g)].name == 'TemporalLobe_L':
# 获取 DICOM 文件中的 ImagePositionPatient 和 PixelSpacing 信息
dcmOrigin = ak.ImagePositionPatient
dcmSpacing = ak.PixelSpacing
# 获取 Organ 轮廓数据点的数量
K = len(CT_Slice[qq].Organ['Item_' + str(g)].ContourData) / 3
# 初始化 x1 和 y1 数组,用于存储轮廓数据点坐标
x1 = np.zeros(K + 1)
y1 = np.zeros(K + 1)
# 遍历所有轮廓数据点
for ii in range(K):
# 将 DICOM 坐标转换为像素坐标
x1[ii] = (mm['Item_' + str(g)].ContourData[1 + (ii - 1) * 3] - dcmOrigin[0]) / dcmSpacing[0]
y1[ii] = (mm['Item_' + str(g)].ContourData[2 + (ii - 1) * 3] - dcmOrigin[1]) / dcmSpacing[1]
# 将最后一个轮廓数据点与第一个轮廓数据点连接,形成闭合的轮廓
x1[K] = x1[0]
y1[K] = y1[0]
# 在 ggsv 矩阵中填充轮廓信息
cv2.fillPoly(ggsv, np.array([np.column_stack((x1, y1))], dtype=np.int32), (1/255, 1/255, 1/255))
# 显示轮廓信息
cv2.imshow('Contours', ggsv)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 更新计数器
pngno += 1
原文地址: https://www.cveoy.top/t/topic/o7Wt 著作权归作者所有。请勿转载和采集!