5.8. Umplere prin inundare și glife de detectare

Primitivele geometrice de la începutul acestei secțiuni plasează marcaje în poziții pe care aplicația le cunoaște deja. Compoziția de imagini așază o imagine peste alta. Un mic grup final de metode de desenare face ceva diferit: plasează marcaje a căror formă depinde de ceea ce se află deja în imagine sau de ceea ce a găsit în ea un algoritm anterior.

5.8.1. Umplere prin inundare

flood_fill() pornește de la un singur pixel – sămânța – și se extinde spre exterior, colorând fiecare pixel care este suficient de asemănător cu sămânța și conectat la ea printr-un lanț de alți pixeli asemănători. Rezultatul este o regiune umplută a cărei limită este decisă de imaginea însăși, nu de ceva transmis apelului.

Cea mai simplă formă acceptă coordonata sămânței și o culoare cu care să se umple:

img.flood_fill(x=160, y=120, color=(0, 255, 0))

Doi parametri de prag controlează cât de agresiv crește umplerea. seed_threshold (o fracție normalizată de la 0.0 la 1.0) stabilește cât de diferit poate fi un pixel față de valoarea sămânței originale fiind în continuare inclus. floating_threshold stabilește cât de diferit poate fi față de fiecare vecin deja inclus. Cele două praguri lucrează împreună: un floating_threshold generos permite umplerii să urmeze un gradient de-a lungul imaginii, în timp ce un seed_threshold strict o împiedică să se îndepărteze prea mult de valoarea sămânței chiar și de-a lungul acelui gradient.

Câțiva indicatori rafinează rezultatul și mai mult:

  • invert=True colorează fiecare pixel care nu se potrivește – complementul regiunii care se potrivește – în loc de pixelii care se potrivesc.

  • clear_background=True aduce la zero fiecare pixel din afara regiunii de umplere. Util pentru a extrage doar regiunea umplută sub formă de mască.

  • Cuvântul-cheie mask are semnificația sa obișnuită: pixelii dezactivați în mască sunt lăsați neatinși, indiferent dacă umplerea i-ar fi atins altfel.

Umplerea prin inundare este cea mai utilă pentru două tipare. Primul este vizualizarea a ceea ce a găsit un detector de regiuni, prin umplerea regiunii detectate cu o culoare distinctă, astfel încât să iasă în evidență față de restul cadrului. Al doilea este extragerea regiunii însăși, prin combinarea clear_background=True cu o sămânță cunoscută din interiorul regiunii și citirea imaginii rezultate ca mască pentru operații ulterioare.

5.8.2. Desenarea rezultatelor de detectare

Algoritmii de procesare a imaginilor returnează adesea obiecte de rezultat care poartă atât o poziție, cât și o structură suplimentară: un punct-cheie cu o orientare, o detectare de față cu un centroid distinct de caseta sa de încadrare, un AprilTag cu patru puncte de colț. Desenarea corectă a acestora – cu o glifă care surprinde structura, nu doar o casetă de încadrare – este un tipar suficient de recurent încât modulul expune două funcții ajutătoare pentru aceasta.

draw_keypoints() acceptă fie un descriptor de punct-cheie returnat de un extractor de caracteristici, fie o listă simplă de triplete (x, y, rotation), și desenează o mică glifă în fiecare punct. Glifa poartă atât poziția, cât și orientarea: un cerc în jurul punctului plus o linie care iese din centru indicând rotația. Acea vizualizare cu un singur apel este cel mai simplu mod de a verifica dacă un extractor de puncte-cheie returnează orientările pe care le așteaptă aplicația.

draw_detection() acceptă un tuplu de șase elemente (rx, ry, rw, rh, cx, cy) – dreptunghiul de încadrare plus un centroid raportat separat – și le desenează pe ambele deodată: un dreptunghi în jurul casetei de încadrare, o cruce la centroid și, opțional, o etichetă text în colțul dreptunghiului. Forma corespunde cu ceea ce raportează de obicei o detectare prin rețea neuronală sau un urmăritor de șabloane, unde centroidul este o poziție mai precisă decât ar oferi centrul casetei de încadrare.

Ambele metode de glife sunt straturi de comoditate peste primitivele geometrice de la începutul acestei secțiuni. O aplicație poate reproduce oricând aceeași vizualizare apelând direct draw_rectangle(), draw_circle(), draw_cross() și draw_string(); metodele de glife doar economisesc evidența pentru tiparele care apar mereu și mereu.

Cu primitivele geometrice pentru geometria cunoscută, compoziția de imagini pentru suprapuneri, umplerea prin inundare pentru regiunile derivate din imagine și glifele de detectare pentru tiparele standard de vizualizare, setul de instrumente de desenare este complet. Orice are nevoie o aplicație pentru a face vizibilă ieșirea unui algoritm are o metodă pe suprafață care o plasează acolo.