LIFE LOG(ここにはあなたのブログ名)

作業日誌 う靴

気ままにコンピュータ関連の備忘録などを書きます...。

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をパースして得た画像データが保存される。