Edite imagens com Jupyter e Python
Quem precisa aprender um aplicativo de edição de imagens quando você pode fazer o trabalho com ferramentas de código aberto que já conhece?
Recentemente, meu filho quis fazer uma página para colorir de um desenho animado favorito. Meu primeiro pensamento foi usar um dos programas de código aberto do Linux que manipula imagens, mas depois lembrei que não tenho ideia de como usar nenhum deles. Felizmente, sei usar Jupyter e Python.
Quão difícil pode ser, pensei, usar o Jupyter para isso?
Para acompanhar, você precisa ter uma versão moderna do Python (se for usuário do macOS, siga este guia), instalar e abrir o Jupyter Labs, sobre o qual você pode aprender mais aqui, e Pillow, um fork amigável da Python Imaging Library (PIL), com:
$ python -V
Python 3.8.5
$ pip install jupyterlab pillow
# Installation process ommitted
$ jupyter lab
Imagine que você queira fazer uma página para colorir com a imagem de um cervo. O primeiro passo provavelmente é baixar a imagem de um cervo e salvá-la localmente. Cuidado com imagens com status de direitos autorais duvidosos; é melhor usar algo com Creative Commons ou outra licença de acesso aberto. Para este exemplo, usei uma imagem licenciada abertamente do Unsplash e a chamei de deer.jpg
.
Quando estiver no Jupyter Lab, comece importando PIL
:
from PIL import Image
Com essas preliminares resolvidas, abra a imagem e observe o tamanho da imagem:
pic = Image.open("deer.jpg")
pic.size
(3561, 5342)
Uau, isso é um pouco chocante - fotos de alta resolução são boas se você quiser fazer um livro encantador sobre veados, mas provavelmente é grande demais para uma página de livro de colorir caseiro. Reduza muuuuito. (Essa gentileza é importante para que este artigo carregue rápido no seu navegador também!)
x, y = pic.size
x //= 10
y //= 10
smaller = pic.resize((x, y))
Isso reduziu a escala da imagem em 10. Veja como fica:
smaller
(Moshe Zadka, CC BY-SA 4.0)
Lindo! Majestoso e remoto, este cervo deve ser fácil para um algoritmo de detecção de bordas. Falando nisso, sim, esse é o próximo passo. Você deseja limpar a imagem para que a coloração seja muito fácil e, felizmente, existe um algoritmo para isso. Faça alguma detecção de borda:
from PIL import ImageFilter
edges = smaller.filter(ImageFilter.FIND_EDGES)
edges
(Moshe Zadka, CC BY-SA 4.0)
Este é provavelmente o passo mais importante. Remove todos os detalhes estranhos e deixa linhas claras. A cor é um pouco estranha, mas não é um problema difícil de resolver. Divida a imagem em faixas de cores e escolha aquela onde as linhas são mais nítidas:
bands = edges.split()
bands[0]
(Moshe Zadka, CC BY-SA 4.0)
As linhas estão claras agora, mas esta não é uma boa imagem para imprimir porque sua impressora ficará sem tinta e seu filho não ficará feliz em colorir preto. Então inverta as cores. Enquanto você faz isso, ajuste as cores para max-black ou max-white para deixar as linhas ainda mais nítidas usando uma chamada de função lambda:
outline = bands[0].point(lambda x: 255 if x<100 else 0)
outline
(Moshe Zadka, CC BY-SA 4.0)
A imagem original tinha muita natureza que eu limpei impiedosamente. Agora há muito espaço vazio, então corte a imagem no essencial:
outline.crop((10, 200, 300, 400))
(Moshe Zadka, CC BY-SA 4.0)
Só falta salvar a imagem como algo fácil de imprimir, como um PDF:
outline.save("deer.pdf")
Vou deixar você descobrir como imprimir no Linux.
Divirta-se fazendo livros de colorir caseiros para seus filhos!