Pythonでマスク画像から領域データを抽出するメモ

やりたいこと:下図の黒背景画像のような「マスク画像」から領域情報(x, y, w, h)を抽出したい(用途としてはTuri CreateのObject Detectionで用いる)

画像1

で、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は矩形の左上ではなく矩形の中心の値を利用する。

画像2


https://github.com/apple/turicreate/tree/master/userguide/object_detection#data-acquisition

## numpy.whereとnumpy.ndarray.max

____________________

ここからはマガジン購読者だけが読めますが、

「がんばって書いた記事は無料公開、
 雑にさくっと書いた記事は有料マガジンに」

という方針なのであまり大したことは書いていません。

が、たったの400円で、すぐに購読解除してもその月は過去記事もさかのぼって読めるので、少しでも気になる内容がある方にはオトクかと思います。

____________________

ここから先は

1,527字 / 1画像
文章やサンプルコードは多少荒削りかもしれませんが、ブログや書籍にはまだ書いていないことを日々大量に載せています。たったの400円で、すぐに購読解除してもその月は過去記事もさかのぼって読めるので、少しでも気になる内容がある方にはオトクかと思います。

技術的なメモやサンプルコード、思いついたアイデア、考えたこと、お金の話等々、頭をよぎった諸々を気軽に垂れ流しています。

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/