TCIA数据库CT数据下载及格式转换(dcm➡️jpg)

最近需要在The Cancer Imaging Archive(TCIA)数据库下载胶质瘤CT数据,搜了一圈似乎没有很系统的下载指南,所以就写下此文记录一下~

后续还对下载的数据集数据进行了转换(dcm➡️jpg)

数据

本文以下载两套数据集为例,分别是

1.ICDC-Glioma01数据集

2.GLIS-RT数据集

数据下载

下载器安装

如下图所示,tcia文件的专用下载器NBIA Data Retriever支持三个平台。对于arch linux平台,可以使用debtap软件将deb进行转译。

manifest file

对于第一套数据,进入下载页面,可以看到下图所示,点击download,将会下载后缀为“.tcia”的manifest file,使用专用的下载器即可下载。

对于第二套数据,可以看见红色框出的Licence,说明该数据集下载受限(如下图),不能像第一套数据集一样直接下载。我们需要点击红色框中的TCIA Restricted,将会下载一个pdf申请表格,需要按照表格需求填写相应的信息(表格中有一项需要注册tcia账号,按照提示注册即可),然后发送邮件到help@cancerimagingarchive.net进行申请。

Data Convert

参考GitHub - vivek8981/DICOM-to-JPG链接中的代码,利用pydicom包,将DICOM(.dcm)图片转化为JPG(.jpg)图片。该项目中extract.py文件用于提取DICOM文件中的图片信息。(根据其提供的表格dicom_image_description.csv提取信息)。

问题来了

如何批量转换?如果想要一个全新的只包含jpg的数据集文件的文件目录该怎么办?

解决

首先理清一下思路,我们现在拥有一个数据集,数据集下包含每个病人样本的文件夹,文件夹下包含各个不同窗位图片。我们可以将数据集根目录及其子目录克隆(不包含文件),然后更改根目录名,就获得了一个全新的目录用于存储输出的jpg文件。

代码

下面是代码部分,语言是python

定义两个函数,其中一个是转换函数,另一个函数用于遍历获取数据集文件夹

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
45
46
47
48
49
50
51
52
53
54
def findAllFile(base):
for root, ds, fs in os.walk(base):
for f in ds:
fullname = os.path.join(root, f)
yield fullname
def covert(inputpath,savepath):
import pydicom as dicom
import matplotlib.pyplot as plt
import os
import cv2
import PIL # optional
import pandas as pd
import csv
# make it True if you want in PNG format
PNG = False
# Specify the .dcm folder path
folder_path =inputpath
# Specify the .jpg/.png folder path
jpg_folder_path =savepath
images_path = os.listdir(folder_path)
# list of attributes available in dicom image
# download this file from the given link # https://github.com/vivek8981/DICOM-to-JPG
dicom_image_description = pd.read_csv("/add_you_path/dicom_image_description.csv")

with open(jpg_folder_path+'/Patient_Detail.csv', 'w', newline ='') as csvfile:
fieldnames = list(dicom_image_description["Description"])
writer = csv.writer(csvfile, delimiter=',')
writer.writerow(fieldnames)
for n, image in enumerate(images_path):
ds = dicom.dcmread(os.path.join(folder_path, image))
rows = []
pixel_array_numpy = ds.pixel_array
if PNG == False:
image = image.replace('.dcm', '.jpg')
else:
image = image.replace('.dcm', '.png')
cv2.imwrite(os.path.join(jpg_folder_path, image), pixel_array_numpy)
if n % 50 == 0:
print('{} image converted'.format(n))
for field in fieldnames:
try:
ds.data_element(field)
except KeyError:
rows.append('')
continue
else:
if ds.data_element(field) is None:
rows.append('')
else:
x = str(ds.data_element(field)).replace("'", "")
y = x.find(":")
x = x[y+2:]
rows.append(x)
writer.writerow(rows)

注意,上述函数中需要在add_you_path中更改为你自己dicom_image_description.csv文件的目录。

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
import os
##get all need dir(absoulte path)
base = 'you dataset path'
all_dir = []
for i in findAllFile(base):
##if i.count('/') ==10:
all_dir.append(i)
##dir add Covert
for i in range(len(all_dir)):
temp = all_dir[i].split("/", 10)
temp[7] = 'ICDC-Glioma_Covert'
all_dir[i] = '/'.join(temp)
## dir sort
##method 1
all_dir = sorted(all_dir,key = lambda i:len(i),reverse=False)
##method 2
##all_dir.sort(key = lambda i:len(i),reverse=True)
## create content tree
for i in all_dir:
os.makedirs(i)
##find leaf node ,covert dcm to jpg
##get all need dir(absoulte path)
leaf = []
for i in findAllFile(base):
if i.count('/') ==10:
leaf.append(i)
for father_path in leaf:
os.chdir(father_path)
retval = os.getcwd()
print("当前工作目录为 %s" % retval)
temp = father_path.split("/", 10)
temp[7] = 'ICDC-Glioma_Covert'
save_path = '/'.join(temp)
##begin covert
covert(father_path,save_path)
print("done")

需要将base中的you dataset path 更改为你数据集的目录。

temp变量后索引的内容”temp[7]“需要改为你想要更改的根目录文件名的位置

一些想法和故障记录

1.关于covert函数,在原github项目中(对于extract.py文件),会报错。我个人认为原因是数据集中的dcm图片不包含项目提供表格中的全部数据,会导致其函数报错。我的解决方法是加入try语句,跳过没有的部分。还有一种方法,将ds.data_element改用ds.get(来源该项目的issues),不会报错了,但是编码上会有问题(可能是我电脑的问题)。

2.对于申请表,个人倾向于用高校邮箱来进行申请。

3.构建目录是对获得的所有目录进行排序(父-子目录),然后使用os.makedirs创建目录。