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 의 두 원이 겹침률 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 을 넘으면 목이 격자 양자화에 묻혀 봉우리가 하나만남는다(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, 내접원의 power diagram), 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 —— 지속성(persistence) / Vincent & Soille, *IEEE TPAMI* 13 (1991) 583 —— 분수령(watershed) / Aurenhammer, *SIAM J. Comput.* 16 (1987) 78 —— power diagram(분할).

자세한 사용 가이드

• blob_analysis 패밀리 가이드

참고(샘플 데이터·문헌)

• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL 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 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.