简体   繁体   English

Python - 使用 OpenCV 将字节图像转换为 NumPy 数组

[英]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.imdecodenumpy.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)

You can get full code from here你可以从这里获得完整的代码

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM