Ну, вы можете легко узнать ответ, посмотрев на исходный код 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)
).