5.8. Bojanje poplavom i glifovi detekcije

Geometrijski primitivi na početku ovog odjeljka stavljaju oznake na položaje koje aplikacija već zna. Kompozicija slike polaže jednu sliku na drugu. Mala završna skupina metoda za crtanje radi nešto drugačije: stavlja oznake čiji oblik ovisi o tome što je već u slici ili o tome što je neki prethodni algoritam u njoj pronašao.

5.8.1. Bojanje poplavom

flood_fill() polazi od jednog piksela – sjemena – i širi se prema van, bojeći svaki piksel koji je dovoljno sličan sjemenu i s njim povezan kroz lanac drugih sličnih piksela. Rezultat je ispunjeno područje čiju granicu određuje sama slika, a ne nešto proslijeđeno pozivu.

Najjednostavniji oblik prima koordinatu sjemena i boju kojom se ispunjava:

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

Dva parametra praga upravljaju time koliko agresivno ispuna raste. seed_threshold (normalizirani razlomak od 0.0 do 1.0) određuje koliko se piksel može razlikovati od vrijednosti izvornog sjemena a da i dalje bude uključen. floating_threshold određuje koliko se može razlikovati od svakog već uključenog susjeda. Dva praga djeluju zajedno: velikodušan floating_threshold omogućuje ispuni da prati gradijent kroz sliku, dok je strog seed_threshold sprječava da odluta predaleko od vrijednosti sjemena čak i duž tog gradijenta.

Nekoliko zastavica dodatno profinjuje rezultat:

  • invert=True boji svaki piksel koji se ne podudara – komplement područja podudaranja – umjesto samih piksela koji se podudaraju.

  • clear_background=True postavlja na nulu svaki piksel izvan područja ispune. Korisno za izdvajanje samog ispunjenog područja kao maske.

  • Ključna riječ mask ima svoje uobičajeno značenje: pikseli isključeni u maski ostaju netaknuti bez obzira na to bi li ih ispuna inače dosegla.

Bojanje poplavom najkorisnije je za dva obrasca. Prvi je vizualiziranje onoga što je neki detektor područja pronašao, ispunjavanjem otkrivenog područja izrazitom bojom tako da se ističe naspram ostatka sličice. Drugi je izdvajanje samog područja, kombiniranjem clear_background=True s poznatim sjemenom unutar područja i čitanjem rezultirajuće slike kao maske za naknadne operacije.

5.8.2. Crtanje rezultata detekcije

Algoritmi za obradu slike često vraćaju objekte s rezultatima koji nose i položaj i neku dodatnu strukturu: ključnu točku s orijentacijom, detekciju lica s centroidom različitim od njezina graničnog okvira, AprilTag s četiri kutne točke. Dobro crtanje tih elemenata – glifom koji obuhvaća strukturu, a ne samo granični okvir – dovoljno je čest obrazac da modul izlaže dva pomoćnika za to.

draw_keypoints() prima ili deskriptor ključne točke koji vraća ekstraktor značajki ili običan popis trojki (x, y, rotation) te crta mali glif u svakoj točki. Glif nosi i položaj i orijentaciju: kružnicu oko točke plus liniju iz središta koja označava rotaciju. Ta vizualizacija jednim pozivom najlakši je način da se provjeri vraća li ekstraktor ključnih točaka orijentacije koje aplikacija očekuje.

draw_detection() prima šesteročlanu n-torku (rx, ry, rw, rh, cx, cy) – granični pravokutnik plus zasebno prijavljeni centroid – i crta oboje odjednom: pravokutnik oko graničnog okvira, križić na centroidu i neobavezno tekstualnu oznaku u kutu pravokutnika. Oblik odgovara onome što tipično prijavljuje detekcija neuronskom mrežom ili pratitelj predloška, gdje je centroid precizniji položaj nego što bi to bilo središte graničnog okvira.

Obje metode za glifove pogodni su slojevi nad geometrijskim primitivima s početka ovog odjeljka. Aplikacija uvijek može reproducirati istu vizualizaciju izravnim pozivanjem draw_rectangle(), draw_circle(), draw_cross() i draw_string(); metode za glifove samo štede knjigovodstvo za obrasce koji se ponavljaju iznova i iznova.

Uz geometrijske primitive za poznatu geometriju, kompoziciju slike za preklope, bojanje poplavom za područja izvedena iz slike i glifove detekcije za standardne obrasce vizualizacije, alat za crtanje je potpun. Sve što aplikacija treba kako bi izlaz algoritma učinila vidljivim ima metodu na sučelju koja to tamo stavlja.