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で画像処理を行うことが出来ます。
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したりして使ってください。
おわり
この関数はOpenCVのノートブックを作っている最中に欲しかったんですが、思いつくのが遅かったので結局ローカルに保存した画像を読み込んで使ってしまいました。
ローカル環境に縛らないプログラム、ノートブックを作りたいときに役に立つと期待しています。