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 著作权归作者所有。请勿转载和采集!

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