5.8. Flood Fill und Erkennungs-Glyphen¶
Die geometrischen Primitive am Anfang dieses Abschnitts setzen Markierungen an Positionen, die die Anwendung bereits kennt. Die Bildkomposition legt ein Bild auf ein anderes. Eine kleine letzte Gruppe von Zeichenmethoden macht etwas anderes: Sie setzt Markierungen, deren Form davon abhängt, was bereits im Bild ist oder was ein vorheriger Algorithmus darin gefunden hat.
5.8.1. Flood Fill¶
flood_fill() beginnt bei einem einzelnen Pixel – dem Startpunkt (Seed) – und wächst nach außen, wobei jedes Pixel eingefärbt wird, das dem Startpunkt ähnlich genug ist und über eine Kette anderer ähnlicher Pixel mit ihm verbunden ist. Das Ergebnis ist ein gefüllter Bereich, dessen Grenze vom Bild selbst bestimmt wird, nicht von etwas, das dem Aufruf übergeben wird.
Die einfachste Form nimmt die Startpunktkoordinate und eine Farbe zum Füllen entgegen:
img.flood_fill(x=160, y=120, color=(0, 255, 0))
Zwei Schwellenwertparameter steuern, wie aggressiv die Füllung wächst. seed_threshold (ein normalisierter Bruchteil von 0.0 bis 1.0) legt fest, wie stark sich ein Pixel vom Wert des ursprünglichen Startpunkts unterscheiden darf und dennoch einbezogen wird. floating_threshold legt fest, wie stark es sich von jedem bereits einbezogenen Nachbarn unterscheiden darf. Die beiden Schwellenwerte wirken zusammen: Ein großzügiger floating_threshold lässt die Füllung einem Verlauf über das Bild folgen, während ein enger seed_threshold verhindert, dass sie auch entlang dieses Verlaufs zu weit vom Startpunktwert abweicht.
Einige Flags verfeinern das Ergebnis weiter:
invert=Truefärbt jedes Pixel ein, das nicht übereinstimmt – das Komplement des übereinstimmenden Bereichs – anstelle der übereinstimmenden Pixel selbst.clear_background=Truesetzt jedes Pixel außerhalb des Füllbereichs auf null. Nützlich, um nur den gefüllten Bereich als Maske zu extrahieren.Das Schlüsselwort
maskhat seine übliche Bedeutung: Pixel, die in der Maske ausgeschaltet sind, bleiben unangetastet, unabhängig davon, ob die Füllung sie sonst erreicht hätte.
Flood Fill ist für zwei Muster am nützlichsten. Das erste ist das Visualisieren dessen, was ein Bereichsdetektor gefunden hat, indem der erkannte Bereich mit einer eindeutigen Farbe gefüllt wird, damit er sich vom Rest des Einzelbilds abhebt. Das zweite ist das Extrahieren des Bereichs selbst, indem clear_background=True mit einem bekannten Startpunkt innerhalb des Bereichs kombiniert und das resultierende Bild als Maske für nachgelagerte Operationen gelesen wird.
5.8.2. Erkennungsergebnisse zeichnen¶
Bildverarbeitungsalgorithmen geben oft Ergebnisobjekte zurück, die sowohl eine Position als auch eine zusätzliche Struktur tragen: einen Schlüsselpunkt mit einer Orientierung, eine Gesichtserkennung mit einem Schwerpunkt, der sich von ihrem Begrenzungsrahmen unterscheidet, ein AprilTag mit vier Eckpunkten. Diese gut zu zeichnen – mit einer Glyphe, die die Struktur erfasst, nicht nur einen Begrenzungsrahmen – ist ein so wiederkehrendes Muster, dass das Modul zwei Hilfsmittel dafür bereitstellt.
draw_keypoints() nimmt entweder einen von einem Merkmalsextraktor zurückgegebenen Schlüsselpunkt-Deskriptor oder eine einfache Liste von (x, y, rotation)-Tripeln entgegen und zeichnet eine kleine Glyphe an jedem Punkt. Die Glyphe trägt sowohl die Position als auch die Orientierung: einen Kreis um den Punkt plus eine Linie aus dem Zentrum, die die Drehung angibt. Diese Visualisierung in einem einzigen Aufruf ist der einfachste Weg, um zu überprüfen, ob ein Schlüsselpunkt-Extraktor die von der Anwendung erwarteten Orientierungen zurückgibt.
draw_detection() nimmt ein Sechs-Tupel (rx, ry, rw, rh, cx, cy) entgegen – das Begrenzungsrechteck plus einen separat gemeldeten Schwerpunkt – und zeichnet beides auf einmal: ein Rechteck um den Begrenzungsrahmen, ein Kreuz am Schwerpunkt und optional ein Textlabel an der Ecke des Rechtecks. Die Form entspricht dem, was eine Erkennung durch ein neuronales Netz oder ein Vorlagen-Tracker typischerweise meldet, wobei der Schwerpunkt eine genauere Position ist, als es das Zentrum des Begrenzungsrahmens liefern würde.
Beide Glyphenmethoden sind Komfortschichten über den geometrischen Primitiven am Anfang dieses Abschnitts. Eine Anwendung kann dieselbe Visualisierung jederzeit reproduzieren, indem sie draw_rectangle(), draw_circle(), draw_cross() und draw_string() direkt aufruft; die Glyphenmethoden ersparen lediglich die Buchführung für die Muster, die immer wieder vorkommen.
Mit den geometrischen Primitiven für bekannte Geometrie, der Bildkomposition für Overlays, Flood Fill für bildabgeleitete Bereiche und den Erkennungs-Glyphen für die üblichen Visualisierungsmuster ist das Zeichen-Toolkit vollständig. Alles, was eine Anwendung benötigt, um die Algorithmusausgabe sichtbar zu machen, hat eine Methode an der Oberfläche, die es dort hinsetzt.