texture op• Datenarten: image → image
• Aufruf: fullseye.apply(img, "local_bimodality", a=0.5, b=0.5) (das 2-D-Modell ist ein Bild plus zwei skalare Regler a,b∈[0,1])

*Die Abbildung ist die tatsächliche Ausgabe auf einer synthetischen 128×128-Eingabe. Links Eingabe, rechts Ausgabe. Punktwolken als Draufsicht-Streudiagramm (Helligkeit = z), 1-D-Reihen als Linie, Volumen als Maximum-Projektion entlang z, Videos als mittleres Bild, komplexe Bilder als Betrag; Rückgabewerte, die kein Bild ergeben, werden als Werte gezeigt.*
Regler a durchfahren (0,1 / 0,5 / 0,9, der andere Regler auf Standard):
▸ local_bimodality: Regler a durchfahren (Doku-Website)
Regler b durchfahren (0,1 / 0,5 / 0,9, der andere Regler auf Standard):
▸ local_bimodality: Regler b durchfahren (Doku-Website)
Auf anderen Bildern (synthetische Szene / Foto / Münzen. Obere Reihe: Eingaben, untere Reihe: deren Ausgaben. Regler auf Standard):
▸ local_bimodality: andere Eingaben (Doku-Website)
*Die 4. Spalte ist eine Farb-Eingabe (H,W,3). Dieser Op verarbeitet Farbe, ohne Kanäle zu vermischen (er faltet den Farbkanal nicht als dritte Raumachse).*
Lokale Bimodalität (bimodality coefficient). Ohne auch nur 1 Schwellenwert zu wählen, liefert sie nur „zerfällt diese Stelle in 2 Werte?“ als Karte von 0 bis 1.
a variiert die Seitenlänge des Fensters über 9, 15, 25, 41 (größer ergibt eine stabilere Schätzung, doch dünne Strukturen lösen sich in der Umgebung auf). b variiert die Kontrastuntergrenze auf max(1e-5, 0.25b x Wertebereich des Bildes) ― liegt die Standardabweichung des Fensters darunter, wird 0 zurückgegeben (auch bei b=0 bleibt die absolute Untergrenze 1e-5).
BC = (Schiefe^2 + 1) / Kurtosis ergibt sich in geschlossener Form allein aus den Momenten 1. bis 4. Ordnung des Fensters (4 Boxmittel). Es ist sowohl translations- als auch skaleninvariant, daher ergeben schwache wie starke Muster denselben Wert. Die Referenzwerte sind durch analytische Lösungen festgelegt, und die Messungen konvergieren dorthin (Fenster 41):
• 2-Punkt-Verteilung (2 Werte je zur Hälfte) = 1.0 (Kurtosis 1 ist die Untergrenze) ― gemessen 1.0000 direkt auf einer Stufe
• Gleichverteilung = 5/9 = 0.5556 ― gemessen 0.5598 an gleichverteilten Zufallszahlen
• Normalverteilung = 1/3 = 0.3333 ― gemessen 0.3306 an normalverteilten Zufallszahlen
> 5/9 ist die klassische Faustregel für "2 Gipfel, spitzer als gleichverteilt". ★Auch bei einem Gipfel wird es nicht 0 ― die Untergrenze der Normalverteilung ist 1/3, nicht 0, nutzbar ist also das Band 0.33-1.0.
Quelle und übernommene Grenzen (Pfister, Schwarz, Janczyk, Dale & Freeman 2013, *Frontiers in Psychology* 4:700). ★Schiefe unimodale Verteilungen erzeugen falsch positive Ergebnisse: In der Abbildung des Papers hat eine eindeutig unimodale Verteilung BC = 0.73 und eine wirklich bimodale Verteilung BC = 0.67, die Rangfolge ist also umgekehrt. Je größer der Betrag der Schiefe, desto höher steigt BC, unabhängig von der Zahl der Gipfel. Dieses Op hat dieselbe Eigenschaft - Fenster mit einseitigem Ausläufer (ein paar helle Punkte auf dunklem Grund usw.) fallen hoch aus. Bimodalität nicht mit diesem 1 Maß entscheiden, sondern mit der Trennbarkeit von local_std oder otsu kombinieren. Die Formel des Papers enthält übrigens eine Stichprobenkorrektur, (m3^2+1)/(m4 + 3(n-1)^2/((n-2)(n-3))), während dieses Op die Populationsversion verwendet (ein Fenster hat 81 bis 1,681 Stichproben, die Korrektur ist vernachlässigbar; die obigen Referenzwerte 1/3, 5/9 und 1.0 gelten für die Populationsversion exakt).
Beziehung zur Verallgemeinerung auf der Seite der Schwellwertwahl: Barron (2020), Generalized Histogram Thresholding (arXiv:2007.07350), enthält Otsu, Minimum Error Thresholding und gewichtete Perzentil-Schwellwerte als Spezialfälle und interpoliert stetig, welcher Schwellwert gewählt wird. Dieses Op ist das Gegenstück:
Es misst, ob es überhaupt einen Schwellwert gibt.
Warum es vor den schwellwertwählenden Ops (otsu / threshold) nötig ist: Binarisierung liefert für jedes Bild eine Antwort, schneidet aber in einem Fenster mit nur 1 Gipfel an einer bedeutungslosen Stelle (eine Grenze, die der otsu- docstring selbst einräumt). Dieses Op liefert vor dem Schneiden, "ob es sich überhaupt trennt", sodass man festlegen kann: "Wo es sich nicht trennt, wird nicht geschnitten." Dient zur Beurteilung, ob ein Zeichenfeld 1 Farbe Schrift auf einem Grund von 1 Farbe ist, ob eine Platte gleichmäßig beleuchtet ist oder ob ein Kratzer wirklich eine andere Graustufe als der Grund hat.
★Die Untergrenze ist Pflicht. Auf einer gleichförmigen Fläche wird die Varianz zu Rundungsstaub, und die Verhältnisse 3. und 4. Ordnung des Staubs werden zu Struktur ― eine Version, die die Untergrenze nur relativ zum Wertebereich des Bildes setzte, ergab auf einem Bild, das nur aus einheitlichem 0.5 mit Staub der Amplitude 1e-12 bis 1e-8 bestand, ein BC-Maximum von 1.0000 (der Wertebereich selbst ist Staub, daher greift die relative Untergrenze nicht). Erst zusammen mit der absoluten Untergrenze 1e-5 fällt es auf 0 (gemessen).
Es normiert nicht (der Wert ist BC selbst), daher lassen sich Werte zwischen Bildern vergleichen. Der Rand wird gespiegelt (mode="reflect"). Ein leerer Frame ergibt überall 0. ★Da das Fenster groß ist, darf es nicht in Kacheln aufgeteilt werden (mit Begründung in scale.py registriert).
• Leitfaden zur Familie gallery2d_texture_freq
• 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.
Das Programm unten ist nachweislich lauffähig (gleiche Eingabe wie die Abbildung). In der Studio-Hilfe wird dieser Block zu Schaltflächen, die es sofort laden und ausführen.
local_bimodality 0.50 0.50
▸ Diese Pipeline laden · Laden & ausführen
• gallery2d_texture_freq — py -3.11 examples/gallery2d_texture_freq.py
image als Eingabe)identity · gaussian · mean_box · bilateral · unsharp · median · min_filter · max_filter
texture)std_filter · local_std · scale_select_std · bootstrap_std_error · structure_tensor_orientation · structure_tensor_coherence · gabor · sk_frangi
*Provenance: ops.py — 2D 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.