Blog

Postado em em 24 de dezembro de 2022

Tratamento de Imagens com Python – Transformando Foto em Desenho

Você sabe fazer tratamento de imagens com Python? Aprenda agora! É fácil e fica pronto com poucas linhas de código!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo ou acesse o nosso canal do YouTube!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Fala Impressionadores! Na aula de hoje quero te mostrar como transformar foto em desenho com Python, tipo aqueles filtros que você tem nas redes sociais ou até mesmo nos programas da Microsoft.

E aí, bora aprender como tratar imagens com Python?

Nós vamos fazer essa manipulação de imagens com Python utilizando a biblioteca OpenCV.

Então eu vou te mostrar qual a função do OpenCV e o que é possível fazer com OpenCV.

Além disso, vou te ensinar como mostrar imagem no Python com essa biblioteca e como editar várias imagens simultaneamente, caso você queira aplicar esse tratamento em mais de uma imagem.

Assim você não vai precisar ficar inserindo as imagens de forma manual!

Vamos começar?

A primeira coisa a fazer é baixar a biblioteca OpenCV.

Para isso você vai rodar no seu terminal (local onde você instala as bibliotecas):

>pip install opencv-python

Na hora de importar vamos importar como cv2:

cv2
cv2

Qual a lógica do OpenCV?

O OpenCV nos permite manipular as imagens de uma forma muito eficiente, o que esta biblioteca faz basicamente é fragmentar uma imagem em seu menor elemento (pixel) e para cada pixel ela atribui um número.

Cada píxel tem uma cor, sabemos que todas as cores podem ser formadas por uma mistura de azul, verde e vermelho e chamamos essa propriedade de padrão RGB.

O OpenCV usa este padrão só que na ordem BGR, isso significa que nossa imagem vai resultar em três números que representam a quantidade de azul, verde e vermelho encontrados nela, exemplo:

(255, 0 , 255) Cada cor pode ir de 0 a 255.

Passo a passo para construir o código:

A primeira coisa que vamos fazer é transformar os pixels em preto e branco.

As imagens de desenho no Python resultam em preto e branco e os programas de tratamento funcionam melhor em imagens em preto e branco também.

Vamos importar a imagem da nossa pasta e rodar um código para visualizar:

Trazer imagem
Trazer imagem
  • A linha verde do código é responsável por trazer da pasta a imagem.
  • Para visualizarmos a imagem no programa usamos a linha de código laranja.
  • A parte em azul é um complemento que deve ser utilizado no código cv2.imshow, sem este complemento vamos gerar um loop infinito.
Tratamento de Imagens com Python
Foto padrão

Perfeito, o primeiro passo de importar a imagem já foi feito, agora vamos transformar a imagem em preto e branco.

Função → Cv2.cvtColor():

Vamos criar uma variável para a imagem em preto e branco e utilizar a função cvtColor() para converter a cor.

Dentro dos parênteses da função vamos passar a imagem e qual conversão queremos fazer.

O OpenCV possui na sua lista uma série de conversões possíveis, vamos usar o padrão que é COLOR_BGR2GRAY.

imagem_pb
imagem_pb
Tratamento de Imagens com Python
imagem_pb

Agora para aplicar o estilo de desenho nesta imagem vamos ter que Criar o que chamamos de máscara.

Essencialmente nós vamos precisar inverter as cores desta imagem criando uma imagem invertida, tudo que é preto vamos transformar em branco e vice-versa.

Nosso objetivo com isso é conseguir os contornos da imagem.

Imagem invertida:

Função – cv2.bitwise_not():

Vamos usar esta função para inverter as cores.

imagem invertida
imagem invertida
Tratamento de Imagens com Python
imagem invertida

Feito isso já podemos transformar a imagem em desenho.

Função → cv2.GaussianBlur():

Vamos aplicar a função GaussianBlur() no código e fazer alguns testes para ajustar a imagem do desenho criado.

GaussianBlur()
GaussianBlur()

Este código funciona quase como um filtro, podemos enxergá-lo assim, para funcionar precisamos inserir 3 informações:

  • Imagem que vamos aplicar
  • Uma tupla → indica a quantidade de filtro que vamos aplicar, vamos inserir duas informações (kernel_size, kernel_size), representam uma largura e uma altura de kernel, geralmente os dois valores são iguais. Os números devem ser sempre positivos e ímpares!
  • Desvio padrão (terceiro argumento = 0).

Para deixar nosso código mais visual vamos trocar os nomes kernel_size por imagem_invertida e criar uma variável onde vamos atribuir o valor do tamanho (size):

→ qtde_filtro = 15

filtro
filtro

Aplicando o desenho com 15 de filtro, a imagem já aparece um pouco mais embaçada:

filtro 15
filtro 15

Aplicando 1515:

filtro 1515
filtro 1515

O valor 1515 é muito alto, ficou tão borrado que não conseguimos mais enxergar a imagem.

Aplicando 55:

Tratamento de Imagens com Python
filtro 55

Vamos seguir com o valor de 15, podemos ajustar depois se for necessário.

Agora só precisamos inverter a imagem como fizemos anteriormente criando outra variável → imagem_blur_invertida.

Estamos com a imagem branco e preto vamos passar para preto e branco.

imagem_blur_invertida
imagem_blur_invertida
imagem
imagem

Atenção! Uma dica importante, o famoso pulo do gato!

Estamos trabalhando com tratamento de imagem, se pegarmos nossa imagem preta a branca original → imagem_pb e dividir ela pela imagem_blur_invertida, vamos ter um resultado de uma imagem com o filtro de Blur aplicado nela.

O resultado deste cálculo será a nossa imagem_desenho.

Função – cv2.divide():

divide
divide

Após fazer este tratamento temos que tomar um cuidado, lembra que cada cor pode ir de 0 a 255?

0 = preto

255 = branco

Quando dividimos imagens parecidas uma pela outra, podemos supor que as quantidades de pixels de cada uma também são parecidas, ou seja, dessa divisão vai resultar um valor que provavelmente está entre 0 e 1.

O valor dos pixels serão similares com uma variação pequena entre eles, 0,5, 0,6, 0,8…

Esta proximidade vai gerar um borrão preto e podemos não ver a imagem.

Para resolver este problema vamos ter que colocar uma multiplicação no código → scale.

Scale = 256.0

Ou seja, vamos pegar o resultado da divisão e multiplicá-lo por 256, dessa forma ao invés da escala ficar entre 0 e 1 vai ficar de 0 a 255 que é a escala padrão.

Tratamento de Imagens com Python
scale

Filtro 95

Tratamento de Imagens com Python
filtro 95

Perfeito! Conseguimos nosso resultado!

Ainda podemos alterar o código para que ele altere várias imagens, agora está alterando apenas uma por vez.

Passo a passo:

  • Vamos criar uma pasta e salvar nesta pasta todas as imagens de uma vez, depois, vamos fazer com que o código leia todo o conteúdo da pasta.
  • Para isso vamos precisar colocar o código todo em uma função → def transformar_desenho()
  • Esta função precisa receber como parâmetro o arquivo e a quantidade de filtro que vamos usar.
  • Vamos substituir o nome da foto pela variável arquivo e colocá-la entre chaves {}
  • A variável que criamos para o filtro vamos excluir do corpo do código porque esta informação já está sendo passada no argumento da função.
  • Agora ao invés de exibir a imagem vamos salvar a imagem na em uma pasta.

Função – imwrite():

Esta função salva as nossas imagens na pasta que criamos → img_tratado.

Para esta função funcionar temos que inserir o nome da pasta que criamos img_tratado, a variável arquivo entre chaves e a variável onde queremos salvar as imagens → imagem_desenho

Tratamento de Imagens com Python
imagem_desenho
filtro 95
filtro 95

Agora vamos fazer com que a função rode para várias imagens.

Para isso vamos importar a biblioteca os, pois ela permite ler as pastas onde as imagens estão salvas.

Função – os.listdir():

Vamos usar a função listdir() para criar uma lista de arquivos com a variável imagens.

Utilizando a estrutura de repetição For:

Usando o for vamos ler o nome do arquivo, aplicar o filtro e rodar o código para todas as imagens da pasta.

Resultado:

Tratamento de Imagens com Python
Resultado

Agora podemos passar para o formato de desenho quantas imagens salvarmos na nossa pasta!

Terminamos o nosso desafio → Tratamento de Imagens com Python!

O nosso último desafio foi construir um código para mesclar PDFs em Python. Clique no link para saber mais!

Conclusão – Tratamento de Imagens com Python

Você já teve que transformar e tratar imagens? Hoje nós transformamos fotos em desenhos no Python!

O objetivo desta aula foi resolver este desafio, transformar imagens em desenho e fazer com que o código rode para várias imagens. Tudo isso com poucas linhas de código!

Aprenda este passo a passo e faça seu próprio código em Python!

Espero que tenham gostado da aula! Abraço,

Hashtag Treinamentos

Para acessar outras publicações de Python, clique aqui!


Quer aprender mais sobre Python com um minicurso básico gratuito?

Quer ter acesso a um Minicurso de Finanças no Excel de forma 100% gratuita? Preencha seu e-mail abaixo!