flaskで画像をグレースケール化するAPIを立てる方法
1. はじめに
flaskを使って、POSTリクエストとして投げた画像データを、グレースケール化した画像データとして返すAPIを作る記事です。
2. インストール
仮想環境の作成とactivate
python3 -m venv .venv source .venv/bin/activate
必要なライブラリのインストール。
pip install flask opencv-python requests
3. 画像をグレースケール化するAPIのコード
output のフォルダをあらかじめ作っておく。
from flask import Flask, jsonify, request import cv2 import numpy as np import base64 import json app = Flask(__name__) @app.route("/image", methods=["POST"]) def image_gray_convert(): response = [] params = json.loads(request.data.decode('utf-8')) for recieve_json in params: # Imageをデコード img_stream = base64.b64decode(recieve_json['Image']) # 配列に変換 img_array = np.asarray(bytearray(img_stream), dtype=np.uint8) # opencvでグレースケール化 img_gray = cv2.imdecode(img_array, 0) # 変換結果を保存 cv2.imwrite('./output/result.png', img_gray) # 保存したファイルに対してエンコード with open('./output/result.png', "rb") as f: img_base64 = base64.b64encode(f.read()).decode('utf-8') response.append({'id': recieve_json['id'], 'result' : img_base64}) return jsonify(response) if __name__ == '__main__': app.run(host='localhost', port=5000, debug=True)
下記でサーバー起動を実行した状態にしておく。
python3 app.py
4. 画像のPOSTリクエストを投げるコード
input フォルダをあらかじめ作っておく。
その中に以下の画像データ(0.jpg)を入れておいた。
import requests import json import base64 with open('./input/0.jpg', "rb") as f: img_base64 = base64.b64encode(f.read()).decode('utf-8') url = "http://localhost:5000/image" #JSON形式のデータ json_data = [ { "id": 0, "Image": img_base64 } ] #POSTリクエストを投げる response = requests.post(url, data=json.dumps(json_data)) response_json = response.json()[0]['result'] print(response_json) # Imageをデコード img_stream = base64.b64decode(response_json) # 配列に変換 img_array = np.asarray(bytearray(img_stream), dtype=np.uint8) img_gray = cv2.imdecode(img_array, 0) # 変換結果を保存 cv2.imwrite('./output_recieve/result.png', img_gray)
コードを実行してみる。
python3 post.py
実行がうまく行くと、output フォルダ内にグレースケール化された result.pngが生成される。
加えて、base64形式のグレースケール化された画像データがjsonで返ってくる。
output_recieve フォルダ内にjsonをパースして得た画像データが保存される。