Retour au catalogue
Season 31 5 Épisodes 18 min 2026

Pillow: The Imaging Library

v12.1 — Édition 2026. Un guide concis sur l'utilisation de Pillow pour le traitement d'images et son intégration dans des projets plus vastes d'IA et de machine learning (v12.1 - 2026).

Traitement d'images Fondamentaux de Python
Pillow: The Imaging Library
Lecture en cours
Click play to start
0:00
0:00
1
La passerelle de la vision : Lazy Loading et métadonnées
Nous explorons la classe Image de Pillow et comment elle agit comme passerelle vers votre jeu de données de vision par ordinateur. Vous apprendrez à ouvrir des images et à extraire des métadonnées instantanément en utilisant le lazy loading.
3m 36s
2
Standardisation des tenseurs : Modes d'image et conversions
Comprendre les modes d'image est essentiel avant de fournir des données à un réseau de neurones. Nous analysons la différence entre les canaux Grayscale, RGB et RGBA, et comment utiliser la méthode convert pour standardiser vos entrées.
4m 18s
3
Géométrie pour les modèles : Redimensionnement, recadrage et padding
Nous abordons le problème du redimensionnement des images pour des entrées de modèle de taille stricte. Vous apprendrez la différence entre écraser une image avec resize, la recadrer avec fit, et ajouter des bandes avec pad.
3m 20s
4
La passerelle des tableaux : Transférer des pixels vers PyTorch
Pillow agit comme un pont entre les fichiers d'images bruts et les tableaux mathématiques. Nous couvrons comment traduire des images en tenseurs NumPy et en formats PyArrow, et comment reconvertir les sorties du modèle en images visibles.
3m 36s
5
Augmentation légère : Le module ImageOps
Vous n'avez pas toujours besoin de bibliothèques lourdes pour augmenter votre jeu de données. Nous explorons le module ImageOps de Pillow pour facilement refléter, retourner et ajuster le contraste afin d'élargir artificiellement vos données d'entraînement.
3m 31s

Épisodes

1

La passerelle de la vision : Lazy Loading et métadonnées

3m 36s

Nous explorons la classe Image de Pillow et comment elle agit comme passerelle vers votre jeu de données de vision par ordinateur. Vous apprendrez à ouvrir des images et à extraire des métadonnées instantanément en utilisant le lazy loading.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Pillow : The Imaging Library, épisode 1 sur 5. Tu peux scanner un dataset d'un million d'images en quelques secondes sans exploser ta mémoire. Le secret, c'est que ta library ne charge les données de pixels qu'au dernier moment possible. The Vision Gateway : le lazy loading et les métadonnées, c'est le mécanisme qui permet de gérer d'immenses répertoires d'images. Quand tu construis un dataset d'IA, tu commences souvent par un web scrape non filtré. Tu te retrouves face à un répertoire de millions de fichiers inconnus. Tu dois les filtrer avant le training. Disons que ton modèle a besoin d'images de 512 par 512 pixels exactement, sauvegardées en JPEG, en couleurs. Une erreur courante est de penser qu'ouvrir un fichier image dans un script va charger immédiatement chaque pixel en mémoire. Si c'était vrai, scanner un million d'images haute résolution consommerait des quantités énormes de RAM et finirait par faire planter ta machine. Au lieu de ça, Pillow gère ça avec un concept appelé le lazy loading. Le point d'entrée pour lire une image dans Pillow, c'est la fonction open, située dans le module Image. Tu passes un chemin de fichier à cette fonction, et elle te retourne un objet Image. Voici le point clé. Appeler la fonction open ne décode pas les données raster. Ça ouvre juste le fichier sur le disque et ça lit le header du fichier. Le header contient juste assez d'informations pour identifier le fichier et comprendre sa géométrie de base. Le gros du travail de décompression et de mapping des données de pixels est différé. Comme Pillow lit le header immédiatement, ton script a un accès instantané aux métadonnées de l'image. Ces métadonnées sont stockées comme des attributs sur l'objet Image. Il y a trois attributs principaux que tu vas utiliser pour évaluer les fichiers. Premièrement, l'attribut format. Il identifie le type de fichier source, en retournant une string comme JPEG ou PNG. Deuxièmement, l'attribut size. Il retourne un tuple à deux éléments contenant la largeur et la hauteur de l'image en pixels. Troisièmement, l'attribut mode. Le mode définit le nombre et les noms des bandes de pixels dans l'image, comme RGB pour la couleur standard, RGBA pour la couleur avec transparence, ou la lettre L pour les niveaux de gris. Avec ces trois attributs, notre data engineer peut traiter ce web scrape massif en toute sécurité. Il écrit une boucle qui appelle la fonction open sur chaque fichier du répertoire. Le script vérifie les métadonnées. Est-ce que le format est égal à JPEG ? Est-ce que la taille est égale à 512 par 512 ? Est-ce que le mode est égal à RGB ? Si le fichier échoue à l'un de ces tests, le script l'ignore et passe au suivant. Pillow laisse les données de pixels complètement tranquilles pendant tout ce processus. Les données raster sont décodées et chargées en mémoire uniquement si ton code finit par appeler une méthode qui le force à agir sur les pixels, comme recadrer l'image ou appliquer un filtre visuel. Pour les centaines de milliers d'images incorrectes dans le répertoire, cette extraction de pixels n'arrive jamais. L'empreinte mémoire reste minuscule. Ton script traite le répertoire aussi vite que ton disque de stockage peut lire ces petits headers de fichiers. Le lazy loading transforme la fonction open d'une opération de rendu lourde en un scanner de métadonnées ultra efficace, ce qui garde tes data pipelines rapides et ton utilisation mémoire stable. Si tu veux soutenir l'émission, tu peux chercher DevStoriesEU sur Patreon. C'est tout pour cet épisode. Merci d'avoir écouté, et continue à développer !
2

Standardisation des tenseurs : Modes d'image et conversions

4m 18s

Comprendre les modes d'image est essentiel avant de fournir des données à un réseau de neurones. Nous analysons la différence entre les canaux Grayscale, RGB et RGBA, et comment utiliser la méthode convert pour standardiser vos entrées.

Télécharger
Bonjour, ici Alex de DEV STORIES DOT EU. Pillow : The Imaging Library, épisode 2 sur 5. Tu laisses un modèle de vision s'entraîner toute la nuit, pour te réveiller et constater que la loop a planté il y a plusieurs heures. Le coupable était une seule image uploadée par un utilisateur, formatée légèrement différemment des autres. Corriger cette incohérence avant qu'elle n'atteigne ton modèle, c'est le rôle de la standardisation des tensors : modes et conversions d'images. Les réseaux de neurones sont rigides. Si ta couche de convolution attend un tensor d'entrée avec trois channels de couleur, et que tu lui fournis une image avec quatre channels, ou un seul channel, les calculs échouent et le pipeline s'arrête. En computer vision, la standardisation de tes formats de données d'image est une étape de pre-processing obligatoire. Pour gérer ça dans Pillow, tu dois comprendre deux propriétés liées : les bands et les modes. Une image dans Pillow est composée d'une ou plusieurs bands de données. Tu peux voir une band comme un array bidimensionnel distinct contenant une composante spécifique de l'image. Par exemple, les valeurs rouges de l'image entière forment une band. Pillow permet à plusieurs bands d'exister dans un seul objet image, à condition qu'elles partagent les mêmes dimensions et la même profondeur. Un mode est une string qui définit le type et la profondeur d'un pixel dans l'image. Le mode indique à Pillow la signification exacte des bands sous-jacentes. Il y a trois modes que tu vas rencontrer constamment dans les pipelines de machine learning. Le mode L correspond à la luminance. C'est une image standard en niveaux de gris 8 bits, et elle contient exactement une band. Le mode RGB est ton format couleur standard. Il comprend trois bands 8 bits : rouge, vert et bleu. Ensuite, il y a le mode RGBA. Les gens pensent souvent qu'une image RGBA est juste une image normale avec un fond transparent. Ce n'est pas comme ça que l'ordinateur la traite. Mathématiquement, une image RGBA possède un quatrième channel de données complet : l'alpha channel, qui dicte l'opacité de chaque pixel. Voici la partie qui compte. Quand un utilisateur uploade une photo de profil PNG transparente, cette image arrive dans ton pipeline en RGBA. Elle transporte quatre bands de données. Si ton image classifier attend un tensor RGB, lui fournir ce PNG brut va immédiatement déclencher une erreur de dimension. Tu dois le standardiser. Tu accomplis ça en utilisant la méthode convert. Quand tu appelles la méthode convert sur un objet image, tu passes la string du mode cible comme argument. Pour résoudre notre problème de PNG, tu ouvres l'image, puis tu appelles convert en passant la string RGB. Appeler la méthode convert ne modifie pas ton image originale in place. Ça renvoie un nouvel objet image construit contenant les données de pixels converties. Le processus de conversion n'est pas toujours une simple suppression de données supplémentaires. Quand tu convertis une image RGBA en RGB, Pillow supprime l'alpha channel, mais il ne préserve pas par magie ce à quoi tu pensais que le fond transparent ressemblait. Par défaut, Pillow remplace la transparence par du noir. Si tu convertis une image RGB vers le mode L pour un modèle en niveaux de gris, Pillow ne se contente pas de faire paresseusement la moyenne des trois bands de couleur. Il applique une formule mathématique pondérée spécifique aux channels rouge, vert et bleu pour calculer une luminance perçue par l'humain très précise. L'image en mode L qui en résulte possède exactement une band. Si tu appelles convert et que tu demandes le mode dans lequel l'image est déjà, Pillow renvoie simplement une copie de l'original sans gaspiller de compute cycles. Ça signifie que tu peux lancer aveuglément une commande convert vers RGB sur chaque fichier de ton dataset sans t'inquiéter de pénaliser ceux qui sont déjà formatés correctement. Pars toujours du principe que les images fournies par l'utilisateur ont des profondeurs de channels imprévisibles. Imposer une conversion de mode stricte à la frontière de ton pipeline est la police d'assurance la moins chère que tu puisses avoir contre les erreurs de dimension au runtime. C'est tout pour cet épisode. Merci pour ton écoute, et continue à développer !
3

Géométrie pour les modèles : Redimensionnement, recadrage et padding

3m 20s

Nous abordons le problème du redimensionnement des images pour des entrées de modèle de taille stricte. Vous apprendrez la différence entre écraser une image avec resize, la recadrer avec fit, et ajouter des bandes avec pad.

Télécharger
Salut, ici Alex de DEV STORIES DOT EU. Pillow : The Imaging Library, épisode 3 sur 5. Tu passes une photo de smartphone à ton réseau de neurones, et son accuracy chute. Le problème ne vient ni de tes weights ni de ton architecture. Si tu écrases simplement une photo rectangulaire dans un tensor carré, tu déformes les features avant même que le modèle ne les voie. Cet épisode parle de géométrie pour les modèles : le resize, le crop et le padding. Tu prépares des photos de smartphone pour un modèle ResNet qui attend un input exact de 224 par 224 pixels. Dans le monde réel, les photos ont toutes sortes de formes. Tu as des paysages larges et des portraits tout en hauteur, mais ton modèle exige un carré parfait. Tu dois combler cet écart sans ruiner la data sous-jacente. L'erreur la plus courante, c'est d'appeler la méthode resize standard sur l'image en lui passant les dimensions 224 par 224. Resize est un outil brutal. Il force l'image dans ces dimensions exactes et ignore complètement l'aspect ratio d'origine. Si l'image d'origine était un rectangle large, elle se retrouve écrasée horizontalement. Les cercles deviennent des ovales étroits. Le réseau de neurones apprend à partir de ces formes déformées, ce qui dégrade ses performances dans le monde réel. Resize ne fait pas un fit intelligent de l'image ; il la déforme aveuglément. Pour éviter la distorsion, tu pourrais faire un crop manuel de l'image. La méthode crop standard prend un tuple de quatre coordonnées qui définit les limites gauche, haut, droite et bas. Tu pourrais calculer le carré central de ton image et cropper le reste. Ça préserve l'aspect ratio et ça évite d'écraser les features. Par contre, ça jette la data sur les bords, et écrire les maths pour calculer la box centrale exacte pour chaque taille d'image entrante, c'est fastidieux. Voici le point clé. Pillow possède un module ImageOps conçu spécifiquement pour résoudre ce problème de géométrie précis. Si tu veux cropper sans faire de maths, tu utilises la méthode fit d'ImageOps. Tu lui donnes la taille exacte que tu veux, comme 224 par 224. Il calcule l'aspect ratio de la taille demandée, scale l'image pour que le côté le plus court corresponde à ta target, puis crop automatiquement l'excédent depuis le centre. Tu obtiens un carré parfait et zéro distorsion, avec le sujet généralement gardé pile au milieu. Et si tu ne peux pas te permettre de perdre les bords de l'image ? Si le sujet est excentré, un center crop risque de le couper en deux. Dans ce cas, tu passes à la méthode pad d'ImageOps. Pad scale l'image pour que le côté le plus long rentre dans ta target de 224 pixels. Le côté le plus court fera alors moins de 224. Pour compenser la différence, la méthode pad ajoute des bordures de couleur unie pour remplir le carré. C'est ce qu'on appelle communément le letterboxing. L'image d'origine entière est préservée, l'aspect ratio reste totalement intact, et le modèle reçoit toujours son carré exact. Chaque fois que tu changes la taille d'une image avec l'une de ces méthodes, Pillow doit calculer les nouveaux pixels. Pour les modèles de machine learning où les détails au niveau du pixel comptent, tu veux un filtre de resampling de haute qualité. Quand tu appelles fit, pad ou resize, tu peux passer un argument de resampling. Un filtre comme BICUBIC est un excellent choix standard ici. Il regarde les pixels environnants pour calculer des transitions fluides, ce qui préserve la netteté des contours sur lesquels reposent tes layers de convolution. Un réseau de neurones peut facilement apprendre à ignorer un padding noir, mais il ne peut pas désécraser une feature déformée. C'est tout pour cet épisode. Merci d'avoir écouté, et continue de développer !
4

La passerelle des tableaux : Transférer des pixels vers PyTorch

3m 36s

Pillow agit comme un pont entre les fichiers d'images bruts et les tableaux mathématiques. Nous couvrons comment traduire des images en tenseurs NumPy et en formats PyArrow, et comment reconvertir les sorties du modèle en images visibles.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Pillow : The Imaging Library, épisode 4 sur 5. Les frameworks de machine learning comme PyTorch ou TensorFlow ne savent pas vraiment ce qu'est un JPEG ou un PNG. Ils ne comprennent que les maths, ce qui veut dire qu'ils ne comprennent que les arrays multidimensionnels. Si tu passes directement un fichier image à un modèle, il va planter. Tu as besoin d'un moyen de traduire ces bytes encodés vers un format purement mathématique. The Array Bridge : Moving Pixels to PyTorch, c'est exactement comme ça que tu résous ce problème. Pillow agit comme le traducteur universel dans la stack IA. Quand tu ouvres une image avec Pillow, tu obtiens un objet Image. Pour l'injecter dans un data pipeline, tu passes cet objet Pillow directement à Numpy en utilisant la fonction as array. Sous le capot, Pillow expose une interface de buffer standard. Numpy lit ce buffer mémoire et le wrap dans un array multidimensionnel. Pour une photo couleur standard, tu obtiens un array en trois dimensions qui représente la hauteur, la largeur et les channels de couleur. C'est là que ça devient intéressant. Quand tu fais cette conversion, tu quittes complètement l'écosystème Pillow. L'array qui en résulte ne contient aucune des metadata de Pillow. Les paramètres DPI, les données EXIF, les profils de couleur ICC et les palettes de couleurs sont complètement supprimés. Il ne te reste que des valeurs numériques de pixels pures et brutes. Si ton image d'origine était basée sur une palette, comme un fichier GIF, tu dois la convertir en image RGB dans Pillow avant de la passer à Numpy. Sinon, tu vas juste obtenir un array de numéros d'index de palette qui ne veulent rien dire, au lieu des vraies couleurs. Une fois que tes pixels sont sous forme d'array, ton framework peut lancer ses opérations sur les tensors, appliquer des filtres ou exécuter un modèle de computer vision. Mais au final, tu récupères un résultat. Un modèle peut sortir un nouvel array qui représente une image générée ou un masque de segmentation. Pour voir ou sauvegarder ce résultat, tu dois traverser le pont dans l'autre sens. Tu prends cet array d'output et tu le passes à la fonction Pillow qui s'appelle from array. Pillow lit la shape et le data type de l'array Numpy pour comprendre comment interpréter les nombres. S'il voit un array d'entiers non signés de huit bits avec trois channels, il crée par défaut une image RGB. S'il voit un seul channel, il crée une image en niveaux de gris. Tu as aussi l'option de passer explicitement le mode de couleur toi-même si tu as besoin d'override le comportement par défaut. Une fois que Pillow a reconstruit l'objet image, tu as juste à appeler la méthode save pour l'écrire directement sur ton disque dur. Déplacer de la mémoire entre différentes libraries peut coûter cher. Si tu traites un dataset massif d'images en haute résolution, copier les données des pixels dans un sens puis dans l'autre crée un bottleneck important. Pour résoudre ça, Pillow supporte le format Apache Arrow via une fonction qui s'appelle from arrow. Arrow est un standard pour les données in-memory. Quand tu utilises la fonction from arrow, Pillow construit une image directement à partir de la data structure Arrow en utilisant de la mémoire partagée zero-copy. Ça veut dire que Pillow et tes autres outils pointent vers le même emplacement mémoire physique exact. La data n'est jamais dupliquée. C'est un moyen super efficace pour injecter de gros volumes de pixels dans des pipelines modernes sans épuiser la mémoire de ton système. La vraie puissance d'une library d'imagerie dans une stack IA, ce n'est pas juste d'ouvrir le fichier, mais de s'effacer gracieusement pour laisser les maths se faire. Merci d'avoir passé quelques minutes avec moi. À la prochaine, porte-toi bien.
5

Augmentation légère : Le module ImageOps

3m 31s

Vous n'avez pas toujours besoin de bibliothèques lourdes pour augmenter votre jeu de données. Nous explorons le module ImageOps de Pillow pour facilement refléter, retourner et ajuster le contraste afin d'élargir artificiellement vos données d'entraînement.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Pillow : The Imaging Library, épisode 5 sur 5. Tu importes un framework de computer vision massif, en récupérant des gigaoctets de dépendances, juste pour retourner quelques images de training. Tu n'as pas toujours besoin d'une library spécialisée et lourde pour construire un pipeline d'augmentation robuste. Parfois, tout ce qu'il te faut, c'est une augmentation légère : le module ImageOps. Avant de regarder les fonctions, on doit séparer ImageOps du module ImageFilter. Les auditeurs confondent parfois les deux. ImageFilter applique des kernels de convolution à une image, en calculant de nouvelles valeurs de pixels en fonction de leurs voisins pour créer des flous ou trouver des contours. ImageOps est complètement différent. Il fournit des opérations de pixel-mapping prêtes à l'emploi. Ce sont des transformations directes et rapides qui manipulent la couleur ou la position de pixels individuels sans reposer sur des calculs de voisinage complexes. Si tu prépares un dataset pour du machine learning, ImageOps te donne des outils instantanés pour multiplier tes data. Tu as des augmentations spatiales déterministes. La fonction mirror retourne ton image horizontalement, en inversant les côtés gauche et droit. La fonction flip la retourne verticalement, en inversant le haut et le bas. Ces deux opérations préservent les dimensions exactes de tes data d'origine, elles sont juste réorientées. Tu as aussi un accès immédiat aux réglages de couleur et de contraste. La fonction grayscale convertit ton image vers un format noir et blanc 8 bits. C'est couramment utilisé pour réduire la dimensionnalité de tes data d'input quand la couleur n'est pas pertinente pour la tâche de classification. La fonction invert inverse tous les channels de couleur. Un pixel 8 bits avec une valeur de zéro devient 255, transformant un fond blanc en noir et des pixels rouges en cyan. C'est super efficace quand tu génères des masques négatifs pour des tâches de segmentation. Voici le point clé. La fonction autocontrast est particulièrement utile pour standardiser des datasets bruts avec un éclairage irrégulier. Elle calcule un histogramme de l'image, trouve les pixels les plus sombres et les plus clairs, et étire la plage de couleurs pour que le pixel le plus sombre devienne noir pur et le plus clair devienne blanc pur. Tu peux passer un pourcentage de cutoff à la fonction autocontrast. Ça indique à Pillow d'ignorer les pixels outliers extrêmes, comme un simple reflet de soleil très vif, lors du calcul de la nouvelle courbe de contraste. Imagine que tu construises un data generator simple pour de l'imagerie satellite. Les photos satellites semblent valides dans n'importe quelle orientation, donc tu peux doubler ton training set sans problème avec des décalages spatiaux. Tu écris une fonction qui prend un directory d'images. Pour chaque fichier, tu charges l'image. Tu génères un entier aléatoire. Si l'entier est pair, tu passes l'image à la fonction mirror d'ImageOps. Si l'entier est impair, tu la passes à la fonction flip. Tu sauvegardes ensuite l'image obtenue sous un nouveau filename avec le type de transformation ajouté à la fin. Tu viens de multiplier ton dataset en utilisant une library standard, ce qui garde ton environnement de deploy exceptionnellement léger. Au lieu de te tourner vers des packages de machine learning lourds pour de la préparation de data basique, vérifier la documentation officielle pour des solutions natives évite le bloat des dépendances. Expérimenter par toi-même avec ces outils built-in simplifiera considérablement tes scripts de preprocessing. Si tu veux suggérer des sujets pour une nouvelle série, visite devstories dot eu. C'est tout pour cet épisode. Merci pour ton écoute, et continue de builder !