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

OpenCV-kynnys Pythonissa cv2.threshold()

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

Tämä olennainen prosessi tunnetaan nimellä Binäärinen kynnys. Nyt – on useita tapoja, joilla voit muokata tätä yleistä ideaa, mukaan lukien toimintojen kääntäminen (vaihtamalla > allekirjoita a < merkki), asettamalla pixel_value että threshold enimmäisarvon/0 (tunnetaan katkaisemisena) sijasta, pitäen pixel_value itse, jos se on yläpuolella threshold tai jos se on alle threshold.

Kaikki nämä on kätevästi toteutettu OpenCV:ssä seuraavasti:

  • cv2.THRESH_BINARY
  • cv2.THRESH_BINARY_INV
  • cv2.THRESH_TRUNC
  • cv2.THRESH_TOZERO
  • cv2.THRESH_TOZERO_INV

… vastaavasti. Nämä ovat suhteellisen "naiiveja" menetelmiä siinä mielessä, että he ovat melko yksinkertaisia, eivät ota huomioon kuvien kontekstia, heillä on tietoa siitä, mitkä muodot ovat yleisiä jne. Näihin ominaisuuksiin - meidän pitäisi käyttää paljon laskennallisesti kalliimpia ja tehokkaampia tekniikat.

Nyt jopa "naiiveilla" menetelmillä - jonkin verran Hyvien kynnysten löytämiseksi voidaan ottaa käyttöön heuristiikkaa, joita ovat Otsu-menetelmä ja kolmiomenetelmä:

  • cv2.THRESH_OTSU
  • cv2.THRESH_TRIANGLE

Huomautus: OpenCV-kynnys on alkeellinen tekniikka, ja se on herkkä valaistuksen muutoksille ja gradienteille, värien heterogeenisyydelle jne. Sitä voidaan parhaiten soveltaa suhteellisen puhtaisiin kuviin sen jälkeen, kun ne on sumennetaan kohinan vähentämiseksi, ilman suurta värivaihtelua segmentoitavissa olevissa kohteissa.

Toinen tapa ratkaista joitakin ongelmia, jotka liittyvät peruskynnysarvoon yhdellä kynnysarvolla, on käyttää mukautuva kynnys joka käyttää kynnysarvoa kuvan jokaiselle pienelle alueelle globaalin sijasta.

Yksinkertainen kynnys OpenCV:llä

Kynnysarvo OpenCV:n Python API:ssa tehdään cv2.threshold() menetelmä – joka hyväksyy kuvan (NumPy-taulukko, esitetään kokonaisluvuilla), kynnyksen, maksimiarvon ja kynnysmenetelmän (miten threshold ja maximum_value käytetään):

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

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)


blurred = cv2.GaussianBlur(img, (7, 7), 0)

ret, img_masked = cv2.threshold(blurred, 220, 255, cv2.THRESH_BINARY)

Palautuskoodi on vain käytetty kynnys:

print(f"Threshold: {ret}") 

Tässä, koska kynnys on 220 ja olemme käyttäneet THRESH_BINARY menetelmä – jokainen yllä oleva pikseliarvo 220 korotetaan arvoon 255, kun taas jokainen alla oleva pikseliarvo 220 alennetaan arvoon 0, luo mustavalkokuvan "naamion" kanssa, joka peittää etualalla olevat kohteet.

Miksi 220? Kun tiedät, miltä kuva näyttää, voit tehdä likimääräisiä arvauksia siitä, minkä kynnyksen voit valita. Käytännössä harvemmin haluat asettaa manuaalista kynnystä, ja me käsittelemme automaattisen kynnyksen valinnan hetkessä.

Piirretään tulos! OpenCV-ikkunat voivat olla hieman hankalia, joten piirrämme alkuperäisen kuvan, sumean kuvan ja tulokset käyttämällä Matplotlibiä:

fig, ax = plt.subplots(1, 3, figsize=(12, 8))
ax[0].imshow(img)
ax[1].imshow(blurred)
ax[2].imshow(img_masked)

Kynnysmenetelmät

Kuten aiemmin mainittiin, voit käyttää kynnystä ja enimmäisarvoa funktiossa useilla eri tavoilla. Olemme aluksi tarkastelleet binääristä kynnystä. Luodaan luettelo menetelmistä ja käytämme niitä yksitellen piirtämällä tulokset:

methods = [cv2.THRESH_BINARY, cv2.THRESH_BINARY_INV, cv2.THRESH_TRUNC, cv2.THRESH_TOZERO, cv2.THRESH_TOZERO_INV]
names = ['Binary Threshold', 'Inverse Binary Threshold', 'Truncated Threshold', 'To-Zero Threshold', 'Inverse To-Zero Threshold']

def thresh(img_path, method, index):
    img = cv2.imread(img_path)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    blurred = cv2.GaussianBlur(img, (7, 7), 0)
    ret, img_masked = cv2.threshold(blurred, 220, 255, method)

    fig, ax = plt.subplots(1, 3, figsize=(12, 4))
    fig.suptitle(names[index], fontsize=18)
    ax[0].imshow(img)
    ax[1].imshow(blurred)
    ax[2].imshow(img_masked)
    plt.tight_layout()

for index, method in enumerate(methods):
    thresh('coins.jpeg', method, index)

THRESH_BINARY ja THRESH_BINARY_INV ovat toistensa käänteisiä ja binaarisoivat kuvan niiden välillä 0 ja 255, määrittämällä ne taustalle ja etualalle ja päinvastoin.

THRESH_TRUNC binarisoi kuvan välillä threshold ja 255.

THRESH_TOZERO ja THRESH_TOZERO_INV binaarisoida välillä 0 ja nykyinen pikselin arvo (src(x, y)). Katsotaanpa tuloksena olevia kuvia:

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

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!

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

Nämä menetelmät ovat riittävän intuitiivisia – mutta kuinka voimme automatisoida hyvän kynnysarvon, ja mitä "hyvä kynnysarvo" edes tarkoittaa? Useimmissa tuloksissa tähän mennessä oli ei-ihanteellinen maski, jossa oli jälkiä ja pilkkuja. Tämä johtuu kolikoiden heijastavien pintojen eroista – ne eivät ole tasaisesti värillisiä, koska harjanteet heijastavat valoa.

Voimme jossain määrin taistella tätä vastaan ​​etsimällä paremman globaalin kynnyksen.

Automaattinen/optimoitu kynnys OpenCV:llä

OpenCV käyttää kahta tehokasta globaalia kynnyshakumenetelmää – Otsun menetelmää ja Triangle-menetelmää.

Otsun menetelmä olettaa, että se toimii kaksimuotoinen kuvia. Bimodaaliset kuvat ovat kuvia, joiden värihistogrammeissa on vain kaksi huippua (eli niillä on vain kaksi erillistä pikseliarvoa). Kun otetaan huomioon, että huiput kuuluvat kukin johonkin luokkaan, kuten "tausta" ja "etualalla", ihanteellinen kynnys on niiden keskellä.

OpenCV Thresholding Pythonissa cv2.threshold() PlatoBlockchain Data Intelligencen kanssa. Pystysuuntainen haku. Ai.
Kuva pistetilanne: https://scipy-lectures.org/

Voit tehdä joistakin kuvista kaksimuotoisempia Gaussin sumennuksen avulla, mutta et kaikkia.

Vaihtoehtoinen, usein paremmin toimiva algoritmi on kolmioalgoritmi, joka laskee harmaasävyisen histogrammin maksimin ja minimin välisen etäisyyden ja piirtää viivan. Kynnysarvoksi valitaan piste, jossa tämä viiva on mahdollisimman kaukana histogrammin muusta osasta:

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

Molemmat olettavat harmaasävyisen kuvan, joten meidän on muutettava syöttökuva harmaaksi kautta cv2.cvtColor():

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

ret, mask1 = cv2.threshold(blurred, 0, 255, cv2.THRESH_OTSU)
ret, mask2 = cv2.threshold(blurred, 0, 255, cv2.THRESH_TRIANGLE)

masked = cv2.bitwise_and(img, img, mask=mask1)

Ajetaan kuva läpi molemmilla menetelmillä ja visualisoidaan tulokset:

methods = [cv2.THRESH_OTSU, cv2.THRESH_TRIANGLE]
names = ['Otsu Method', 'Triangle Method']

def thresh(img_path, method, index):
    img = cv2.imread(img_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (7, 7), 0)

    ret, img_masked = cv2.threshold(blurred, 0, 255, method)
    print(f"Threshold: {ret}")

    fig, ax = plt.subplots(1, 3, figsize=(12, 5))
    fig.suptitle(names[index], fontsize=18)
    ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    ax[1].imshow(cv2.cvtColor(gray, cv2.COLOR_BGR2RGB))
    ax[2].imshow(cv2.cvtColor(img_masked, cv2.COLOR_BGR2RGB))

for index, method in enumerate(methods):
    thresh('coins.jpeg', method, index)

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

Tässä kolmiomenetelmä toimii paremmin kuin Otsun menetelmä, koska kuva ei ole bimodaalinen:

import numpy as np

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

histogram_gray, bin_edges_gray = np.histogram(gray, bins=256, range=(0, 255))
histogram_blurred, bin_edges_blurred = np.histogram(blurred, bins=256, range=(0, 255))

fig, ax = plt.subplots(1, 2, figsize=(12, 4))

ax[0].plot(bin_edges_gray[0:-1], histogram_gray)
ax[1].plot(bin_edges_blurred[0:-1], histogram_blurred)

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

On kuitenkin selvää, kuinka kolmiomenetelmä pystyi toimimaan kuvan kanssa ja tuottamaan tyydyttävämmän tuloksen.

OpenCV-kynnyksen rajoitukset

Kynnysarvo OpenCV:llä on yksinkertaista, helppoa ja tehokasta. Se on kuitenkin melko rajallinen. Heti kun esittelet värikkäitä elementtejä, epäyhtenäisiä taustoja ja vaihtuvia valaistusolosuhteita – globaalista kynnysarvosta konseptina tulee liian jäykkä.

Kuvat ovat yleensä liian monimutkaisia, jotta yksi kynnys riittää, ja tämä voidaan osittain korjata mukautuva kynnys, jossa käytetään useita paikallisia kynnysarvoja yhden globaalin sijasta. Vaikka mukautuva kynnys on myös rajoitettu, se on paljon joustavampi kuin globaali kynnys.

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. 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 Thresholding Pythonissa cv2.threshold() 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