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

27

我需要使用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()函数得到的数组类似?


2
然后使用 encoded_bytes = cv2.imencode('.png', content) - zindarod
@zindarod 你应该把那个变成正式的答案。那实际上实现了OP想要的功能。顺便说一句,这个函数输出一个元组,第一个元素表示编码是否成功(bool),第二个元素是图像的实际压缩版本。建议忽略第一个元素。 - rayryeng
@rayryeng 我认为现在这个评论已经足够了。让我们看看它是否对提问者有所帮助。 - zindarod
1
@zindarod 已经明白了...但我还是有点困惑。如果 OP 使用的是 cv2.imread,在其中指定了图像的位置...为什么他们不能简单地使用 open 呢? - rayryeng
1
如果您实际上并没有使用cv2进行任何处理,那么解码PNG文件只为再次将其编码为PNG是非常愚蠢的... - abarnert
显示剩余11条评论
1个回答

52

你只需要按照与图像相同的格式对数组进行编码,然后如果想要以相同的格式使用它,就使用 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')然后处理帧? - wasd
4
可以,但那是一种非常低效的方法。你正在使用OpenCV解码视频,然后再以字节形式重新编码,以供云视觉API使用。 - rayryeng
内容1和内容2对我来说不一样。 - pavan
你是用完全相同的代码吗,@pavan?还是你使用了不同的编码(例如jpeg)? - alkasm
@alkasm 我使用了 JPEG。 - pavan
@pavan 这就是它们不同的原因——JPEG 是一种有损压缩格式,因此数据不会完全相同。 - alkasm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接