URLから取得した画像データをNumpyのArrayに変換する

lockdefです

今日は個人的に欲しかった関数を実装したので紹介します

前準備

必要なライブラリのインストールです。

pip install Pillow

目的

引数で画像のURLを受け取り、NumpyのArrayを返す関数を作る

手法の紹介

1.必要なモジュールをインポートする

import requests
from io import BytesIO

from PIL import Image
  • URLからデータを取得するためのrequestsライブラリ
  • I/O関係の処理を行うためのBytesIO関数
  • 画像を扱うImage関数

これらをインポートします

2. データのリクエス

response = requests.get(url, stream=True)

requestライブラリのget関数でデータを取得します

3. arrayに変換する

if response.status_code == 200:
    img_array = Image.open(BytesIO(response.content)).convert('RGB')

データの取得が成功したことをif文で確認してから変換を行います
二行目がわかりにくいので分割します

content = response.content
bytes_data = BytesIO(content)
img = Image.open(bytes_data)
img _converted= img.convert('RGB')

一行目で取得したデータの画像データを取得します。
二行目でデータをメモリ上に(一時的な)保存をします。
三行目でNumpyのArrayに変換をします。
四行目でRGBに変換します。

以上で完了です。

使用例

取得した画像データはMatplotlib等で表示したりPillowで画像処理を行うことが出来ます。

f:id:lockdef:20190502205912j:plain

OpenCVで画像処理をする場合

下記にあるGistの13行目を変更します。

return Image.open(BytesIO(response.content)).convert('RGB')

から

return Image.open(BytesIO(response.content)).convert('BGR')

にしてください。
OpenCVでは画像データをBGRとして読み込むのでconvertの引数を'RGB'から'BGR'に変更することでOpenCVでも正常に画像を扱えるようになります

全文

最後に関数化したものをおいておきます。
コピペで使ったり、Gistからダウンロードしてimportしたりして使ってください。

gist.github.com

おわり

この関数はOpenCVのノートブックを作っている最中に欲しかったんですが、思いつくのが遅かったので結局ローカルに保存した画像を読み込んで使ってしまいました。
ローカル環境に縛らないプログラム、ノートブックを作りたいときに役に立つと期待しています。