Pythonでマスク画像から領域データを抽出するメモ
やりたいこと:下図の黒背景画像のような「マスク画像」から領域情報(x, y, w, h)を抽出したい(用途としてはTuri CreateのObject Detectionで用いる)
で、NumPyを使ってこういう実装をするということはわかっているのだが、
def mask_to_bbox_coordinates(img):
import numpy as np
mask = img.pixel_data
# 真っ黒の場合はNoneを返す
if mask.max() == 0:
return None
# Take max along both x and y axis, and find first and last non-zero value
x0, x1 = np.where(mask.max(0))[0][[0, -1]]
y0, y1 = np.where(mask.max(1))[0][[0, -1]]
return {'x': (x0 + x1) / 2, 'width': (x1 - x0),
'y': (y0 + y1) / 2, 'height': (y1 - y0)}
が、恥ずかしながらPython/NumPy初心者すぎて`np.where(mask.max(0))[0][[0, -1]]`のあたりがよく理解できていないので、ググりつつ何をやっているか理解する。(mask.max() == 0まではわかる)
## Turi Createにおける座標系
Turi Createの座標系は下図のように左上原点で単位はピクセル(正規化しない)。そして矩形領域を示すためのx, y, w, hのx, yは矩形の左上ではなく矩形の中心の値を利用する。
https://github.com/apple/turicreate/tree/master/userguide/object_detection#data-acquisition
## numpy.whereとnumpy.ndarray.max
____________________
ここからはマガジン購読者だけが読めますが、
「がんばって書いた記事は無料公開、
雑にさくっと書いた記事は有料マガジンに」
という方針なのであまり大したことは書いていません。
が、たったの400円で、すぐに購読解除してもその月は過去記事もさかのぼって読めるので、少しでも気になる内容がある方にはオトクかと思います。
____________________
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/