連結成分にラベルを付け、面積・形・位置で選び、数えます。接触している対象は分水嶺で分けられます。
Label connected components, select them by area, shape or position, and count them. Touching objects can be separated with a watershed.
向く: 個数・面積・粒度分布。前景と背景がはっきり分かれる場面。
向かない: ★計数が合っていて分割が全部外れる点があります(poc_cell_counting)。1 つの指標に畳まず、数と形を別に数えてください。粒度分布では D50 が合う点が「正確」ではなく打ち消しであることも実測されています(poc_particle_sizing)。
import fullseye as fs
import numpy as np
mask = np.zeros((64, 64), bool)
mask[10:20, 10:20] = True
mask[40:46, 40:46] = True
# ★`blob_count` は**台帳 op ではなく 2-D の進化 op** です。
# `fs.ledger.<name>` で見つからないときは `fs.op_find("<name>")` を引くと、どの層に居るかが返ります。
print('個数 =', fs.op.blob_count(mask)) # 2.0
auto_threshold → blob_label → blob_select → blob_features
auto_threshold で前景の 2 値マスク → blob_label で連結成分にラベル → blob_select で面積・形・位置で絞り → blob_features で個々の面積・重心・主軸を表にする。
接触した対象は watersheds(種は blob_seeds)。個数だけなら blob_count。重なりが深くて個数が決まらないかもしれないときは blob_count_interval —— 山の突出度を測り、決まらなければ個数ではなく区間を返す(poc_dense_bubble_count)。2-D レジストリ側で済ませるなら otsu → remove_small → select_shape。
計数が合っていて分割が全部外れる点がある(poc_cell_counting)—— 数と形を別に数える。粒度分布で D50 が合う点は「正確」ではなく融合と縁切れの打ち消し(poc_particle_sizing)。
面積は mm/px の 2 乗。mm_per_px_from_reference で mm/px を出し、面積には自分で 2 乗して掛ける(table_px_to_mm が換算するのは長さ列だけ)。
blob_label / blob_select / blob_count / watershedspoc_dense_bubble_count、poc_cell_counting、poc_particle_sizing