numpy.array与img_to_array

时间:2018-12-11 06:14:45

标签: python numpy image-processing keras

numpy.array(image)img_to_array(image)函数之间有什么区别? img_to_array位于keras.preprocessing.image软件包中。我想将它与图像一起用作此功能的输入。

2 个答案:

答案 0 :(得分:1)

好吧,您可以通过查看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,以将通道放置在第一个轴或最后一个轴上。此外,它将确保返回的数组是3D数组(例如,如果给定的输入img是可能表示灰度图像的2D数组,则它将添加另一个尺寸为1的轴以使其成为3D阵列)。

请注意,尽管已经在文档字符串中提到输入图像是PIL图像实例,但是它也可以与numpy数组甚至Python列表一起使用(因为输入首先被转换为numpy数组:{{ 1}})。

答案 1 :(得分:0)

据我在some examples上看到的,img_to_array()是图像类的一种方法。该类不代表数组,而是更抽象的东西,但是图像本质上是数组。这可能就是为什么numpy.array(image)会有类似结果的原因。

请注意,由于方法具有更多信息(称为“上下文”),因此它们应更加有效和可靠。例如,当涉及到表示而不是RGB时,opencv2正在处理BGR图像。起初可能会造成混淆,但是使用适当的cv2库,您甚至不必真正考虑它(取决于您打算做什么)。