Weet je nog toen je dat beeld van lage kwaliteit zag en voelde je je een beetje teleurgesteld? Het was niet duidelijk genoeg, en de details waren een beetje wazig. Wat als je die afbeelding naar een betere versie zou kunnen verbeteren? Zou dat niet geweldig zijn? Gelukkig is er een manier om dat te doen, met behulp van Python!
Een van de methoden die u kunt gebruiken om een afbeelding te verbeteren is histogramvereffening, wat in het bijzonder de contrast van de afbeelding. Vrijwel alle camerasystemen gebruiken histogramvereffening om onze foto's er beter uit te laten zien en aan het einde van de tutorial zul je ontdekken waarom dit zo is.
In de volgende sectie zal ik dieper ingaan op wat wordt bedoeld met histogramvereffening en wat er gebeurt met de afbeelding bij het toepassen van de methode, en dan zullen we zien hoe we de methode in Python kunnen implementeren. Klaar?
Laten we zeggen dat je de afbeelding pout.jpg hebt (ga je gang en download hem). Dit is een demo-afbeelding gebruikt in MATLAB, waar ik het vandaan heb, maar we zullen het hier in onze tutorial gebruiken. De afbeelding ziet er als volgt uit:
Laten we eens kijken hoe we toegang krijgen tot de pixelwaarden van de afbeelding, waarnaar wordt verwezen intensiteiten. Ik heb dit kleine Python-script geschreven dat we kunnen gebruiken om dat te doen (merk op dat ik de OpenCV-bibliotheek gebruik):
importeer cv2 img = cv2.imread ('pout.jpg') img_shape = img.shape height = img_shape [0] width = img_shape [1] voor rij in bereik (breedte): voor kolom binnen bereik (hoogte): print (img [kolom rij])
Wat ik hier doe, is het lezen van onze afbeelding (pout.jpg), en dan de vorm (grootte) van de afbeelding onderzoeken. img_shape
zal terugkeren: (1031, 850, 3)
. Dit betekent dat ons beeld van hoogte is (aantal kolommen) 1031
, en van de breedte (aantal rijen) 850
, en heeft 3
kanalen (RGB). Merk op dat de eerste parameter in het resultaat de hoogte is en de tweede parameter de breedte. Ten slotte doorlopen we de rijen en kolommen en drukken de verschillende pixelwaarden (intensiteiten) uit bij elk rij- / kolompaar.
Eén voorbeeld van de uitvoer is: [137 137 137]
. Ja, ik weet het, je verwachtte één waarde als resultaat voor de pixelintensiteit. We hebben hier de waarde van de pixelintensiteit, maar wat de uitvoer ons laat zien, zijn de resultaten van het rood, groen en blauw (RGB
) kanalen. Houd er echter rekening mee dat in OpenCV de bestelling is BGR
, omdat dit de manier is waarop OpenCV de afbeelding laadt. Het bovenstaande voorbeeldresultaat bevat dus de waarde 137
voor elk kanaal, in de volgorde van B
, G
, en R
, respectievelijk.
De reden voor de introductie is dat histogramvereffening eigenlijk over de modificatie van pixelintensiteiten om het contrast van het beeld te verbeteren. Ons belangrijkste werk hier zal dus zijn op het niveau van de pixelintensiteit.
Op dit punt vraag je je misschien af wat een histogram is. Hoewel de term soms een beetje verwarrend is, is het eigenlijk een heel eenvoudig concept. Het histogram is eenvoudigweg een diagram dat het aantal pixels in een afbeelding weergeeft bij elke intensiteitswaarde die in die afbeelding wordt gevonden.
Omdat onze pixels drie waarden hebben, één voor elk van de BGR-kanalen, kan één manier om het histogram te tekenen drie histogrammen hebben, één voor elk kanaal, waarbij de x-as de verschillende pixelwaarden (intensiteiten) en de y -as toont hoe vaak (frequentie) die bepaalde pixelwaarde verscheen tussen de verschillende pixelwaarden.
Het histogram van het rode kanaal kan bijvoorbeeld een pixelwaarde van 137
op de x-as en de y-as kan aangeven hoeveel pixels deze waarde hadden voor het rode kanaal, bijvoorbeeld, 86
. Dus de manier waarop we dat lezen, is door te zeggen dat de pixelwaarde voor het rode kanaal van 137
kwam binnen 86
pixels, of is herhaald 86
tijden in ons beeld.
Als we de code van dit Image Histogram-artikel gebruiken om het histogram voor onze afbeelding te tekenen, krijgen we het volgende:
Het histogram is eigenlijk voor de rode, groene en blauwe kanalen. Laten we een klein voorbeeld nemen van de uitvoer die u zou krijgen van de vorige code, zoals hieronder getoond. Dit toont aan dat de kanaalwaarden altijd hetzelfde lijken te zijn, en de verschillende drie getrokken lijnen zullen dus dezelfde waarden hebben en op elkaar worden getekend, en verschijnen als slechts één regel.
[94 94 94] [95 95 95] [97 97 97] [99 99 99] [100 100 100] [101 101 101] [101 101 101] [101 101 101] [100 100 100] [98 98 98] [95 95 95] [93 93 93]
Wat de histogram-egalisatiemethode voor het bovenstaande histogram zal doen, is dat het de intensiteitswaarden zodanig zal transformeren dat het histogram er uit zal zien vleien in de resulterende afbeelding. Met andere woorden, histogramvereffening is een methode die beeldintensiteiten aanpast om het contrast van het beeld te verbeteren.
Het bovenstaande histogram ziet er een beetje geconcentreerd uit naar het midden van de figuur, en wat histogramvereffening zal doen, is de pixelintensiteitswaarden verder verdelen om een meer afgeplat histogram te krijgen.
Ik denk dat dat voldoende is voor histogramvereffening om hier te bespreken, omdat we niet meer wiskundig willen worden in deze tutorial, vooral omdat het meer gaat over de implementatie van de methode in Python. U kunt deze opmerkingen echter controleren met de verschillende formules die bij de methode zijn betrokken: histogramvereffening. Dus laten we nu eens kijken naar de implementatie!
In deze sectie zal ik je laten zien hoe je de histogram-equalisatiemethode in Python implementeert. We zullen de bovenstaande afbeelding (pout.jpg) gebruiken in onze experimenten. Laten we het proces stap voor stap doorlopen. Het eerste dat we moeten doen is de OpenCV- en NumPy-bibliotheken als volgt importeren:
importeer cv2 import numpy
Daarna moeten we gewoon onze afbeelding lezen, pout.jpg:
img = cv2.imread ('pout.jpg')
Het goede nieuws is dat OpenCV ons een functie biedt waarmee we histogramvereffening op een afbeelding kunnen toepassen, namelijk equalizeHist (). Het is eenvoudig om deze functie toe te passen op een afbeelding in grijstinten, omdat de methode feitelijk het histogram van a evenaart grijstinten afbeelding, maar in ons geval hebben we drie kanalen (RGB) voor elke pixel en kunnen we histogramvereffening op de drie kanalen niet op een afzonderlijke manier toepassen.
Een mooie oplossing die ik tegenkwam in het boek Python: Real World Machine Learning is om onze afbeelding naar de YUV-kleurruimte te converteren, de Y
kanaal en converteer het resultaat uiteindelijk naar RGB. Dus het eerste dat we doen is onze afbeelding converteren naar YUV
. Dit kan als volgt worden gedaan met de methode cvtColor (), die de afbeelding converteert van de ene ruimtekleur naar de andere:
img_to_yuv = cv2.cvtColor (img, cv2.COLOR_BGR2YUV)
Merk op dat we gebruiken BGR
in plaats van RGB
hier, omdat OpenCV (zoals eerder vermeld) de afbeeldingen laadt BGR
formaat.
We passen nu de histogram-equalisatiemethode toe op de Y
kanaal met behulp van de methode equalizeHist ():
img_to_yuv [:,:, 0] = cv2.equalizeHist (img_to_yuv [:,:, 0])
Ten slotte zetten we het Y
kanaal naar RGB
(BGR
in OpenCV), als volgt:
hist_equalization_result = cv2.cvtColor (img_to_yuv, cv2.COLOR_YUV2BGR)
Gefeliciteerd! U hebt nu histogramvereffening toegepast op de afbeelding. In de volgende subparagraaf zal ik alle code samenvoegen en laten zien hoe onze afbeelding eruit zal zien na het toepassen van histogramvereffening.
Laten we alles wat we hebben geleerd samen zetten. Het Python-script voor het toepassen van histogramvereffening op pout.jpg
ziet er als volgt uit:
import cv2 import numpy 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)
De uitvoer van het bovenstaande script is de volgende afbeelding:
Om het verschil beter op te merken, plaats ik de twee afbeeldingen naast elkaar (links: origineel beeld, rechts: resultaat van histogramvereffening):
Heb je het verschil opgemerkt? De juiste afbeelding ziet er veel duidelijker uit dan de originele afbeelding. Geen wonder dat bijna alle afbeeldingssystemen histogramvereffening uitvoeren!
Voordat we afronden, kijken we eerst hoe het histogram van ons resultaat eruit ziet:
Als u het histogram van het resulterende beeld vergelijkt met het histogram van het originele beeld, zult u merken dat het histogram van het resulterende beeld platter is dan het histogram van het originele beeld, en dit is precies wat de histogram-egalisatiemethode doet.
In deze zelfstudie hebben we gezien hoe we het contrast van een afbeelding kunnen verbeteren met behulp van een methode genaamd histogramvereffening, en hoe het eenvoudig te implementeren is met behulp van Python en OpenCV.
Het resultaat was zeer interessant omdat het veel duidelijker was dan het originele beeld en het histogram van het resultaat platter was dan het histogram van het originele beeld, dat een betere verdeling van pixelintensiteitswaarden over het beeld laat zien.
Tot slot, aarzel niet om te zien wat we beschikbaar hebben voor verkoop en om te studeren in de Envato-markt, en stel vragen en geef waardevolle feedback via de onderstaande feed.