Convierta cualquier imagen en un boceto usando Python

Convierta cualquier imagen en un boceto usando Python

Hacer un hermoso boceto requiere mucho tiempo y esfuerzo. Afortunadamente, la programación ha evolucionado, por lo que ahora puede transformar fácilmente las imágenes y crear hermosos diseños. Una técnica impresionante que puede llevar a cabo es convertir una imagen en un boceto digital.

Si bien un boceto mecánico no se verá exactamente como su propio dibujo a lápiz, vale la pena experimentar con el resultado. Aprenda a programar una aplicación de este tipo utilizando el módulo OpenCV en el lenguaje Python súper amigable.

El Módulo OpenCV

OpenCV es una biblioteca de código abierto desarrollada y mantenida por Intel de métodos de visión artificial utilizados para el procesamiento de imágenes y la visión artificial. Hace que sea sencillo para los usuarios crear aplicaciones optimizadas, interactuar con imágenes y videos en tiempo real y seleccionar el algoritmo ideal para sus necesidades.

Algunas de las aplicaciones populares de OpenCV incluyen detección de rostros, seguimiento automático de rostros en cinematografía, filtros de redes sociales, reconocimiento de matrículas de automóviles y monitoreo de CCTV. Para usar el módulo OpenCV en Python, abra su terminal y escriba el siguiente comando:

pip install opencv-python

Cómo convertir cualquier imagen en un boceto usando Python

Para convertir su imagen favorita en un boceto digital, comience colocándola en la misma carpeta que un nuevo programa de Python, para facilitar la referencia. Luego comience a construir su programa siguiendo los siguientes pasos.

El primer paso es importar el módulo OpenCV a su entorno. Una vez que OpenCV está disponible, puede usar su funcionalidad para realizar varias tareas. Pase la ruta de su archivo de imagen a la función imread() para cargarlo. Almacene su imagen en una variable, llamada image1 aquí, para futuras referencias.

Almacene el título de la ventana en una variable llamada window_name . Esto será útil cuando elija mostrar la imagen usando la función imshow() . Esta función requiere dos parámetros: el título y la imagen que desea mostrar.

import cv2

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

Una vez que tenga la imagen deseada, debe realizar cinco operaciones para transformarla en un boceto. Primero, convierta la imagen en color a escala de grises. Puede hacerlo con la función cvtColor() . Esta función toma la imagen cuyos colores desea modificar y un código de conversión como COLOR_BGR2GRAY .

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

Una vez que tenga una imagen en escala de grises, invierta sus colores. En este punto, debe comprender cómo una computadora forma una imagen. Una imagen consta de muchos píxeles diminutos con diferentes intensidades. En una imagen en color, cada píxel contiene componentes rojo, verde y azul, cada uno con una intensidad que varía de 0 a 255.

En una imagen en escala de grises, solo hay sombras de gris, por lo que la intensidad de un píxel varía entre 0 y 1. Para invertir las intensidades de píxel de esta imagen, pase la imagen en escala de grises a la función bitwise_not() .

Como sugiere el nombre, esta función invierte el valor de cada píxel a su equivalente complementario. Todos los píxeles que son mayores que 0 se establecen en 0 y todos los píxeles que son iguales a 0 se establecen en 255.

invert = cv2.bitwise_not(grey_img)

Después de invertir las intensidades de los píxeles, puede suavizar la imagen con la ayuda de Gaussian Blur. El proceso de desenfoque gaussiano utiliza un filtro gaussiano. Un filtro gaussiano es un filtro de paso bajo que solo permite el paso de frecuencias bajas, eliminando el componente de alta frecuencia de una señal o una imagen.

La función GaussianBlur() de OpenCV acepta cuatro parámetros. Estos son un objeto de matriz que actúa como la imagen de origen, el tamaño k (tamaño del núcleo) y sigmaX (la desviación estándar del núcleo gaussiano).

Suponga que tiene una fotografía física en la mano. Si quisieras difuminarlo, podrías aplicar pedazos de cera o papel pergamino sobre él. Puedes imaginar el núcleo como este trozo de papel transparente. Digitalmente, esto sucede un poco diferente. Para desenfocar, enfocar y aplicar otros efectos en una imagen digital, multiplica una matriz con la intensidad de los píxeles de la imagen.

El tamaño k es siempre un número impar positivo. A medida que aumenta el tamaño del kernel, aumenta el desenfoque. Para comprender sigmaX, suponga que está aplicando cera sobre un papel. A medida que aplica cera, el papel se vuelve uniformemente translúcido. De manera similar, debe mantener los valores del kernel cerca de un punto específico (el promedio). El valor sigmaX define la diferencia entre el promedio y otros valores de los píxeles en una imagen.

Pase la imagen invertida, el tamaño del núcleo como (21, 21) y 0 desviación estándar a la función Desenfoque gaussiano:

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

Pase la imagen borrosa a la función bitwise_not() nuevamente para invertirla:

invertedblur = cv2.bitwise_not(blur)

Finalmente, use la función divide() y realice la división por elemento de la matriz de imágenes en escala de grises y la matriz de imágenes borrosas invertidas con una escala de 256.

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

Esencialmente, la función realiza la siguiente operación:

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

Almacene el resultado en una variable llamada sketch. Para guardar la imagen final, pase un nombre para su archivo de salida y la imagen del boceto a la función imwrite() . Para verificarlo, puede usar la función imread() para cargar la imagen de boceto guardada, dar un título a la ventana y mostrarla usando la función imshow().

Use la función waitkey() pasando 0 para mostrar la ventana de la imagen original y la ventana de boceto generada hasta que presione cualquier 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 el código y tendrá su programa listo.

Resultado de muestra de convertir una imagen en un boceto usando este programa de Python

Puede elegir una hermosa imagen de paisaje y ejecutarla a través del programa para generar este impresionante boceto digital.

Imagen para dibujar la casa con el lago

En una imagen de retrato, el programa genera el siguiente boceto digital.

Imagen para Sketch Man

Puede experimentar con los parámetros de la función según su gusto para generar su boceto digital deseado.

Procesamiento de Imágenes y Visión por Computador

El procesamiento de imágenes y la visión artificial son dos campos tecnológicos estrechamente relacionados. Ambos involucran la alteración de imágenes digitales para obtener los resultados deseados. El procesamiento de imágenes se enfoca en mejorar una imagen, mientras que la visión por computadora busca patrones y objetos dentro de una imagen para comprenderla.

Scikit-image es otra biblioteca de Python que proporciona una amplia variedad de funciones de procesamiento de imágenes. Tiene varios módulos precompilados, filtros, capas, transformaciones y más. Si está buscando un módulo para usar con modelos de aprendizaje profundo como CNN y RNN, es posible que desee explorar Torchvision.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *