OpenCV Adaptive Thresholding în Python cu cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

OpenCV Adaptive Thresholding în Python cu cv2.adaptiveThreshold()

Introducere

Thresholdingul este o tehnică simplă și eficientă pentru a efectua segmentarea de bază într-o imagine și pentru a o binariza (transforma-o într-o imagine binară) în cazul în care pixelii sunt fie 0 or 1 (Sau 255 dacă folosiți numere întregi pentru a le reprezenta).

În mod obișnuit, puteți utiliza thresholding pentru a efectua o segmentare simplă de fundal-prim-plan într-o imagine și se reduce la variante ale unei tehnici simple pentru fiecare pixel:

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

Limitarea simplă are probleme flagrante și necesită o introducere destul de curată, ceea ce o face să nu fie atât de practică pentru multe cazuri de utilizare. Infractorul principal este un prag global care se aplică întregii imagini, în timp ce imaginile sunt rareori suficient de uniforme pentru ca pragurile generale să funcționeze, cu excepția cazului în care sunt artificiale.

Un prag global ar funcționa bine pentru separarea caracterelor dintr-o carte alb-negru, pe paginile scanate. Un prag global va eșua foarte probabil pe o imagine de telefon a aceleiași pagini, deoarece condițiile de iluminare pot fi variabile între părți ale paginii, făcând un punct de tăiere global prea sensibil la datele reale.

Pentru a combate acest lucru – putem folosi local pragurilor, folosind o tehnică cunoscută sub numele de pragării adaptive. În loc să tratăm toate părțile imaginii cu aceeași regulă, putem schimba pragul pentru fiecare area locala asta pare potrivit pentru asta. Acest lucru face ca pragurile să fie parțial invariante la schimbările de iluminare, zgomot și alți factori. Deși mult mai utilă decât thresholding-ul global, thresholding-ul în sine este o tehnică limitată, rigidă și este cel mai bine aplicată pentru ajutor cu preprocesarea imaginilor (mai ales când vine vorba de identificarea imaginilor de aruncat), mai degrabă decât segmentarea.

Pentru aplicații mai delicate care necesită context, este mai bine să folosiți tehnici mai avansate, inclusiv învățarea profundă, care a determinat progresele recente în viziunea computerizată.

Adaptive Thresholding cu OpenCV

Să încărcăm o imagine cu condiții de iluminare variabile, în care o parte a imaginii este mai focalizată decât alta, fotografia fiind luată dintr-un unghi. O poză pe care am făcut-o lui Harold McGee „Despre mâncare și gătit” va servi grozav!

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

Acum, folosind pragurile obișnuite, putem încerca să separăm literele de fundal, deoarece există o diferență clară de culoare între ele. Toate culorile hârtiei vor fi tratate ca fundal. Deoarece nu știm cu adevărat care ar trebui să fie pragul – să aplicăm metoda lui Otsu pentru a găsi o valoare bună, anticipând că imaginea este oarecum bi-modală (dominată de două culori în principal):

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

Să aruncăm o privire la rezultat:

OpenCV Adaptive Thresholding în Python cu cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

Ai. Partea din stânga a textului este în principal estompată, umbra din jurul jgheabului a mâncat total o porțiune din imagine, iar textul este prea saturat! Aceasta este o imagine „în sălbăticie”, iar regulile generale, cum ar fi limitarea globală, nu funcționează bine. Care ar trebui să fie pragul? Depinde de partea din imagine!

cv2.adaptiveThreshold() metoda ne permite să facem exact acest lucru:

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

adaptive_method poate fi a cv2.ADAPTIVE_THRESH_MEAN_C or cv2.ADAPTIVE_THRESH_GAUSSIAN_C, În cazul în care C este ultimul argument pe care l-ai pus. Ambele metode calculează pragul în funcție de vecinii pixelului în cauză, unde block_size dictează numărul de vecini de luat în considerare (zona cartierului).

ADAPTIVE_THRESH_MEAN_C ia media vecinilor si deduce C, În timp ce ADAPTIVE_THRESH_GAUSSIAN_C ia suma ponderată gaussiană a vecinilor și deduce C.

Consultați ghidul nostru practic și practic pentru a învăța Git, cu cele mai bune practici, standarde acceptate de industrie și fisa de cheat incluse. Opriți căutarea pe Google a comenzilor Git și de fapt învăţa aceasta!

De asemenea, vă permite să setați o strategie de binarizare, dar este limitat la THRESH_BINARY și THRESH_BINARY_INV, iar schimbarea între ele va schimba efectiv ceea ce este „fondul” și ce este „primul plan”.

Metoda returnează doar masca pentru imagine - nu codul de returnare și masca. Să încercăm să segmentăm caracterele în aceeași imagine ca înainte, utilizând pragul adaptiv:


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

Rezultă o imagine mult mai clară:

OpenCV Adaptive Thresholding în Python cu cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

Notă: block_size argumentul trebuie să fie un număr nepar.

În același mod, putem aplica pragul gaussian:

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

Ceea ce produce, de asemenea, o imagine destul de satisfăcătoare în cele din urmă:

OpenCV Adaptive Thresholding în Python cu cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

Atât dimensiunea blocului (zona vecină) cât și C sunt hiperparametri de reglat aici. Încercați diferite valori și alegeți-o pe cea care funcționează cel mai bine pe imaginea dvs. În general, pragul gaussian este mai puțin sensibil la zgomot și va produce imagini puțin mai sumbre, mai curate, dar acest lucru variază și depinde de intrare.

Limitările limitării adaptive

Cu thresholdingul adaptiv, am reușit să evităm limitarea generală a thresholding-ului, dar este încă relativ rigid și nu funcționează grozav pentru intrările colorate. De exemplu, dacă încărcăm o imagine cu foarfece și un kit mic cu culori diferite, chiar și pragurile adaptive vor avea probleme de segmentare cu adevărat corectă, cu anumite caracteristici întunecate fiind conturate, dar fără ca obiectele întregi să fie luate în considerare:

OpenCV Adaptive Thresholding în Python cu cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

Dacă ajustăm dimensiunea blocului și C, îl putem face să considere patch-uri mai mari ca fiind parte a aceluiași obiect, dar apoi să întâmpinăm probleme cu realizarea dimensiunilor vecine prea global, revenind la aceleași probleme generale cu limitarea globală:

OpenCV Adaptive Thresholding în Python cu cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

Concluzie

În ultimii ani, segmentarea binară (ca ceea ce am făcut aici) și segmentarea cu mai multe etichete (unde puteți avea un număr arbitrar de clase codificate) au fost modelate cu succes cu rețele de învățare profundă, care sunt mult mai puternice și mai flexibile. În plus, pot codifica contextul global și local în imaginile pe care le segmentează. Dezavantajul este că aveți nevoie de date pentru a-i instrui, precum și de timp și expertiză.

Pentru o stabilire de prag simplă din mers, puteți utiliza OpenCV și puteți lupta împotriva unor limitări folosind pragurile adaptive, mai degrabă decât strategiile globale de prag. Pentru o segmentare precisă, la nivel de producție, veți dori să utilizați rețele neuronale.

Mergând mai departe – Învățare profundă practică pentru viziunea computerizată

Natura ta curios te face să vrei să mergi mai departe? Vă recomandăm să verificați Curs: „Învățare profundă practică pentru viziunea computerizată cu Python”.

OpenCV Adaptive Thresholding în Python cu cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

Un alt curs de Computer Vision?

Nu vom face clasificarea cifrelor MNIST sau a modei MNIST. Și-au servit rolul cu mult timp în urmă. Prea multe resurse de învățare se concentrează pe seturile de date de bază și pe arhitecturile de bază înainte de a lăsa arhitecturile avansate de tip cutie neagră să asume povara performanței.

Vrem să ne concentrăm asupra demistificare, practic, înţelegere, intuiţie și proiecte reale. Vreau sa invat cum poți face o diferență? Vă vom duce într-o plimbare de la modul în care creierul nostru procesează imaginile până la scrierea unui clasificator de învățare profundă de nivel de cercetare pentru cancerul de sân la rețele de învățare profundă care „halucinează”, învățându-vă principiile și teoria prin muncă practică, echipându-vă cu know-how și instrumente pentru a deveni un expert în aplicarea învățării profunde pentru a rezolva viziunea computerizată.

Ce e inauntru?

  • Primele principii ale vederii și modul în care computerele pot fi învățate să „vadă”
  • Diferite sarcini și aplicații ale vederii computerizate
  • Instrumentele meseriei care vă vor ușura munca
  • Găsirea, crearea și utilizarea seturilor de date pentru viziune computerizată
  • Teoria și aplicarea rețelelor neuronale convoluționale
  • Gestionarea deplasării de domeniu, apariției concomitente și a altor părtiniri în seturile de date
  • Transfer Învățați și utilizați timpul de instruire și resursele de calcul ale altora în beneficiul dumneavoastră
  • Construirea și formarea unui clasificator de ultimă generație pentru cancerul de sân
  • Cum să aplicați o doză sănătoasă de scepticism ideilor principale și să înțelegeți implicațiile tehnicilor adoptate pe scară largă
  • Vizualizarea unui „spațiu conceptual” al unui ConvNet folosind t-SNE și PCA
  • Studii de caz despre modul în care companiile folosesc tehnicile de viziune computerizată pentru a obține rezultate mai bune
  • Evaluarea corectă a modelului, vizualizarea spațiului latent și identificarea atenției modelului
  • Efectuarea cercetărilor de domeniu, procesarea propriilor seturi de date și stabilirea de teste de model
  • Arhitecturi de ultimă oră, progresul ideilor, ce le face unice și cum să le implementăm
  • KerasCV – o bibliotecă WIP pentru crearea de conducte și modele de ultimă generație
  • Cum să analizați și să citiți lucrările și să le implementați singur
  • Selectarea modelelor în funcție de aplicația dvs
  • Crearea unui canal de învățare automată de la capăt la capăt
  • Peisaj și intuiție în detectarea obiectelor cu R-CNN-uri mai rapide, RetinaNets, SSD-uri și YOLO
  • Instanță și segmentare semantică
  • Recunoașterea obiectelor în timp real cu YOLOv5
  • Instruirea detectoarelor de obiecte YOLOv5
  • Lucrul cu Transformers folosind KerasNLP (bibliotecă WIP puternică în industrie)
  • Integrarea Transformers cu ConvNets pentru a genera subtitrări ale imaginilor
  • Deepdream
  • Optimizarea modelului de Deep Learning pentru viziunea computerizată

Timestamp-ul:

Mai mult de la Stackabuse