按顺序导入图像数据集

时间:2019-03-19 00:50:03

标签: python python-3.x tiff dicom pydicom

我正在尝试按顺序导入3D图像,并将标识标签链接到每个文件夹。目前,我有代码可以对dicom文件执行此操作,但我也尝试使用.tiff图像文件:

data_dir = "\\tiff\\"
patients =  os.listdir(data_dir)
labels_df = pd.read_csv('\\tiff_labels.csv', index_col = 0)
IMG_PX_SIZE = 50
HM_SLICES = 20
def process_data(patient, labels_df, image_px_size = 50, hm_slices = 20, visualize = False):
    label = labels_df.at[patient, 'label']
    path = data_dir + patient
    slices = [pydicom.read_file(path + '/' + s, force = True) for s in os.listdir(path)]
    slices.sort(key = lambda x: int(x.ImagePositionPatient[2]))

我尝试将第9行和第10行更改为:

slices = [cv2.imread(path + '/' + s) for s in os.listdir(path)]
slices.sort()

我发现的问题在第10行:key = lambda x:int(x.ImagePositionPatient [2])。 ImagePositionPatient是dicom的专有功能,无法找到另一种方式对图像进行排序。

我得到了错误:

Traceback (most recent call last):
  File "preprocessing_data.py", line 83, in <module>
    image_data, label = process_data(patient, labels_df, image_px_size = IMG_PX_SIZE, hm_slices = HM_SLICES)
  File "preprocessing_data.py", line 28, in process_data
    slices.sort()
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

2 个答案:

答案 0 :(得分:0)

如果您要对numpy数组列表进行排序,请尝试以下操作:

slices.sort(key=len)

答案 1 :(得分:0)

我看到的问题是

slices = [cv2.imread(path + '/' + s) for s in os.listdir(path)]

创建仅包含图像数据的数组列表,没有有意义的信息可用于排序。如果要按文件名排序,可以执行以下操作:

slices = [[s,cv2.imread(path + '/' + s)] for s in os.listdir(path)]

为您创建的每个文件创建一个包含2个条目的列表,第一个条目是文件名,第二个条目是图像数据。然后slices.sort()开箱即用。但是您必须索引两个列表才能获取图像数据。要访问第5张图片,例如,将为slices[5][1]