OpenCV Thresholding v Pythonu s cv2.threshold() PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Omejevanje pragov OpenCV v Pythonu s cv2.threshold()

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

Ta bistveni proces je znan kot Binarno določanje praga. Zdaj – obstaja več načinov, kako lahko prilagodite to splošno idejo, vključno z obračanjem operacij (preklapljanje > podpišite z a < znak), nastavitev pixel_value k threshold namesto največje vrednosti/0 (znano kot prirezovanje), ohranjanje pixel_value sama, če je nad threshold ali če je pod threshold.

Vse to je bilo priročno implementirano v OpenCV kot:

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

… oz. To so razmeroma »naivne« metode, saj so dokaj preproste, ne upoštevajo konteksta v slikah, poznajo oblike, ki so pogoste itd. Za te lastnosti bi morali uporabiti veliko računalniško dražje in zmogljivejše metode. tehnike.

Zdaj, tudi z "naivnimi" metodami - nekaj za iskanje dobrih pragov je mogoče uvesti hevristiko, ki vključuje metodo Otsu in metodo trikotnika:

  • cv2.THRESH_OTSU
  • cv2.THRESH_TRIANGLE

Opomba: Prag OpenCV je osnovna tehnika in je občutljiva na spremembe osvetlitve in gradiente, barvno heterogenost itd. Najbolje jo je uporabiti na razmeroma čistih slikah, potem ko jih zameglite, da zmanjšate šum, brez večjih barvnih razlik v predmetih, ki jih želite segmentirati.

Drug način za premagovanje nekaterih težav z osnovnim določanjem praga z eno samo vrednostjo praga je uporaba prilagodljiv prag ki uporabi mejno vrednost za vsako majhno regijo na sliki in ne globalno.

Preprosto določanje pragov z OpenCV

Določanje praga v API-ju za Python OpenCV poteka prek cv2.threshold() metoda – ki sprejme sliko (matriko NumPy, predstavljeno s celimi števili), prag, največjo vrednost in metodo praga (kako threshold in maximum_value so uporabljeni):

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)

Povratna koda je samo uporabljeni prag:

print(f"Threshold: {ret}") 

Tukaj, saj je prag 220 in uporabili smo THRESH_BINARY metoda – vsaka zgornja vrednost slikovne pike 220 se bo povečalo na 255, medtem ko je vsaka vrednost slikovne pike spodaj 220 bo znižan na 0, ki ustvarja črno-belo sliko z "masko", ki pokriva predmete v ospredju.

Zakaj 220? Če veste, kako izgleda slika, lahko naredite nekaj približnih ugibanj o tem, kateri prag lahko izberete. V praksi boste le redko želeli nastaviti ročni prag, zato bomo v trenutku obravnavali samodejno izbiro praga.

Narišimo rezultat! Okna OpenCV so lahko nekoliko zahtevna, zato bomo izvirno sliko, zamegljeno sliko in rezultate narisali z Matplotlib:

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

Metode določanja pragov

Kot smo že omenili, obstaja več načinov, kako lahko uporabite prag in največjo vrednost v funkciji. Na začetku smo si ogledali binarni prag. Ustvarimo seznam metod in jih uporabimo eno za drugo ter narišemo rezultate:

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 in THRESH_BINARY_INV sta inverzna drug drugemu in binarizirata sliko med njimi 0 in 255in jih dodelite ozadju oziroma ospredju in obratno.

THRESH_TRUNC binarizira sliko med threshold in 255.

THRESH_TOZERO in THRESH_TOZERO_INV binarizirati med 0 in trenutno vrednost pikslov (src(x, y)). Oglejmo si nastale slike:

OpenCV Thresholding v Pythonu s cv2.threshold() PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

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!

OpenCV Thresholding v Pythonu s cv2.threshold() PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.
OpenCV Thresholding v Pythonu s cv2.threshold() PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.
OpenCV Thresholding v Pythonu s cv2.threshold() PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.
OpenCV Thresholding v Pythonu s cv2.threshold() PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Te metode so dovolj intuitivne – toda kako lahko avtomatiziramo dobro mejno vrednost in kaj sploh pomeni "dobra mejna vrednost"? Večina dosedanjih rezultatov je imela neidealne maske z madeži in madeži v njih. To se zgodi zaradi razlike v odsevnih površinah kovancev – niso enakomerno obarvani zaradi razlike v tem, kako grebeni odbijajo svetlobo.

Temu se lahko do neke mere spopademo z iskanjem boljšega globalnega praga.

Samodejno/optimizirano določanje praga z OpenCV

OpenCV uporablja dve učinkoviti metodi iskanja po globalnem pragu – Otsujevo metodo in metodo trikotnika.

Otsujeva metoda predvideva, da deluje dvomodalni slike. Bimodalne slike so slike, katerih barvni histogrami vsebujejo samo dva vrha (tj. imajo samo dve različni vrednosti slikovnih pik). Glede na to, da vrhovi vsak pripadajo razredu, kot sta "ozadje" in "ospredje", je idealen prag točno na sredini med njimi.

OpenCV Thresholding v Pythonu s cv2.threshold() PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.
Image kredit: https://scipy-lectures.org/

Nekatere slike lahko naredite bolj dvomodalne z gaussovimi zameglitvami, vendar ne vseh.

Nadomestni, pogosto bolj učinkovit algoritem je algoritem trikotnika, ki izračuna razdaljo med najvišjo in najnižjo vrednostjo histograma sivine in nariše črto. Točka, na kateri je ta črta največ oddaljena od preostalega histograma, je izbrana kot prag:

OpenCV Thresholding v Pythonu s cv2.threshold() PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Oba predpostavljata sliko v sivih odtenkih, zato bomo morali vhodno sliko pretvoriti v sivo prek 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)

Preglejmo sliko z obema metodama in vizualizirajmo rezultate:

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 v Pythonu s cv2.threshold() PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.
OpenCV Thresholding v Pythonu s cv2.threshold() PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Tu metoda trikotnika prekaša Otsujevo metodo, ker slika ni bimodalna:

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 v Pythonu s cv2.threshold() PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Vendar je jasno, kako je metoda trikotnika lahko delovala s sliko in ustvarila bolj zadovoljiv rezultat.

Omejitve določanja praga OpenCV

Določanje praga z OpenCV je preprosto, enostavno in učinkovito. Kljub temu je dokaj omejen. Takoj, ko uvedete pisane elemente, neenakomerna ozadja in spreminjajoče se svetlobne pogoje – postane globalno pragovanje kot koncept preveč togo.

Slike so običajno preveč zapletene, da bi bil dovolj en sam prag, to pa je mogoče delno rešiti z prilagodljiv prag, kjer se uporabi več lokalnih pragov namesto enega globalnega. Čeprav je tudi omejeno, je prilagodljivo določanje praga veliko bolj prilagodljivo kot globalno določanje praga.

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. 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«.

OpenCV Thresholding v Pythonu s cv2.threshold() 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