Matlab 代码转换为 Python 代码:CT 图像处理及器官分割
import os
import numpy as np
import cv2
import matplotlib.pyplot as plt
pngno = 1
NumOfCTSlice = len(CT_Slice)
zio = sorted(CT_Slice, key=lambda x: x.SliceLocation, reverse=True)
for gio in range(NumOfCTSlice):
qq = zio[gio]
mm = qq.Organ
if mm is None:
continue
len = 0
a = []
b = []
NumOfOrgan = len(mm)
ak = dicominfo(qq.name)
filepath = os.getcwd()
L = dicomread(qq.name)
# 尺寸本来就是 512*512,无需修改
# 在将原图尺寸修改为 512*512 后,imshow 中的 []、'border'、'tight' 属性会使 print 在打印时,一定将图片的尺寸修改为 640*640
# 此处用 imwrite 代替 print,结合 getframe 不会改变保存图片的尺寸
# 此处%
# dicomread 读取了 CT 文件信息后不能像普通图片那样直接用 imwrite 保存,如果使用了 imwrite,保存的图片是全黑的 (应该是图像文件格式不一样函数使用不对口所致),
# 所以这里要先用 imshow,把图像展示出来,再用 imwrite 结合 getframe 保存所需图像
os.chdir('D:\hzx\datawinnoxyf\train1') # 根据需要,此处为放置制作的输入图像
# figure(pngno)
# img1 = imshow(L, [], 'border', 'tight')
# f1 = getframe(gcf)
L1 = L * ak.RescaleSlope + ak.RescaleIntercept
M = cv2.normalize(L1, None, alpha=-5, beta=75, norm_type=cv2.NORM_MINMAX) # 归一化
cv2.imwrite(ak.PatientID + '_' + str(pngno) + '.png', M)
# delete(img1)
# close all
# h1 = figure(pngno)
# set(h1,'visible','off')
ggsv = np.zeros((512, 512))
img2 = plt.imshow(L, [], 'border', 'tight')
plt.hold(True)
ax = [0, 0, 512, 512]
bx = [0, 512, 512, 0]
plt.fill(ax, bx, 'k')
plt.hold(True)
for g in range(NumOfOrgan):
if mm[g]['name'] == 'OR TP Lobe-L' or mm[g]['name'] == 'TemporalLobe_L':
dcmOrigin = ak.ImagePositionPatient
dcmSpacing = ak.PixelSpacing
K = len(qq.Organ[g]['ContourData']) / 3
x1 = np.zeros(K + 1)
y1 = np.zeros(K + 1)
for ii in range(K):
x1[ii] = (mm[g]['ContourData'][1 + (ii - 1) * 3] - dcmOrigin[0, 0]) / dcmSpacing[0, 0]
y1[ii] = (mm[g]['ContourData'][2 + (ii - 1) * 3] - dcmOrigin[1, 0]) / dcmSpacing[1, 0]
x1[K + 1] = x1[0]
y1[K + 1] = y1[0]
plt.fill(x1, y1, [1 / 255, 1 / 255, 1 / 255])
f = plt.gcf()
gg = f.canvas.tostring_rgb()
gg = cv2.cvtColor(np.frombuffer(gg, dtype=np.uint8).reshape(f.canvas.get_width_height()[::-1] + (3,)), cv2.COLOR_RGB2GRAY)
a, b = np.where(gg)
len = len(a)
for j in range(len):
ggsv[a[j], b[j]] = 1/255
plt.fill(ax, bx, 'k')
plt.hold(True)
pngno += 1
原文地址: https://www.cveoy.top/t/topic/o7WM 著作权归作者所有。请勿转载和采集!