computer-visionAan de slag met computer-vision


Opmerkingen

Digital Image Processing en Computer Vision is een interessant veld, omdat het prachtig gelegen is tussen wiskunde en informatica. Daarom is het erg handig om de basisprincipes te begrijpen en toe te passen met behulp van programmering om het onderwerp te begrijpen.

Digitale afbeeldingen zijn discretisatie van 2 of 3 dimensionale signalen. Met andere woorden, digitale afbeeldingen zijn bemonsterde sets pixels of voxels van continue domeinen.

                                        f : R² ⊃ Ω → R

Waar de f digitaal beeld over Ω is: rechthoekig beelddomein

Omwille van de eenvoud zullen we alleen tweedimensionale digitale afbeeldingen bespreken, zoals die in onze StackOverflow-avatars.

Over pixels: een korte opmerking over pixelwaarden voordat we beginnen te discussiëren over de soorten afbeeldingen. Als vuistregel beginnen pixels met waarde 0 die geen licht (zwart) aangeeft, tot 1, maximale intensiteit (bijvoorbeeld wit), en ze worden weergegeven in gehele getallen.

Binaire afbeeldingen: alleen afbeeldingen in zwart-wit. Elke pixel is 0 of 1, elke pixel kan worden voorgesteld door een bit. Ze zijn niet erg populair, omdat ze over het algemeen worden gebruikt in wetenschappelijke toepassingen of voor andere beeldverwerkingsbewerkingen als masker bijvoorbeeld.

Lena-afbeelding in binaire vorm

Een voorbeeld van een binaire afbeelding. (Waarschuwing voor de pixelwaarden van de afbeelding van dit bestand is niet noodzakelijkerwijs binair, dit is ter demonstratie, ook dit is Lena, de ster van de wereld voor beeldverwerking)

Grijswaardenafbeeldingen: dankzij online filters kent iedereen deze afbeeldingen nog steeds erg goed. Deze afbeeldingen zijn over het algemeen één byte per pixel, met 0 als zwart en 255 als wit, alles tussen een andere toon en een grijze, aangezien mensen slechts 40 grijstinten kunnen onderscheiden, is dit bereik voldoende voor veel toepassingen (merk op dat de waarden pixels hier worden toegewezen van 0 tot 1 tot byte waarden 0 - 255)

Lena-afbeelding in grijstinten

Kleurenafbeeldingen: ten slotte het meest voorkomende digitale afbeeldingstype, kleurenafbeeldingen. We moeten hier het concept van kanalen vermelden. Digitale afbeeldingen hebben ook kanalen, eigenlijk hebben binaire en grijswaardenafbeeldingen hierboven ook kanalen. De meest gebruikelijke beschrijving is het RGB-model (rood-groen-blauw), in zo'n geval heeft het beeld 3 kanalen (verwar het niet met afmetingen, dit zijn nog steeds 2D-beelden) om de roodheid, blauwheid en groenheid van het beeld te beschrijven. In dit geval is elke pixel een triplet, een waarde tussen 0 - 255 (Geen rood tot de meeste rood), 0 - 255 (Geen groen tot de meeste groen), 0 - 255 (Geen blauw tot de meeste blauw). Voor dit model is pixel {0,0,0} zwart, {255,255,255} is wit, {255,0,0} is rood, {255, 255, 0} is geel. Kleur is echter een zeer breed onderwerp en u kunt de referenties raadplegen voor meer informatie.

Lena-afbeelding in kleur

Hyper-spectrale afbeeldingen:

Nadat we de kanalen hadden besproken, is praten over hyper-spectrale beelden gemakkelijker. Deze afbeeldingen kunnen honderden kanalen hebben en worden meestal gebruikt in microscopie, satellietbeelden enz.

lezingen

  1. Signaalsampling: https://en.wikipedia.org/wiki/Sampling_(signal_processing)

  2. Bible of Digital Image Processing: RC Gonzalez, RE Woods: Digital Image Processing. Derde editie, Pearson Prentice Hall, Upper Saddle River, 2008.

  3. Computer Vision Review (Tot Deep Learning): R. Szeliski: Computer Vision: algoritmen en toepassingen. Springer, New York, 2010.

  4. Om een beeld te krijgen van binaire, grijswaarden-, kleurenafbeeldingen: https://en.wikipedia.org/wiki/Grayscale

Voorbeelden

Dit is een zeer eenvoudige Python-oefenreeks voor beeldverwerking en computervisie, ontworpen om deze onderwerpen met weinig praktische onderwerpen te introduceren. Het spijt me bij voorbaat voor rookie-fouten, het is nog in ontwikkeling. In deze serie beperk ik de digitale afbeeldingen die we kunnen gebruiken tot PNG-bestanden omwille van de eenvoud, die ik ook zal bespreken op het onderwerp van beeldcompressie.

Gelieve klonen de repository als je dat nog niet hebt gedaan, of u kunt gewoon downloaden hier via Github:

git clone https://github.com/Skorkmaz88/compvis101
 

Er zijn twee bestanden die u kunt gebruiken, een daarvan is tutorial0.py en de andere is het lezen vanImages.ipynb, de tweede is een ipython-notebook als u dat liever doet. Maar twee bestanden doen hetzelfde.

Code heeft uitleg in opmerkingen, dat ben ik


 # libs
import png

# We create a greyscale image as described in our text.
# To do that simply, we create a 2D array in python. 
# x and y, x being horizontal and y being vertical directions.

x  = []
y = []
# Play around with these pixels values to get different grayscale images, they shoud be 
# in range of 0 - 255. 
white = 255
gray = 128
black = 0
width  = 100
height = 300

# Add 100 x 100 rectangle as just white(255) valued pixels
for i in range(0, 100):
    for j in range(0,100):
        y.append(white); # Pixel (i,j) is being set to a value, rest is coding trick to nest two lists 
    x.append(y)
    y = []
    
# Add 100 x 100 rectangle as just mid-gray(128) valued pixels
for i in range(0, 100):
    for j in range(0,100):
        y.append(gray);
    x.append(y)
    y = []

# Add 100 x 100 rectangle as just black(0) valued pixels
for i in range(0, 100):
    for j in range(0,100):
        y.append(black);
    x.append(y)
    y = []

# output image file 
f = open('out.png', 'wb')
w = png.Writer(width, height , greyscale=True, bitdepth=8)
w.write(f, x)
f.close()
# If everything went well, you should have 3 vertically aligned rectangles white, gray and black 
# Check your working folder

# PART 2
# Read a grayscale image and convert it to binary

# This time we will binarize a grayscale image, to do that we will read pixels and according to threshold we set
# we will decide if that pixel should be white or black 

# This file is originally 8 bit png image, can be found in github repository, you should use only this type of
# images if you want to change the image.
f = open('./img/lenaG.png', 'r')

r=png.Reader(file=f)
# You will the details about the image, for now pay attention to size and bitdepth only.
img = r.read()

width = img[0]
height = img[1]
# Threshold value for binarizing images, 
threshold = 128
print "Input image size is: "+ str(width)+ " pixels as  width, " + str(height) + " pixels as height"

f_out = open('lenaBinary.png', 'wb')
w = png.Writer(width, height , greyscale=True, bitdepth=1)

pixels = img[2]
 
x = []
y = []

# Let's traverse the Lena image 
for row in pixels:
    for pixel in row:
        p_value =  pixel
        # Now here we binarize image in pixel level
        if p_value > threshold:
            p_value = 1
        else:
            p_value = 0
            
        y.append(p_value);
    x.append(y)
    y = []

w.write(f_out, x)
f_out.close()

Als alles goed werkte, gefeliciteerd! U hebt een afbeelding helemaal opnieuw gemaakt en de eerste pixelniveau-transformatie op een bestaande afbeelding uitgevoerd. Controleer uw werkmap om de nieuwe afbeeldingen te zien

Installatie of instellingen

Gedetailleerde instructies voor het instellen of installeren van computer-vision.

Voor deze en volgende series van computer vision gebruik ik Python 2 als programmeertaal. Python is een veel voorkomende keuze voor de wetenschappelijke gemeenschap, het is gratis, het heeft veel bibliotheken voor gratis en open-source, en als je nieuw bent met programmeren is het een van de eenvoudigste om te leren en te beginnen met programmeren.

Stel nu in, als je Linux gebruikt, heb je waarschijnlijk al python, open gewoon de terminal en typ 'python' om te controleren of alles al werkt. Anderen kunnen deze link controleren en python 2.7 downloaden.

Ten tweede moeten we de bibliotheken installeren die we in de broncode gaan gebruiken. Nu, een opmerking hier, deze installatie is ontworpen voor dit voorbeeld, in latere stadia zullen we verschillende bibliotheken toevoegen, en natuurlijk kunnen verschillende computer vision-toepassingen specifieke bibliotheken vereisen zoals OpenCV. We hebben slechts één bibliotheek nodig om in ons systeem te worden geïnstalleerd om de code uit te voeren. Bij het gebruik van python installeer ik meestal afhankelijkheden met behulp van 'pip'. Het is een eenvoudig hulpmiddel om de python-modules te installeren, u kunt het ook controleren via deze link

Nu zijn we klaar om de bibliotheek te installeren die we nodig hebben, PyPNG. Als u pip gebruikt, hoeft u alleen maar te doen

pip-installatie PyPNG

in terminal als u Linux / Mac gebruikt, in opdrachtregel als u Windows gebruikt.

Voor deze oefeningen moet u ook afbeeldingen ophalen die u kunt vinden in de github-link naast de broncode en ipython-notebooks.

https://github.com/Skorkmaz88/compvis101

Nu moeten we goed zijn om te oefenen