Torna al catalogo
Season 31 5 Episodi 19 min 2026

Pillow: The Imaging Library

v12.1 — Edizione 2026. Una guida concisa all'uso di Pillow per l'elaborazione delle immagini e alla sua integrazione in progetti più ampi di IA e machine learning (v12.1 - 2026).

Elaborazione delle Immagini Python Core
Pillow: The Imaging Library
In Riproduzione
Click play to start
0:00
0:00
1
Il Gateway della Visione: Lazy Loading e Metadati
Esploriamo la classe Image di Pillow e come funge da gateway per il tuo dataset di computer vision. Imparerai come aprire le immagini ed estrarre i metadati istantaneamente utilizzando il lazy loading.
3m 56s
2
Standardizzare i Tensors: Modalità Immagine e Conversioni
Comprendere le modalità delle immagini è fondamentale prima di fornire dati a una rete neurale. Analizziamo la differenza tra i canali Grayscale, RGB e RGBA, e come utilizzare il metodo convert per standardizzare i tuoi input.
4m 04s
3
Geometria per i Modelli: Resizing, Cropping e Padding
Affrontiamo il problema del reshaping delle immagini per input dei modelli di dimensioni rigorose. Imparerai la differenza tra schiacciare un'immagine con resize, ritagliarla con fit e applicare il letterboxing con pad.
3m 55s
4
Il Ponte degli Array: Spostare i Pixel verso PyTorch
Pillow funge da ponte tra i file immagine grezzi e gli array matematici. Trattiamo come tradurre le immagini in tensors NumPy e formati PyArrow, e come convertire gli output del modello di nuovo in immagini visibili.
3m 40s
5
Augmentation Leggera: Il Modulo ImageOps
Non hai sempre bisogno di librerie pesanti per fare augmentation sul tuo dataset. Esploriamo il modulo ImageOps di Pillow per specchiare, fare flip e regolare il contrasto facilmente, in modo da espandere artificialmente i tuoi dati di training.
3m 38s

Episodi

1

Il Gateway della Visione: Lazy Loading e Metadati

3m 56s

Esploriamo la classe Image di Pillow e come funge da gateway per il tuo dataset di computer vision. Imparerai come aprire le immagini ed estrarre i metadati istantaneamente utilizzando il lazy loading.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Pillow: The Imaging Library, episodio 1 di 5. Puoi scansionare un dataset di un milione di immagini in pochi secondi senza saturare la memoria. Il segreto è che la tua libreria non carica effettivamente i dati dei pixel fino all'ultimo momento possibile. The Vision Gateway: Lazy Loading e Metadata è il meccanismo che rende possibile la gestione di enormi directory di immagini. Quando crei un dataset per l'IA, spesso parti da un web scrape non curato. Ti trovi di fronte a una directory di milioni di file sconosciuti. Devi filtrarli prima del training. Mettiamo che il tuo modello richieda immagini di esattamente 512 per 512 pixel, salvate come JPEG, in full color. Un malinteso comune è pensare che aprire un file immagine all'interno di uno script carichi immediatamente ogni singolo pixel in memoria. Se fosse vero, scansionare un milione di immagini ad alta risoluzione consumerebbe enormi quantità di RAM e finirebbe per far crashare la tua macchina. Invece, Pillow gestisce la cosa usando un concetto chiamato lazy loading. L'entry point per leggere un'immagine in Pillow è la funzione open, che si trova nel modulo Image. Passi a questa funzione un file path, e lei restituisce un oggetto Image. Ecco il punto chiave. Chiamare la funzione open non decodifica i dati raster. Si limita ad aprire il file sul disco e a leggere il file header. L'header contiene solo le informazioni sufficienti per identificare il file e capirne la geometria di base. Il vero lavoro pesante di decompressione e mappatura dei dati dei pixel viene rimandato. Dato che Pillow legge immediatamente l'header, il tuo script ottiene accesso istantaneo ai metadata dell'immagine. Questi metadata vengono salvati come attributi sull'oggetto Image. Ci sono tre attributi principali che userai per valutare i file. Il primo è l'attributo format. Questo identifica il tipo di file sorgente, restituendo una string come JPEG o PNG. Il secondo è l'attributo size. Questo restituisce una tuple di due elementi che contiene la larghezza e l'altezza dell'immagine in pixel. Il terzo è l'attributo mode. Il mode definisce il numero e i nomi delle bande di pixel nell'immagine, come RGB per il colore standard, RGBA per il colore con trasparenza, o la lettera L per la scala di grigi. Con questi tre attributi, il nostro data engineer può processare quel massiccio web scrape in totale sicurezza. Scrive un loop che chiama la funzione open su ogni file nella directory. Lo script controlla i metadata. Il format è uguale a JPEG? La size è uguale a 512 per 512? Il mode è uguale a RGB? Se il file fallisce uno qualsiasi di questi controlli, lo script lo ignora e va avanti. Pillow lascia i dati effettivi dei pixel completamente intatti durante l'intero processo. I dati raster vengono decodificati e caricati in memoria solo se il tuo codice alla fine chiama un metodo che lo forza ad agire sui pixel, come fare il crop dell'immagine o applicare un filtro visivo. Per le centinaia di migliaia di immagini sbagliate nella directory, quell'estrazione dei pixel non avviene mai. Il memory footprint rimane minuscolo. Il tuo script processa la directory alla stessa velocità con cui il tuo disco di archiviazione riesce a leggere quei piccoli file header. Il lazy loading trasforma la funzione open da una pesante operazione di rendering a un metadata scanner altamente efficiente, mantenendo veloci le tue data pipeline e piatto l'utilizzo della memoria. Se ti va di supportare lo show, puoi cercare DevStoriesEU su Patreon. Questo è tutto per questo episodio. Grazie per l'ascolto, e continua a sviluppare!
2

Standardizzare i Tensors: Modalità Immagine e Conversioni

4m 04s

Comprendere le modalità delle immagini è fondamentale prima di fornire dati a una rete neurale. Analizziamo la differenza tra i canali Grayscale, RGB e RGBA, e come utilizzare il metodo convert per standardizzare i tuoi input.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Pillow: The Imaging Library, episodio 2 di 5. Lasci un vision model in training per tutta la notte, solo per scoprire al risveglio che il loop è crashato ore prima. Il colpevole era una singola immagine caricata da un utente, formattata in modo leggermente diverso dalle altre. Risolvere questa incoerenza prima che raggiunga il tuo modello è il compito della standardizzazione dei tensor: mode e conversioni delle immagini. Le reti neurali sono rigide. Se il tuo convolutional layer si aspetta un input tensor con tre canali colore, e gli passi un'immagine con quattro canali, o un solo canale, i calcoli saltano e la pipeline si ferma. Nella computer vision, standardizzare i formati dei dati delle tue immagini è uno step di pre-processing obbligatorio. Per gestire questa cosa in Pillow, devi capire due proprietà collegate: band e mode. Un'immagine in Pillow è composta da una o più band di dati. Puoi pensare a una band come a un array bidimensionale distinto che contiene una componente specifica dell'immagine. Ad esempio, i valori del rosso in tutta l'immagine formano una band. Pillow permette a diverse band di coesistere in un singolo image object, a patto che condividano le stesse dimensioni e la stessa profondità. Un mode è una string che definisce il tipo e la profondità di un pixel nell'immagine. Il mode dice a Pillow esattamente cosa significano le band sottostanti. Ci sono tre mode che incontrerai costantemente nelle pipeline di machine learning. Il mode L sta per luminanza. Si tratta di un'immagine standard in scala di grigi a otto bit, e contiene esattamente una band. Il mode RGB è il tuo formato true color standard. Comprende tre band a otto bit: rosso, verde e blu. Poi c'è il mode RGBA. Spesso si pensa a un'immagine RGBA semplicemente come a una normale immagine con uno sfondo trasparente. Ma non è così che la tratta il computer. Matematicamente, un'immagine RGBA possiede un quarto canale dati completo: l'alpha channel, che determina l'opacità di ogni singolo pixel. Ecco la parte importante. Quando un utente carica un'immagine del profilo PNG trasparente, quell'immagine arriva nella tua pipeline come RGBA. Si porta dietro quattro band di dati. Se il tuo image classifier si aspetta un tensor RGB, passargli quel PNG raw scatenerà immediatamente un errore di dimension mismatch. Devi standardizzarla. Puoi farlo usando il metodo convert. Quando chiami il metodo convert su un image object, passi la string del mode di destinazione come argomento. Per risolvere il nostro problema con il PNG, apri l'immagine, poi chiami convert passando la string RGB. Chiamare il metodo convert non altera la tua immagine originale in place. Restituisce un nuovo image object appena costruito che contiene i dati dei pixel tradotti. Il processo di conversione non è sempre una semplice eliminazione di dati extra. Quando converti un'immagine RGBA in RGB, Pillow scarta l'alpha channel, ma non preserva magicamente l'aspetto che pensavi avesse lo sfondo trasparente. Di default, Pillow sostituisce la trasparenza con il nero. Se converti un'immagine RGB al mode L per un modello grayscale, Pillow non si limita a fare pigramente la media delle tre band di colore. Applica una specifica formula matematica ponderata ai canali rosso, verde e blu per calcolare una luminanza percepita dall'occhio umano estremamente accurata. L'immagine risultante in mode L ha esattamente una band. Se chiami convert e richiedi il mode in cui l'immagine si trova già, Pillow restituisce semplicemente una copia dell'originale senza sprecare compute cycles. Questo significa che puoi lanciare ciecamente un comando convert a RGB su ogni singolo file nel tuo dataset senza preoccuparti di penalizzare quelli che sono già formattati correttamente. Dai sempre per scontato che le immagini fornite dagli utenti abbiano channel depth imprevedibili. Imporre una rigida conversione di mode all'ingresso della tua pipeline è la polizza assicurativa più economica che hai contro i runtime dimension error. Questo è tutto per questo episodio. Grazie per l'ascolto, e continua a sviluppare!
3

Geometria per i Modelli: Resizing, Cropping e Padding

3m 55s

Affrontiamo il problema del reshaping delle immagini per input dei modelli di dimensioni rigorose. Imparerai la differenza tra schiacciare un'immagine con resize, ritagliarla con fit e applicare il letterboxing con pad.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Pillow: The Imaging Library, episodio 3 di 5. Dai in pasto una foto dello smartphone alla tua rete neurale, e la sua accuracy crolla. Il problema non sono i tuoi weights o la tua architecture. Se semplicemente schiacci una foto rettangolare in un tensor quadrato, distorci le feature prima ancora che il model le veda. Questo episodio parla di geometria per i model: resize, crop e padding. Stai preparando delle foto scattate con uno smartphone per un model ResNet che si aspetta un input esatto di 224 per 224 pixel. Le foto del mondo reale hanno tutte le forme. Hai paesaggi wide e ritratti verticali, ma il tuo model richiede un quadrato perfetto. Devi colmare questo gap senza rovinare i dati sottostanti. L'errore più comune è chiamare il metodo standard resize sull'immagine e passargli le dimensioni 224 per 224. Resize è uno strumento grossolano. Forza l'immagine in quelle dimensioni esatte e ignora completamente l'aspect ratio originale. Se l'immagine originale era un rettangolo largo, viene schiacciata orizzontalmente. I cerchi diventano ovali stretti. La rete neurale impara da queste forme distorte, il che degrada le sue performance nel mondo reale. Resize non fa un fit intelligente dell'immagine; la deforma ciecamente. Per evitare distorsioni, potresti fare un crop manuale dell'immagine. Il metodo crop standard prende una tuple di quattro coordinate che definisce i bordi left, upper, right e lower. Potresti calcolare il quadrato centrale della tua immagine e fare il crop del resto. Questo preserva l'aspect ratio ed evita di schiacciare le feature. Tuttavia, butta via i dati sui bordi, e scrivere i calcoli per trovare l'esatto box centrale per ogni size di immagine in ingresso è noioso. Ecco l'intuizione chiave. Pillow ha un modulo ImageOps progettato specificamente per risolvere questo esatto problema di geometria. Se vuoi fare un crop senza fare i calcoli, usi il metodo fit di ImageOps. Gli passi la size esatta che vuoi, tipo 224 per 224. Calcola l'aspect ratio della size richiesta, fa uno scale down dell'immagine in modo che il lato più corto corrisponda al tuo target, e poi fa un crop automatico dell'eccesso dal centro. Ottieni un quadrato perfetto e zero distorsioni, con il soggetto di solito mantenuto esattamente al centro. E se non puoi permetterti di perdere i bordi dell'immagine? Se il soggetto è decentrato, un center crop potrebbe tagliarlo a metà. In quel caso, passi al metodo pad di ImageOps. Pad fa uno scale down dell'immagine in modo che il lato più lungo stia nel tuo target di 224 pixel. Il lato più corto ora sarà meno di 224. Per compensare la differenza, il metodo pad aggiunge dei bordi a tinta unita per riempire il quadrato. Questo è comunemente noto come letterboxing. L'intera immagine originale viene preservata, l'aspect ratio rimane completamente intatto, e il model riceve comunque il suo quadrato esatto. Ogni volta che cambi la size di un'immagine con uno di questi metodi, Pillow deve calcolare i nuovi pixel. Per i model di machine learning in cui i dettagli a livello di pixel sono importanti, vuoi un resampling filter di alta qualità. Quando chiami fit, pad o resize, puoi passare un argomento di resampling. Un filter come BICUBIC è un'ottima scelta standard qui. Guarda i pixel circostanti per calcolare transizioni fluide, preservando la nitidezza dei bordi su cui si basano i tuoi convolutional layer. Una rete neurale può facilmente imparare a ignorare il padding nero, ma non può de-schiacciare una feature distorta. Questo è tutto per questo episodio. Grazie per aver ascoltato, e continua a sviluppare!
4

Il Ponte degli Array: Spostare i Pixel verso PyTorch

3m 40s

Pillow funge da ponte tra i file immagine grezzi e gli array matematici. Trattiamo come tradurre le immagini in tensors NumPy e formati PyArrow, e come convertire gli output del modello di nuovo in immagini visibili.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Pillow: The Imaging Library, episodio 4 di 5. I framework di machine learning come PyTorch o TensorFlow non sanno effettivamente cosa sia un JPEG o un PNG. Capiscono solo la matematica, il che significa che capiscono solo array multidimensionali. Se passi un file immagine direttamente a un modello, fallirà. Ti serve un modo per tradurre quei byte codificati in un formato puramente matematico. The Array Bridge: Moving Pixels to PyTorch è esattamente come risolvi questo problema. Pillow fa da traduttore universale nello stack AI. Quando apri un'immagine usando Pillow, ottieni un oggetto Image. Per darlo in pasto a una data pipeline, passi quell'oggetto Pillow direttamente a Numpy usando la funzione as array. Dietro le quinte, Pillow espone un'interfaccia buffer standard. Numpy legge questo memory buffer e lo incapsula in un array multidimensionale. Per una fotografia a colori standard, ottieni un array tridimensionale che rappresenta l'altezza, la larghezza e i canali colore. Ed è qui che la cosa si fa interessante. Quando fai questa conversione, esci completamente dall'ecosistema di Pillow. L'array risultante non contiene nessuno dei metadata di Pillow. Le impostazioni DPI, i dati EXIF, i profili colore ICC e le palette colori vengono completamente rimossi. Ti rimangono solo i puri valori numerici raw dei pixel. Se la tua immagine originale era basata su palette, come un file GIF, devi convertirla in un'immagine RGB all'interno di Pillow prima di passarla a Numpy. Altrimenti, otterrai solo un array di numeri indice della palette senza significato, invece dei colori veri e propri. Una volta che i tuoi pixel sono in formato array, il tuo framework può eseguire le sue operazioni sui tensor, applicare filtri o eseguire un modello di computer vision. Ma alla fine, ti torna indietro un risultato. Un modello potrebbe restituire in output un nuovo array che rappresenta un'immagine generata o una segmentation mask. Per visualizzare o salvare questo risultato, devi attraversare il ponte nella direzione opposta. Prendi quell'array di output e lo passi alla funzione di Pillow chiamata from array. Pillow legge la shape e il data type dell'array Numpy per capire come interpretare i numeri. Se vede un array di unsigned eight-bit integers con tre canali, di default crea un'immagine RGB. Se vede un singolo canale, crea un'immagine in scala di grigi. Hai anche l'opzione di passare esplicitamente il color mode tu stesso, se hai bisogno di fare l'override del comportamento di default. Una volta che Pillow ricostruisce l'oggetto Image, ti basta chiamare il metodo save per scriverlo direttamente sul tuo hard drive. Spostare memoria tra librerie diverse può essere costoso. Se stai processando un dataset enorme di immagini ad alta risoluzione, copiare i dati dei pixel avanti e indietro crea un bottleneck significativo. Per risolvere questo problema, Pillow supporta il formato Apache Arrow tramite una funzione chiamata from arrow. Arrow è uno standard per i dati in-memory. Quando usi la funzione from arrow, Pillow costruisce un'immagine direttamente dalla data structure di Arrow usando la zero-copy shared memory. Questo significa che Pillow e i tuoi altri tool puntano esattamente alla stessa locazione di memoria fisica. I dati non vengono mai duplicati. È un modo estremamente efficiente per dare in pasto grandi volumi di pixel alle pipeline moderne senza esaurire la memoria di sistema. Il vero potere di una libreria di imaging in uno stack AI non sta solo nell'aprire il file, ma nel farsi da parte con eleganza per permettere alla matematica di fare il suo corso. Grazie per aver passato qualche minuto con me. Alla prossima, stammi bene.
5

Augmentation Leggera: Il Modulo ImageOps

3m 38s

Non hai sempre bisogno di librerie pesanti per fare augmentation sul tuo dataset. Esploriamo il modulo ImageOps di Pillow per specchiare, fare flip e regolare il contrasto facilmente, in modo da espandere artificialmente i tuoi dati di training.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Pillow: The Imaging Library, episodio 5 di 5. Importi un framework di computer vision enorme, tirandoti dietro gigabyte di dipendenze, solo per fare il flip di un paio di immagini di training. Non hai sempre bisogno di una library specializzata e pesante per costruire una pipeline di augmentation robusta. A volte, tutto ciò che ti serve è una augmentation leggera: il modulo ImageOps. Prima di guardare le funzioni, dobbiamo separare ImageOps dal modulo ImageFilter. A volte gli ascoltatori li confondono. ImageFilter applica dei convolution kernel a un'immagine, calcolando i nuovi valori dei pixel in base ai loro vicini per creare blur o trovare gli edge. ImageOps è completamente diverso. Fornisce operazioni di pixel-mapping già pronte. Sono trasformazioni dirette e veloci che manipolano il colore o la posizione dei singoli pixel senza dipendere da calcoli complessi sui vicini. Se stai preparando un dataset per il machine learning, ImageOps ti offre dei tool immediati per moltiplicare i tuoi dati. Hai a disposizione delle augmentation spaziali deterministiche. La funzione mirror esegue il flip della tua immagine orizzontalmente, scambiando il lato sinistro e quello destro. La funzione flip esegue un flip verticale, scambiando la parte superiore e quella inferiore. Entrambe le operazioni preservano le dimensioni esatte dei tuoi dati originali, semplicemente riorientandoli. Hai anche accesso immediato alle regolazioni di colore e contrasto. La funzione grayscale converte la tua immagine in un formato bianco e nero a otto bit. Questo è comunemente usato per ridurre la dimensionalità dei tuoi dati di input quando il colore non è rilevante per il task di classificazione. La funzione invert inverte tutti i color channel. Un pixel a otto bit con valore zero diventa duecentocinquantacinque, trasformando uno sfondo bianco in nero e i pixel rossi in ciano. Questo è molto efficace quando generi maschere negative per task di segmentazione. Ecco il punto chiave. La funzione autocontrast è particolarmente utile per standardizzare dataset raw con illuminazione non uniforme. Calcola un istogramma dell'immagine, trova i pixel più scuri e più chiari ed estende il color range in modo che il pixel più scuro diventi nero puro e quello più chiaro diventi bianco puro. Puoi passare una percentuale di cutoff alla funzione autocontrast. Questo dice a Pillow di ignorare i pixel outlier estremi, come un singolo riflesso solare molto intenso, quando calcola la nuova curva di contrasto. Pensa di costruire un semplice data generator per immagini satellitari. Le foto satellitari sembrano valide da qualsiasi orientamento, quindi puoi tranquillamente raddoppiare il tuo training set con degli shift spaziali. Scrivi una funzione che prende una directory di immagini. Per ogni file, carichi l'immagine. Generi un intero random. Se l'intero è pari, passi l'immagine alla funzione mirror di ImageOps. Se l'intero è dispari, la passi alla funzione flip. Poi salvi l'immagine risultante con un nuovo filename a cui aggiungi il tipo di trasformazione. Hai appena moltiplicato il tuo dataset usando una standard library, mantenendo il tuo deployment environment estremamente leggero. Invece di ricorrere a pesanti package di machine learning per la data preparation di base, controllare la documentazione ufficiale per soluzioni native previene il dependency bloat. La sperimentazione pratica con questi tool built-in semplificherà drasticamente i tuoi preprocessing script. Se vuoi suggerire argomenti per una nuova serie, visita devstories dot eu. Questo è tutto per questo episodio. Grazie per l'ascolto e continua a sviluppare!