Trois niveaux d’abstraction (via PIL)
Le fichier, support « physique », sur le disque.
L’objet Python « image » intermédiaire. Contient les informations
sur l’encodage... et les données.
La matrice des pixels.
Fichier Objet Python Matrice de pixels
’baroudeur.bmp’ <PIL.BmpImage... array([[[ 12, 16, 25],
... ...
image mode=RGB [80, 86, 60]]],
...> dtype=uint8)
’baroudeur.jpg’ <PIL.JpegImage... array([[[ 12, 16, 25],
... ...
image mode=RGB [80, 86, 60]]],
...> dtype=uint8)
’baroudeurBW.jpg’ <PIL.JpegImage... array([[14, 15, 15, ...,
... ...
image mode=L ... 80, 80, 80]],
...> dtype=uint8)
Image.open : objet image à partir du fichier.
numpy.array : tableau/matrice de pixels à partir de l’objet image.
Exemple :
Définition de l’objet et de la matrice
>>> chat = im.open(’images_out/baroudeurBW.jpg’)
>>> pixels_chat = np.array(chat)
>>> chat
<PIL.JpegImagePlugin.JpegImageFile image mode=L
size=2048x1536 at 0xB5F911AC>
>>> pixels_chat
array([[ 14, 15, 15, ..., 208, 212, 215],
[ 14, 15, 15, ..., 211, 212, 214],
...,
[208, 206, 203, ..., 80, 80, 80]], dtype=uint8)
Image.fromarray : des pixels à l’objet image.
Méthode save des objets image : pour sauver sous différents formats.
Exemple :
pixels_chat = np.array( im.open(’baroudeurBW.jpg’) )
pixels_chat[ 100:200 , 500:1500 ] =
255*np.ones((100, 1000),dtype=’uint8’)
im.fromarray(pixels_chat).save(’mystere.jpg’)
Quelques points techniques
Slicing : tableau[ a:b , c:d ] en lecture ou écriture.
numpy.zeros( (a,b) ) et numpy.ones( (a,b) ) attention aux types.
Conversion en niveaux (Levels) de gris :
image.open(’image_couleur.jpg’).convert(’L’).save(’image_BW.png’)
Appliquer une fonction aux pixels : deux approches
pixels1 = np.array(im.open(’baroudeur.jpg’))
Pixel par pixel ; 48 secondes
(H, L, _) = pixels1.shape # hauteur * largeur * 3
pixels2 = np.copy(pixels1)
for i in range( H ):
for j in range( L ):
pixels2[i][j] = contraste( pixels2[i][j] )
Par application d’une fonction « vectorisée » au tableau ; 3 secondes
contraste_vecto = np.vectorize( contraste )
pixels2 = contraste_vecto( pixels1 )
# en fait : pixels2 = np.array( ... , dtype=’uint8’)
im.fromarray(pixels2).save(’baroudeurBW2.jpg’)