numpy.array против img_to_array - PullRequest
       3

numpy.array против img_to_array

0 голосов
/ 11 декабря 2018

В чем разница между функциями numpy.array(image) и img_to_array(image)?img_to_array находится внутри keras.preprocessing.image упаковки.Я хотел использовать его с изображением в качестве входных данных для этой функции.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Ну, вы можете легко узнать ответ, посмотрев на исходный код img_to_array:

def img_to_array(img, data_format='channels_last', dtype='float32'):
    """Converts a PIL Image instance to a Numpy array.
    # Arguments
        img: PIL Image instance.
        data_format: Image data format,
            either "channels_first" or "channels_last".
        dtype: Dtype to use for the returned array.
    # Returns
        A 3D Numpy array.
    # Raises
        ValueError: if invalid `img` or `data_format` is passed.
    """
    if data_format not in {'channels_first', 'channels_last'}:
        raise ValueError('Unknown data_format: %s' % data_format)
    # Numpy array x has format (height, width, channel)
    # or (channel, height, width)
    # but original PIL image has format (width, height, channel)
    x = np.asarray(img, dtype=dtype)
    if len(x.shape) == 3:
        if data_format == 'channels_first':
            x = x.transpose(2, 0, 1)
    elif len(x.shape) == 2:
        if data_format == 'channels_first':
            x = x.reshape((1, x.shape[0], x.shape[1]))
        else:
            x = x.reshape((x.shape[0], x.shape[1], 1))
    else:
        raise ValueError('Unsupported image shape: %s' % (x.shape,))
    return x

Таким образом, основное отличие состоит в том, что вы можете передавать формат данныхаргумент img_to_array для размещения каналов либо на первой оси, либо на последней оси.Кроме того, это будет гарантировать, что возвращаемый массив является трехмерным массивом (например, если заданный входной сигнал img является двумерным массивом, который может представлять изображение в градациях серого, тогда он добавил бы другую ось с размером 1, чтобы сделать его трехмерным массивом).

Обратите внимание, что хотя в строке документации было упомянуто, что входное изображение является экземпляром изображения PIL, однако оно также будет работать с массивами numpy или даже списками Python (поскольку вход сначала преобразуется в массив numpy).: x = np.asarray(img, dtype=dtype)).

0 голосов
/ 11 декабря 2018

Насколько я могу видеть на , некоторые примеры , img_to_array() - это метод класса изображения.Класс представляет собой не массив, а нечто более абстрактное, но изображение по своей сути является массивом.Возможно, поэтому у вас будет похожий результат с numpy.array(image).

Обратите внимание, что, поскольку методы содержат больше информации (назовите ее «контекст»), они должны быть более эффективными и надежными.Например, opencv2 манипулирует изображениями BGR, когда речь идет о представлении, а не RGB.Поначалу это может сбивать с толку, но при использовании правильной библиотеки cv2 вам даже не нужно думать об этом (в зависимости от того, что вы собираетесь делать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...