Afbeeldingen en afbeeldingsverwerking

Voltooid

Voordat we beeldverwerking en andere computer vision-mogelijkheden kunnen verkennen, is het handig om na te gaan wat een afbeelding daadwerkelijk is in de context van gegevens voor een computerprogramma.

Afbeeldingen als pixelmatrices

Op een computer is een afbeelding een matrix met numerieke pixelwaarden . Denk bijvoorbeeld aan de volgende matrix:

 0   0   0   0   0   0   0  
 0   0   0   0   0   0   0
 0   0  255 255 255  0   0
 0   0  255 255 255  0   0
 0   0  255 255 255  0   0
 0   0   0   0   0   0   0
 0   0   0   0   0   0   0

De matrix bestaat uit zeven rijen en zeven kolommen, die de pixelwaarden voor een afbeelding van 7x7 pixels vertegenwoordigen (ook wel de resolutie van de afbeelding genoemd). Elke pixel heeft een waarde tussen 0 (zwart) en 255 (wit); met waarden tussen deze grenzen die grijstinten vertegenwoordigen. De afbeelding die wordt weergegeven door deze matrix ziet er ongeveer als volgt uit (vergrootglas):

Diagram of a grayscale image.

De matrix van pixelwaarden voor deze afbeelding is tweedimensionaal (die rijen en kolommen of x - en y-coördinaten vertegenwoordigt) en definieert één rechthoek met pixelwaarden. Eén laag pixelwaarden zoals deze vertegenwoordigt een afbeelding met grijswaarden. In werkelijkheid zijn de meeste digitale afbeeldingen multidimensionaal en bestaan ze uit drie lagen (ook wel kanalen genoemd) die kleurenkleuren van rood, groen en blauw (RGB) vertegenwoordigen. We kunnen bijvoorbeeld een kleurenafbeelding voorstellen door drie kanalen met pixelwaarden te definiëren die dezelfde vierkante vorm maken als in het vorige voorbeeld van grijswaarden:

Red:
 150  150  150  150  150  150  150  
 150  150  150  150  150  150  150
 150  150  255  255  255  150  150
 150  150  255  255  255  150  150
 150  150  255  255  255  150  150
 150  150  150  150  150  150  150
 150  150  150  150  150  150  150

Green:
 0    0    0    0    0    0    0          
 0    0    0    0    0    0    0
 0    0   255  255  255   0    0
 0    0   255  255  255   0    0
 0    0   255  255  255   0    0
 0    0    0    0    0    0    0
 0    0    0    0    0    0    0

Blue:
 255  255  255  255  255  255  255  
 255  255  255  255  255  255  255
 255  255   0    0    0   255  255
 255  255   0    0    0   255  255
 255  255   0    0    0   255  255
 255  255  255  255  255  255  255
 255  255  255  255  255  255  255

Dit is de resulterende afbeelding:

Diagram of a color image.

De paarse vierkantjes worden vertegenwoordigd door de combinatie:

Red: 150 
Green: 0 
Blue: 255 

De gele vierkantjes in het midden worden vertegenwoordigd door de combinatie:

Red: 255
Green: 255
Blue: 0

Filters gebruiken om afbeeldingen te verwerken

Een veelgebruikte manier om afbeeldingsverwerkingstaken uit te voeren, is door filters toe te passen die de pixelwaarden van de afbeelding wijzigen om een visueel effect te maken. Een filter wordt gedefinieerd door een of meer matrices van pixelwaarden, die filterkernels worden genoemd. U kunt bijvoorbeeld een filter definiëren met een 3x3-kernel, zoals wordt weergegeven in dit voorbeeld:

-1 -1 -1
-1  8 -1
-1 -1 -1

De kernel wordt vervolgens samengevoegd over de afbeelding, waarbij een gewogen som wordt berekend voor elke 3x3-patch van pixels en het resultaat wordt toegewezen aan een nieuwe afbeelding. Het is gemakkelijker om te begrijpen hoe het filteren werkt door een stapsgewijs voorbeeld te verkennen.

Laten we beginnen met de afbeelding met grijswaarden die we eerder hebben verkend:

 0   0   0   0   0   0   0  
 0   0   0   0   0   0   0
 0   0  255 255 255  0   0
 0   0  255 255 255  0   0
 0   0  255 255 255  0   0
 0   0   0   0   0   0   0
 0   0   0   0   0   0   0

Eerst passen we de filterkernel toe op de linkerbovenhoek van de afbeelding, waarbij elke pixelwaarde wordt vermenigvuldigd met de overeenkomende gewichtswaarde in de kernel en de resultaten worden toegevoegd:

(0 x -1) + (0 x -1) + (0 x -1) +
(0 x -1) + (0 x 8) + (0 x -1) +
(0 x -1) + (0 x -1) + (255 x -1) = -255

Het resultaat (-255) wordt de eerste waarde in een nieuwe matrix. Vervolgens verplaatsen we de filterkernel één pixel naar rechts en herhalen we de bewerking:

(0 x -1) + (0 x -1) + (0 x -1) +
(0 x -1) + (0 x 8) + (0 x -1) +
(0 x -1) + (255 x -1) + (255 x -1) = -510

Nogmaals, het resultaat wordt toegevoegd aan de nieuwe matrix, die nu twee waarden bevat:

-255  -510

Het proces wordt herhaald totdat het filter is samengevoegd in de hele afbeelding, zoals wordt weergegeven in deze animatie:

Diagram of a filter.

Het filter wordt samengevoegd in de afbeelding en berekent een nieuwe matrix met waarden. Sommige waarden liggen mogelijk buiten het waardebereik van 0 tot 255 pixels, zodat de waarden worden aangepast aan dat bereik. Vanwege de vorm van het filter wordt de buitenrand van pixels niet berekend, dus wordt er een opvullingswaarde (meestal 0) toegepast. De resulterende matrix vertegenwoordigt een nieuwe afbeelding waarin het filter de oorspronkelijke afbeelding heeft getransformeerd. In dit geval heeft het filter het effect gehad van het markeren van de randen van vormen in de afbeelding.

Als u het effect van het filter duidelijker wilt zien, ziet u hier een voorbeeld van hetzelfde filter dat is toegepast op een echte afbeelding:

Oorspronkelijke afbeelding Gefilterde afbeelding
Diagram of a banana. Diagram of a filtered banana.

Omdat het filter is samengevoegd in de afbeelding, wordt dit type afbeeldingsmanipulatie vaak aangeduid als convolutionele filtering. Het filter dat in dit voorbeeld wordt gebruikt, is een bepaald type filter (een laplace-filter genoemd) waarmee de randen van objecten in een afbeelding worden gemarkeerd. Er zijn veel andere soorten filters die u kunt gebruiken om wazige, verscherping, kleurinversion en andere effecten te maken.