search
LoginSignup
17

More than 3 years have passed since last update.

posted at

updated at

Python・OpenCVでバイナリデータを扱う場合

やりたいこと

バイナリデータから cv2.imread と同じ結果を得たい。

例えば、次のようなケースを想定。
1. PDFファイルをバイナリモードで開く
2. PDFデータ内から画像部分のバリナリデータを抜き取る
3. バイナリデータを画像としてOpenCVで扱う

※一般的なPDFのライブラリを使用せず、最低限の解析処理でPDFデータを扱ってみたいため

背景

Pythonについては初心者な人間が、1ヶ月程前にOpenCVにて画像解析に手を付け始めて2,3日やったものの、それから1ヶ月手付かずの状況でふと再開しました。
これまではファイル保存していた画像を扱っていましたが、OpenCVでの処理を行なう前段階で、画像がバイナリデータの状態の時に、どのようにデータを扱うかがわからず、あれこれ調べた結果をまとめました。

考えた事ややったこと

メモリストリームにして、ストリーム形式が扱えるメソッドに渡せばいいだろうと考えました。
しかし、OpenCVにそのようなメソッドがあるのかがわからず、適当に検索を進めます。
そして、ほぼ答えの載った内容を見つけたので、実際に試してみて足りない部分を補うような形となったのが次の結論です。

とりあえずの結論

import cv2
import numpy as np
import io
from PIL import Image

###ここはコメントをもらうまえのコード(※closeし忘れていた)
###filename = "test.png"
###img_binary = open(filename, "rb").read()

#バイナリデータを準備するのにファイル読込を行なう(テスト用なのでファイル名も直接指定)
#なお、実際には前段階でバイナリデータが渡されることを想定している
with open("test.png", 'rb') as f:
    img_binary = f.read()

#想定する処理はここから --------------------

#バイナリーストリーム <- バリナリデータ
img_binarystream = io.BytesIO(img_binary)

#PILイメージ <- バイナリーストリーム
img_pil = Image.open(img_binarystream)
print(img_pil.mode) #この段階だとRGBA

#numpy配列(RGBA) <- PILイメージ
img_numpy = np.asarray(img_pil)

#numpy配列(BGR) <- numpy配列(RGBA)
img_numpy_bgr = cv2.cvtColor(img_numpy, cv2.COLOR_RGBA2BGR)

#表示確認
cv2.imshow('window title', img_numpy_bgr)
cv2.waitKey(0)
cv2.destroyAllWindows()

今後

もっとよいやり方がわかったら追記したいと思います。
未だにPythonの構文にも慣れておらず、入出力もどうなっているのか把握できていないレベルですので・・・

以上

参考にしたもの

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
17