如何将np数组中的图像转换为与使用二进制读取读取图像相同的格式

时间:2019-01-13 08:33:16

标签: python numpy

我正在使用Microsoft的Face认知服务,并且我的工作流将图像显示为numpy数组

MS允许图像以url或标题中的数据的形式传入

如果在标头中传递数据,则可以使用如下所示的二进制读取来创建数据:

# cropped is the image as a numpy array
# the three attempts below do not work
# as microsoft does not recognise the result
# as an image
image_data = cropped.tobytes()
image_data = cropped.tobytes("F")
image_data  = cropped.tobytes("C")

# the following method does work but seems 
# a bit ridiculous
cv2.imwrite("temp.png", cropped)
with open(path_to_image, 'rb') as f:
    image_data = f.read()

我可以通过使用opencv imwrite保存到磁盘,然后按上述方式读回它,以正确的格式获取numpy数组,但这似乎并不明智。

我尝试使用numpy函数tobytes(“ F”)和tobytes(“ C”),但MS无法将结果识别为有效图像

如何使用numpy将图像数组转换为与从磁盘读取图像相同的格式?

1 个答案:

答案 0 :(得分:0)

标准图像格式包含一个标头,该标头包含有关图像的元数据和经过编码以匹配该格式规范的图像数据。当您在数组上调用tobytes时,numpy只是将图像数据展平并将其编码为未压缩的字节。您使用的软件无法使用此数据,因为没有标头描述图像的编码方式。是压缩还是未压缩?图像是黑白还是彩色?像素是使用RGB还是HUV编码的?

听起来,最好的选择是将标准图像格式的图像数据传递给Microsoft。您可以通过使用BytesIO来避免使用文件,但是基本思想是已经拥有的文件。

from io import BytesIO
import PIL

image = PIL.Image.fromarray(cropped, mode="RGB")
with BytesIO() as temp_buffer:
    image.save(temp_buffer, format='png')
    image_data = temp_buffer.getvalue()