python - 如何将 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 将图像数组转换为与从磁盘读取图像相同的格式?
解决方案
标准图像格式由带有关于图像的元数据和编码以匹配该格式规范的图像数据的标头组成。当您调用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()
推荐阅读
- php - 如何用php替换文件夹中的文件
- mysql - MySQL 连接错误无法检索数据库列表
- javascript - PHP 和 JQuery ajax 网址
- kernel - 在 openssl 中启用特定密码套件
- android - Android MVVM 架构 - ViewModel 中的 Android 引用/导入
- javascript - Redux 状态已更新但组件未更新
- u-sql - 在 ADF 活动之间传递参数
- mysql - 在idea中调试启动Spring启动应用程序时,Liquibase再次运行变更集
- font-awesome-5 - 来自 Font Awesome 5 的奇怪行为
- java - Kotlin/Java SimpleDateFormat 问题:无法解析的日期