[英]Python - byte image to NumPy array using OpenCV
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\\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
I am able to convert it to a NumPy array using Pillow
:我可以使用
Pillow
将其转换为 NumPy 数组:
image = numpy.array(Image.open(io.BytesIO(image_bytes)))
But I don't really like using Pillow.但我真的不喜欢使用 Pillow。 Is there a way to use clear OpenCV, or directly NumPy even better, or some other faster library?
有没有办法使用清晰的 OpenCV,或者直接使用 NumPy 甚至更好,或者其他一些更快的库?
I created a 2x2 JPEG image to test this.我创建了一个2x2 JPEG 图像来测试这个。 The image has white, red, green and purple pixels.
图像具有白色、红色、绿色和紫色像素。 I used
cv2.imdecode
and numpy.frombuffer
我使用了
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)
This seems to work, although the channel order is BGR and not RGB as in PIL.Image
.这似乎有效,尽管通道顺序是 BGR 而不是
PIL.Image
RGB。 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]]]
I searched all over the internet finally I solved:我在互联网上搜索了最后我解决了:
NumPy array (cv2 image) - Convert NumPy 数组(cv2 图像)- 转换
NumPy to bytes
NumPy 到字节
and和
bytes to NumPy
字节到 NumPy
:. :.
#data = cv2 image array
def encodeImage(data):
#resize inserted image
data= cv2.resize(data, (480,270))
# run a color convert:
data= cv2.cvtColor(data, cv2.COLOR_BGR2RGB)
return bytes(data) #encode Numpay to Bytes string
def decodeImage(data):
#Gives us 1d array
decoded = np.fromstring(data, dtype=np.uint8)
#We have to convert it into (270, 480,3) in order to see as an image
decoded = decoded.reshape((270, 480,3))
return decoded;
# Load an color image
image= cv2.imread('messi5.jpg',1)
img_code = encodeImage(image) #Output: b'\xff\xd8\xff\xe0\x00\x10...';
img = decodeImage(img_code) #Output: normal array
cv2.imshow('image_deirvlon',img);
print(decoded.shape)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.