Cómo convertir cualquier imagen en un dibujo a lápiz con 10 líneas de código

Utilice la visión por computadora básica y la biblioteca Numpy de Python

Siempre me ha fascinado la visión por ordenador y, sobre todo, su poder para manipular imágenes.

Una imagen es básicamente una matriz de números para Python. Entonces podemos realizar una variedad de manipulaciones de matrices para obtener resultados muy interesantes. En esta publicación, hablo sobre cómo reducir una imagen a un contorno de 'lápiz'.

Los pasos

El proceso es bastante simple:

  1. Escala de grises la imagen
  2. Invertirlo
  3. Difuminar la imagen invertida
  4. Esquivar mezcla la imagen borrosa y en escala de grises.

Podemos elegir cualquier imagen de Internet. Iré con esta imagen del jugador de críquet indio Virat Kohli:

1. Cargar imagen

import imageioimg="//static.cricinfo.com/db/PICTURES/CMS/263600/263697.20.jpg"start_img = imageio.imread(img)

Puedes ver cómo Python ve esta imagen con el shapeatributo:

start_img.shape(196, 160, 30)

Así que esta es una imagen de tres canales de tamaño 196x160.

2. Escala de grises

Luego hacemos la imagen en blanco y negro.

Numpy no tiene ninguna función incorporada para la escala de grises, pero podemos convertir fácilmente la imagen usando la fórmula. Puede aprender por qué esta fórmula funciona aquí.

Y= 0.299 R + 0.587 G + 0.114 B

Entonces nuestra función se verá así:

import numpy as npdef grayscale(rgb): return np.dot(rgb[...,:3], [0.299, 0.587, 0.114])

Aplicar escala de grises:

gray_img = grayscale(start_img)

3. Invertir imagen

Podemos invertir imágenes simplemente restando de 255, ya que las imágenes en escala de grises son imágenes de 8 bits o tienen un máximo de 256 tonos.

inverted_img = 255-gray_img

4. Imagen borrosa

Ahora difuminamos la imagen invertida. El desenfoque se realiza aplicando un filtro gaussiano a la imagen invertida. La clave aquí es la varianza de la función gaussiana o sigma.

A medida que aumenta sigma, la imagen se vuelve más borrosa. Sigma controla el alcance de la variación y, por tanto, el grado de desenfoque.

import scipy.ndimageblur_img = scipy.ndimage.filters.gaussian_filter(inverted_img,sigma=5)

5. Esquivar y fusionar

El modo de fusión Color Dodge divide la capa inferior por la capa superior invertida. Esto aclara la capa inferior según el valor de la capa superior. Tenemos la imagen borrosa, que resalta los bordes más atrevidos.

Como todas nuestras imágenes se leen con Numpy, todos los cálculos matriciales son súper rápidos.

def dodge(front,back): result=front*255/(255-back) result[result>255]=255 result[back==255]=255 return result.astype(‘uint8’)
final_img= dodge(blur_img,gray_img)

¡Y eso es!

6. Trazar y guardar

Podemos trazar nuestra imagen final usando plt.imgshow. Tenga en cuenta que debemos mantener el cmapargumento igual a “gray”.

import matplotlib.pyplot as pltplt.imshow(final_img, cmap=”gray”)

Podemos guardar la imagen usando:

plt.imsave(‘img2.png’, final_img, cmap=’gray’, vmin=0, vmax=255)

Resultado final

Todo el código en acción

Aquí no tenemos mucho espacio para jugar, excepto con el parámetro sigma mientras desenfocamos.

A medida que aumenta sigma, la imagen se vuelve más clara, pero el tiempo de ejecución también aumenta. Entonces, una sigma de 5 funciona bien para nosotros.

Código condensado:

Prometí 10 líneas o menos, así que aquí tienes:

Como siempre, puede encontrar el código detallado completo en mi GitHub.

PD: así es como creé mi DP medio. Si te gusta este blog, muestra algunos ❤️ :)

Además, no soy dueño de esta imagen de Virat. ¡Espero que no le importe!