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

OpenCV Adaptive Thresholding i Python med cv2.adaptiveThreshold()

Introduktion

Thresholding er en enkel og effektiv teknik til at udføre grundlæggende segmentering i et billede og at binarisere det (gøre det til et binært billede), hvor pixels er enten 0 or 1 (eller 255 hvis du bruger heltal til at repræsentere dem).

Typisk kan du bruge tærskelværdi til at udføre simpel baggrund-forgrundssegmentering i et billede, og det koger ned til varianter af en simpel teknik for hver pixel:

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

Simpel tærskelværdi har åbenlyse problemer og kræver ret uberørt input, hvilket gør det knap så praktisk til mange brugssager. Hovedforbryderen er en global tærskel, som anvendes på hele billedet, hvorimod billeder sjældent er ensartede nok til, at generelle tærskler kan fungere, medmindre de er kunstige.

En global tærskel ville fungere godt til at adskille tegn i en sort/hvid bog på scannede sider. En global tærskel vil meget sandsynligt mislykkes på et telefonbillede af den samme side, da lysforholdene kan variere mellem dele af siden, hvilket gør et globalt afskæringspunkt for følsomt over for rigtige data.

For at bekæmpe dette - kan vi ansætte lokale tærskler ved hjælp af en teknik kendt som adaptiv tærskelværdi. I stedet for at behandle alle dele af billedet med den samme regel, kan vi ændre tærsklen for hver lokalområde det ser ud til at passe til det. Dette gør tærskelværdien delvist invariabel for ændringer i belysning, støj og andre faktorer. Selvom det er meget mere nyttigt end global tærskelværdi, er tærskelværdien i sig selv en begrænset, stiv teknik og anvendes bedst til hjælp til billedforbehandling (især når det kommer til at identificere billeder, der skal kasseres), snarere end segmentering.

For mere delikate applikationer, der kræver kontekst, er du bedre stillet ved at anvende mere avancerede teknikker, herunder dyb læring, som har drevet de seneste fremskridt inden for computersyn.

Adaptiv tærskelværdi med OpenCV

Lad os indlæse et billede med variable lysforhold, hvor en del af billedet er i mere fokus end en anden, hvor billedet er taget fra en vinkel. Et billede jeg tog af Harold McGee's “Om mad og madlavning” vil tjene godt!

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

Nu, ved at bruge almindelig tærskelværdi, kan vi prøve at adskille bogstaverne fra baggrunden, da der er en tydelig farveforskel mellem dem. Al papirfarve vil blive behandlet som baggrund. Da vi ikke rigtig ved, hvad tærsklen skal være – lad os anvende Otsus metode til at finde en god værdi, idet vi forventer, at billedet er noget bi-modalt (domineret af to farver 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))

Lad os tage et kig på resultatet:

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

Av. Den venstre del af teksten er hovedsageligt falmet, skyggen omkring tagrenden spiste fuldstændig en del af billedet, og teksten er for mættet! Dette er et billede "i naturen", og generelle regler såsom global tærskelværdi fungerer ikke godt. Hvad skal tærsklen være? Det afhænger af den del af billedet!

cv2.adaptiveThreshold() metode tillader os at gøre præcis dette:

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

adaptive_method kan være en cv2.ADAPTIVE_THRESH_MEAN_C or cv2.ADAPTIVE_THRESH_GAUSSIAN_CHvor C er det sidste argument du sætter. Begge disse metoder beregner tærsklen i henhold til naboerne til den pågældende pixel, hvor block_size dikterer antallet af naboer, der skal tages i betragtning (området af kvarteret).

ADAPTIVE_THRESH_MEAN_C tager gennemsnittet af naboerne og trækker fra C, mens ADAPTIVE_THRESH_GAUSSIAN_C tager den gaussisk-vægtede sum af naboerne og trækker fra C.

Tjek vores praktiske, praktiske guide til at lære Git, med bedste praksis, brancheaccepterede standarder og inkluderet snydeark. Stop med at google Git-kommandoer og faktisk lærer det!

Det giver dig også mulighed for at indstille en binariseringsstrategi, men er begrænset til THRESH_BINARY , THRESH_BINARY_INV, og skift mellem dem vil effektivt skifte, hvad der er "baggrund" og hvad der er "forgrund".

Metoden returnerer bare masken for billedet - ikke returkoden og masken. Lad os prøve at segmentere tegnene i det samme billede som før ved hjælp af adaptiv tærskelværdi:


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 meget klarere billede:

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

Bemærk: block_size argumentet skal være et ulige tal.

På nogenlunde samme måde kan vi anvende gaussisk tærskelværdi:

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

Hvilket også giver et ret tilfredsstillende billede i sidste ende:

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

Både blokstørrelsen (naboareal) og C er hyperparametre at indstille her. Prøv forskellige værdier og vælg den, der fungerer bedst på dit billede. Generelt er gaussisk tærskelværdi mindre følsom over for støj og vil producere en smule dystrere, renere billeder, men dette varierer og afhænger af inputtet.

Begrænsninger af adaptiv tærskelværdi

Med adaptiv tærskelværdi var vi i stand til at undgå den overordnede begrænsning af tærskelværdier, men den er stadig relativt stiv og fungerer ikke fantastisk til farverige input. For eksempel, hvis vi indlæser et billede af en saks og et lille sæt med forskellige farver, vil selv adaptiv tærskelværdi have problemer med virkelig at segmentere det rigtigt, med visse mørke funktioner, der er skitseret, men uden at hele objekter tages i betragtning:

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

Hvis vi justerer blokstørrelsen og C, kan vi få det til at betragte større patches som en del af det samme objekt, men så støde på problemer med at lave nabostørrelserne for global, falder tilbage til de samme overordnede problemer med global tærskelværdi:

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

Konklusion

I de senere år er binær segmentering (som hvad vi gjorde her) og multi-label segmentering (hvor du kan få kodet et vilkårligt antal klasser) med succes blevet modelleret med deep learning netværk, som er meget mere kraftfulde og fleksible. Derudover kan de indkode global og lokal kontekst i de billeder, de segmenterer. Ulempen er – du har brug for data til at træne dem, samt tid og ekspertise.

Til simpel tærskeling på farten kan du bruge OpenCV og kæmpe mod nogle af begrænsningerne ved at bruge adaptiv tærskelværdi frem for globale tærskelstrategier. For nøjagtig segmentering på produktionsniveau skal du bruge neurale netværk.

Gå videre – Praktisk dyb læring til computersyn

Din nysgerrige natur giver dig lyst til at gå længere? Vi anbefaler at tjekke vores Kursus: "Praktisk dyb læring til computersyn med Python".

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

Endnu et kursus i computersyn?

Vi laver ikke klassificering af MNIST-cifre eller MNIST-mode. De tjente deres del for længe siden. For mange læringsressourcer fokuserer på grundlæggende datasæt og grundlæggende arkitekturer, før de lader avancerede black-box-arkitekturer bære byrden af ​​ydeevne.

Vi ønsker at fokusere på afmystificering, praktisk, forståelse, intuition , rigtige projekter. Vil gerne lære hvordan kan du gøre en forskel? Vi tager dig med på en tur fra den måde, vores hjerner behandler billeder på, til at skrive en deep learning-klassificerer for brystkræft i forskningsklasse til deep learning-netværk, der "hallucinerer", lærer dig principperne og teorien gennem praktisk arbejde, og udstyrer dig med knowhow og værktøjer til at blive ekspert i at anvende dyb læring til at løse computervision.

Hvad er der indenfor?

  • De første principper for vision og hvordan computere kan læres at "se"
  • Forskellige opgaver og anvendelser af computersyn
  • Branchens værktøjer, der vil gøre dit arbejde lettere
  • Finde, skabe og bruge datasæt til computervision
  • Teorien og anvendelsen af ​​​​konvolutionelle neurale netværk
  • Håndtering af domæneskift, samtidige forekomster og andre skævheder i datasæt
  • Overfør Læring og udnyttelse af andres træningstid og beregningsressourcer til din fordel
  • Opbygning og træning af en avanceret brystkræftklassificering
  • Hvordan man anvender en sund dosis skepsis til mainstream ideer og forstår implikationerne af vidt anvendte teknikker
  • Visualisering af et ConvNets "konceptrum" ved hjælp af t-SNE og PCA
  • Casestudier af, hvordan virksomheder bruger computervisionsteknikker til at opnå bedre resultater
  • Korrekt modelevaluering, latent rumvisualisering og identifikation af modellens opmærksomhed
  • Udførelse af domæneforskning, bearbejdning af dine egne datasæt og etablering af modeltest
  • Banebrydende arkitekturer, udviklingen af ​​ideer, hvad der gør dem unikke, og hvordan man implementerer dem
  • KerasCV – et WIP-bibliotek til at skabe state of the art pipelines og modeller
  • Hvordan man analyserer og læser papirer og implementerer dem selv
  • Valg af modeller afhængigt af din applikation
  • Oprettelse af en end-to-end machine learning pipeline
  • Landskab og intuition på objektdetektion med hurtigere R-CNN'er, RetinaNets, SSD'er og YOLO
  • Forekomst og semantisk segmentering
  • Objektgenkendelse i realtid med YOLOv5
  • Træning af YOLOv5 objektdetektorer
  • Arbejde med transformere ved hjælp af KerasNLP (industristærkt WIP-bibliotek)
  • Integrering af transformere med ConvNets for at generere billedtekster
  • Deepdream
  • Deep Learning model optimering til computer vision

Tidsstempel:

Mere fra Stablemisbrug