Ubuntu - Traiter des images par lot, avec Python


On utilise ici un ordinateur sous Ubuntu 18.04 avec Python 3.6.
La création d'un programme permettant de traiter automatiquement un lot de fichiers images avec Python sous Ubuntu passe par la maitrise de chacune des tâches suivantes :
1) Vérifier l'installation de l'interpréteur Python;
2) Vérifier la présence d'un IDE (Environnement de Développement Intégré);
3) Vérifier la présence de la librairie graphique PIL;
4) Créer une nouvelle image;
5) Modifier une image existante;
6) Récupérer la taille d'une image;
7) Lister les images d'un répertoire;
8) Créer une bordure noire sur une image;
9) Créer une bordure noire sur un lot d'images.

1) Vérifier l'installation de Python

On commence par regarder quelle est la version de Python installée sur l'ordinateur en tapant la commande python dans le Terminal de commandes.
La commande "python" est appelée "lien symbolique" car elle renvoit automatiquement vers la version de python installée (version 2.x ou 3.x) ou vers l'une de ces versions si plusieurs versions diiférentes de python sont installées.

01

Normalement sous Ubuntu 18.04 et ultérieur, Python 3.x est installé par défaut (3.x étant 3.4, 3.5, 3.6, 3.7,..). Il suffit de taper python3 pour l'invoquer.
Si python 3.x n'est pas installé, on peut l'installer en tapant les commandes habituelles d'installation sous Linux, à savoir :
sudo apt-get update et sudo apt-get install python3.x
Remarque: L’outil PIP (Python Installs Packages) qui permet d’installer facilement des modules additionnels pour Python est inclus par défaut avec Python, à partir de la version Python 3.4.

Si la commande python renvoit vers la version python 2.x malgré qu'une version python 3.x soit également installée, il suffit de taper la commande sudo ln -s usr/bin/python3.x /usr/bin/python pour associer python3.x à la commande python.
Exemple :
sudo ln -s usr/bin/python3.6 /usr/bin/python

2) Vérifier la présence d'un IDE Python

On regarde si un IDE (idle ou Thonny par exemple est installé. Si ce n'est pas le cas, on en installe un (thonny par exemple).
sudo apt-get update
sudo apt-get install thonny

Remarque : On peut aussi se contenter d'utiliser simplement un éditeur de texte mais dans ce cas il faudra exécuter le programme source.py depuis le Terminal de commandes (commande python source.py)

3) Vérifier la présence de la librairie graphique PIL

PIL (Python Imaging Library) ou Pillow est une bibliothèque de traitement d'images pour le langage de programmation Python. On vérifie sa présence en tapant la commande pip list. Si Pillow n'est pas installée, on l'installe en tapant la commande sudo pip install pillow.

02

4) Créer une nouvelle image

Une fois que les éléments pré-cités sont opérationnels, on peut créer un programme Python. Le code source essai.py suivant permet de créer une nouvelle image RGB de 150 pixels de large et 100 pixels de haut. L'instruction putpixel permet de colorer individuellement chaque pixel de l'image. Un fois créée, l'image est enregistrée dans le fichier sauv.png, dans le répertoire du programme.
La fonction range(n) renvoie une suite de nombres compris entre 0 et n-1 en s’incrémentant automatiquement de 1 à chaque fois.
Les valeurs de x et y varient donc ici de 0 à 149 et de 0 à 99 compris, ce qui est parfait puisque les pixels d'une image de largeur L pixels et de hauteur H pixels varient de 0 à L-1 et de 0 à H-1.

03

#-------------------------------------------
#! essai.py : Création d'une nouvelle image
#-- ----------------------------------------
from PIL import Image
img = Image.new('RGB', (150, 100))
for y in range(100):
       for x in range(150):
             img.putpixel((x,y), (255,0,0))
img.save("sauv.png")

04

5) Modifier une image existante

Le code source suivant modifie l'image sauv.png créée précédemment et enregistre l'image modifiée dans le fichier sauv2.png, dans le répertoire du programme.

#-------------------------------------------
#! essai.py : Modifier une image existante
#-- ----------------------------------------
from PIL import Image
img= Image.open("sauv.png")
for y in range(50):
       for x in range(75):
             img.putpixel((x,y), (0,255,0))
img.save("sauv2.png")

05

6) Récupérer la taille d'une image

Le code source suivant récupère la taille en pixels de l'image sauv.png qui se trouve dans le répertoire du programme. img.size est une variable de type liste.

#-------------------------------------------
#! essai.py : Récupérer la taille d'une image
#-- ----------------------------------------
from PIL import Image
img= Image.open("sauv.png")
width, height = img.size
print (img.size)
print (width)
print (height)

>>> %Run essai.py
(150, 100)
150
100
>>>

7) Lister les images d'un répertoire

La méthode listdir() de la classe os retourne une liste contenant, dans un ordre arbitraire, les noms de l'ensemble des fichiers contenus dans un répertoire.

06

#-------------------------------------------
#! essai.py : Lister les images d'un répertoire
#-- ----------------------------------------
import os, sys
# Chemin du répertoire
path = "/media/ubuntu/data/essai/"
rep = os.listdir (path)
for file in rep:
       print (file)

>>> %Run essai.py
005.jpg
002.jpg
001.jpg
004.jpg
007.jpg
006.jpg
003.jpg
>>>

8) Créer une bordure noire-blanche sur une image

Le programme suivant crée une bordure extérieure noire-blanche sur une image sauv.png de dimension quelconque, sans modifier la dimension de cette image, puis enregistre l'image modifiéee dans le fichier sauv2.png dans le répertoire du programme.

Il est à noter qu'une image de dimension L, H a ses pixels numérotés de 0 à L-1 en abscisse et 0 à H-1 en ordonnée. De plus l'instruction i in range (0,n,1)) fait varier i de 0 à n-1 compris (et non pas n)

from PIL import Image
img= Image.open("sauv.png")
w, h = img.size
print (w); print (h)
for x in range (0,w,1):
       img.putpixel((x,0), (0,0,0))
       img.putpixel((x,h-1), (0,0,0))
for y in range (0,h,1):
       img.putpixel((0,y), (0,0,0))
       img.putpixel((w-1,y), (0,0,0))

for x in range (1,w-1,1):
       img.putpixel((x,1), (255,255,255))
       img.putpixel((x,h-2), (255,255,255))
for y in range (1, h-1,1):
       img.putpixel((1,y), (255,255,255))
       img.putpixel((w-2,y), (255,255,255))
img.save('sauv2.png')

07

9) Créer une bordure noire-blanche sur un lot d'images

Le programme suivant crée une bordure extérieure noire-blanche sur toutes les images (de dimensions quelconques, différentes ou non selon les images) contenues dans le répertoire /media/ubuntu/data/essai/, sans modifier la dimension de chacune de ces images, puis enregistre les images modifiées, avec le même nom, dans le répertoire /media/ubuntu/data/essai2/.

#-------------------------------------------
#! Programme Python
#! eil.py - Encadrement d'images par lot
#! Claude Turrier - 25 octobre 2020
#-- ----------------------------------------
from PIL import Image
import os, sys
path = "/media/ubuntu/data/essai/"
dest= "/media/ubuntu/data/essai2/"
for filename in os.listdir(dest) :
      os.remove(dest + "/" + filename)
rep = os.listdir (path)
print (rep)
for file in rep:
       fic=path + file
       img= Image.open(fic)
       w, h = img.size
       # cadre extérieur noir
       for x in range (0,w,1):
             img.putpixel((x,0), (0,0,0))
             img.putpixel((x,h-1), (0,0,0))
       for y in range (0,h,1):
             img.putpixel((0,y), (0,0,0))
             img.putpixel((w-1,y), (0,0,0))
       # cadre intercalé blanc
       for x in range (1,w-1,1):
             img.putpixel((x,1), (255,255,255))
             img.putpixel((x,h-2), (255,255,255))
       for y in range (1, h-1,1):
             img.putpixel((1,y), (255,255,255))
             img.putpixel((w-2,y), (255,255,255))
       dest= "/media/ubuntu/data/essai2/"+ file
       img.save(dest)

08