批量读取dicom数据 to Array类型(多标签融合)

本文最后更新于:2023年4月7日 下午

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
file_name = ["portalvein", "venoussystem", "venacava"]
def read_dicom(path):
lstFileDCM = []
for dirName, subdirList, fileList in os.walk(path):
n = len(fileList)
# print("n:", n)
for i in range(n):
filename = fileList[i]

idx = filename.split("_")[-1]
filename = filename.replace(str(idx), str(i))

lstFileDCM.append(os.path.join(dirName, filename))

# 读取第一张dicom图片
RefDs = pydicom.read_file(lstFileDCM[0])
# 得到dicom图片所组成3D图片的维度
ConstPixelDims = (int(RefDs.Rows), int(RefDs.Columns), len(lstFileDCM))
print("ConstPixelDims:", ConstPixelDims)
# (512,512,74)【这是我的一张示例图片输出的结果】

# 得到x方向和y方向的Spacing并得到z方向的层厚
ConstPixelSpacing = (float(RefDs.PixelSpacing[0]), float(RefDs.PixelSpacing[1]), float(RefDs.SliceThickness))
# (0.742187976837158, 0.742187976837158, 2.5)【这是我的一张示例图片输出的结果】

# 得到图像的原点
Origin = RefDs.ImagePositionPatient
# [0, 0, 0]【这是我的一张示例图片输出的结果】

# 根据维度创建一个numpy的三维数组,并将元素类型设为:pixel_array.dtype
ArrayDicom = np.zeros(ConstPixelDims, dtype=RefDs.pixel_array.dtype)

# 遍历所有的dicom文件,读取图像数据,存放在numpy数组中
i = 0
for filenameDCM in lstFileDCM:
ds = pydicom.read_file(filenameDCM)
ArrayDicom[:, :, lstFileDCM.index(filenameDCM)] = ds.pixel_array
# 将文件按照png的格式写进当前目录
# cv2.imwrite(os.path.join(png_path, "out_" + str(i) + '.png'), ArrayDicom[:, :, lstFileDCM.index(filenameDCM)])
i += 1

# 对numpy数组进行转置,即把坐标轴(x,y,z)变换为(z,y,x),这样是dicom存储文件的格式,即第一个维度为z轴便于图片堆叠
ArrayDicom = np.transpose(ArrayDicom, (2, 0, 1))
return ArrayDicom,ConstPixelSpacing,Origin

打赏支持
“如果你觉得我的文章不错,不妨鼓励我继续写作。”

批量读取dicom数据 to Array类型(多标签融合)
https://dreamoneyou.github.io/2022/批量读取dicom数据 to array类型((多标签融合)))/
作者
九叶草
发布于
2022年2月25日
更新于
2023年4月7日
许可协议