blob_count_interval — BLOB split op

• Datenarten: mask → table

• Aufruf: 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' (die Implementierung direkt: 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'; aus dem Register: opsblob.get("blob_count_interval"))

Verwendung

Zählt überlappende Objekte. Ist die Anzahl nicht bestimmbar, wird statt einer Zahl ein Intervall zurückgegeben (fail-closed).

Objekte in einem verschmolzenen Klumpen erscheinen als Gipfel der Distanztransformation. Überlappen sich zwei Kreise, entsteht eine Einschnürung; je flacher sie ist (je kleiner die Prominenz des Gipfels), desto weniger lässt sich entscheiden, ob es "2 oder 1" sind. blob_seeds + blob_split wählen ein einziges h und geben immer eine einzige Anzahl zurück —— selbst wo die Überlappung zu tief für eine Entscheidung ist, kommt eine plausible Zahl heraus. Dieser op misst die Prominenz jedes Gipfels, behandelt Gipfel im Schwellenband als "mehrdeutig" und gibt die Anzahl als Intervall von lo bis hi zurück. Nur wenn das Intervall die Breite 0 hat, wird count zurückgegeben.

Klassifikation der Gipfel (Prominenz p, Höhe h, relative Prominenz p/h; h entspricht dem Inkreisradius):

• p >= min_prominence und p/h >= rel_hi → sicherer Gipfel (wird gezählt)

• p >= min_prominence und rel_lo <= p/h < rel_hi → mehrdeutig (in lo nicht gezählt, in hi gezählt)

• sonst → Rauschen (Gipfel aus der Gitterquantisierung; an Ellipsen gemessen unter 0.6 px)

Warum relative Prominenz: Überlappen sich zwei Kreise gleichen Radius r mit Überlappungsgrad o (Mittelpunktsabstand d = 2r(1 − o)), ist die halbe Breite der Einschnürung w = sqrt(r² − (d/2)²) und p/h = 1 − sqrt(1 − (1 − o)²) —— unabhängig vom Radius. Ein absolutes h passt in einem Bild mit großen und kleinen Blasen nur zu einer Seite (dieselbe Form wie die Lücke, die poc_cell_counting festgehalten hat). Das Standardband 0.05–0.15 entspricht Überlappungsgraden von 0.69–0.47.

Wird round_tol angegeben, wird auch Fläche, die die Gipfel nicht erklären können, abgewiesen. Über einem Überlappungsgrad von 0.7 geht die Einschnürung in der Gitterquantisierung unter, und nur ein Gipfel bleibt übrig (2 sehen aus wie 1). Daher wird die Fläche der Komponente mit Σπh² verglichen, der Summe der Inkreisflächen der sicheren und mehrdeutigen Gipfel; ist Fläche > (1 + round_tol + 1/h_min) · Σπh², wird die Obergrenze geöffnet (hi = None). 1/h_min ist der Anteil der Gitterquantisierung (bei Kreisscheiben ab Radius 8 px Verhältnis höchstens 1.09, gemessen 2026-10-18). round_tol entspricht dem zulässigen Seitenverhältnis − 1 (eine Ellipse mit Seitenverhältnis a/b hat das Flächenverhältnis a/b). Für runde Objekte wie Blasen 0.1, für unregelmäßige wie Zellen etwa 0.3. None setzt keine Form voraus (tiefe Überlappungen werden übersehen).

Die Obergrenze des Intervalls ist keine Garantie: hi ist die Anzahl der Objekte, die als Gipfel sichtbar wurden; Objekte, die ohne Gipfel verschüttet sind (etwa eine kleine Blase, die in eine große hineinragt), sind auch in hi nicht enthalten. Die Obergrenze wird nur geöffnet, wenn die Flächenprüfung sie erfasst. Ist determined False, steht nur fest, dass "die Anzahl nicht angegeben werden kann", und das Intervall ist ein Richtwert (in einem halbsynthetischen Test mit echten Blasenformen lag bei einem als unbestimmt gemeldeten Klumpen der wahre Wert um 1 über hi. poc_dense_bubble_count).

Parameters

region : array_like

2-D-Vordergrund (> 0 ist Vordergrund).

rel_lo, rel_hi : float

Band der relativen Prominenz. 0 < rel_lo <= rel_hi < 1.

min_prominence : float

Absolute Untergrenze der Prominenz [px]. >= 0. Verwirft Gipfel aus der Quantisierung der Distanztransformation.

round_tol : float or None

Toleranz der Flächenprüfung (siehe oben). Bei None keine Prüfung.

connectivity : {4, 8}

Zusammenhang für Komponenten und Wasserstände.

Returns

dict

count (int, wenn das Intervall die Breite 0 hat, sonst None), lo,

hi (None, wenn die Obergrenze offen ist), determined, reason,

labels (Aufteilung nur mit sicheren Gipfeln als Saat, int32, Potenzdiagramm der Inkreise), labels_hi

(Aufteilung auch mit mehrdeutigen Gipfeln als Saat), components (je Komponente label / lo /

hi (-1, wenn offen) / status / area / area_ratio),

peaks (je Gipfel component / row / col / height /

prominence / rel_prominence / status (0 Rauschen, 1 mehrdeutig, 2 sicher)),

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"] # Überlappungsgrad 0.1: eindeutig 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) # Überlappungsgrad 0.6: unbestimmt

>>> r["count"] is None, r["lo"]

(True, 1)

Herkunft (nur öffentliche Literatur): Edelsbrunner, Letscher & Zomorodian, *Discrete Comput. Geom.* 28 (2002) 511 —— Persistenz / Vincent & Soille, *IEEE TPAMI* 13 (1991) 583 —— Wasserscheide / Aurenhammer, *SIAM J. Comput.* 16 (1987) 78 —— Potenzdiagramm (Aufteilung).

Ausführlicher Anwendungsleitfaden

• Leitfaden zur Familie blob_analysis

Referenzen (Beispieldaten, Literatur)

• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).

• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.

• Der kanonische Algorithmus (Autor, Jahr) und seine Anwendungen stehen im Familienleitfaden oben.

Ausführbare Beispiele (verifizierte Samples, die diesen Operator wirklich aufrufen)

• poc_dense_bubble_count — py -3.11 examples/poc_dense_bubble_count.py

Typkompatible Folge-Operatoren (nehmen table als Eingabe)

—

Gleiche Kategorie (split)

blob_distance · blob_seeds · blob_split


*Provenance: blob2d.py — BLOB Operator-Registry. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*

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