5.12. Binär tröskelvärdesbehandling

Många bildbehandlingspipelines kokar ner till en fråga om varje pixel: är denna ljushet inom det intervall som betyder ”förgrund”? Är denna färg tillräckligt nära röd för att vara den markör som tillämpningen spårar? Är denna pixel en del av den kandidatuppsättning som nästa steg i pipelinen ska titta på? Tröskelvärdesbehandling är operationen som förvandlar dessa frågor till ett binärt svar på varje position – på om pixeln matchar, av om den inte gör det – och reducerar hela bilden till en mask som resten av pipelinen kan arbeta mot.

5.12.1. Binärmetoden

Metoden binary() kör den klassificeringen över varje pixel i bilden i ett enda anrop. Den tar en lista med tröskelvärdesintervall – de villkor en pixel kan matcha för att räknas som ”på” – och skriver om bilden så att varje pixel som matchade minst ett av intervallen sätts till formatets maximala värde, och varje pixel som inte gjorde det sätts till noll. Resultatet är den binära mask som resten av pipelinen kan använda direkt.

I sin enklaste form har tröskelvärdeslistan ett intervall och anropet returnerar en mask av pixlar i det intervallet:

img.binary([(120, 255)])

Det är listformen som gör binary kraftfull. En pipeline som vill spåra två färgade markörer, eller ett ljushetsintervall plus en isolerad mättnadstopp, skickar in båda intervallen i samma lista och får en enda utdatamask som täcker alla matchningar.

En horisontell gråskalegradient högst upp märkt "input -- pixelvärden från 0 till 255". Under den är ett inklusivt tröskelvärdesintervall från lo till hi markerat med klamrar längs gradienten, som omsluter det intervall av ljushets- värden som räknas som matchningar. En binär utdatastapel längst ner visar vitt inom intervallet lo-till-hi och svart utanför det.

Tröskelvärdesbehandling förvandlar en bild med kontinuerliga värden till en binär mask: varje pixel inom tröskelvärdesintervallet blir formatets maximum, varje pixel utanför blir noll.

5.12.2. Gråskaletupeln

För en gråskalebild är varje post i tröskelvärdeslistan en tvåelements tupel (lo, hi) som beskriver ett inklusivt ljushetsintervall. Pixlar med värden mellan lo och hi (inklusive) matchar; allt utanför det intervallet gör det inte. De naturliga mönstren är okomplicerade:

  • (0, 60) matchar mörka pixlar – allt från svart upp till djupgrått.

  • (180, 255) matchar ljusa pixlar – allt från ljusgrått upp till vitt.

  • (100, 160) matchar mellangrå pixlar – ett band i mitten av ljushetsintervallet.

Ordningen på de två värdena inuti en tupel spelar ingen roll; metoden växlar dem internt om lo är större än hi, så (60, 0) fungerar likadant som (0, 60).

5.12.3. LAB-tupeln för färg

För en RGB565-bild är varje post en sexelements tupel (l_lo, l_hi, a_lo, a_hi, b_lo, b_hi) som beskriver ett inklusivt intervall i LAB-färgrymden snarare än direkt i rött, grönt och blått. Tröskelvärdena är L (ljushet), A (den kromatiska axeln från grönt till rött) och B (den kromatiska axeln från blått till gult), var och en jämförd mot pixelns värde i den kanalen.

Anledningen till att gå via LAB snarare än att tröskelvärdesbehandla RGB direkt är den egenskap som LAB-färgrymden konstruerades kring: LAB separerar ljushet från kroma. Två pixlar som visar samma färg men vid olika ljushet hamnar vid olika L-värden men vid ungefär samma A- och B-värden. Den separationen låter tröskelvärdesintervallen beskriva en färg genom dess position på A- och B-axlarna och lämna L-intervallet vidöppet för att acceptera den färgen vid varje ljushet från skugga genom högdager. Ett RGB-baserat tröskelvärde kan inte göra det – varje förändring i belysning flyttar alla tre R-, G-, B-värdena på en gång, och en spårare byggd på RGB-tröskelvärden bryter samman första gången ett moln passerar förbi solen.

Det praktiska mönstret: välj de A- och B-intervall som beskriver färgen tillämpningen spårar och lämna L-intervallet brett – ofta (0, 100) för att acceptera vilken ljushet som helst – om inte tillämpningen specifikt vill tröskelvärdesbehandla på ljushet såväl som färg.

För tupler med färre än sex värden får de saknade komponenterna standardvärdet maximalt intervall (ingen begränsning på den axeln). En tvåelements tupel (l_lo, l_hi) i en RGB565-tröskelvärdeslista tröskelvärdesbehandlar därför endast på ljushet och matchar varje färg.

Anteckning

Ett verkligt vidöppet L-intervall har en hake i den nedre änden. När ljusheten faller mot noll konvergerar varje färg mot svart, med A- och B-värdena som kollapsar mot noll och blir dominerade av brus – så mörka pixlar kan driva in i A- och B-intervallen och bli spårade som målfärgen. Om svarta regioner av scenen lyser upp som matchningar, höj l_lo tills de faller bort.

5.12.4. Flaggor

Tre nyckelordsargument styr utdata:

  • invert=True vänder resultatet. Varje pixel som skulle ha matchat blir noll, och varje pixel som skulle ha varit noll blir det maximala värdet. Användbart när det naturliga sättet att beskriva förgrunden är genom vad den inte är.

  • zero=True ändrar driftläget: matchande pixlar nollställs och icke-matchande pixlar behåller sina ursprungliga värden. Använd detta när målet är att radera de matchande pixlarna från bilden snarare än att reducera bilden till en binär mask av dem.

  • to_bitmap=True returnerar resultatet som en BINARY-bild istället för att skriva över källans befintliga format. Resultatet med en bit per pixel är vad senare maskargument accepterar direkt, och konverteringen besparar ofta minnesbelastningen av att bära runt en mask i fullt format.

Mask och ROI följer samma konvention som resten av ytan: en roi-rektangel begränsar operationen till ett delområde, en mask-bild begränsar den till ett godtyckligt mönster av positioner.

5.12.5. På plats som standard

Liksom de aritmetiska operationerna körs binary på plats som standard: källbildens pixlar skrivs över med den binära utdatan, och de ursprungliga värdena är borta efter anropet. Formen to_bitmap=True är alternativet när källan behöver bevaras och utdatan ska vara en nyallokerad BINARY-bild. Formen copy=True accepteras också för ett resultat i samma format på en ny buffert.