OpenCV Adaptive Thresholding i Python med cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Vertikalt søk. Ai.

OpenCV Adaptive Thresholding i Python med cv2.adaptiveThreshold()

Introduksjon

Thresholding er en enkel og effektiv teknikk for å utføre grunnleggende segmentering i et bilde, og for å binarisere det (gjøre det om til et binært bilde) der piksler er enten 0 or 1 (eller 255 hvis du bruker heltall for å representere dem).

Vanligvis kan du bruke terskelverdi til å utføre enkel bakgrunns-forgrunnssegmentering i et bilde, og det koker ned til varianter av en enkel teknikk for hver piksel:

if pixel_value > threshold:
    pixel_value = MAX
else:
    pixel_value = 0

Enkel terskel har skarpe problemer og krever ganske uberørte input, noe som gjør det ikke så praktisk for mange brukstilfeller. Hovedforbryteren er en global terskel som brukes på hele bildet, mens bilder sjelden er ensartede nok til at generelle terskler fungerer, med mindre de er kunstige.

En global terskel ville fungere bra for å skille tegn i en svart-hvitt bok, på skannede sider. En global terskel vil høyst sannsynlig svikte på et telefonbilde av den samme siden, siden lysforholdene kan variere mellom deler av siden, noe som gjør et globalt grensepunkt for følsomt for reelle data.

For å bekjempe dette – kan vi ansette lokal terskler, ved å bruke en teknikk kjent som adaptiv terskel. I stedet for å behandle alle deler av bildet med samme regel, kan vi endre terskelen for hver lokalt område det virker passende for det. Dette gjør terskelingen delvis invariabel for endringer i lys, støy og andre faktorer. Selv om det er mye mer nyttig enn global terskeling, er terskeling i seg selv en begrenset, rigid teknikk, og brukes best for hjelp med bildeforbehandling (spesielt når det gjelder å identifisere bilder som skal forkastes), i stedet for segmentering.

For mer delikate applikasjoner som krever kontekst, er det bedre å bruke mer avanserte teknikker, inkludert dyp læring, som har drevet de siste fremskrittene innen datasyn.

Adaptiv terskelverdi med OpenCV

La oss laste inn et bilde med variable lysforhold, der en del av bildet er i mer fokus enn en annen, med bildet tatt fra en vinkel. Et bilde jeg tok av Harold McGee “Om mat og matlaging” vil tjene bra!

img = cv2.imread('book.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)

Nå, ved å bruke vanlig terskelverdi, kan vi prøve å skille ut bokstavene fra bakgrunnen, siden det er en klar fargeforskjell mellom dem. All papirfarge vil bli behandlet som bakgrunn. Siden vi egentlig ikke vet hva terskelen skal være – la oss bruke Otsus metode for å finne en god verdi, og forutse at bildet er noe bi-modalt (dominert av to farger for det meste):

img = cv2.imread('book.jpg')


gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)

ret, mask = cv2.threshold(blurred, 0, 255, cv2.THRESH_OTSU)
print(f'Threshold: {ret}')

fig, ax = plt.subplots(1, 2, figsize=(12, 5))
ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(mask, cv2.COLOR_BGR2RGB))

La oss ta en titt på resultatet:

OpenCV Adaptive Thresholding i Python med cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Vertikalt søk. Ai.

Au. Den venstre delen av teksten er hovedsakelig falmet, skyggen rundt takrennen spiste totalt opp en del av bildet, og teksten er for mettet! Dette er et bilde "i naturen", og generelle regler som global terskel fungerer ikke bra. Hva skal terskelen være? Det kommer an på delen av bildet!

De cv2.adaptiveThreshold() metoden lar oss gjøre akkurat dette:

cv2.adaptiveThreshold(img, 
                      max_value, 
                      adaptive_method, 
                      threshold_method, 
                      block_size, 
                      C)

De adaptive_method kan være en cv2.ADAPTIVE_THRESH_MEAN_C or cv2.ADAPTIVE_THRESH_GAUSSIAN_C, Hvor C er det siste argumentet du angir. Begge disse metodene beregner terskelen i henhold til naboene til den aktuelle pikselen, der block_size dikterer antall naboer som skal vurderes (området til nabolaget).

ADAPTIVE_THRESH_MEAN_C tar gjennomsnittet av naboene og trekker fra C, Mens ADAPTIVE_THRESH_GAUSSIAN_C tar den gaussisk-vektede summen av naboene og trekker fra C.

Sjekk ut vår praktiske, praktiske guide for å lære Git, med beste praksis, bransjeaksepterte standarder og inkludert jukseark. Slutt å google Git-kommandoer og faktisk lære den!

Den lar deg også angi en binariseringsstrategi, men er begrenset til THRESH_BINARY og THRESH_BINARY_INV, og å bytte mellom dem vil effektivt bytte hva som er "bakgrunn" og hva som er "forgrunn".

Metoden returnerer bare masken for bildet – ikke returkoden og masken. La oss prøve å segmentere tegnene i det samme bildet som før, ved å bruke adaptiv terskelverdi:


img = cv2.imread('book.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)


mask = cv2.adaptiveThreshold(blurred, 
                              255, 
                              cv2.ADAPTIVE_THRESH_MEAN_C, 
                              cv2.THRESH_BINARY, 
                              31, 
                              10)


fig, ax = plt.subplots(1, 2, figsize=(12, 5))
ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(mask, cv2.COLOR_BGR2RGB))
plt.tight_layout()

Dette resulterer i et mye klarere bilde:

OpenCV Adaptive Thresholding i Python med cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Vertikalt søk. Ai.

OBS: De block_size argumentet må være et ujevnt tall.

På omtrent samme måte kan vi bruke gaussisk terskelverdi:

mask = cv2.adaptiveThreshold(blurred, 
                              255, 
                              cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
                              cv2.THRESH_BINARY, 
                              31, 
                              10)

Som også gir et ganske tilfredsstillende bilde til slutt:

OpenCV Adaptive Thresholding i Python med cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Vertikalt søk. Ai.

Både blokkstørrelsen (naboareal) og C er hyperparametre for å stille inn her. Prøv ut forskjellige verdier og velg den som fungerer best på bildet ditt. Generelt er gaussisk terskelverdi mindre følsom for støy og vil gi litt mørkere, renere bilder, men dette varierer og avhenger av inngangen.

Begrensninger for adaptiv terskelverdi

Med adaptiv terskeling klarte vi å unngå den overordnede begrensningen av terskel, men den er fortsatt relativt stiv og fungerer ikke bra for fargerike innganger. For eksempel, hvis vi laster inn et bilde av saks og et lite sett med forskjellige farger, vil selv adaptiv terskel ha problemer med å virkelig segmentere det riktig, med visse mørke trekk som er skissert, men uten at hele objekter blir vurdert:

OpenCV Adaptive Thresholding i Python med cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Vertikalt søk. Ai.

Hvis vi justerer blokkstørrelsen og C, kan vi få det til å betrakte større oppdateringer som en del av det samme objektet, men så får vi problemer med å lage nabostørrelser for global, faller tilbake til de samme overordnede problemene med global terskel:

OpenCV Adaptive Thresholding i Python med cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Vertikalt søk. Ai.

konklusjonen

I de siste årene har binær segmentering (som det vi gjorde her) og multi-label segmentering (hvor du kan få kodet et vilkårlig antall klasser) blitt modellert med suksess med dyplæringsnettverk, som er mye kraftigere og mer fleksible. I tillegg kan de kode global og lokal kontekst inn i bildene de segmenterer. Ulempen er – du trenger data for å trene dem, samt tid og ekspertise.

For enkel terskeling underveis kan du bruke OpenCV og kjempe mot noen av begrensningene ved å bruke adaptiv terskelverdi i stedet for globale terskelstrategier. For nøyaktig segmentering på produksjonsnivå, bør du bruke nevrale nettverk.

Gå videre – praktisk dyp læring for datasyn

Din nysgjerrige natur gjør at du ønsker å gå lenger? Vi anbefaler å sjekke ut vår Kurs: "Praktisk dyplæring for datasyn med Python".

OpenCV Adaptive Thresholding i Python med cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Vertikalt søk. Ai.

Et annet datasynskurs?

Vi kommer ikke til å klassifisere MNIST-sifre eller MNIST-mote. De tjente sin del for lenge siden. For mange læringsressurser fokuserer på grunnleggende datasett og grunnleggende arkitekturer før de lar avanserte svartboksarkitekturer bære byrden av ytelse.

Vi ønsker å fokusere på avmystifisering, praktisk, forståelse, intuisjon og ekte prosjekter. Vil lære hvordan du kan gjøre en forskjell? Vi tar deg med på en tur fra måten hjernen vår behandler bilder på til å skrive en dyplæringsklassifiser for brystkreft til dyplæringsnettverk som "hallusinerer", lærer deg prinsippene og teorien gjennom praktisk arbeid, og utstyrer deg med kunnskap og verktøy for å bli en ekspert på å bruke dyp læring for å løse datasyn.

Hva er inni?

  • De første prinsippene for visjon og hvordan datamaskiner kan læres å "se"
  • Ulike oppgaver og anvendelser av datasyn
  • Verktøyene i bransjen som vil gjøre arbeidet ditt enklere
  • Finne, lage og bruke datasett for datasyn
  • Teorien og anvendelsen av konvolusjonelle nevrale nettverk
  • Håndtering av domeneskift, samtidig forekomst og andre skjevheter i datasett
  • Overfør Læring og bruk av andres treningstid og beregningsressurser til din fordel
  • Bygge og trene en toppmoderne brystkreftklassifiser
  • Hvordan bruke en sunn dose skepsis til mainstream ideer og forstå implikasjonene av vidt vedtatte teknikker
  • Visualisere et ConvNets "konseptrom" ved hjelp av t-SNE og PCA
  • Kasusstudier av hvordan bedrifter bruker datasynsteknikker for å oppnå bedre resultater
  • Riktig modellevaluering, latent romvisualisering og identifisering av modellens oppmerksomhet
  • Utføre domeneforskning, behandle egne datasett og etablere modelltester
  • Nyskapende arkitekturer, utviklingen av ideer, hva som gjør dem unike og hvordan de implementeres
  • KerasCV – et WIP-bibliotek for å lage toppmoderne rørledninger og modeller
  • Hvordan analysere og lese artikler og implementere dem selv
  • Velge modeller avhengig av din applikasjon
  • Opprette en ende-til-ende maskinlæringspipeline
  • Landskap og intuisjon på objektdeteksjon med raskere R-CNN, RetinaNets, SSD og YOLO
  • Forekomst og semantisk segmentering
  • Objektgjenkjenning i sanntid med YOLOv5
  • Trening av YOLOv5-objektdetektorer
  • Arbeide med transformatorer ved å bruke KerasNLP (bransjesterkt WIP-bibliotek)
  • Integrering av transformatorer med ConvNets for å generere bildetekster
  • Deepdream
  • Deep Learning-modelloptimalisering for datasyn

Tidstempel:

Mer fra Stackabuse