Prilagodljivo določanje praga OpenCV v Pythonu s cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Prilagodljivo določanje praga OpenCV v Pythonu s cv2.adaptiveThreshold()

Predstavitev

Prag je preprosta in učinkovita tehnika za izvedbo osnovne segmentacije v sliki in njeno binarizacijo (pretvorbo v binarno sliko), kjer so slikovne pike bodisi 0 or 1 (ali 255 če za njihovo predstavitev uporabljate cela števila).

Običajno lahko s pragom izvedete preprosto segmentacijo ozadja in ospredja na sliki, vse pa se zmanjša na različice preproste tehnike za vsako slikovno piko:

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

Enostavno določanje pragov ima očitne težave in zahteva dokaj nedotaknjen vnos, zaradi česar ni tako praktičen za številne primere uporabe. Glavni kršitelj je globalni prag, ki se uporablja za celotno sliko, medtem ko so slike redkokdaj dovolj enotne, da bi splošni pragovi delovali, razen če so umetni.

Globalni prag bi dobro deloval pri ločevanju znakov v črno-beli knjigi na skeniranih straneh. Globalni prag zelo verjetno ne bo uspel na telefonski sliki te iste strani, saj so lahko svetlobni pogoji med deli strani spremenljivi, zaradi česar je globalna mejna točka preveč občutljiva za dejanske podatke.

Za boj proti temu – lahko zaposlimo lokalna pragov z uporabo tehnike, znane kot prilagodljiv prag. Namesto da bi vse dele slike obravnavali z istim pravilom, lahko spremenimo prag za vsakega lokalno območje to se zdi primerno za to. Zaradi tega je določanje praga delno nespremenljivo glede na spremembe osvetlitve, hrupa in drugih dejavnikov. Čeprav je veliko bolj uporabno kot globalno določanje pragov, je določanje pragov samo po sebi omejena, toga tehnika in se najbolje uporablja za pomoč pri predobdelavi slik (zlasti ko gre za prepoznavanje slik, ki jih je treba zavreči), namesto za segmentacijo.

Za bolj občutljive aplikacije, ki zahtevajo kontekst, je bolje, da uporabite naprednejše tehnike, vključno z globokim učenjem, ki spodbuja nedavni napredek računalniškega vida.

Prilagodljivo določanje praga z OpenCV

Naložimo sliko s spremenljivimi svetlobnimi pogoji, kjer je en del slike bolj izostren kot drugi, pri čemer je slika posneta pod kotom. Slika Harolda McGeeja, ki sem jo posnel "O hrani in kuhanju" bo odlično služil!

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

Zdaj lahko z običajnim določanjem pragov črke ločimo od ozadja, saj je med njimi jasna barvna razlika. Vse barve papirja bodo obravnavane kot ozadje. Ker v resnici ne vemo, kakšen bi moral biti prag – uporabimo Otsujevo metodo, da poiščemo dobro vrednost, pri čemer predvidevamo, da je slika nekoliko dvomodalna (večinoma prevladujeta dve barvi):

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

Poglejmo si rezultat:

Prilagodljivo določanje praga OpenCV v Pythonu s cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Ojej. Levi del besedila je v glavnem zbledel, senca okoli žleba je popolnoma pojedla del slike, besedilo pa je preveč nasičeno! To je slika »v naravi« in splošna pravila, kot je globalno določanje pragov, ne delujejo dobro. Kakšen naj bo prag? Odvisno od dela slike!

O cv2.adaptiveThreshold() metoda nam omogoča točno to:

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

O adaptive_method je lahko a cv2.ADAPTIVE_THRESH_MEAN_C or cv2.ADAPTIVE_THRESH_GAUSSIAN_C, Kjer C je zadnji argument, ki ste ga nastavili. Obe metodi izračunata prag glede na sosede zadevne slikovne pike, kjer je block_size narekuje število sosedov, ki jih je treba upoštevati (površino soseske).

ADAPTIVE_THRESH_MEAN_C vzame povprečje sosedov in odšteje C, Medtem ko je ADAPTIVE_THRESH_GAUSSIAN_C vzame Gaussovo uteženo vsoto sosedov in odšteje C.

Oglejte si naš praktični, praktični vodnik za učenje Gita z najboljšimi praksami, standardi, sprejetimi v panogi, in priloženo goljufijo. Nehajte Googlati ukaze Git in pravzaprav naučiti it!

Omogoča tudi nastavitev strategije binarizacije, vendar je omejena na THRESH_BINARY in THRESH_BINARY_INV, in preklapljanje med njimi bo učinkovito preklopilo, kaj je »ozadje« in kaj je »ospredje«.

Metoda samo vrne masko za sliko – ne povratne kode in maske. Poskusimo segmentirati znake na isti sliki kot prej z uporabo prilagodljivega praga:


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

Posledica tega je veliko jasnejša slika:

Prilagodljivo določanje praga OpenCV v Pythonu s cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Opomba: O block_size argument mora biti neparno število.

Na približno enak način lahko uporabimo Gaussov prag:

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

Kar na koncu ustvari tudi precej zadovoljivo sliko:

Prilagodljivo določanje praga OpenCV v Pythonu s cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Tako velikost bloka (sosednje območje) kot C so hiperparametri za nastavitev tukaj. Preizkusite različne vrednosti in izberite tisto, ki najbolje deluje na vaši sliki. Na splošno je Gaussov prag manj občutljiv na šum in bo proizvedel nekoliko temnejše in čistejše slike, vendar se to razlikuje in je odvisno od vnosa.

Omejitve prilagodljivega določanja praga

S prilagodljivim določanjem pragov smo se lahko izognili glavni omejitvi določanja pragov, vendar je še vedno razmeroma tog in ne deluje dobro za barvite vnose. Na primer, če naložimo sliko škarij in majhnega kompleta z različnimi barvami, bo celo prilagodljivo določanje praga imelo težave pri pravilnem segmentiranju, pri čemer bodo določene temne značilnosti označene, vendar ne bodo upoštevani celotni predmeti:

Prilagodljivo določanje praga OpenCV v Pythonu s cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Če prilagodimo velikost bloka in C, lahko naredimo, da večje popravke obravnava kot del istega predmeta, a nato naleti na težave pri določanju velikosti sosedov preveč globalno, pri čemer se vrnemo k istim splošnim težavam z globalnim pragom:

Prilagodljivo določanje praga OpenCV v Pythonu s cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

zaključek

V zadnjih letih je bila binarna segmentacija (kot to, kar smo storili tukaj) in segmentacija z več oznakami (kjer imate lahko kodirano poljubno število razredov) uspešno modelirana z omrežji globokega učenja, ki so veliko močnejša in prilagodljiva. Poleg tega lahko kodirajo globalni in lokalni kontekst v slike, ki jih segmentirajo. Slaba stran je – za njihovo usposabljanje potrebujete podatke, pa tudi čas in strokovno znanje.

Za sprotno, preprosto določanje pragov lahko uporabite OpenCV in se borite proti nekaterim omejitvam z uporabo prilagodljivega določanja pragov namesto globalnih strategij določanja pragov. Za natančno segmentacijo na ravni proizvodnje boste želeli uporabiti nevronske mreže.

Naprej – Praktično poglobljeno učenje za računalniški vid

Ali zaradi vaše radovedne narave želite iti dlje? Priporočamo, da si ogledate naše Tečaj: »Praktično poglobljeno učenje za računalniški vid s Pythonom«.

Prilagodljivo določanje praga OpenCV v Pythonu s cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Še en tečaj računalniškega vida?

Ne bomo izvajali klasifikacije števk MNIST ali načina MNIST. Svojo so že zdavnaj odslužili. Preveč učnih virov se osredotoča na osnovne nabore podatkov in osnovne arhitekture, preden prepusti naprednim arhitekturam črnih skrinjic breme zmogljivosti.

Želimo se osredotočiti na demistifikacija, praktičnosti, razumevanje, intuicija in pravi projekti. Želim se naučiti kako lahko kaj spremeniš? Popeljali vas bomo od načina, na katerega naši možgani obdelujejo slike, do pisanja raziskovalnega klasifikatorja globokega učenja za raka dojke do omrežij globokega učenja, ki »halucinirajo«, vas naučijo načel in teorije s praktičnim delom ter vas opremijo z znanje in izkušnje ter orodja, da postanete strokovnjak za uporabo globokega učenja za reševanje računalniškega vida.

Kaj je notri?

  • Prva načela vida in kako lahko računalnike naučimo "videti"
  • Različne naloge in aplikacije računalniškega vida
  • Strokovna orodja, ki vam bodo olajšala delo
  • Iskanje, ustvarjanje in uporaba naborov podatkov za računalniški vid
  • Teorija in uporaba konvolucijskih nevronskih mrež
  • Obravnava premikov domene, sopojavljanja in drugih pristranskosti v nizih podatkov
  • Prenos učenja in uporaba časa za usposabljanje in računalniških virov drugih v vašo korist
  • Izdelava in usposabljanje najsodobnejšega klasifikatorja raka dojke
  • Kako uporabiti zdrav odmerek skepticizma za glavne ideje in razumeti posledice splošno sprejetih tehnik
  • Vizualizacija »konceptnega prostora« ConvNet z uporabo t-SNE in PCA
  • Študije primerov o tem, kako podjetja uporabljajo tehnike računalniškega vida za doseganje boljših rezultatov
  • Pravilno vrednotenje modela, vizualizacija latentnega prostora in prepoznavanje pozornosti modela
  • Izvajanje domenskih raziskav, obdelava lastnih naborov podatkov in vzpostavljanje testov modelov
  • Vrhunske arhitekture, razvoj idej, kaj jih dela edinstvene in kako jih uresničiti
  • KerasCV – knjižnica WIP za ustvarjanje najsodobnejših cevovodov in modelov
  • Kako razčleniti in brati prispevke ter jih implementirati sami
  • Izbira modelov glede na vašo aplikacijo
  • Ustvarjanje cevovoda strojnega učenja od konca do konca
  • Pokrajina in intuicija pri zaznavanju predmetov s hitrejšimi R-CNN, RetinaNets, SSD in YOLO
  • Instančna in pomenska segmentacija
  • Prepoznavanje predmetov v realnem času z YOLOv5
  • Usposabljanje detektorjev predmetov YOLOv5
  • Delo s transformatorji z uporabo KerasNLP (industrijska knjižnica WIP)
  • Integracija Transformers s ConvNets za ustvarjanje napisov slik
  • Deepdream
  • Optimizacija modela globokega učenja za računalniški vid

Časovni žig:

Več od Stackabuse