5.12. Binaire drempelwaarde¶
Veel beeldverwerkingspijplijnen komen neer op een vraag over elke pixel: ligt deze helderheid binnen het bereik dat “voorgrond” betekent? Ligt deze kleur dicht genoeg bij rood om de markering te zijn die de toepassing volgt? Maakt deze pixel deel uit van de kandidatenset waar de volgende fase van de pijplijn naar moet kijken? Drempelwaarde is de bewerking die die vragen op elke positie omzet in een binair antwoord – aan als de pixel overeenkomt, uit als dat niet zo is – en de hele afbeelding reduceert tot een masker waar de rest van de pijplijn tegen kan werken.
5.12.1. De binary-methode¶
De binary()-methode voert die classificatie uit over elke pixel in één aanroep. Het neemt een lijst van drempelbereiken – de voorwaarden die een pixel kan vervullen om als “aan” te tellen – en herschrijft de afbeelding zo dat elke pixel die met ten minste één van de bereiken overeenkwam wordt ingesteld op de maximumwaarde van het formaat, en elke pixel die dat niet deed op nul wordt gezet. Het resultaat is het binaire masker dat de rest van de pijplijn direct kan gebruiken.
In de eenvoudigste vorm heeft de drempellijst één bereik en retourneert de aanroep een masker van pixels in dat bereik:
img.binary([(120, 255)])
De lijstvorm is wat binary krachtig maakt. Een pijplijn die twee gekleurde markeringen wil volgen, of een helderheidsbereik plus een geïsoleerde verzadigingspiek, geeft beide bereiken door in dezelfde lijst en krijgt een enkel uitvoermasker dat alle overeenkomsten dekt.
Drempelwaarde verandert een afbeelding met continue waarden in een binair masker: elke pixel binnen het drempelbereik wordt het maximum van het formaat, elke pixel daarbuiten wordt nul.¶
5.12.2. De grijswaardentupel¶
Voor een grijswaardenafbeelding is elke vermelding in de drempellijst een tupel met twee elementen (lo, hi) die een inclusief helderheidsbereik beschrijft. Pixels met waarden tussen lo en hi (inclusief) komen overeen; alles buiten dat bereik niet. De natuurlijke patronen zijn eenvoudig:
(0, 60)komt overeen met donkere pixels – alles van zwart tot en met diep grijs.(180, 255)komt overeen met heldere pixels – alles van lichtgrijs tot en met wit.(100, 160)komt overeen met middengrijze pixels – een band in het midden van het helderheidsbereik.
De volgorde van de twee waarden binnen een tupel maakt niet uit; de methode verwisselt ze intern als lo groter is dan hi, dus (60, 0) werkt hetzelfde als (0, 60).
5.12.3. De LAB-tupel voor kleur¶
Voor een RGB565-afbeelding is elke vermelding een tupel met zes elementen (l_lo, l_hi, a_lo, a_hi, b_lo, b_hi) die een inclusief bereik beschrijft in de LAB-kleurruimte in plaats van rechtstreeks in rood, groen en blauw. De drempelwaarden zijn L (lichtheid), A (groen-naar-rood chromatische as) en B (blauw-naar-geel chromatische as), elk vergeleken met de waarde van de pixel in dat kanaal.
De reden om via LAB te gaan in plaats van rechtstreeks RGB te drempelen, is de eigenschap waar de LAB-kleurruimte omheen is ontworpen: LAB scheidt lichtheid van chroma. Twee pixels die dezelfde kleur tonen maar bij verschillende helderheden, eindigen bij verschillende L-waarden maar bij ongeveer dezelfde A- en B-waarden. Die scheiding laat de drempelbereiken een kleur beschrijven aan de hand van zijn positie op de A- en B-assen en laat het L-bereik wijd open om die kleur bij elke helderheid van schaduw tot hooglicht te accepteren. Een op RGB gebaseerde drempelwaarde kan dat niet – elke verandering in verlichting verschuift alle drie de R-, G-, B-waarden tegelijk, en een tracker gebouwd op RGB-drempelwaarden valt uit elkaar de eerste keer dat er een wolk voor de zon schuift.
Het praktische patroon: kies de A- en B-bereiken die de kleur beschrijven die de toepassing volgt, en laat het L-bereik wijd – vaak (0, 100) om elke helderheid te accepteren – tenzij de toepassing specifiek ook op helderheid naast kleur wil drempelen.
Voor tupels met minder dan zes waarden vallen de ontbrekende componenten terug op het maximumbereik (geen beperking op die as). Een tupel (l_lo, l_hi) met twee elementen in een RGB565-drempellijst drempelt daarom alleen op lichtheid en komt overeen met elke kleur.
Notitie
Een werkelijk wijd open L-bereik heeft een addertje onder het gras aan de onderkant. Naarmate de lichtheid naar nul daalt, convergeert elke kleur naar zwart, waarbij de A- en B-waarden naar nul instorten en door ruis worden gedomineerd – zodat donkere pixels in de A- en B-bereiken kunnen afdrijven en als de doelkleur worden gevolgd. Als zwarte gebieden van de scene als overeenkomsten oplichten, verhoog dan l_lo totdat ze wegvallen.
5.12.4. Vlaggen¶
Drie trefwoordargumenten besturen de uitvoer:
invert=Truekeert het resultaat om. Elke pixel die zou hebben overeengekomen wordt nul, en elke pixel die nul zou zijn geweest wordt de maximumwaarde. Nuttig wanneer de natuurlijke manier om de voorgrond te beschrijven is via wat deze niet is.zero=Trueverandert de werkingsmodus: overeenkomende pixels worden op nul gezet en niet-overeenkomende pixels behouden hun oorspronkelijke waarden. Gebruik dit wanneer het doel is om de overeenkomende pixels uit de afbeelding te wissen in plaats van de afbeelding te reduceren tot een binair masker ervan.to_bitmap=Trueretourneert het resultaat als eenBINARY-afbeelding in plaats van het bestaande formaat van de bron te overschrijven. Het resultaat van één bit per pixel is wat latere maskerargumenten direct accepteren, en de conversie bespaart vaak de geheugendruk van het rondslepen van een masker in volledig formaat.
Masker en ROI volgen dezelfde conventie als de rest van het oppervlak: een roi-rechthoek beperkt de bewerking tot een deelgebied, een mask-afbeelding beperkt deze tot een willekeurig patroon van posities.
5.12.5. Standaard ter plaatse¶
Net als de rekenkundige bewerkingen draait binary standaard ter plaatse: de pixels van de bronafbeelding worden overschreven met de binaire uitvoer, en de oorspronkelijke waarden zijn na de aanroep verdwenen. De vorm to_bitmap=True is het alternatief wanneer de bron behouden moet blijven en de uitvoer een vers toegewezen BINARY-afbeelding moet zijn. De vorm copy=True wordt ook geaccepteerd voor een resultaat in hetzelfde formaat op een nieuwe buffer.