Egalarea histogramelor în Python

Îți amintești când ai văzut imaginea slabă și ai simțit puțin dezamăgirea? Nu era destul de clar, iar detaliile erau un pic neclar. Ce se întâmplă dacă puteți îmbunătăți imaginea unei versiuni mai bune? Nu ar fi grozav? Din fericire, există o modalitate de a face acest lucru, folosind Python!

Una dintre metodele pe care le puteți utiliza pentru îmbunătățirea unei imagini este echilibrarea histogramei, care, în special, sporește contrast a imaginii. Aproape toate sistemele de camere utilizează de fapt o egalizare a histogramei pentru a face imaginile să arate mai bine și la sfârșitul tutorialului veți descoperi de ce este așa.

În următoarea secțiune, voi detalia mai mult ce se înțelege prin egalizarea histogramei și ce se întâmplă cu imaginea atunci când se aplică metoda și apoi vom vedea cum putem implementa metoda în Python. Gata?

Egalarea histogramelor

Să presupunem că aveți imaginea pout.jpg (continuați și descărcați-o). Aceasta este o imagine demo folosită în MATLAB, de unde am primit-o, dar o vom folosi în tutorialul nostru aici. Imaginea arată după cum urmează:

Să aruncăm o privire asupra modului în care putem accesa valorile pixelilor imaginii, denumite în continuare intensitatea. Am scris acest mic script Python pe care îl putem folosi pentru a face asta (observați că folosesc biblioteca OpenCV):

import cv2 img = cv2.imread ('pout.jpg') img_shape = img.shape height = img_shape [0] width = img_shape [1] pentru rândul în interval (lățime) [coloană] [rând])

Ceea ce fac aici este citirea imaginii noastre (pout.jpg), și apoi investigarea formei (dimensiunii) imaginii. img_shape va reveni: (1031, 850, 3). Aceasta înseamnă că imaginea noastră are înălțime (numărul de coloane) 1031, și a lățimii (număr de rânduri) 850, și are 3 canale (RGB). Observați că primul parametru din rezultat este înălțimea, iar al doilea parametru este lățimea. În cele din urmă, bifăm rândurile și coloanele și tipărim diferitele valori ale pixelilor (intensități) la fiecare pereche de rânduri / coloane.

Un exemplu de ieșire este: [137 137 137]. Da, știu că așteptați o valoare ca rezultat al intensității pixelilor. Avem de fapt valoarea intensității pixelilor aici, dar ceea ce ne arată rezultatele sunt rezultatele roșu, verde și albastru (RGB). Rețineți, totuși, că în OpenCV ordinea este BGR, asa cum OpenCV incarca imaginea. Astfel, rezultatul eșantionului de mai sus conține valoarea 137 pentru fiecare canal, în ordinea B, G, și R, respectiv.

Motivul introducerii este că egalizarea histogramei este de fapt despre modificarea intensităților pixelilor pentru a îmbunătăți contrastul imaginii. Astfel, lucrarea noastră principală aici va fi la nivelul intensității pixelilor.

În acest moment, s-ar putea să te întrebi ce histograma este. Deși uneori termenul ar putea fi un pic confuz, este de fapt un concept foarte simplu. Histograma este pur și simplu o diagramă care descrie numărul de pixeli dintr-o imagine la fiecare valoare a intensității găsită în acea imagine.

Deoarece pixelii noștri au trei valori, unul pentru fiecare canal BGR, o modalitate de a desena histograma este de a avea trei histograme, câte unul pentru fiecare canal, unde axa x va avea diferite valori ale pixelilor (intensități) și y -asisul va arăta de câte ori (frecvența) a apărut o anumită valoare a pixelilor între diferitele valori ale pixelilor.

De exemplu, histograma canalului roșu poate avea o valoare a pixelilor 137 pe axa x, iar axa y poate arăta câte pixeli au avut această valoare pentru canalul roșu, de exemplu, de exemplu, 86. Deci modul în care citim asta este prin a spune că valoarea pixelilor pentru canalul roșu de 137 a apărut în 86 pixeli sau sa repetat 86 ori în imaginea noastră.

Folosind codul din acest articol Histograma imaginii pentru a desena histograma pentru imaginea noastră, obținem următoarele:

Histograma este de fapt pentru canalele roșii, verzi și albastre. Să luăm un mic eșantion de ieșire pe care ați obține de la codul anterior, după cum se arată mai jos. Acest lucru arată că valorile canalului par a fi întotdeauna aceleași și că diferitele trei linii trasate vor avea astfel aceleași valori și vor fi desenate unul peste celălalt, aparând ca un singur rând.

[101 100 101] [101 101 101] [101 101 101] [101 101 101] [100 100 100] [98 98 98] [95 95 95] [95 95 95] [93 93 93]

Ce va face metoda de egalizare a histogramei pentru histograma de mai sus este că va transforma valorile intensității într-un mod care va face aspectul histogramei flata în imaginea rezultată. Cu alte cuvinte, egalizarea histogramei este o metodă care ajustează intensitățile imaginii pentru a spori contrastul imaginii.

Histograma de mai sus pare puțin concentrată spre mijlocul figurinei și ceea ce va face o egalizare a histogramei este distribuirea valorilor intensității pixelilor în continuare pentru a obține o histogramă mai aplatizată.

Cred că e suficient să existe o egalizare a histogramei pentru a discuta aici, deoarece nu vrem să obținem mai multă matematică în acest tutorial, mai ales că este mai mult despre implementarea metodei în Python. Cu toate acestea, puteți verifica aceste note care arată diferitele formule implicate în metodă: egalizarea histogramei. Deci, hai să ne aruncăm cu toții în aplicare!

Egalarea histogramelor în Python

În această secțiune, vă voi arăta cum să implementați metoda de egalizare a histogramei în Python. Vom folosi imaginea de mai sus (pout.jpg) în experimentele noastre. Să trecem prin procesul pas cu pas. Primul lucru pe care trebuie să-l facem este importul bibliotecilor OpenCV și NumPy, după cum urmează:

import cv2 import numpy

După aceea, trebuie doar să citim imaginea noastră, pout.jpg:

img = cv2.imread ('pout.jpg')

Vestea bună este că OpenCV ne oferă o funcție prin care putem aplica egalizarea histogramei pe o imagine, și anume equalizeHist (). Este simplu să aplicați această funcție pe o imagine din tonuri de gri, deoarece metoda echilibrează de fapt histograma a alb-negru imaginea, dar în cazul nostru avem trei canale (RGB) pentru fiecare pixel și nu putem aplica egalizarea histogramei pe cele trei canale într-o manieră separată.

O soluție plăcută am întâlnit-o în cartea Python: Real World Machine Learning este de a converti imaginea noastră în spațiul de culoare YUV, de a egaliza Y canal și, în final, convertiți rezultatul la RGB. Deci, primul lucru pe care îl facem este să ne convertim imaginea YUV. Acest lucru se poate face folosind metoda cvtColor (), care convertește imaginea de la o culoare la alta, după cum urmează:

img_to_yuv = cv2.cvtColor (img, cv2.COLOR_BGR2YUV)

Observați că vom folosi BGR in loc de RGB aici, deoarece OpenCV (așa cum am menționat mai sus) încarcă imaginile în BGR format.

Acum aplicăm metoda de egalizare a histogramei pe Y canal folosind metoda equalizeHist ():

img_to_yuv [:,:,]] = cv2.equalizeHist (img_to_yuv [:,:, 0])

În cele din urmă, convertim Y canal la RGB (BGR în OpenCV), după cum urmează:

hist_equalization_result = cv2.cvtColor (img_to_yuv, cv2.COLOR_YUV2BGR)

Felicitări! Acum ați aplicat egalizarea histogramei imaginii. În următoarea subsecțiune, voi pune întregul cod împreună și vă voi arăta cum va arăta imaginea noastră după ce ați aplicat egalizarea histogramei.

Punându-le pe toți împreună

Să punem tot ce am învățat împreună. Scriptul Python pentru aplicarea egalizării histogramelor pout.jpg arată după cum urmează:

import import cv2 numar img = cv2.imread ('pout.jpg') img_to_yuv = cv2.cvtColor (img, cv2.COLOR_BGR2YUV) img_to_yuv [:,: 0] = cv2.equalizeHist (img_to_yuv [:,: 0]) hist_equalization_result = cv2.cvtColor (img_to_yuv, cv2.COLOR_YUV2BGR) cv2.imwrite ('result.jpg', hist_equalization_result)

Rezultatul scriptului de mai sus este următoarea imagine:

Pentru a observa diferența mai bine, voi pune cele două imagini unul lângă celălalt (stânga: imaginea originală, dreapta: rezultatul egalizării histogramei):

Ai observat diferența? Imaginea potrivită arată mult mai clară decât imaginea originală. Nu e de mirare de ce aproape toate sistemele de imagistica efectueaza egalizarea histogramei!

Înainte de a încheia, să vedem cum arată histograma rezultatului nostru:

Dacă comparați histograma imaginii rezultate cu histograma imaginii originale, veți observa că histograma imaginii rezultate este mai lată decât histograma imaginii originale și aceasta este exact ceea ce face metoda de egalizare a histogramei.

Concluzie

În acest tutorial, am văzut cum putem îmbunătăți contrastul unei imagini utilizând o metodă numită echilibrarea histogramei, și cum este ușor de implementat folosind Python și OpenCV.

Rezultatul a fost foarte interesant, deoarece a fost mult mai clar decât imaginea originală, iar histograma rezultatului a fost mai plăcută decât histograma imaginii originale, arătând o distribuție mai bună a valorilor intensității pixelilor în imagine.

În cele din urmă, nu ezitați să vedeți ceea ce avem la dispoziție pentru vânzare și pentru studiul pe piața Envato și vă rugăm să puneți întrebările și să oferiți feedback-ul dvs. valoros utilizând feedul de mai jos.

Cod