将 MATLAB 代码转换为 Python 代码并添加注释
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'字符串需要根据实际情况进行修改。
希望这些信息能够帮到您。如果您还有其他问题,请随时提问。
原文地址: https://www.cveoy.top/t/topic/o7WK 著作权归作者所有。请勿转载和采集!