5.8. Flood fill och detekteringsglyfer

De geometriska primitiverna i början av detta avsnitt sätter markeringar på positioner som tillämpningen redan känner till. Bildkomposition lägger en bild ovanpå en annan. En liten avslutande grupp av ritmetoder gör något annorlunda: den sätter markeringar vars form beror på vad som redan finns i bilden, eller vad någon tidigare algoritm hittade i den.

5.8.1. Flood fill

flood_fill() startar från en enda pixel – fröet – och växer utåt, och målar varje pixel som är tillräckligt lik fröet och förbunden med det genom en kedja av andra liknande pixlar. Resultatet är ett fyllt område vars gräns bestäms av bilden själv, inte av något som skickas till anropet.

Den enklaste formen tar frökoordinaten och en färg att fylla med:

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

Två tröskelvärdesparametrar styr hur aggressivt fyllningen växer. seed_threshold (en normaliserad andel från 0.0 till 1.0) anger hur olik en pixel får vara från det ursprungliga fröets värde och ändå inkluderas. floating_threshold anger hur olik den får vara från varje redan inkluderad granne. De två tröskelvärdena samverkar: ett generöst floating_threshold låter fyllningen följa en gradient över bilden, medan ett snävt seed_threshold hindrar den från att avvika för långt från frövärdet även längs den gradienten.

Några flaggor förfinar resultatet ytterligare:

  • invert=True målar varje pixel som inte matchar – komplementet till det matchande området – snarare än de matchande pixlarna själva.

  • clear_background=True nollställer varje pixel utanför fyllningsområdet. Användbart för att extrahera enbart det fyllda området som en mask.

  • Nyckelordet mask har sin vanliga innebörd: pixlar som är avstängda i masken lämnas ifred oavsett om fyllningen annars skulle ha nått dem.

Flood fill är mest användbar för två mönster. Det första är att visualisera vad någon områdesdetektor hittade, genom att fylla det detekterade området med en distinkt färg så att det sticker ut mot resten av bildrutan. Det andra är att extrahera själva området, genom att kombinera clear_background=True med ett känt frö inuti området och läsa den resulterande bilden som en mask för efterföljande operationer.

5.8.2. Rita detekteringsresultat

Bildbehandlingsalgoritmer returnerar ofta resultatobjekt som bär både en position och någon ytterligare struktur: en nyckelpunkt med en orientering, en ansiktsdetektering med en centroid skild från sin begränsningsruta, en AprilTag med fyra hörnpunkter. Att rita dessa väl – med en glyf som fångar strukturen, inte bara en begränsningsruta – är ett tillräckligt återkommande mönster för att modulen ska exponera två hjälpfunktioner för det.

draw_keypoints() tar antingen en nyckelpunktsdeskriptor som returneras av en särdragsextraktor, eller en enkel lista med (x, y, rotation)-trippler, och ritar en liten glyf vid varje punkt. Glyfen bär både positionen och orienteringen: en cirkel runt punkten plus en linje ut från centrum som anger rotationen. Den visualiseringen i ett enda anrop är det enklaste sättet att kontrollera att en nyckelpunktsextraktor returnerar de orienteringar tillämpningen förväntar sig.

draw_detection() tar en sex-tupel (rx, ry, rw, rh, cx, cy) – begränsningsrektangeln plus en separat rapporterad centroid – och ritar båda på en gång: en rektangel runt begränsningsrutan, ett kors vid centroiden, och valfritt en textetikett i rektangelns hörn. Formen matchar vad en neuronnätsdetektering eller en mallspårare typiskt rapporterar, där centroiden är en mer precis position än centrum av begränsningsrutan skulle ge.

Båda glyfmetoderna är bekvämlighetslager ovanpå de geometriska primitiverna i början av detta avsnitt. En tillämpning kan alltid återskapa samma visualisering genom att anropa draw_rectangle(), draw_circle(), draw_cross(), och draw_string() direkt; glyfmetoderna sparar bara bokföringen för de mönster som dyker upp om och om igen.

Med de geometriska primitiverna för känd geometri, bildkomposition för överlägg, flood fill för bildhärledda områden, och detekteringsglyferna för de vanliga visualiseringsmönstren är ritverktygslådan komplett. Allt en tillämpning behöver för att göra algoritmutdata synligt har en metod på ytan som placerar det där.