概念
cv2.fillPoly(img,polygon_coord,fill_val)
引数
img: (画像)np.array
polygon_coord: ポリゴンの座標 x,y のnp.array [[x1,y1],[x2,y2].....] intの値
fii_val: 塗りつぶす値 (値と色のarray)
画像内でポリゴンの範囲を塗りつぶします。物体検出やポリゴンのデータからマスクを作成することでよく利用している関数です。
polygon_coordsは (1,p,2)のサイズのnp.arrayです。pはポリゴンのポイントです。画像内で塗りつぶすので、polygon_coords形式はintが必要です。
jsonからマスク作成
画像セグメンテーションのタスクでは、もとデータはよくjson形式です。モデル内で読み込むために、画像のarrayに変換しなければなりません。このjsonのデータは、xyのarrayに変化して、cv2.fillpollyを利用したら、画像に変換できます。
今回、cv2.resize()の記事と同じの「かぼすちゃん」の写真を使います。Makesense.aiというラベル作成のサイトでカボスちゃんの体、目、鼻のラベルを作ります。(jsonのファイルをダウンロードのリンク)、利用しているファイルはGitrepoで保存しています(リンク)。ぜひ使ってください
import matplotlib.pyplot as plt
import cv2,json
import numpy as np
#ファイルを読み込む
img=cv2.imread("doge.jpg")[:,:,::-1]
json_data = json.load(open("doge_json.json"))
#マスク作成
label_dic={"Body":1,"Eye":2,"Nose":3} #ラベルの辞書
img_mask=np.zeros_like(img[:,:,0])
for id_l, items in json_data["doge.jpg"]["regions"].items():
#XとYを検出
print(id_l,len(items["shape_attributes"]))
x_vals=items["shape_attributes"]["all_points_x"]
y_vals=items["shape_attributes"]["all_points_y"]
#(1,p,2)のarrayに変換
coors_xy= np.array([x_vals,y_vals])
pixel_loc_xy = np.floor(coors_xy).T
#マスクのファイルに塗りつぶす
val=label_dic[items["region_attributes"]["label"]]
img_mask = cv2.fillPoly(img_mask, np.int32([pixel_loc_xy]), val)
#表示
fig,axs=plt.subplots(1,2,figsize=(12,8))
axs[0].imshow(img)
axs[1].imshow(img_mask)
#保存
cv2.imwrite("doge_mask.png",img_mask)