blob_count_interval — BLOB 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)。

Parameters

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}

分量与水位的连通方式。

Returns

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。

Examples

>>> 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 —— 幂图(分割)。

详细使用指南

• blob_analysis 族使用指南

参考(示例数据、文献)

• 示例数据目录(下载 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.