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

OpenCV adaptiivne lävi Pythonis koos cv2.adaptiveThreshold()

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

Lihtsa künnise määramisel on silmatorkavad probleemid ja see nõuab üsna põlist sisendit, mistõttu pole see paljudel kasutusjuhtudel nii praktiline. Peamine rikkuja on globaalne lävi, mida rakendatakse kogu pildile, samas kui kujutised on harva piisavalt ühtlased, et üldised läved toimiksid, välja arvatud juhul, kui need on kunstlikud.

Ülemaailmne lävi toimiks hästi mustvalgete raamatute märkide eraldamisel skannitud lehtedel. Globaalne lävi ei tööta suure tõenäosusega sama lehe telefonipildil, kuna valgustingimused võivad lehe osade vahel olla erinevad, muutes globaalse piirpunkti tegelike andmete suhtes liiga tundlikuks.

Selle vastu võitlemiseks saame kasutada kohalik künnised, kasutades tehnikat, mida tuntakse kui adaptiivne lävi. Selle asemel, et käsitleda kõiki pildi osi sama reegliga, saame muuta iga osa jaoks läve kohalik ala see tundub selle jaoks sobivat. See muudab läve osaliselt muutumatuks valgustuse, müra ja muude tegurite suhtes. Kuigi lävendamine on palju kasulikum kui globaalne lävi, on see piiratud ja jäik tehnika ning seda saab kõige paremini kasutada pildi eeltöötluse (eriti äravisatavate piltide tuvastamise) abistamiseks, mitte segmenteerimiseks.

Delikaatsete rakenduste jaoks, mis nõuavad konteksti, on parem kasutada täiustatud tehnikaid, sealhulgas süvaõpet, mis on ajendanud arvutinägemise hiljutisi edusamme.

Adaptive Thresholding OpenCV abil

Laadime sisse muutuvate valgustingimustega pildi, kus üks osa pildist on rohkem fookuses kui teine, kusjuures pilt on tehtud nurga alt. Pilt, mille tegin Harold McGee'st "Toidu ja toiduvalmistamise kohta" teenib suurepäraselt!

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

Nüüd, kasutades tavalist lävendit, saame proovida tähed taustast eraldada, kuna nende vahel on selge värvide erinevus. Kõiki paberivärve käsitletakse taustana. Kuna me tegelikult ei tea, mis lävi peaks olema, siis kasutame hea väärtuse leidmiseks Otsu meetodit, eeldades, et pilt on mõnevõrra bimodaalne (domineerib enamasti kaks värvi):

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

Vaatame tulemust:

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

Oeh. Teksti vasakpoolne osa on peamiselt tuhmunud, renni ümber olev vari sõi osa pildist täielikult ära ja tekst on liiga küllastunud! See pilt on "looduses" ja üldreeglid, nagu globaalne lävi, ei tööta hästi. Milline peaks olema künnis? Oleneb pildi osast!

. cv2.adaptiveThreshold() meetod võimaldab meil teha täpselt seda:

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

. adaptive_method võib olla a cv2.ADAPTIVE_THRESH_MEAN_C or cv2.ADAPTIVE_THRESH_GAUSSIAN_C, Kus C on viimane argument, mille sead. Mõlemad meetodid arvutavad läve vastavalt kõnealuse piksli naabritele, kus block_size määrab arvesse võetavate naabrite arvu (naabruskonna pindala).

ADAPTIVE_THRESH_MEAN_C võtab naabrite keskmise ja lahutab C, Samas kui ADAPTIVE_THRESH_GAUSSIAN_C võtab naabrite Gaussi kaalutud summa ja lahutab C.

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!

See võimaldab teil määrata ka binariseerimisstrateegia, kuid see on piiratud THRESH_BINARY ja THRESH_BINARY_INV, ja nende vahel vahetamine vahetab tõhusalt seda, mis on "taustal" ja mis "esiplaanil".

Meetod tagastab lihtsalt pildi maski, mitte tagastuskoodi ja maski. Proovime segmenteerida märgid samal pildil nagu varem, kasutades adaptiivset lävi:


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

Selle tulemuseks on palju selgem pilt:

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

Märge: . block_size argument peab olema paaritu arv.

Samamoodi saame rakendada Gaussi läve:

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

Mis annab lõpuks ka üsna rahuldava pildi:

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

Nii ploki suurus (naaberala) kui ka C on siin häälestavad hüperparameetrid. Proovige erinevaid väärtusi ja valige see, mis teie pildile kõige paremini sobib. Üldiselt on Gaussi läviväärtus müra suhtes vähem tundlik ja annab veidi tuhmimad ja puhtamad pildid, kuid see varieerub ja sõltub sisendist.

Adaptiivse künnise piirangud

Adaptiivse lävenduse abil suutsime vältida lävestamise kõikehõlmavat piirangut, kuid see on siiski suhteliselt jäik ega tööta värviliste sisendite jaoks suurepäraselt. Näiteks kui laadime sisse kääride kujutise ja väikese komplekti, millel on erinevad värvid, on isegi adaptiivse lävendi puhul probleeme selle õige segmenteerimisega, kuna teatud tumedad omadused on välja toodud, kuid terveid objekte ei arvestata:

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

Kui me näpistame ploki suurust ja C, saame panna selle pidama suuremaid plaastreid sama objekti osaks, kuid siis tekib probleeme naabersuuruste määramisega liiga globaalne, mis langeb tagasi samade üldiste probleemide juurde globaalse lävega:

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

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 ja võidelda mõningate piirangutega, kasutades pigem adaptiivset läve, mitte globaalseid lävestamisstrateegiaid. 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 adaptiivne lävi Pythonis koos cv2.adaptiveThreshold() 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