web-dev-qa-db-ja.com

Python-OpenCVを使用したNumPy配列へのバイト画像

バイト単位の画像があります:

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))) 

しかし、私は枕を使うのは本当に好きではありません。明確なOpenCVを使用する方法、直接NumPyを使用する方法、またはその他の高速ライブラリを使用する方法はありますか?

8
Martin Brišiak

これをテストするために 2x2 JPEG画像 を作成しました。画像には白、赤、緑、紫のピクセルがあります。 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)

チャンネルの順序はPIL.ImageのようにRGBではなくBGRですが、これは機能しているようです。これを調整するために使用するフラグがおそらくいくつかあります。試験結果:

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]]]
11
Norrius