Aplicações de machine learning, deep learning e inteligência artificial frequentemente requerem imagens digitais pré-processadas. Além de pré-processamento, a edição de imagens também é muito utilizada para aumentar artificialmente a quantidade de dados para treinar redes neurais. O Python possui algumas bibliotecas excelentes para processamento e edição de imagens. Neste post, vamos falar sobre uma delas, a biblioteca Pillow.
Pillow é um fork da biblioteca Python Imaging Libary (PIL). Ela trabalha com inúmeros formatos de imagens e possui uma série de funcionalidades para processamento como mudança de tamanho, filtros, rotação, cropping, entre outras. Vamos conhecer algumas dessas funcionalidades.
Instalação
É recomendável instalar a biblioteca Pillow usando um ambiente virtual para evitar incompatibilidades, pois ela não é atualizada tão rapidamente quanto outras bibliotecas.
Para instalar com pip:
pip install Pillow
Para instalar com conda:
conda install -c anaconda pillow
Abrindo uma imagem com Pillow
Para começar, é necessário importar o módulo da biblioteca que será usado. Nós vamos usar o Image por enquanto.
from PIL import Image
Qualquer fotografia que você tem pode ser usada para acompanhar este post. Mas, se você quiser a mesma imagem que usamos, o link está aqui.
Para abrir a imagem com o Pillow, é preciso colocar sua path e o nome da imagem. Se você não sabe a path, clique no arquivo da imagem com o botão direito e ache a path em propriedades. Outra forma é, se a imagem estiver na mesma pasta que seu código no VScode, clique no arquivo da imagem com o botão direito e vai aparecer a opção copy path ou o equivalente em português. No nosso caso, a extensão da imagem é .jpg. Confira qual é a sua e modifique seu código de acordo. No VScode, a path já vai incluir o nome da imagem com a extensão correta.
O código abaixo abre e plota a imagem usando o Pillow.
img = Image.open('sua_path/nome_da_sua_imagem.jpg')
img.show()
Executando o código acima, a imagem irá abrir numa janela contendo algumas informações sobre ela. Note que o formato não é o da imagem original, mas da imagem que o Pillow abriu. Por isso, mesmo se sua imagem for .jpg, o formato provavelmente aparecerá com .PNG. Nosso resultado é mostrado abaixo. As informações estão no canto à direita.
Manipulando algumas propriedades de uma imagem
O Pillow pode ser usado para verificar várias propriedades de uma imagem e também para transformá-las. O código abaixo mostra como verificar o formato, tamanho e modo de cores da imagem.
print(img.format, img.size, img.mode)
No caso da imagem que usamos, o resultado é mostrado abaixo.
JPEG (640, 356) RGB
O Pillow também é capaz de transformar várias propriedades de imagens.
Para alterar o formato de uma imagem, basta salvá-la com uma extensão diferente. Se você quiser alterar também o nome da nova imagem, apenas troque o nome usado dentro dos parênteses.
img.save('img.png')
img.save('img.eps')
img.save('img.tiff')
Outra propriedade facilmente transformada é o tamanho da imagem usando a método .resize(). É possível mudar esse parâmetro usando o tamanho original como referência como no código abaixo. Nesse exemplo, reduzimos as dimensões originais pela metade. Note que é preciso garantir que o resultado do novo tamanho seja do tipo int.
img_menor = img.resize((int(img.size[0]*0.5), int(img.size[1]*0.5)))
img_menor.save('img_menor.jpg')
Também é possível alterar o tamanho da imagem usando diretamente o número de pixeis que queremos. No exemplo abaixo, a nova imagem foi definida com 250 pixeis de largura e 250 de altura. Mas atenção: isso frequentemente distorce a imagem.
img_menor = img.resize((250, 250))
img_menor.save('img_menor2.jpg')
O modo de cor da imagem pode ser manipulado com o método .convert(). No código abaixo, usamos um for loop para criar várias versões da nossa imagem, cada uma com um modo de cor específico. Veja que usamos a imagem menor criada acima como imagem de entrada.
modo = ["1",'L','P', 'RGBA']
for m in modo:
file_name = "img_modo_"+str(m)
imx = img_menor.convert(m)
imx.save(file_name+'.png')
Os resultados são mostrados abaixo (ordem: RGBA, 1, P, L).
Cropping
Outro método importante do Pillow é o .crop(). Ele corta a imagem a partir de uma caixa definida com quatro coordenadas (esquerda, topo, direita, base). No exemplo abaixo, cortamos a imagem em duas metades.
box = (0, 0, 320, 356)
img_cropped = img.crop(box)
img_cropped.save('img_crop_esquerda.jpg')
box = (320, 0, 640, 356)
img_cropped = img.crop(box)
img_cropped.save('img_direita.jpg')
Rotações
A imagem também pode ser girada ou transposta com o Pillow. Para rotacioná-la, é preciso usar o método .rotate() e indicar o número de graus que serão usados.
img_70 = img.rotate(70)
img_70.save('img70.jpg')
Já para fazer a transposição completa da imagem, o método é o .transpose().
img_transpose = img.transpose(Image.FLIP_LEFT_RIGHT)
img_transpose.save('imgTranspose.jpg')
Filtros e manipulações de cores
O método .point() possibilita a manipulação das intensidades dos pixeis individualmente. Acoplado a uma função, ele permite alterações bastante variadas.
imgPoint = img.point(lambda i: i * 2)
imgPoint.save('img_point.jpg')
Esse método também pode ser aplicado em canais individuais de cores como mostrado abaixo. Nesse exemplo, a manipulação foi feita apenas no canal azul (B).
imgB = img.split()
R, G, B = 0, 1, 2
imgB = imgB[B].point(lambda i: i * 2)
imgB.save('img_pointB.jpg')
Além de todas essas funcionalidades, o Pillow também tem vários filtros. Eles podem ser usados para criar diversos efeitos. Abaixo, mostramos alguns exemplos de como usar o filtro .BoxBlur(). Veja que é possível variar a intensidade do blur aplicada à imagem.
from PIL import ImageFilter
imgFilter = img_menor.filter(ImageFilter.BoxBlur(1))
imgFilter.save('imgBlur1.jpg')
imgFilter = img_menor.filter(ImageFilter.BoxBlur(2))
imgFilter.save('imgBlur2.jpg')
imgFilter = img_menor.filter(ImageFilter.BoxBlur(5))
imgFilter.save('imgBlur5.jpg')
Conclusões
Nesse post, apresentamos um pouco sobre a biblioteca Pillow. Ela é extremamente usada em técnicas de inteligência artificial e deep learning, principalmente em aplicações com imagens como reconhecimento facial e localizações de objetos. Para saber mais, consulte a documentação oficial.