首页 > 解决方案 > 如何将 np 数组中的图像转换为与使用二进制读取读取该图像相同的格式

问题描述

我正在使用 Microsoft 的人脸认知服务,我的工作流程将图像作为一个 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 将图像数组转换为与从磁盘读取图像相同的格式?

标签: pythonnumpy

解决方案


标准图像格式由带有关于图像的元数据和编码以匹配该格式规范的图像数据的标头组成。当您调用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()

推荐阅读