Невозможно передать данные изображения DICOM в генератор данных изображения - PullRequest
4 голосов
/ 17 февраля 2020

Итак, я предварительно обработал некоторые изображения DICOM для подачи в нейронную сеть, и на этапе увеличения изображения генератор данных изображения ожидает 4d вход, а мои данные - 3D (200, 420, 420)

Я пытался изменение формы массива и расширение размеров, но в обоих случаях я не могу построить отдельные изображения в массиве (ожидается, что изображение имеет форму 420, 420, и вместо этого мои новые изображения имеют форму 420, 420, 1)

, и вот мои коды;

У меня есть три функции для преобразования изображений DICOM в изображения с хорошим контрастом;

Эта функция принимает единицы измерения поля дома

def transform_to_hu(medical_image, image):
    intercept = medical_image.RescaleIntercept
    slope = medical_image.RescaleSlope
    hu_image = image * slope + intercept

    return hu_image

Эта функция устанавливает значения изображения окна;

def window_image(image, window_center, window_width):
    img_min = window_center - window_width // 2
    img_max = window_center + window_width // 2
    window_image = image.copy()
    window_image[window_image < img_min] = img_min
    window_image[window_image > img_max] = img_max

    return window_image

И эта функция загружает изображение:

def load_image(file_path):
    medical_image = dicom.read_file(file_path)
    image = medical_image.pixel_array

    hu_image = transform_to_hu(medical_image, image)
    brain_image = window_image(hu_image, 40, 80)
    return brain_image

Затем я загружаю свои изображения:

files = sorted(glob.glob('F:\CT_Data_Classifier\*.dcm'))
images = np.array([load_image(path) for path in files])

images.shape возвращает (200, 512, 512 ) и все в порядке с данными, например, я могу построить 100-е изображение на plt.imshow(images[100]), а на графике изображение

, а затем подать данные в генератор данных изображения

train_image_data = ImageDataGenerator(
    rescale=1./255,
    shear_range=0.,
    zoom_range=0.05,
    rotation_range=180,
    width_shift_range=0.05,
    height_shift_range=0.05,
    horizontal_flip=True,
    vertical_flip=True,
    fill_mode='constant',
    cval=0

, но затем, когда я пытаюсь построить, с этим код:

plt.figure(figsize=(12, 12))
for X_batch, y_batch in train_image_data.flow(trainX, trainY, batch_size=9):
    for i in range(0, 9):
        plt.subplot(330 + 1 + i)
        plt.imshow(X_batch[i])
    plt.show()
    break 

возвращает

(ValueError: ('Input data in "NumpyArrayIterator" should have rank 4. You passed an array with shape', (162, 420, 420)))

Я попытался раскрыть и изменить форму, чтобы добавить дополнительное измерение в конце массива для представления каналов, но затем оно возвращает

TypeError: Invalid shape (420, 420, 1) for image data

на этапе plt.imshow

Я врач, а не опытный программист, поэтому я был бы очень признателен за вашу помощь. веселит.

1 Ответ

2 голосов
/ 17 февраля 2020

Вы правильно добавили дополнительное измерение для представления каналов. Эта часть кажется в порядке. Проблема с заговором. Для этого вы можете использовать:

plt.matshow(x[..., 0]).

, где x - трехмерный массив. Синтаксис x[..., 0] означает получение индекса 0 последнего измерения массива x. Многоточие (...) - это сокращение, чтобы заполнить размеры. Для трехмерного массива эквивалентный вызов будет x[:, :, 0].

...