import numpy as np
import cv2
import os
from pydicom import dicomread, dicominfo
import matplotlib.pyplot as plt

# 初始化变量
pngno = 1

# 假设 CT_Slice 是一个包含多个切片的列表,每个切片包含一个字典
NumOfCTSlice = len(CT_Slice)

# 按照 SliceLocation 降序排序切片
zio = np.sort([slice.SliceLocation for slice in CT_Slice])[::-1]

# 遍历每个切片
for gio in range(NumOfCTSlice):
    qq = index[gio]
    mm = CT_Slice[qq].Organ
    
    # 如果 Organ 字段为空,跳过该切片
    if mm is None:
        continue
    
    # 初始化变量
    len = 0
    a = []
    b = []
    NumOfOrgan = len(mm.__dict__)
    ak = dicominfo(CT_Slice[qq].name)
    filepath = os.getcwd()
    L = dicomread(CT_Slice[qq].name)
    
    # 保存图像
    cd('D:\hzx\datawinnoxyf\train1')
    L1 = L * ak.RescaleSlope + ak.RescaleIntercept
    M = cv2.normalize(L1, None, -5, 75, cv2.NORM_MINMAX)
    cv2.imwrite(f'{ak.PatientID}_{pngno}.png', M)
    pngno += 1
    
    # 创建一个 512x512 的矩阵,用于存储器官轮廓的像素
    ggsv = np.zeros((512, 512))
    
    # 显示图像
    plt.figure(figsize=(8, 8))
    img2 = plt.imshow(L, 'gray')
    ax = np.array([0, 0, 512, 512])
    bx = np.array([0, 512, 512, 0])
    plt.fill(ax, bx, 'k')
    
    # 遍历每个器官
    for g in range(NumOfOrgan):
        # 检查器官名称是否为 'OR TP Lobe-L' 或 'TemporalLobe_L'
        if mm[f'Item_{g}'].name == 'OR TP Lobe-L' or mm[f'Item_{g}'].name == 'TemporalLobe_L':
            # 获取 DICOM 信息
            dcmOrigin = ak.ImagePositionPatient
            dcmSpacing = ak.PixelSpacing
            
            # 获取器官轮廓数据
            K = len(CT_Slice[qq].Organ[f'Item_{g}'].ContourData) // 3
            x1 = np.zeros(K+1)
            y1 = np.zeros(K+1)
            
            # 将轮廓数据转换为图像坐标
            for ii in range(K):
                x1[ii] = (mm[f'Item_{g}'].ContourData[1+(ii-1)*3] - dcmOrigin[0, 1]) / dcmSpacing[0, 1]
                y1[ii] = (mm[f'Item_{g}'].ContourData[2+(ii-1)*3] - dcmOrigin[1, 1]) / dcmSpacing[1, 1]
            
            # 闭合轮廓
            x1[K] = x1[0]
            y1[K] = y1[0]
            
            # 在图像上绘制器官轮廓
            plt.fill(x1, y1, [1/255, 1/255, 1/255])
            
            # 获取图像帧数据
            f = plt.gcf()
            gg = f.canvas.copy_from_bbox(f.bbox)
            gg = cv2.cvtColor(gg, cv2.COLOR_RGB2GRAY)
            
            # 查找轮廓中的像素位置
            a, b = np.where(gg)
            len = len(a)
            
            # 将轮廓像素标记为 1/255
            for j in range(len):
                ggsv[a[j], b[j]] = 1/255
            
            # 重绘黑色背景
            plt.fill(ax, bx, 'k')
    
    # 显示图像
    plt.show()
    plt.close()

解释:

  • 代码使用 pydicom 库读取和解析 DICOM 文件。
  • 代码循环遍历每个切片,并提取每个切片的器官信息。
  • 如果器官信息为空,则跳过该切片。
  • 代码使用 cv2.normalize 将图像像素值归一化到 -5 到 75 之间。
  • 代码使用 cv2.imwrite 保存图像。
  • 代码使用 matplotlib.pyplot 库显示图像。
  • 代码使用 plt.fill 在图像上绘制器官轮廓。
  • 代码使用 f.canvas.copy_from_bbox(f.bbox) 获取图像帧数据。
  • 代码使用 cv2.cvtColor 将图像转换为灰度图像。
  • 代码使用 np.where 查找轮廓中的像素位置。
  • 代码使用 ggsv 矩阵存储器官轮廓的像素位置。
  • 代码使用 plt.show() 显示图像。

注意:

  • 代码中的 CT_Slice 变量需要根据实际情况进行修改。
  • 代码中的 D:\hzx\datawinnoxyf\train1 路径需要根据实际情况进行修改。
  • 代码中的 'OR TP Lobe-L''TemporalLobe_L' 字符串需要根据实际情况进行修改。

希望这些信息能够帮到您。如果您还有其他问题,请随时提问。

将 MATLAB 代码转换为 Python 代码并添加注释

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

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