OpenCV Adaptive Thresholding Pythonissa cv2.adaptiveThreshold() PlatoBlockchain Data Intelligencen kanssa. Pystysuuntainen haku. Ai.

OpenCV:n mukautuva kynnys Pythonissa cv2:lla.adaptiveThreshold()

esittely

Kynnys on yksinkertainen ja tehokas tekniikka perussegmentoinnin suorittamiseksi kuvassa ja sen binaarisoimiseksi (muuttaa se binäärikuvaksi), jossa pikselit ovat joko 0 or 1 (Tai 255 jos käytät kokonaislukuja edustamaan niitä).

Tyypillisesti voit käyttää kynnysarvoa yksinkertaisen tausta-etualan segmentoinnin suorittamiseen kuvassa, ja se tiivistyy yksinkertaisen tekniikan muunnelmiin jokaiselle pikselille:

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

Yksinkertaisella kynnyksellä on räikeitä ongelmia ja se vaatii melko koskematonta syöttöä, minkä vuoksi se ei ole niin käytännöllistä monissa käyttötapauksissa. Suurin syy on globaali kynnys, jota sovelletaan koko kuvaan, kun taas kuvat ovat harvoin tarpeeksi yhtenäisiä, jotta yleiset kynnykset toimisivat, elleivät ne ole keinotekoisia.

Yleinen kynnys toimisi hyvin erotettaessa merkkejä mustavalkoisessa kirjassa, skannatuilla sivuilla. Maailmanlaajuinen kynnys epäonnistuu hyvin todennäköisesti saman sivun puhelinkuvassa, koska valaistusolosuhteet voivat vaihdella sivun osien välillä, jolloin globaali rajapiste on liian herkkä todelliselle tiedolle.

Tämän torjumiseksi – voimme työllistää paikallinen kynnysarvoja käyttämällä tekniikkaa, joka tunnetaan nimellä mukautuva kynnys. Sen sijaan, että käsittelisimme kuvan kaikkia osia samalla säännöllä, voimme muuttaa kunkin kynnysarvoa paikallinen alue se näyttää sopivalta siihen. Tämä tekee kynnysarvosta osittain muuttumattoman valaistuksen, melun ja muiden tekijöiden muutoksille. Vaikka kynnysarvo on paljon hyödyllisempi kuin yleinen kynnys, se on rajoitettu, jäykkä tekniikka, ja sitä voidaan parhaiten käyttää apuna kuvan esikäsittelyssä (erityisesti kun on kyse hylättävien kuvien tunnistamisesta) segmentoinnin sijaan.

Arkaluontoisemmissa sovelluksissa, jotka vaativat kontekstia, sinun on parempi käyttää kehittyneempiä tekniikoita, mukaan lukien syväoppiminen, joka on johtanut viimeaikaisiin tietokonenäön kehitykseen.

Mukautuva kynnys OpenCV:llä

Ladataan kuvaa vaihtelevilla valaistusolosuhteilla, jossa yksi kuvan osa on tarkempi kuin toinen, kuva on otettu kulmasta. Kuva, jonka otin Harold McGee'sista “Ruoasta ja ruoanlaitosta” palvelee loistavasti!

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

Nyt, käyttämällä tavallista kynnysarvoa, voimme yrittää erottaa kirjaimet taustasta, koska niiden välillä on selvä väriero. Kaikki paperivärit käsitellään taustana. Koska emme todellakaan tiedä, mikä kynnys pitäisi olla, sovelletaan Otsun menetelmää hyvän arvon löytämiseen ennakoiden, että kuva on jossain määrin bimodaalinen (enimmäkseen kaksi väriä hallitsee):

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))

Katsotaanpa tulosta:

OpenCV Adaptive Thresholding Pythonissa cv2.adaptiveThreshold() PlatoBlockchain Data Intelligencen kanssa. Pystysuuntainen haku. Ai.

Auts. Tekstin vasen osa on pääosin haalistunut, kourun ympärillä oleva varjo söi kokonaan osan kuvasta ja teksti on liian kylläistä! Tämä on kuva "luonnossa", ja yleiset säännöt, kuten globaali kynnys, eivät toimi hyvin. Mikä kynnyksen pitäisi olla? Riippuu kuvan osasta!

- cv2.adaptiveThreshold() menetelmän avulla voimme tehdä juuri tämän:

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

- adaptive_method voi olla a cv2.ADAPTIVE_THRESH_MEAN_C or cv2.ADAPTIVE_THRESH_GAUSSIAN_C, Jossa C on viimeinen asettamasi argumentti. Molemmat menetelmät laskevat kynnyksen kyseisen pikselin naapureiden mukaan, missä block_size sanelee huomioon otettavien naapureiden lukumäärän (naapurialueen).

ADAPTIVE_THRESH_MEAN_C ottaa naapureiden keskiarvon ja vähentää C, Kun taas ADAPTIVE_THRESH_GAUSSIAN_C ottaa naapureiden gaussin painotetun summan ja vähentää C.

Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, jossa on parhaat käytännöt, alan hyväksymät standardit ja mukana tuleva huijauslehti. Lopeta Git-komentojen googlailu ja oikeastaan oppia se!

Sen avulla voit myös asettaa binarisointistrategian, mutta rajoittuu siihen THRESH_BINARY ja THRESH_BINARY_INV, ja niiden välillä vaihtaminen vaihtaa tehokkaasti, mikä on "tausta" ja mikä "etualalla".

Menetelmä palauttaa vain kuvan maskin – ei palautuskoodia ja maskia. Yritetään segmentoida merkit samassa kuvassa kuin ennenkin käyttämällä mukautuvaa kynnystä:


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()

Tämä johtaa paljon selkeämpään kuvaan:

OpenCV Adaptive Thresholding Pythonissa cv2.adaptiveThreshold() PlatoBlockchain Data Intelligencen kanssa. Pystysuuntainen haku. Ai.

Huomautus: - block_size argumentin on oltava parillinen luku.

Samalla tavalla voimme soveltaa Gaussin kynnysarvoa:

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

Mikä myös tuottaa lopulta melko tyydyttävän kuvan:

OpenCV Adaptive Thresholding Pythonissa cv2.adaptiveThreshold() PlatoBlockchain Data Intelligencen kanssa. Pystysuuntainen haku. Ai.

Sekä lohkon koko (naapurialue) että C ovat tässä viritettävät hyperparametrit. Kokeile erilaisia ​​arvoja ja valitse se, joka toimii parhaiten kuvassasi. Yleensä Gaussin kynnysarvo on vähemmän herkkä kohinalle ja tuottaa hieman synkempiä, puhtaampia kuvia, mutta tämä vaihtelee ja riippuu syötteestä.

Mukautuvan kynnyksen rajoitukset

Mukautuvan kynnyksen avulla pystyimme välttämään kynnysarvon kattavan rajoituksen, mutta se on silti suhteellisen jäykkä eikä toimi hyvin värikkäille tuloille. Jos esimerkiksi lataamme kuvan saksista ja pienestä sarjasta eri väreillä, jopa mukautuvassa kynnyksessä on ongelmia sen segmentoinnissa oikein, kun tietyt tummat piirteet hahmotellaan, mutta kokonaisia ​​objekteja ei oteta huomioon:

OpenCV Adaptive Thresholding Pythonissa cv2.adaptiveThreshold() PlatoBlockchain Data Intelligencen kanssa. Pystysuuntainen haku. Ai.

Jos säädämme lohkon kokoa ja C, voimme saada sen pitämään suuremmat paikat osana samaa objektia, mutta sitten törmäämme ongelmiin naapurikokojen tekemisessä liian globaali, palaten samoihin yleisiin ongelmiin globaalin kynnyksen kanssa:

OpenCV Adaptive Thresholding Pythonissa cv2.adaptiveThreshold() PlatoBlockchain Data Intelligencen kanssa. Pystysuuntainen haku. Ai.

Yhteenveto

Viime vuosina binäärisegmentointia (kuten teimme täällä) ja monimerkkisegmentointia (jossa voit koodata mielivaltaisen määrän luokkia) on mallinnettu menestyksekkäästi syväoppimisverkoilla, jotka ovat paljon tehokkaampia ja joustavampia. Lisäksi he voivat koodata globaalin ja paikallisen kontekstin segmentoimissaan kuvissa. Haittapuoli on se, että tarvitset dataa kouluttaaksesi heitä sekä aikaa ja asiantuntemusta.

Voit käyttää OpenCV:tä nopeaan, yksinkertaiseen kynnykseen ja taistella joitakin rajoituksia vastaan ​​käyttämällä adaptiivista kynnysarvoa globaalien kynnysstrategioiden sijaan. Tarkkaa tuotantotason segmentointia varten kannattaa käyttää hermoverkkoja.

Jatketaan – Käytännön syvällistä oppimista tietokonenäköön

Utelias luonteesi saa sinut haluamaan pidemmälle? Suosittelemme tutustumaan meidän Kurssi: "Käytännön syvällinen oppiminen tietokonenäön käyttöön Pythonilla".

OpenCV Adaptive Thresholding Pythonissa cv2.adaptiveThreshold() PlatoBlockchain Data Intelligencen kanssa. Pystysuuntainen haku. Ai.

Toinen tietokonenäkökurssi?

Emme luokittele MNIST-numeroita tai MNIST-muotia. He palvelivat osansa kauan sitten. Liian monet oppimisresurssit keskittyvät perustietosarjoihin ja perusarkkitehtuureihin, ennen kuin edistyneiden black-box-arkkitehtuurien annetaan kantaa suoritustaakka.

Haluamme keskittyä demystifikaatio, käytännöllisyys, ymmärtäminen, intuitio ja oikeita projekteja. Haluan oppia miten voitko vaikuttaa? Viemme sinut matkalle aivomme prosessoinnista kuvien tutkimiseen rintasyövän syväoppimisluokittajan kirjoittamiseen syväoppimisverkostoihin, jotka "halusinoivat", opettaen sinulle periaatteita ja teoriaa käytännön työssä ja varustamalla tietotaitoa ja työkaluja tullaksesi asiantuntijaksi syväoppimisen soveltamisessa tietokonenäön ratkaisemiseen.

Mitä on sisällä?

  • Näön ensimmäiset periaatteet ja kuinka tietokoneet voidaan opettaa "näkemään"
  • Tietokonenäön eri tehtävät ja sovellukset
  • Ammatin työkalut, jotka helpottavat työtäsi
  • Tietokokonaisuuksien etsiminen, luominen ja hyödyntäminen tietokonenäköä varten
  • Konvoluutiohermoverkkojen teoria ja sovellus
  • Verkkotunnuksen siirtymisen, samanaikaisen esiintymisen ja muiden vääristymien käsittely tietojoukoissa
  • Siirrä Oppiminen ja muiden koulutusajan ja laskennallisten resurssien hyödyntäminen hyödyksesi
  • Huippuluokan rintasyövän luokittelijan rakentaminen ja kouluttaminen
  • Kuinka soveltaa tervettä annos skeptisyyttä valtavirran ideoihin ja ymmärtää laajalti käytettyjen tekniikoiden vaikutukset
  • ConvNetin "konseptitilan" visualisointi t-SNE:n ja PCA:n avulla
  • Tapaustutkimuksia siitä, kuinka yritykset käyttävät tietokonenäkötekniikoita parempien tulosten saavuttamiseksi
  • Oikea mallin arviointi, piilevän tilan visualisointi ja mallin huomion tunnistaminen
  • Toimialuetutkimuksen suorittaminen, omien tietojoukkojen käsittely ja mallitestien laatiminen
  • Huippuluokan arkkitehtuurit, ideoiden eteneminen, mikä tekee niistä ainutlaatuisia ja miten ne toteutetaan
  • KerasCV – WIP-kirjasto uusimpien putkien ja mallien luomiseen
  • Kuinka jäsentää ja lukea papereita ja toteuttaa ne itse
  • Mallien valinta sovelluksesi mukaan
  • Luodaan päästä päähän koneoppimisputki
  • Maisema ja intuitio kohteen havaitsemisessa nopeampien R-CNN-, RetinaNet-, SSD- ja YOLO-verkkojen avulla
  • Instanssi ja semanttinen segmentointi
  • Reaaliaikainen objektintunnistus YOLOv5:n avulla
  • YOLOv5-objektitunnistimien koulutus
  • Työskentely Transformersin kanssa KerasNLP:n (teollisuuden vahvuus WIP-kirjasto) avulla
  • Transformersin integrointi ConvNet-verkkojen kanssa kuvien tekstitysten luomiseksi
  • Deepdream
  • Deep Learning -mallin optimointi tietokonenäköä varten

Aikaleima:

Lisää aiheesta Stackabus