v12.1 — Edição de 2026. Um guia conciso sobre a utilização do Pillow para processamento de imagem e como este se integra em projetos maiores de IA e machine learning (v12.1 - 2026).
A Porta de Entrada para a Visão: Lazy Loading e Metadados
Exploramos a classe Image do Pillow e como esta atua como porta de entrada para o seu dataset de visão computacional. Irá aprender a abrir imagens e a extrair metadados instantaneamente utilizando lazy loading.
3m 56s
2
Padronização de Tensores: Modos de Imagem e Conversões
Compreender os modos de imagem é fundamental antes de alimentar uma rede neuronal com dados. Analisamos a diferença entre os canais Grayscale, RGB e RGBA, e como utilizar o método convert para padronizar os seus inputs.
4m 16s
3
Geometria para Modelos: Redimensionamento, Recorte e Padding
Abordamos o problema de reconfigurar imagens para inputs de modelos com tamanhos estritos. Irá aprender a diferença entre achatar uma imagem com resize, recortar com fit e aplicar letterboxing com pad.
4m 03s
4
A Ponte de Arrays: Mover Píxeis para o PyTorch
O Pillow atua como a ponte entre ficheiros de imagem em bruto e arrays matemáticos. Abordamos como traduzir imagens para tensores NumPy e formatos PyArrow, e como converter os outputs do modelo de volta para imagens visíveis.
4m 21s
5
Data Augmentation Leve: O Módulo ImageOps
Nem sempre precisa de bibliotecas pesadas para aplicar data augmentation ao seu dataset. Exploramos o módulo ImageOps do Pillow para espelhar, inverter e ajustar o contraste facilmente, de forma a expandir artificialmente os seus dados de treino.
3m 59s
Episódios
1
A Porta de Entrada para a Visão: Lazy Loading e Metadados
3m 56s
Exploramos a classe Image do Pillow e como esta atua como porta de entrada para o seu dataset de visão computacional. Irá aprender a abrir imagens e a extrair metadados instantaneamente utilizando lazy loading.
Olá, daqui é o Alex da DEV STORIES DOT EU. Pillow: The Imaging Library, episódio 1 de 5. Podes analisar um dataset de um milhão de imagens em segundos sem estourar a tua memória. O segredo é que a tua library não carrega os dados dos pixels até ao último momento possível. The Vision Gateway: lazy loading e metadata é o mecanismo que torna possível lidar com diretórios de imagens massivos.
Quando constróis um dataset de IA, muitas vezes começas com um web scrape sem curadoria. Estás a olhar para um diretório com milhões de ficheiros desconhecidos. Precisas de os filtrar antes do training. Imagina que o teu modelo precisa de imagens com exatamente 512 por 512 pixels, guardadas como JPEGs, a cores. Um erro comum é pensar que abrir um ficheiro de imagem dentro de um script vai carregar todos os pixels para a memória imediatamente. Se isso fosse verdade, analisar um milhão de imagens de alta resolução iria consumir quantidades enormes de RAM e, eventualmente, crashar a tua máquina. Em vez disso, o Pillow lida com isto usando um conceito chamado lazy loading.
O entry point para ler uma imagem no Pillow é a função open, localizada no módulo Image. Passas a esta função um file path, e ela devolve um objeto Image. Aqui está o ponto chave. Chamar a função open não descodifica os dados raster. Apenas abre o ficheiro no disco e lê o file header. O header contém apenas a informação suficiente para identificar o ficheiro e perceber a sua geometria básica. O verdadeiro trabalho pesado de descomprimir e mapear os dados dos pixels é adiado.
Como o Pillow lê o header imediatamente, o teu script tem acesso instantâneo à metadata da imagem. Esta metadata é guardada como atributos no objeto Image. Existem três atributos principais que vais usar para avaliar ficheiros. O primeiro é o atributo format. Este identifica o tipo de ficheiro de origem, devolvendo uma string como JPEG ou PNG. O segundo é o atributo size. Este devolve um tuple de dois elementos que contém a largura e a altura da imagem em pixels. O terceiro é o atributo mode. O mode define o número e os nomes das bandas de pixels na imagem, como RGB para cor standard, RGBA para cor com transparência, ou a letra L para grayscale.
Com estes três atributos, o nosso data engineer consegue processar aquele web scrape massivo com segurança. Ele escreve um loop que chama a função open em cada ficheiro do diretório. O script verifica a metadata. O format é igual a JPEG? O size é igual a 512 por 512? O mode é igual a RGB? Se o ficheiro falhar alguma destas verificações, o script ignora-o e avança.
O Pillow deixa os dados dos pixels completamente intactos durante todo este processo. Os dados raster só são descodificados e carregados para a memória se o teu código eventualmente chamar um method que o force a atuar sobre os pixels, como fazer crop à imagem ou aplicar um filtro visual. Para as centenas de milhares de imagens incorretas no diretório, essa extração de pixels nunca acontece. O memory footprint mantém-se minúsculo. O teu script processa o diretório tão rápido quanto a tua drive de armazenamento consegue ler esses pequenos file headers.
O lazy loading transforma a função open de uma operação de rendering pesada num metadata scanner altamente eficiente, mantendo as tuas data pipelines rápidas e o teu uso de memória estável. Se quiseres apoiar o podcast, podes procurar por DevStoriesEU no Patreon. É tudo por este episódio. Obrigado por ouvires, e continua a construir!
2
Padronização de Tensores: Modos de Imagem e Conversões
4m 16s
Compreender os modos de imagem é fundamental antes de alimentar uma rede neuronal com dados. Analisamos a diferença entre os canais Grayscale, RGB e RGBA, e como utilizar o método convert para padronizar os seus inputs.
Olá, daqui é o Alex da DEV STORIES DOT EU. Pillow: A Biblioteca de Imagens, episódio 2 de 5. Deixas um vision model a treinar durante a noite, só para acordares e veres que o loop crashou há horas. O culpado foi uma única imagem enviada por um utilizador, formatada de maneira ligeiramente diferente das restantes. Corrigir esta inconsistência antes que chegue ao teu modelo é o trabalho de Standardizing Tensors: Image Modes and Conversions.
As redes neuronais são rígidas. Se a tua convolutional layer espera um input tensor com três canais de cor, e tu a alimentas com uma imagem com quatro canais, ou um canal, a matemática falha e o pipeline para. Em computer vision, padronizar os formatos dos teus dados de imagem é um passo de pré-processamento obrigatório.
Para gerir isto no Pillow, precisas de entender duas propriedades ligadas: bands e modes. Uma imagem no Pillow consiste numa ou mais bands de dados. Podes pensar numa band como um array bidimensional distinto que contém um componente específico da imagem. Por exemplo, os valores de vermelho em toda a imagem formam uma band. O Pillow permite que várias bands existam num único image object, desde que partilhem as mesmas dimensões e profundidade.
Um mode é uma string que define o tipo e a profundidade de um pixel na imagem. O mode diz ao Pillow exatamente o que as bands subjacentes significam. Existem três modes que vais encontrar constantemente em pipelines de machine learning. O mode L significa luminância. Esta é uma imagem grayscale standard de oito bits, e contém exatamente uma band. O mode RGB é o teu formato true color standard. É composto por três bands de oito bits: vermelho, verde e azul. Depois, há o mode RGBA. As pessoas muitas vezes pensam numa imagem RGBA apenas como uma imagem normal com um fundo transparente. Não é assim que o computador a trata. Matematicamente, uma imagem RGBA possui um quarto canal de dados completo — o alpha channel, que dita a opacidade de cada pixel.
Aqui está a parte que interessa. Quando um utilizador faz upload de uma foto de perfil PNG transparente, essa imagem chega ao teu pipeline como RGBA. Traz quatro bands de dados. Se o teu image classifier espera um tensor RGB, alimentá-lo com esse PNG raw vai disparar imediatamente um erro de dimension mismatch. Tens de a padronizar. Consegues fazer isto usando o method convert.
Quando chamas o method convert num image object, passas a string do target mode como argumento. Para corrigir o nosso problema com o PNG, abres a imagem, e depois chamas convert passando a string RGB. Chamar o method convert não altera a tua imagem original in place. Retorna um image object recém-construído que contém os dados dos píxeis traduzidos.
O processo de conversão nem sempre é uma simples eliminação de dados extra. Quando convertes uma imagem RGBA para RGB, o Pillow descarta o alpha channel, mas não preserva magicamente a aparência que tu achavas que o fundo transparente tinha. Por default, o Pillow substitui a transparência por preto. Se converteres uma imagem RGB para o mode L para um grayscale model, o Pillow não faz apenas a média preguiçosa das três color bands. Aplica uma fórmula matemática ponderada específica aos canais vermelho, verde e azul para calcular uma luminância percebida pelo ser humano altamente precisa. A imagem mode L resultante tem exatamente uma band.
Se chamares convert e pedires o mode em que a imagem já está, o Pillow simplesmente retorna uma cópia da original sem desperdiçar compute cycles. Isto significa que podes correr cegamente um comando convert para RGB em cada ficheiro do teu dataset sem te preocupares em penalizar os que já estão formatados corretamente.
Assume sempre que as imagens fornecidas pelo utilizador têm channel depths imprevisíveis. Impor uma mode conversion estrita na fronteira do teu pipeline é o seguro mais barato que tens contra erros de dimensão em runtime.
É tudo por este episódio. Obrigado por ouvires, e continua a programar!
3
Geometria para Modelos: Redimensionamento, Recorte e Padding
4m 03s
Abordamos o problema de reconfigurar imagens para inputs de modelos com tamanhos estritos. Irá aprender a diferença entre achatar uma imagem com resize, recortar com fit e aplicar letterboxing com pad.
Olá, daqui fala o Alex da DEV STORIES DOT EU. Pillow: The Imaging Library, episódio 3 de 5. Alimentas a tua rede neuronal com uma foto de smartphone, e a sua accuracy cai. O problema não são os teus weights nem a tua arquitetura. Se simplesmente esmagares uma foto retangular num tensor quadrado, distorces as features antes mesmo de o modelo as ver. Este episódio aborda Geometria para Modelos: Resizing, Cropping e Padding.
Estás a preparar fotos de smartphone para um modelo ResNet que espera um input exato de 224 por 224 pixels. As fotos do mundo real vêm em todos os formatos. Tens paisagens amplas e retratos altos, mas o teu modelo exige um quadrado perfeito. Tens de preencher essa lacuna sem arruinar os dados originais. O erro mais comum é chamar o método resize standard na imagem e passar as dimensões de 224 por 224. O resize é um instrumento bruto. Ele força a imagem a essas dimensões exatas e ignora completamente o aspect ratio original. Se a imagem original era um retângulo largo, fica esmagada horizontalmente. Os círculos transformam-se em ovais estreitas. A rede neuronal aprende com estas formas distorcidas, o que degrada a sua performance no mundo real. O resize não faz o fit inteligente de uma imagem; simplesmente distorce-a de forma cega.
Para evitar a distorção, podes fazer o crop manual da imagem. O método crop standard recebe um tuple de quatro coordenadas que definem os limites left, upper, right e lower. Podes calcular o quadrado central da tua imagem e fazer crop do resto. Isto preserva o aspect ratio e evita esmagar as features. No entanto, deita fora dados à volta das bordas, e escrever a matemática para calcular a center box exata para cada tamanho de imagem que entra é entediante.
Aqui está o ponto chave. O Pillow tem um módulo ImageOps desenhado especificamente para resolver este exato problema de geometria. Se quiseres fazer crop sem fazer as contas, usas o método fit do ImageOps. Dizes-lhe o tamanho exato que queres, como 224 por 224. Ele calcula o aspect ratio do tamanho que pediste, faz o scale down da imagem para que o lado mais curto corresponda ao teu target, e depois faz automaticamente o crop do excesso a partir do centro. Ficas com um quadrado perfeito e zero distorção, com o sujeito geralmente mantido bem no meio.
E se não te puderes dar ao luxo de perder as bordas da imagem? Se o sujeito estiver descentrado, um center crop pode cortá-lo ao meio. Nesse caso, mudas para o método pad do ImageOps. O pad faz o scale down da imagem para que o lado mais longo caiba no teu target de 224 pixels. O lado mais curto terá agora menos de 224. Para compensar a diferença, o método pad adiciona bordas de cor sólida para preencher o quadrado. Isto é comumente conhecido como letterboxing. Toda a imagem original é preservada, o aspect ratio permanece totalmente intacto, e o modelo continua a receber o seu quadrado exato.
Sempre que alteras o tamanho de uma imagem com qualquer um destes métodos, o Pillow tem de calcular os novos pixels. Para modelos de machine learning onde o detalhe ao nível do pixel importa, queres um filtro de resampling de alta qualidade. Ao chamar o fit, pad ou resize, podes passar um argumento de resampling. Um filtro como o BICUBIC é uma forte escolha standard aqui. Ele olha para os pixels vizinhos para calcular transições suaves, preservando a nitidez das bordas das quais as tuas convolutional layers dependem. Uma rede neuronal pode facilmente aprender a ignorar o padding preto, mas não consegue desesmagar uma feature distorcida. É tudo por este episódio. Obrigado por ouvires, e continua a desenvolver!
4
A Ponte de Arrays: Mover Píxeis para o PyTorch
4m 21s
O Pillow atua como a ponte entre ficheiros de imagem em bruto e arrays matemáticos. Abordamos como traduzir imagens para tensores NumPy e formatos PyArrow, e como converter os outputs do modelo de volta para imagens visíveis.
Olá, daqui é o Alex da DEV STORIES DOT EU. Pillow: The Imaging Library, episódio 4 de 5. Frameworks de machine learning como o PyTorch ou o TensorFlow não sabem exatamente o que é um JPEG ou um PNG. Eles só entendem matemática, o que significa que só entendem arrays multidimensionais. Se passares um ficheiro de imagem diretamente para um modelo, ele vai falhar. Precisas de uma forma de traduzir esses bytes codificados para um formato puramente matemático. The Array Bridge: Moving Pixels to PyTorch é exatamente como resolves isto.
O Pillow atua como o tradutor universal na stack de IA. Quando abres uma imagem usando o Pillow, obténs um objeto Image. Para alimentares uma data pipeline com esse objeto, passas esse objeto Pillow diretamente para o Numpy usando a função as array. Nos bastidores, o Pillow expõe uma interface de buffer standard. O Numpy lê este memory buffer e encapsula-o num array multidimensional. Para uma fotografia a cores standard, obténs um array tridimensional que representa a altura, a largura e os canais de cor.
É aqui que a coisa fica interessante. Quando fazes esta conversão, sais completamente do ecossistema do Pillow. O array resultante não contém nenhuma da metadata do Pillow. As definições de DPI, os dados EXIF, os perfis de cor ICC e as paletas de cores são completamente removidos. Ficas apenas com os valores numéricos puros e raw dos pixels. Se a tua imagem original era baseada em paletas, como um ficheiro GIF, tens de a converter para uma imagem RGB dentro do Pillow antes de a passares para o Numpy. Caso contrário, vais obter apenas um array de números de index da paleta sem significado, em vez de cores reais.
Assim que os teus pixels estiverem em formato de array, a tua framework pode correr as suas operações de tensores, aplicar filtros ou executar um modelo de computer vision. Mas, eventualmente, recebes um resultado de volta. Um modelo pode fazer o output de um novo array que representa uma imagem gerada ou uma máscara de segmentação. Para veres ou guardares este resultado, tens de atravessar a ponte na direção oposta. Pegas nesse array de output e passas para a função do Pillow chamada from array. O Pillow lê o shape e o data type do array Numpy para descobrir como interpretar os números. Se vir um array de inteiros unsigned de oito bits com três canais, cria por default uma imagem RGB. Se vir apenas um canal, cria uma imagem em tons de cinzento. Também tens a opção de passar explicitamente o color mode, caso precises de fazer override ao comportamento default. Assim que o Pillow reconstrói o objeto de imagem, só tens de chamar o método save para o gravar diretamente no teu disco rígido.
Mover memória entre diferentes libraries pode ser dispendioso. Se estiveres a processar um dataset massivo de imagens de alta resolução, copiar os dados dos pixels de um lado para o outro cria um bottleneck significativo. Para resolver isto, o Pillow suporta o formato Apache Arrow através de uma função chamada from arrow. O Arrow é um standard para dados in-memory. Quando usas a função from arrow, o Pillow constrói uma imagem diretamente da estrutura de dados do Arrow usando zero-copy shared memory. Isto significa que o Pillow e as tuas outras tools apontam exatamente para a mesma localização de memória física. Os dados nunca são duplicados. É uma forma altamente eficiente de alimentar grandes volumes de pixels em pipelines modernas sem esgotar a memória do teu sistema.
O verdadeiro poder de uma imaging library numa stack de IA não está apenas em abrir o ficheiro, mas em sair do caminho de forma elegante para que a matemática possa acontecer. Obrigado por passares uns minutos comigo. Até à próxima, fica bem.
5
Data Augmentation Leve: O Módulo ImageOps
3m 59s
Nem sempre precisa de bibliotecas pesadas para aplicar data augmentation ao seu dataset. Exploramos o módulo ImageOps do Pillow para espelhar, inverter e ajustar o contraste facilmente, de forma a expandir artificialmente os seus dados de treino.
Olá, daqui é o Alex do DEV STORIES DOT EU. Pillow: The Imaging Library, episódio 5 de 5. Importas uma framework de computer vision enorme, puxando gigabytes de dependências, só para inverter algumas imagens de treino. Nem sempre precisas de uma library especializada e pesada para construir um pipeline de augmentation robusto. Às vezes, tudo o que precisas é de Lightweight Augmentation: o módulo ImageOps.
Antes de olharmos para as funções, precisamos de separar o ImageOps do módulo ImageFilter. Os ouvintes às vezes confundem os dois. O ImageFilter aplica convolution kernels a uma imagem, calculando novos valores de pixel com base nos seus vizinhos para criar blurs ou encontrar edges. O ImageOps é completamente diferente. Fornece operações de pixel-mapping prontas a usar. São transformações diretas e rápidas que manipulam a cor ou a posição de pixels individuais sem depender de matemática complexa de vizinhança.
Se estiveres a preparar um dataset para machine learning, o ImageOps dá-te ferramentas instantâneas para multiplicares os teus dados. Tens augmentations espaciais determinísticas. A função mirror inverte a tua imagem horizontalmente, trocando os lados esquerdo e direito. A função flip inverte-a verticalmente, trocando a parte de cima e a de baixo. Ambas as operações preservam as dimensões exatas dos teus dados originais, apenas reorientados.
Também tens acesso imediato a ajustes de cor e contraste. A função grayscale converte a tua imagem para um formato preto e branco de oito bits. Isto é muito usado para reduzir a dimensionalidade dos teus dados de input quando a cor não é relevante para a tarefa de classificação. A função invert inverte todos os canais de cor. Um pixel de oito bits com o valor zero passa a duzentos e cinquenta e cinco, transformando um fundo branco em preto e pixels vermelhos em ciano. Isto é altamente eficaz a gerar máscaras negativas para tarefas de segmentação.
Aqui está o ponto chave. A função autocontrast é particularmente útil para padronizar datasets brutos com iluminação inconsistente. Calcula um histograma da imagem, encontra os pixels mais escuros e mais claros, e estica a gama de cores para que o pixel mais escuro passe a preto puro e o mais claro a branco puro. Podes passar uma percentagem de cutoff à função autocontrast. Isto diz ao Pillow para ignorar pixels outliers extremos, como um único reflexo de sol intenso, ao calcular a nova curva de contraste.
Imagina que estás a construir um data generator simples para imagens de satélite. As fotos de satélite parecem válidas em qualquer orientação, por isso podes duplicar o teu training set em segurança com transformações espaciais. Escreves uma função que recebe um diretório de imagens. Para cada ficheiro, carregas a imagem. Geras um integer aleatório. Se o integer for par, passas a imagem para a função mirror do ImageOps. Se o integer for ímpar, passas a imagem para a função flip. A seguir, guardas a imagem resultante com um novo nome de ficheiro, acrescido do tipo de transformação. Acabaste de multiplicar o teu dataset usando uma standard library, mantendo o teu ambiente de deploy excecionalmente leve.
Em vez de recorreres a pacotes pesados de machine learning para preparação básica de dados, consultar a documentação oficial à procura de soluções nativas evita o dependency bloat. A experimentação hands-on com estas ferramentas built-in vai simplificar drasticamente os teus scripts de preprocessing. Se quiseres sugerir tópicos para uma nova série, visita devstories dot eu. É tudo por este episódio. Obrigado por ouvires, e continua a construir!
Tap to start playing
Browsers block autoplay
Share this episode
Episode
—
Copy this episode in another language:
Este site não utiliza cookies. O nosso fornecedor de alojamento pode registar o seu endereço de IP para efeitos analíticos. Saber mais.