5.8. Wypełnianie przez zalewanie i glify wykryć¶
Prymitywy geometryczne na początku tej sekcji umieszczają znaki w pozycjach, które aplikacja już zna. Komponowanie obrazów nakłada jeden obraz na drugi. Niewielka, ostatnia grupa metod rysowania robi coś innego: umieszcza znaki, których forma zależy od tego, co już znajduje się w obrazie, lub od tego, co znalazł w nim jakiś wcześniejszy algorytm.
5.8.1. Wypełnianie przez zalewanie¶
flood_fill() zaczyna od pojedynczego piksela – ziarna – i rozrasta się na zewnątrz, malując każdy piksel, który jest wystarczająco podobny do ziarna i połączony z nim poprzez łańcuch innych podobnych pikseli. Wynikiem jest wypełniony obszar, którego granica jest wyznaczana przez sam obraz, a nie przez cokolwiek przekazanego do wywołania.
Najprostsza postać przyjmuje współrzędną ziarna oraz kolor wypełnienia:
img.flood_fill(x=160, y=120, color=(0, 255, 0))
Dwa parametry progu sterują tym, jak agresywnie rozrasta się wypełnienie. seed_threshold (znormalizowany ułamek od 0.0 do 1.0) ustala, jak bardzo piksel może różnić się od wartości pierwotnego ziarna, a mimo to zostać włączony. floating_threshold ustala, jak bardzo może różnić się od każdego już włączonego sąsiada. Oba progi działają razem: hojny floating_threshold pozwala wypełnieniu podążać za gradientem w obrazie, podczas gdy ciasny seed_threshold powstrzymuje je przed zbytnim oddaleniem od wartości ziarna nawet wzdłuż tego gradientu.
Kilka flag dodatkowo udoskonala wynik:
invert=Truemaluje każdy piksel, który nie pasuje – dopełnienie pasującego obszaru – zamiast samych pasujących pikseli.clear_background=Truezeruje każdy piksel poza obszarem wypełnienia. Przydatne do wyodrębnienia samego wypełnionego obszaru jako maski.Słowo kluczowe
maskma swoje zwykłe znaczenie: piksele wyłączone w masce pozostają nietknięte niezależnie od tego, czy wypełnienie w przeciwnym razie by je objęło.
Wypełnianie przez zalewanie jest najbardziej przydatne w dwóch schematach. Pierwszy to wizualizacja tego, co znalazł jakiś detektor obszarów, poprzez wypełnienie wykrytego obszaru wyróżniającym się kolorem, tak aby odznaczał się on od reszty ramki. Drugi to wyodrębnienie samego obszaru, poprzez połączenie clear_background=True ze znanym ziarnem wewnątrz obszaru i odczytanie powstałego obrazu jako maski dla dalszych operacji.
5.8.2. Rysowanie wyników wykryć¶
Algorytmy przetwarzania obrazu często zwracają obiekty wyników, które niosą zarówno pozycję, jak i pewną dodatkową strukturę: punkt kluczowy z orientacją, wykrycie twarzy z centroidem różnym od jego ramki ograniczającej, znacznik AprilTag z czterema punktami narożnymi. Dobre ich narysowanie – za pomocą glifu, który oddaje strukturę, a nie tylko ramki ograniczającej – jest na tyle powtarzającym się schematem, że moduł udostępnia do tego dwa pomocniki.
draw_keypoints() przyjmuje albo deskryptor punktu kluczowego zwrócony przez ekstraktor cech, albo zwykłą listę trójek (x, y, rotation) i rysuje mały glif w każdym punkcie. Glif niesie zarówno pozycję, jak i orientację: okrąg wokół punktu plus linię wychodzącą ze środka, wskazującą obrót. Ta wizualizacja jednym wywołaniem jest najprostszym sposobem na sprawdzenie, czy ekstraktor punktów kluczowych zwraca orientacje, których oczekuje aplikacja.
draw_detection() przyjmuje sześcioelementową krotkę (rx, ry, rw, rh, cx, cy) – prostokąt ograniczający plus osobno raportowany centroid – i rysuje oba naraz: prostokąt wokół ramki ograniczającej, krzyżyk w centroidzie oraz opcjonalnie etykietę tekstową w narożniku prostokąta. Ta forma odpowiada temu, co zazwyczaj raportuje wykrycie z sieci neuronowej lub śledzenie szablonowe, gdzie centroid jest dokładniejszą pozycją niż dałby środek ramki ograniczającej.
Obie metody glifów to warstwy ułatwień nad prymitywami geometrycznymi z początku tej sekcji. Aplikacja zawsze może odtworzyć tę samą wizualizację, wywołując bezpośrednio draw_rectangle(), draw_circle(), draw_cross() oraz draw_string(); metody glifów oszczędzają jedynie księgowania dla schematów, które pojawiają się raz za razem.
Mając prymitywy geometryczne dla znanej geometrii, komponowanie obrazów dla nakładek, wypełnianie przez zalewanie dla obszarów wyprowadzonych z obrazu oraz glify wykryć dla standardowych schematów wizualizacji, zestaw narzędzi do rysowania jest kompletny. Wszystko, czego aplikacja potrzebuje, aby uwidocznić wynik algorytmu, ma metodę w interfejsie, która umieszcza go tam.