本文介绍了Python - 使用 OpenCV 将字节图像转换为 NumPy 数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个以字节为单位的图像:

I have an image in bytes:

print(image_bytes)

b'\xff\xd8\xff\xfe\x00\x10Lavc57.64.101\x00\xff\xdb\x00C\x00\x08\x04\x04\x04\x04\x04\x05\x05\x05\x05\x05\x05\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x07\x07\x07\x08\x08\x08\x07\x07\x07\x07\x06\x06\x07\x07\x08\x08\x08\x08\t\t\t\x08\x08\x08\x08\t\t\n\n\n\x0c\x0c\x0b\x0b\x0e\x0e\x0e\x11\x11\x14\xff\xc4\x01\xa2\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x01\x00\x03\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\ ...其他一些东西

我可以使用 Pillow 将其转换为 NumPy 数组:

I am able to convert it to a NumPy array using Pillow:

image = numpy.array(Image.open(io.BytesIO(image_bytes)))

但我真的不喜欢使用 Pillow.有没有办法使用清晰的 OpenCV,或者直接使用 NumPy 更好,或者其他一些更快的库?

But I don't really like using Pillow. Is there a way to use clear OpenCV, or directly NumPy even better, or some other faster library?

推荐答案

我创建了一个 2x2 JPEG 图片 来测试一下.图像具有白色、红色、绿色和紫色像素.我使用了 cv2.imdecodenumpy.来自缓冲区

I created a 2x2 JPEG image to test this. The image has white, red, green and purple pixels. I used cv2.imdecode and numpy.frombuffer

import cv2
import numpy as np

f = open('image.jpg', 'rb')
image_bytes = f.read()  # b'\xff\xd8\xff\xe0\x00\x10...'

decoded = cv2.imdecode(np.frombuffer(image_bytes, np.uint8), -1)

print('OpenCV:\n', decoded)

# your Pillow code
import io
from PIL import Image
image = np.array(Image.open(io.BytesIO(image_bytes)))
print('PIL:\n', image)

这似乎有效,尽管通道顺序是 BGR 而不是 PIL.Image 中的 RGB.您可能会使用一些标志来调整它.测试结果:

This seems to work, although the channel order is BGR and not RGB as in PIL.Image. There are probably some flags you might use to tune this. Test results:

OpenCV:
 [[[255 254 255]
  [  0   0 254]]

 [[  1 255   0]
  [254   0 255]]]
PIL:
 [[[255 254 255]
  [254   0   0]]

 [[  0 255   1]
  [255   0 254]]]

这篇关于Python - 使用 OpenCV 将字节图像转换为 NumPy 数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-14 05:32