如何将numpy数组图像转换为字节?

Posted

技术标签:

【中文标题】如何将numpy数组图像转换为字节?【英文标题】:How to turn numpy array image to bytes? 【发布时间】:2018-11-10 19:20:37 【问题描述】:

我需要使用 Google Vision API 识别图像。在这些示例中,它们使用以下构造:

with io.open('test.png', 'rb') as image_file:
    content = image_file.read()
image = vision.types.Image(content=content)

我需要做类似的事情,但我的图片来自:

content = cv2.imread()

返回 numpy 数组,而不是字节。我试过了:

content = content.tobytes()

它将数组转换为字节,但显然返回不同的字节,因为它给出了不同的结果。 那么如何使我的图像数组类似于我通过open() 函数获得的图像数组

【问题讨论】:

您需要哪些字节? PNG文件的字节数? RGBA5、RGB8 或 RGB16 格式的解压缩图像的字节数取决于文件中的内容?或者特别是在RGB8中,不管文件是如何存储的? R-G-B-A 顺序的四个独立解压 16 位平面的字节数? (小端还是大端?)还有别的吗? @abarnert 我不太清楚。我只是希望它看起来与 open('file.png', 'rb') 给我的一样。有没有办法检查? 然后使用encoded_bytes = cv2.imencode('.png', content) @zindarod 明白了......但我仍然很困惑。如果 OP 使用 cv2.imread 您指定图像所在的位置...为什么他们不能简单地使用 open 代替它? 如果你实际上并没有对 cv2 进行任何处理,那么解码一个 PNG 文件只是为了再次将其编码为 PNG 是非常愚蠢的...... 【参考方案1】:

您只需将数组编码为与图像相同的格式,然后然后使用tobytes(),如果您希望它采用相同的格式。

>>> import cv2
>>> with open('image.png', 'rb') as image_file:
...     content1 = image_file.read()
...
>>> image = cv2.imread('image.png')
>>> success, encoded_image = cv2.imencode('.png', image)
>>> content2 = encoded_image.tobytes()
>>> content1 == content2
True

【讨论】:

看视频会不会一样?所以我会有类似的东西:cap = cv2.VideoCapture('video.avi') 然后在框架上工作? 是的,它会起作用,但这是一种非常低效的做事方式。您使用 OpenCV 解码视频只是为了以字节形式重新编码它以供云视觉 API 使用。

以上是关于如何将numpy数组图像转换为字节?的主要内容,如果未能解决你的问题,请参考以下文章

Python - 使用 OpenCV 将字节图像转换为 NumPy 数组

如何将 PIL 图像转换为 numpy 数组?

如何将 NumPy 数组图像转换为 TensorFlow 图像?

如何将 NumPy 数组转换为应用 matplotlib 颜色图的 PIL 图像

如何使用 matplotlib/numpy 将数组保存为灰度图像?

将CV2 numpy数组转换为QImage时如何配置颜色?