Импортируйте наборы данных изображения в порядке - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь импортировать трехмерные изображения по порядку и связывать идентифицирующие ярлыки с каждой папкой.В настоящее время у меня есть код для этого для файлов 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 голосов
/ 19 марта 2019

Проблема, которую я вижу, состоит в том, что

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].

0 голосов
/ 19 марта 2019

Если вы пытаетесь отсортировать список пустых массивов, попробуйте следующее:

slices.sort(key=len)
...