split op• 資料種類:mask → table
• 呼叫: import fullseye as fs; fs.ledger.blob_count_interval(region: 'Any', rel_lo: 'float' = 0.05, rel_hi: 'float' = 0.15, min_prominence: 'float' = 1.0, round_tol: 'Optional[float]' = None, connectivity: 'int' = 8) -> 'dict'(要直接呼叫實作,import blob2d; blob2d.blob_count_interval(region: 'Any', rel_lo: 'float' = 0.05, rel_hi: 'float' = 0.15, min_prominence: 'float' = 1.0, round_tol: 'Optional[float]' = None, connectivity: 'int' = 8) -> 'dict';從台帳取用則 opsblob.get("blob_count_interval"))
對重疊的物體計數。無法確定時回傳區間而不是個數(fail-closed)。
融合團塊中的物體表現為距離轉換的峰。兩個圓重疊時會形成頸縮,頸縮越淺(峰的突出度越小),就越無法確定「是 2 個還是 1 個」。blob_seeds + blob_split 只選一個 h, 總是回傳一個確定的個數 —— 即使在重疊過深、無法確定的地方,也會給出一個看似合理的數。本 op 逐峰量測突出度,把落在閾值帶內的峰視為「模糊」, 並以 lo 〜 hi 的區間回傳個數。只有區間寬度為 0 時才回傳 count。
峰的判定(突出度 p、高度 h、相對突出度 p/h。h 相當於內切圓半徑):
• p >= min_prominence 且 p/h >= rel_hi → 確定的峰(計數)
• p >= min_prominence 且 rel_lo <= p/h < rel_hi → 模糊(不計入 lo,計入 hi)
• 其他 → 雜訊(網格量化產生的峰。橢圓上實測小於 0.6 px)
使用相對突出度的理由:半徑同為 r 的 2 個圓以重疊率 o(中心距 d = 2r(1 − o))重疊時,頸縮的半寬為 w = sqrt(r² − (d/2)²), p/h = 1 − sqrt(1 − (1 − o)²) —— 與半徑無關。若選用絕對值的 h,在大泡與小泡混合的影像中只能適合其中一方(與 poc_cell_counting 記錄下的漏洞同一形態)。預設帶 0.05〜0.15 對應重疊率 0.69〜0.47。
給定 round_tol 時,還會拒絕無法用峰來解釋的面積。重疊率超過 0.7 時,頸縮被網格量化淹沒,只剩下 1 個峰(2 個看起來像 1 個)。因此把元件的面積與確定峰和模糊峰的內切圓面積總和 Σπh² 比較,若面積 > (1 + round_tol + 1/h_min) · Σπh²,則開放上限(hi = None)。1/h_min 是網格量化的部分(半徑 8 px 以上的圓盤比值不超過 1.09,2026-10-18 實測)。round_tol 相當於容許的長寬比 − 1 (長寬比 a/b 的橢圓面積比為 a/b)。像氣泡那樣圓的物體取 0.1,像細胞那樣不規則的取 0.3 左右。None 不假定形狀(會漏掉深度重疊)。
區間的上限並非保證: hi 是表現為峰的物體個數,沒有留下峰而被埋沒的物體(如嵌入大泡中的小泡)也不計入 hi。只有面積檢查能捕捉到它時才開放上限。determined 為 False 時,唯一確定的是「無法說出個數」,區間只是參考(在使用真實氣泡形狀的半合成實驗中,出現了回答為無法確定的團塊其真值比 hi 多 1 個的例子。poc_dense_bubble_count)。
region : array_like
2-D 前景(> 0 為前景)。
rel_lo, rel_hi : float
相對突出度的帶。0 < rel_lo <= rel_hi < 1。
min_prominence : float
突出度的絕對下限 [px]。>= 0。去除距離轉換量化產生的峰。
round_tol : float or None
面積檢查的容許量(見上文)。None 時不檢查。
connectivity : {4, 8}
元件與水位的連通方式。
dict
count(區間寬度為 0 時為 int,否則為 None)、lo、
hi(上限開放時為 None)、determined、reason、
labels(只以確定峰為種子的分割,int32,內切圓的冪圖)、labels_hi
(也以模糊峰為種子的分割)、components(各元件的 label / lo /
hi(開放時為 -1)/ status / area / area_ratio)、
peaks(各峰的 component / row / col / height /
prominence / rel_prominence / status(0 雜訊・1 模糊・2 確定))、
params。
>>> import numpy as np
>>> yy, xx = np.mgrid[0:80, 0:120]
>>> two = ((yy - 40) ** 2 + (xx - 40) ** 2 < 400) | ((yy - 40) ** 2 + (xx - 76) ** 2 < 400)
>>> blob_count_interval(two)["count"] # 重疊率 0.1: 確定為 2 個
2
>>> deep = ((yy - 40) ** 2 + (xx - 50) ** 2 < 400) | ((yy - 40) ** 2 + (xx - 66) ** 2 < 400)
>>> r = blob_count_interval(deep, round_tol=0.1) # 重疊率 0.6: 無法確定
>>> r["count"] is None, r["lo"]
(True, 1)
來歷(僅限公開文獻): Edelsbrunner, Letscher & Zomorodian, *Discrete Comput. Geom.* 28 (2002) 511 —— 持續同調 / Vincent & Soille, *IEEE TPAMI* 13 (1991) 583 —— 分水嶺 / Aurenhammer, *SIAM J. Comput.* 16 (1987) 78 —— 冪圖(分割)。
• 範例資料目錄(下載 URL / 授權) —— 2-D 用 skimage.data(BSD/公有領域)加合成圖,3-D 給出真實資料源(Stanford/PDS 等)的下載 URL。
• 運算子來歷與參考文獻 —— 該運算子族所依據的研究/方法出處。
• 演算法的正典(作者、年份)與用途見上面的族使用指南。
• poc_dense_bubble_count — py -3.11 examples/poc_dense_bubble_count.py
table 作為輸入)—
split)blob_distance · blob_seeds · blob_split
*Provenance: blob2d.py — BLOB 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.