OpenCV lävi Pythonis koos cv2.threshold() PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.

OpenCV künnis Pythonis koos cv2.threshold()

Sissejuhatus

Lävimine on lihtne ja tõhus tehnika pildil põhilise segmenteerimise teostamiseks ja selle binaarseks muutmiseks (binaarkujutiseks muutmiseks), kus pikslid on kas 0 or 1 (Või 255 kui kasutate nende esitamiseks täisarve).

Tavaliselt saate läviväärtust kasutada pildil lihtsa tausta-esiplaani segmenteerimise tegemiseks ja see taandub iga piksli jaoks lihtsa tehnika variantidele.

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

Seda olulist protsessi nimetatakse Binaarne lävi. Nüüd – selle üldise idee muutmiseks on mitmeid viise, sealhulgas toimingute ümberpööramine (vahetamine > märk a-ga < märk), millega pixel_value Euroopa threshold maksimaalse väärtuse/0 asemel (tuntud kui kärpimine), hoides pixel_value ise, kui see on üle threshold või kui see on allpool threshold.

Kõik need on OpenCV-s mugavalt rakendatud järgmiselt:

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

… vastavalt. Need on suhteliselt "naiivsed" meetodid, kuna need on üsna lihtsad, ei arvesta piltide kontekstiga, neil on teadmine, millised kujundid on tavalised jne. Nende omaduste jaoks peaksime kasutama arvutuslikult palju kallimaid ja võimsamaid tehnikaid.

Nüüd isegi "naiivsete" meetoditega - mõned Heade lävede leidmiseks saab paika panna heuristika, mille hulka kuuluvad Otsu meetod ja kolmnurga meetod:

  • cv2.THRESH_OTSU
  • cv2.THRESH_TRIANGLE

Märge: OpenCV lävendus on algeline tehnika ning on tundlik valgustuse muutuste ja gradientide, värvide heterogeensuse jms suhtes. Seda on kõige parem rakendada suhteliselt puhastele piltidele pärast nende hägustamist, et vähendada müra, ilma et segmenteeritavate objektide värvid varieeruksid.

Teine viis ühe läveväärtusega põhilävega seotud probleemide lahendamiseks on kasutada adaptiivne lävi mis rakendab läviväärtust pildi igale väikesele piirkonnale, mitte globaalselt.

Lihtne lävendamine OpenCV-ga

Läviväärtus OpenCV Pythoni API-s toimub läbi cv2.threshold() meetod – mis aktsepteerib kujutist (NumPy massiiv, esitatakse täisarvudega), lävi, maksimumväärtust ja lävimeetodit (kuidas threshold ja maximum_value kasutatakse):

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)

Tagastuskood on lihtsalt rakendatud lävi:

print(f"Threshold: {ret}") 

Siin, kuna lävi on 220 ja me oleme kasutanud THRESH_BINARY meetod – iga ülaltoodud piksli väärtus 220 suurendatakse kuni 255, samas kui iga piksli väärtus allpool 220 alandatakse tasemele 0, luues mustvalge pildi, “maskiga”, kattes esiplaanil olevaid objekte.

Miks 220? Pildi välimuse teadmine võimaldab teil teha ligikaudseid oletusi selle kohta, millise läve saate valida. Praktikas tahate harva käsitsi läve määrata ja me käsitleme automaatset lävevalikut hetkega.

Joonistame tulemuse! OpenCV aknad võivad olla pisut keerulised, nii et joonistame algse pildi, hägustatud pildi ja tulemused Matplotlibi abil:

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

Lävimismeetodid

Nagu varem mainitud, on funktsioonis künnise ja maksimumväärtuse kasutamiseks erinevaid viise. Oleme esialgu vaadanud binaarset läve. Loome meetodite loendi ja rakendame neid ükshaaval, joonistades tulemused:

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 on teineteise pöördvõrdelised ja kahendavad kujutise nende vahel 0 ja 255, määrates need vastavalt taustale ja esiplaanile ning vastupidi.

THRESH_TRUNC kahendab pildi vahel threshold ja 255.

THRESH_TOZERO ja THRESH_TOZERO_INV vahel kahendama 0 ja praegune piksli väärtus (src(x, y)). Vaatame saadud pilte:

OpenCV lävi Pythonis koos cv2.threshold() PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.

Tutvuge meie praktilise ja praktilise Giti õppimise juhendiga, mis sisaldab parimaid tavasid, tööstusharus aktsepteeritud standardeid ja kaasas olevat petulehte. Lõpetage Giti käskude guugeldamine ja tegelikult õppima seda!

OpenCV lävi Pythonis koos cv2.threshold() PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.
OpenCV lävi Pythonis koos cv2.threshold() PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.
OpenCV lävi Pythonis koos cv2.threshold() PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.
OpenCV lävi Pythonis koos cv2.threshold() PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.

Need meetodid on piisavalt intuitiivsed – aga kuidas me saame automatiseerida head läviväärtust ja mida "hea läviväärtus" üldse tähendab? Enamikul senistest tulemustest olid mitteideaalsed maskid, nendes olid märgid ja täpid. See juhtub müntide peegeldavate pindade erinevuse tõttu – need ei ole ühtlaselt värvitud, kuna servad peegeldavad valgust erinevalt.

Me saame sellega teatud määral võidelda, leides parema globaalse läve.

Automaatne/optimeeritud lävendamine OpenCV-ga

OpenCV kasutab kahte tõhusat globaalse läveotsingu meetodit – Otsu meetodit ja kolmnurga meetodit.

Otsu meetod eeldab, et see töötab bimodaalne pilte. Bimodaalsed kujutised on kujutised, mille värvihistogrammid sisaldavad ainult kahte piiki (st neil on ainult kaks erinevat piksliväärtust). Arvestades, et kõik tipud kuuluvad sellistesse klassidesse nagu "taust" ja "esiplaan" - ideaalne lävi on nende keskel.

OpenCV lävi Pythonis koos cv2.threshold() PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.
Pilt krediit: https://scipy-lectures.org/

Saate Gaussi hägudega muuta mõne pildi bimodaalsemaks, kuid mitte kõiki.

Alternatiivne, sageli paremini toimiv algoritm on kolmnurga algoritm, mis arvutab halli tasandi histogrammi maksimumi ja miinimumi vahelise kauguse ning tõmbab joone. Läviväärtuseks valitakse punkt, kus see joon on ülejäänud histogrammist maksimaalselt kaugel:

OpenCV lävi Pythonis koos cv2.threshold() PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.

Mõlemad eeldavad halltooniga kujutist, seega peame sisendpildi muutma halliks läbi 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)

Laske pilt läbi mõlema meetodi abil ja visualiseerime tulemused:

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 lävi Pythonis koos cv2.threshold() PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.
OpenCV lävi Pythonis koos cv2.threshold() PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.

Siin ületab kolmnurga meetod Otsu meetodit, kuna pilt ei ole kahemodaalne:

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 lävi Pythonis koos cv2.threshold() PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.

Siiski on selge, kuidas kolmnurga meetod suutis pildiga töötada ja anda rahuldavama tulemuse.

OpenCV läve piirangud

Lävendamine OpenCV-ga on lihtne, lihtne ja tõhus. Siiski on see üsna piiratud. Niipea, kui tutvustate värvilisi elemente, ebaühtlast tausta ja muutuvaid valgustingimusi, muutub globaalne lävi kontseptsioonina liiga jäigaks.

Pildid on tavaliselt liiga keerulised, et ühest künnisest piisaks, ja seda saab osaliselt lahendada adaptiivne lävi, kus ühe globaalse künnise asemel rakendatakse palju kohalikke lävesid. Kuigi adaptiivne künnis on ka piiratud, on see palju paindlikum kui globaalne lävi.

Järeldus

Viimastel aastatel on binaarset segmenteerimist (nagu see, mida me siin tegime) ja mitme märgisega segmenteerimist (kus saab lasta kodeerida suvaline arv klasse) edukalt modelleerida süvaõppevõrkudega, mis on palju võimsamad ja paindlikumad. Lisaks saavad nad segmenteeritavatesse kujutistesse kodeerida globaalse ja kohaliku konteksti. Negatiivne külg on see, et nende koolitamiseks on vaja andmeid, samuti aega ja teadmisi.

Lennul ja lihtsal künnisel saate kasutada OpenCV-d. Täpse tootmistaseme segmenteerimise jaoks peaksite kasutama närvivõrke.

Edasiminek – praktiline süvaõpe arvutinägemise jaoks

Sinu uudishimulik loomus tekitab sinus soovi minna kaugemale? Soovitame tutvuda meiega Kursus: "Praktiline süvaõpe arvutinägemise jaoks Pythoniga".

OpenCV lävi Pythonis koos cv2.threshold() PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.

Veel üks arvutinägemise kursus?

Me ei klassifitseeri MNIST-i numbreid ega MNIST-moodi. Nad teenisid oma osa juba ammu. Liiga paljud õpperessursid keskenduvad põhiandmekogumitele ja põhiarhitektuuridele, enne kui lasevad täiustatud musta kasti arhitektuurid jõudluskoormuse enda kanda võtta.

Tahame keskenduda demüstifitseerimine, praktilisus, mõistmine, intuitsioon ja tõelisi projekte. Tahad õppida kuidas saate midagi muuta? Viime teid teele alates viisist, kuidas meie aju töötleb pilte, kuni rinnavähi süvaõppe klassifikaatori kirjutamiseni kuni süvaõppevõrgustikeni, mis "hallutsineerivad", õpetades teile põhimõtteid ja teooriat praktilise töö kaudu, varustades teid oskusteavet ja tööriistu, et saada eksperdiks süvaõppe rakendamisel arvutinägemise lahendamisel.

Mis seal sees on?

  • Nägemise esimesed põhimõtted ja see, kuidas arvuteid saab õpetada nägema
  • Arvutinägemise erinevad ülesanded ja rakendused
  • Tööriistad, mis muudavad teie töö lihtsamaks
  • Arvutinägemise andmestike otsimine, loomine ja kasutamine
  • Konvolutsiooniliste närvivõrkude teooria ja rakendus
  • Domeeni nihke, koosesinemise ja muude andmekogumite eelarvamuste käsitlemine
  • Teisaldage õppimine ja teiste koolitusaja ja arvutusressursside kasutamine teie kasuks
  • Kaasaegse rinnavähi klassifikaatori ehitamine ja väljaõpe
  • Kuidas rakendada tervet annust skepsist peavoolu ideede suhtes ja mõista laialdaselt kasutusele võetud tehnikate mõju
  • ConvNeti "kontseptsiooniruumi" visualiseerimine t-SNE ja PCA abil
  • Juhtumiuuringud, kuidas ettevõtted kasutavad arvutinägemise tehnikaid paremate tulemuste saavutamiseks
  • Mudeli nõuetekohane hindamine, varjatud ruumi visualiseerimine ja mudeli tähelepanu tuvastamine
  • Domeeniuuringu läbiviimine, oma andmekogumite töötlemine ja mudelitestide loomine
  • Tipptasemel arhitektuurid, ideede edenemine, mis teeb need ainulaadseks ja kuidas neid ellu viia
  • KerasCV – WIP-teek tipptasemel torujuhtmete ja mudelite loomiseks
  • Kuidas töid sõeluda ja lugeda ning neid ise rakendada
  • Mudelite valimine sõltuvalt teie rakendusest
  • Täieliku masinõppe torujuhtme loomine
  • Maastik ja intuitsioon objektide tuvastamisel kiiremate R-CNN-ide, RetinaNetside, SSD-de ja YOLO-ga
  • Eksemplar ja semantiline segmenteerimine
  • Reaalajas objektituvastus YOLOv5-ga
  • YOLOv5 objektidetektorite koolitamine
  • Transformeritega töötamine KerasNLP-ga (tööstuse tugev WIP-teek)
  • Transformerite integreerimine ConvNetsiga, et luua piltide pealdised
  • Deepdream
  • Süvaõppe mudeli optimeerimine arvutinägemise jaoks

Ajatempel:

Veel alates Stackabus