Converta qualquer imagem em um esboço usando Python

Converta qualquer imagem em um esboço usando Python

Fazer um belo esboço requer muito tempo e esforço. Felizmente, a programação evoluiu para que agora você possa facilmente transformar imagens e criar belos designs. Uma técnica impressionante que você pode realizar é converter uma imagem em um esboço digital.

Embora um esboço mecânico não pareça exatamente com o seu próprio desenho a lápis, vale a pena experimentar a saída. Aprenda a programar um aplicativo desses usando o módulo OpenCV na super amigável linguagem Python.

O Módulo OpenCV

OpenCV é uma biblioteca de código aberto desenvolvida e mantida pela Intel de métodos de visão computacional usados ​​para processamento de imagem e visão computacional. Ele torna simples para os usuários criar aplicativos otimizados, interagir com imagens e vídeos em tempo real e selecionar o algoritmo ideal para suas necessidades.

Algumas das aplicações populares do OpenCV incluem detecção de rosto, rastreamento automático de rosto em cinematografia, filtros de mídia social, reconhecimento de placas de carros e monitoramento CCTV. Para usar o módulo OpenCV em Python, abra seu terminal e digite o seguinte comando:

pip install opencv-python

Como converter qualquer imagem em um esboço usando Python

Para converter sua imagem favorita em um esboço digital, comece colocando-a na mesma pasta que um novo programa Python, para fácil referência. Em seguida, comece a criar seu programa usando as etapas a seguir.

O primeiro passo é importar o módulo OpenCV para o seu ambiente. Assim que o OpenCV estiver disponível, você poderá usar sua funcionalidade para realizar várias tarefas. Passe o caminho do seu arquivo de imagem para a função imread() para carregá-lo. Armazene sua imagem em uma variável – chamada image1 aqui – para referência futura.

Armazene o título da janela em uma variável chamada window_name . Isso será útil quando você optar por exibir a imagem usando a função imshow() . Esta função requer dois parâmetros: o título e a imagem que você deseja exibir.

import cv2

image1 = cv2.imread('image.jpg')
window_name = 'Actual image'
cv2.imshow(window_name, image1)

Depois de obter a imagem desejada, você precisa realizar cinco operações para transformá-la em um esboço. Primeiro, converta a imagem colorida em tons de cinza. Você pode fazer isso com a função cvtColor() . Essa função recebe a imagem cujas cores você deseja alterar e um código de conversão como COLOR_BGR2GRAY .

grey_img = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)

Depois de obter uma imagem em tons de cinza, inverta suas cores. Neste ponto, você precisa entender como um computador forma uma imagem. Uma imagem consiste em muitos pixels minúsculos com intensidades variadas. Em uma imagem colorida, cada pixel contém componentes vermelho, verde e azul, cada um com uma intensidade que varia de 0 a 255.

Em uma imagem em tons de cinza, existem apenas tons de cinza, portanto a intensidade de um pixel varia entre 0 e 1. Para inverter as intensidades de pixel dessa imagem, passe a imagem em tons de cinza para a função bitwise_not() .

Como o nome sugere, esta função inverte o valor de cada pixel em seu equivalente complementar. Todos os pixels maiores que 0 são definidos como 0 e todos os pixels iguais a 0 são definidos como 255.

invert = cv2.bitwise_not(grey_img)

Depois de inverter as intensidades dos pixels, você pode suavizar a imagem com a ajuda do Gaussian Blur. O processo Gaussian Blur faz uso de um filtro gaussiano. Um filtro gaussiano é um filtro passa-baixo que permite apenas a passagem de baixas frequências, removendo o componente de alta frequência de um sinal ou imagem.

A função GaussianBlur() do OpenCV aceita quatro parâmetros. Estes são um objeto de matriz que atua como a imagem de origem, o ksize (tamanho do kernel) e sigmaX (o desvio padrão do kernel gaussiano).

Suponha que você tenha uma fotografia física em suas mãos. Se você quiser borrá-lo, pode aplicar pedaços de papel manteiga ou pergaminho sobre ele. Você pode imaginar o kernel como este pedaço de papel transparente. Digitalmente, isso acontece um pouco diferente. Para desfocar, aumentar a nitidez e aplicar outros efeitos em uma imagem digital, multiplique uma matriz pela intensidade dos pixels da imagem.

O ksize é sempre um número ímpar positivo. Conforme você aumenta o tamanho do kernel, o desfoque aumenta. Para entender o sigmaX, suponha que você esteja aplicando cera em um papel. À medida que você aplica cera, o papel fica uniformemente translúcido. Da mesma forma, você deve manter os valores do kernel próximos a um ponto específico (a média). O valor sigmaX define a diferença entre a média e outros valores dos pixels em uma imagem.

Passe a imagem invertida, o tamanho do kernel como (21, 21) e 0 desvio padrão para a função Gaussian Blur:

blur = cv2.GaussianBlur(invert, (21, 21), 0)

Passe a imagem desfocada para a função bitwise_not() novamente para invertê-la:

invertedblur = cv2.bitwise_not(blur)

Por fim, use a função divide() e execute a divisão por elemento da matriz de imagem em tons de cinza e a matriz de imagem desfocada invertida com uma escala de 256.

sketch = cv2.divide(grey_img, invertedblur, scale=256.0)

Essencialmente, a função executa a seguinte operação:

def divide(grey_img, b, invertedblur=256.0):
    return (grey_img * scale) / invertedblur

Armazene o resultado em uma variável chamada sketch. Para salvar a imagem final, passe um nome para o arquivo de saída e a imagem do esboço para a função imwrite() . Para verificar isso, você pode usar a função imread() para carregar a imagem de esboço salva, dar um título à janela e exibi-la usando a função imshow().

Use a função waitkey() passando 0 para exibir a janela da imagem original e a janela do esboço gerado até que você pressione qualquer tecla.

cv2.imwrite("sketch.jpeg", sketch)
image = cv2.imread("sketch.jpeg")
window_name ='Sketch image'
cv2.imshow(window_name, image)
cv2.waitKey(0)

Reúna todo o código e você terá seu programa pronto.

Saída de amostra da conversão de uma imagem em um esboço usando este programa Python

Você pode escolher uma bela imagem de paisagem e executá-la no programa para gerar esse impressionante esboço digital.

Imagem para esboçar casa com lago

Em uma imagem de retrato, o programa gera o seguinte esboço digital.

Imagem para Sketch Man

Você pode experimentar os parâmetros da função de acordo com sua preferência para gerar o esboço digital desejado.

Processamento de Imagens e Visão Computacional

Processamento de imagem e visão computacional são dois campos da tecnologia intimamente relacionados. Ambos envolvem a alteração de imagens digitais para obter os resultados desejados. O processamento de imagem se concentra em melhorar uma imagem, enquanto a visão computacional procura encontrar padrões e objetos dentro de uma imagem para entendê-la.

Scikit-image é outra biblioteca Python que fornece uma ampla variedade de funções de processamento de imagem. Possui vários módulos pré-compilados, filtros, camadas, transformações e muito mais. Se você está procurando um módulo para usar em modelos de aprendizado profundo, como CNN e RNN, talvez queira explorar o Torchvision.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *