将 MATLAB 代码转换为 Python 代码:处理医学图像并提取器官轮廓
import numpy as np import cv2 import os
假设 CT_Slice 是一个包含 DICOM 图像信息的列表
pngno = 1 NumOfCTSlice = len(CT_Slice)
使用 SliceLocation 属性对 CT_Slice 列表进行排序,并以降序排列
zio = np.sort([slice.SliceLocation for slice in CT_Slice])[::-1]
使用索引列表对排序后的 CT_Slice 列表进行遍历
for gio in range(NumOfCTSlice): qq = zio[gio] mm = CT_Slice[qq].Organ # 检查器官是否为空,如果为空则跳过 if mm is None: continue len = 0 a = [] b = [] NumOfOrgan = len(mm) # 获取 DICOM 文件信息 ak = dicominfo(CT_Slice[qq].name) filepath = os.getcwd() # 读取 DICOM 图像数据 L = dicomread(CT_Slice[qq].name)
# 设置工作目录,将处理后的图像保存到指定的文件夹
os.chdir('D:\hzx\datawinnoxyf\train1')
# 使用 RescaleSlope 和 RescaleIntercept 属性进行图像灰度值转换
L1 = L * ak.RescaleSlope + ak.RescaleIntercept
# 使用 OpenCV 库进行图像归一化,将灰度值映射到 -5 到 75 之间
M = cv2.normalize(L1, None, -5, 75, cv2.NORM_MINMAX)
# 保存处理后的图像
cv2.imwrite(f"{ak.PatientID}_{pngno}.png", M)
# 创建一个 512x512 的空白图像
ggsv = np.zeros((512, 512))
# 显示原始图像,并等待用户按下任意键
img2 = cv2.imshow('image', L)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 定义矩形的顶点坐标
ax = np.array([0, 0, 512, 512])
bx = np.array([0, 512, 512, 0])
# 在空白图像上绘制黑色矩形
cv2.fillPoly(ggsv, [ax, bx], (0, 0, 0))
# 遍历器官轮廓数据
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, 1] - dcmOrigin[0, 0]) / dcmSpacing[0, 0]
y1[ii] = (mm[f'Item_{g}'].ContourData[2+(ii-1)*3, 1] - dcmOrigin[1, 0]) / dcmSpacing[1, 0]
# 连接轮廓的起点和终点
x1[K+1] = x1[0]
y1[K+1] = y1[0]
# 使用白色填充器官轮廓区域
cv2.fillPoly(ggsv, [x1, y1], (1/255, 1/255, 1/255))
# 在空白图像上绘制黑色矩形
cv2.fillPoly(ggsv, [ax, bx], (0, 0, 0))
continue
# 处理完所有器官后,保存处理后的图像
# ...
原文地址: https://www.cveoy.top/t/topic/o7WH 著作权归作者所有。请勿转载和采集!