我有一个以字节为单位的图像:
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\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\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\ ... some other stuff
我可以使用Pillow
将其转换为NumPy数组:
image = numpy.array(Image.open(io.BytesIO(image_bytes)))
但我并不喜欢使用Pillow。有没有办法使用清晰的OpenCV,或者直接使用NumPy,还是其他更快的库?
答案 0 :(得分:5)
我创建了一个2x2 JPEG image来测试它。图像具有白色,红色,绿色和紫色像素。我使用了cv2.imdecode
和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。您可能会使用一些标志来调整它。测试结果:
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]]]
答案 1 :(得分:0)
我在整个互联网上搜索了一下,终于解决了:
NumPy数组(cv2图像)-转换
numpy转换为字节
和
字节为NumPy
:。
{
"numbers": [
{
"a": 0.795741457922079,
"b": 0.07941685760724382,
"c": 0.048012832026655516
},
{
"a": 0.17600389141580575,
"b": 0.4720288949307833,
"c": 0.8079844242898715
},
]
}
您可以从here
获取完整的代码