5.8. Vuotäyttö ja tunnistusmerkit

Tämän osion alussa olevat geometriset perusmuodot asettavat merkit sijainteihin, jotka sovellus jo tuntee. Kuvien yhdistäminen asettaa yhden kuvan toisen päälle. Pieni viimeinen piirtomenetelmien ryhmä tekee jotain erilaista: se asettaa merkkejä, joiden muoto riippuu siitä, mitä kuvassa jo on, tai mitä jokin aiempi algoritmi siitä löysi.

5.8.1. Vuotäyttö

flood_fill() lähtee yhdestä pikselistä – siemenestä – ja kasvaa ulospäin maalaten jokaisen pikselin, joka on riittävän samankaltainen kuin siemen ja yhteydessä siihen muiden samankaltaisten pikseleiden ketjun kautta. Tuloksena on täytetty alue, jonka rajan päättää kuva itse, ei mikään kutsulle välitetty.

Yksinkertaisin muoto ottaa siemenen koordinaatin ja täyttövärin:

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

Kaksi kynnysarvoparametria ohjaavat, kuinka aggressiivisesti täyttö kasvaa. seed_threshold (normalisoitu osuus välillä 0.01.0) määrää, kuinka paljon pikseli voi erota alkuperäisen siemenen arvosta tullen silti mukaan luetuksi. floating_threshold määrää, kuinka paljon se voi erota kustakin jo mukaan luetusta naapurista. Kaksi kynnysarvoa toimivat yhdessä: antelias floating_threshold antaa täytön seurata liukuvärjäystä kuvan poikki, kun taas tiukka seed_threshold estää sitä eksymästä liian kauas siemenen arvosta tuotakin liukuvärjäystä pitkin.

Muutama lippu tarkentaa tulosta edelleen:

  • invert=True maalaa jokaisen pikselin, joka ei täsmää – täsmäävän alueen komplementin – itse täsmäävien pikseleiden sijaan.

  • clear_background=True nollaa jokaisen täyttöalueen ulkopuolisen pikselin. Hyödyllinen pelkän täytetyn alueen erottamiseksi maskiksi.

  • mask -avainsanalla on tavanomainen merkityksensä: maskissa pois kytketyt pikselit jätetään rauhaan riippumatta siitä, olisiko täyttö muuten yltänyt niihin.

Vuotäyttö on hyödyllisin kahteen tarkoitukseen. Ensimmäinen on visualisoida se, mitä jokin aluetunnistin löysi, täyttämällä tunnistettu alue selvällä värillä niin, että se erottuu muusta kehyksestä. Toinen on erottaa itse alue yhdistämällä clear_background=True tunnettuun siemeneen alueen sisällä ja lukemalla tuloksena saatu kuva maskiksi myöhempiä operaatioita varten.

5.8.2. Tunnistustulosten piirtäminen

Kuvankäsittelyalgoritmit palauttavat usein tulosobjekteja, jotka kantavat sekä sijainnin että jotakin lisärakennetta: avainpisteen orientaatioineen, kasvotunnistuksen, jonka keskipiste eroaa sen rajauslaatikosta, AprilTag-merkin neljine kulmapisteineen. Näiden piirtäminen hyvin – merkillä, joka tavoittaa rakenteen eikä pelkkää rajauslaatikkoa – on niin toistuva kuvio, että moduuli tarjoaa siihen kaksi apuvälinettä.

draw_keypoints() ottaa joko piirre-eristimen palauttaman avainpistekuvaajan tai pelkän listan (x, y, rotation) -kolmikoita ja piirtää pienen merkin kuhunkin pisteeseen. Merkki kantaa sekä sijainnin että orientaation: ympyrä pisteen ympärillä sekä keskipisteestä lähtevä viiva, joka osoittaa kierron. Tuo yhden kutsun visualisointi on helpoin tapa tarkistaa, että avainpiste-eristin palauttaa sovelluksen odottamat orientaatiot.

draw_detection() ottaa kuusikon (rx, ry, rw, rh, cx, cy) – rajaussuorakulmion sekä erikseen raportoidun keskipisteen – ja piirtää molemmat kerralla: suorakulmion rajauslaatikon ympärille, ristin keskipisteeseen ja valinnaisesti tekstinä luokkanimen suorakulmion kulmaan. Muoto vastaa sitä, mitä neuroverkkotunnistus tai mallipohjaseuranta tyypillisesti raportoi, jolloin keskipiste on tarkempi sijainti kuin rajauslaatikon keskikohta antaisi.

Molemmat merkkimenetelmät ovat mukavuuskerroksia tämän osion alussa olevien geometristen perusmuotojen päällä. Sovellus voi aina tuottaa saman visualisoinnin kutsumalla suoraan menetelmiä draw_rectangle(), draw_circle(), draw_cross() ja draw_string(); merkkimenetelmät vain säästävät kirjanpidon yhä uudelleen toistuvissa kuvioissa.

Geometristen perusmuotojen ollessa tunnetulle geometrialle, kuvien yhdistämisen päällyksille, vuotäytön kuvasta johdetuille alueille ja tunnistusmerkkien vakiomuotoisille visualisointikuvioille piirtotyökalupakki on valmis. Kaikelle, mitä sovellus tarvitsee algoritmin tulosteen näkyväksi tekemiseen, on menetelmä pinnalla, joka asettaa sen sinne.