Beeldverbetering in Python

Laat me deze tutorial starten door een theoretisch jargon uit de weg te gaan. Als we het hebben over beeldverbetering, dit betekent in feite dat we een nieuwe versie van de afbeelding willen die meer geschikt is dan de originele versie. 

Wanneer u bijvoorbeeld een document scant, heeft het uitvoerbeeld mogelijk een lagere kwaliteit dan het originele invoerbeeld. We hebben dus een manier nodig om de kwaliteit van uitvoerafbeeldingen te verbeteren, zodat ze visueel expressiever voor de kijker kunnen zijn, en dit is waar beeldverbetering in het spel komt. Wanneer we een afbeelding verbeteren, gaan we de afbeeldingsfuncties, zoals het contrast en de randen, aanscherpen.

Het is belangrijk op te merken dat beeldverbetering de informatie-inhoud van de afbeelding niet verhoogt, maar eerder het dynamische bereik van de gekozen functies vergroot, waardoor uiteindelijk de beeldkwaliteit verbetert. Dus hier weten we eigenlijk niet hoe het uitvoerbeeld eruit zou zien, maar we zouden (subjectief) kunnen zien of er verbeteringen waren of niet, zoals het observeren van meer details in het uitvoerbeeld, bijvoorbeeld.

Beeldverbetering wordt gewoonlijk gebruikt als een voorbewerkingstap in de fundamentele stappen die zijn betrokken bij digitale beeldverwerking (d.w.z. segmentatie, weergave). Er zijn veel technieken voor beeldverbetering, maar ik zal in deze tutorial twee technieken behandelen: afbeelding omgekeerd en transformatie van machtswetten. We zullen kijken hoe we ze in Python kunnen implementeren. Dus laten we beginnen!

Afbeelding omgekeerd

Zoals je misschien al geraden had uit de titel van deze sectie (die ook kan worden aangeduid als afbeelding negatie), beeldinversie beoogt de donkere intensiteiten in het invoerbeeld om te zetten in heldere intensiteiten in het uitvoerbeeld en heldere intensiteiten in het invoerbeeld tot donkere intensiteiten in het uitvoerbeeld. Met andere woorden, de donkere gebieden worden lichter en de lichte delen worden donkerder.

Zeg dat I (i, j) verwijst naar de intensiteitswaarde van de pixel op (I, j). Om hier iets te verduidelijken, vallen de intensiteitswaarden in het grijswaardenbeeld binnen het bereik [0255], en (I, j) verwijst naar respectievelijk de rij- en kolomwaarden. Wanneer we de operator voor beeldinversie toepassen op een afbeelding in grijswaarden, wordt de uitvoerpixel gebruikt O (i, j) waarde zal zijn:

O (i, j) = 255 - I (i, j)

Tegenwoordig zijn de meeste van onze afbeeldingen kleurenafbeeldingen. Die afbeeldingen bevatten drie kanalen, rood, groen, en blauw, verwezen naar Als RGB afbeeldingen. In dit geval moeten we, in tegenstelling tot de bovenstaande formule, de intensiteit van aftrekken elk kanaal vanaf 255. Het uitvoerbeeld heeft dus de volgende waarden op pixel (I, j):

O_R (i, j) = 255 - R (i, j) O_G (i, j) = 255 - G (i, j) O-B) i, j) = 255 - B (i, j)

Laten we na deze inleiding eens kijken hoe we de operator voor afbeelding-omkering in Python kunnen implementeren. Ik wil graag vermelden dat omwille van de eenvoud, ik de operator op een afbeelding in grijstinten zal uitvoeren. Maar ik zal je een paar gedachten geven over het toepassen van de operator op een kleurenafbeelding, en ik zal het volledige programma voor je achterlaten als een oefening.

Het eerste dat u voor een kleurenafbeelding moet doen, is het extraheren van elke pixelkanaal (dat wil zeggen RGB) intensiteitswaarde. Voor dit doel kunt u de Python Imaging Library (PIL) gebruiken. Ga je gang en download een voorbeeld van een bavianenafbeelding van baboon.png. De grootte van de afbeelding is 500x500. Stel dat u de rode, groene en blauwe intensiteitswaarden op de pixellocatie wilt extraheren (325, 432). Dit kan als volgt worden gedaan:

van PIL import Afbeelding im = Image.open ('baboon.png') print im.getpixel ((325.432))

Gebaseerd op de documentatie, wat de methode getPixel () doet is:

Retourneert de pixelwaarde op een gegeven positie.

Na het uitvoeren van het bovenstaande script, zult u merken dat u alleen het volgende resultaat krijgt: 138! Maar waar zijn de intensiteitswaarden van de drie kanalen (RGB)? Het probleem lijkt te zijn met de mode van de afbeelding die wordt gelezen. Controleer de modus door de volgende verklaring uit te voeren:

print im.mode

Je krijgt de uitvoer P, wat betekent dat de afbeelding in een paletmodus is gelezen. Een ding dat u kunt doen is de afbeelding naar de RGB-modus converteren voordat u de intensiteitswaarden van de verschillende kanalen retourneert. Om dat te doen, kunt u de converteren() methode, als volgt:

rgb_im = im.convert ('RGB')

In dit geval krijgt u de volgende geretourneerde waarde: (180, 168, 178). Dit betekent dat de intensiteitswaarden voor de rode, groene en blauwe kanalen respectievelijk 180, 168 en 178 zijn.

Om alles wat we tot nu toe hebben beschreven samen te stellen, ziet het Python-script dat de RGB-waarden van een afbeelding retourneert er als volgt uit:

van PIL import Afbeelding im = Image.open ('baboon.png') rgb_im = im.convert ('RGB') print rgb_im.getpixel ((325.432))

Er is nog een punt over voordat u verdergaat naar de operator voor beeldinversie. In het bovenstaande voorbeeld ziet u hoe u de RGB-waarde van kunt ophalen een alleen pixel, maar wanneer u de inverse operator uitvoert, moet u dat uitvoeren allemaal de pixels. 

Om alle intensiteitswaarden voor de verschillende kanalen van elke pixel af te drukken, kunt u het volgende doen:

from PIL import Afbeelding im = Image.open ('baboon.png') rgb_im = im.convert ('RGB') width, height = im.size for w in range (width): for h in range (height): print rgb_im.getpixel ((w, h))

Op dit punt laat ik het als een oefening om uit te vinden hoe je de beeldinversie-operator toepast op alle kleurenbeeldkanalen (dus RGB) van elke pixel.

Laten we eens kijken naar een voorbeeld dat de beeldinversie-operator toepast op een grijswaardenafbeelding. Ga je gang en download boat.tiff, dat in deze sectie als onze testafbeelding zal dienen. Dit is hoe het eruit ziet:

Ik ga de gebruiken scipy bibliotheek voor deze taak. Het Python-script voor het toepassen van de afbeeldinginversie-operator op de afbeelding hierboven ziet er als volgt uit:

import scipy.misc van scipy import misc van scipy.misc.pilutil import Afbeelding im = Image.open ('boat.tiff') im_array = scipy.misc.fromimage (im) im_inverse = 255 - im_array im_result = scipy.misc.toimage (im_inverse) misc.imsave ('result.tiff', im_result)

Het eerste dat we hebben gedaan na het lezen van de afbeelding is om het naar een ndarray te converteren om de beeldinversie-operator erop toe te passen. Na het toepassen van de operator, converteren we de ndarray eenvoudigweg naar een afbeelding en slaan die afbeelding op als result.tiff. De onderstaande figuur toont het resultaat van het toepassen van de afbeelding omgekeerd op de bovenstaande afbeelding (de originele afbeelding is aan de linkerkant en het resultaat van het toepassen van de afbeelding omgekeerde operator is aan de rechterkant):

Merk op dat sommige functies van de afbeelding duidelijker werden na het toepassen van de operator. Kijk bijvoorbeeld naar de wolken en de vuurtoren in het juiste beeld.

Machtswet transformatie

Deze operator, ook wel genoemd gamma correctie, is een andere operator die we kunnen gebruiken om een ​​afbeelding te verbeteren. Laten we de vergelijking van de operator bekijken. Op de pixel (I, j), de operator ziet er als volgt uit:

p (i, j) = kI (i, j) ^ gamma

I (i, j) is de intensiteitswaarde op de afbeeldingslocatie (I, j); en k en gamma zijn positieve constanten. Ik zal hier niet ingaan op wiskundige details, maar ik geloof dat je een grondige uitleg van dit onderwerp kunt vinden in beeldverwerkingsboeken. Het is echter belangrijk om op te merken dat in de meeste gevallen, k = 1, dus we zullen vooral de waarde van gamma veranderen. De bovenstaande vergelijking kan dus worden gereduceerd tot:

p (i, j) = I (i, j) ^ gamma

Ik ga de gebruiken OpenCV en NumPy bibliotheken hier. U kunt mijn tutorial raadplegen. Introductie van NumPy als u meer wilt weten over de bibliotheek. Onze testafbeelding is weer boot.tiff (ga je gang en download hem).

Het Python-script voor het uitvoeren van de Power Law Transformation-operator ziet er als volgt uit:

import cv2 import numpy als np im = cv2.imread ('boat.tiff') im = im / 255.0 im_power_law_transformation = cv2.pow (im, 0.6) cv2.imshow ('Originele afbeelding', im) cv2.imshow ('Power Law Transformation ', im_power_law_transformation) cv2.waitKey (0)

Merk op dat de gammawaarde die we hebben gekozen is 0.6. De onderstaande afbeelding toont het originele beeld en het resultaat van het toepassen van de Power Law Transformation-operator op die afbeelding (de linkerafbeelding toont de originele afbeelding en de rechterafbeelding toont het resultaat na het toepassen van de transformator van de machtswettransformatie).

Het bovenstaande resultaat was toen gamma = 0,6. Laten we eens kijken wat er gebeurt als we gamma verhogen naar 1.5, bijvoorbeeld:

Merk op dat naarmate we de waarde van gamma verhogen, het beeld donkerder wordt en andersom.

Men zou zich af kunnen vragen wat het gebruik van de transformatie van de machtswet zou kunnen zijn. In feite reageren de verschillende apparaten die worden gebruikt voor het verzamelen, afdrukken en weergeven van beelden volgens de transformator van de energietransformatie. Dit komt door het feit dat het menselijk brein gammacorrectie gebruikt om een ​​beeld te verwerken. Gammacorrectie wordt bijvoorbeeld belangrijk geacht als we willen dat een afbeelding correct wordt weergegeven (het beste beeldcontrast wordt in alle afbeeldingen weergegeven) op een computerscherm of televisieschermen.

Conclusie

In deze zelfstudie hebt u geleerd hoe u afbeeldingen kunt verbeteren met Python. U hebt gezien hoe u functies markeert met behulp van de operator voor beeldinversie en hoe de transformatie van de machtswetgeving wordt beschouwd als een cruciale operator voor het correct weergeven van afbeeldingen op computermonitoren en televisieschermen.

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.