如何将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 数组
如何将 NumPy 数组图像转换为 TensorFlow 图像?
如何将 NumPy 数组转换为应用 matplotlib 颜色图的 PIL 图像