Computer Vision como usted sabe (o incluso si no lo sabe) es una herramienta muy poderosa con inmensas posibilidades. Entonces, cuando me dispuse a preparar un cómic de la vida universitaria de un amigo, pronto me di cuenta de que necesitaba algo que redujera mis esfuerzos de pintarlo pero que mantuviera la calidad y se me ocurrió la siguiente solución.
Primero veamos el resultado:
Imagen original
Versión de dibujos animados
Bordes obtenidos de la imagen (resultado del Umbral adaptativo)
Veamos el código:
class Cartoonizer: """Cartoonizer effect A class that applies a cartoon effect to an image. The class uses a bilateral filter and adaptive thresholding to create a cartoon effect. """ def __init__(self): pass def render(self, img_rgb): img_rgb = cv2.imread(img_rgb) img_rgb = cv2.resize(img_rgb, (1366,768)) numDownSamples = 2 # number of downscaling steps numBilateralFilters = 50 # number of bilateral filtering steps # -- STEP 1 -- # downsample image using Gaussian pyramid img_color = img_rgb for _ in range(numDownSamples): img_color = cv2.pyrDown(img_color) #cv2.imshow("downcolor",img_color) #cv2.waitKey(0) # repeatedly apply small bilateral filter instead of applying # one large filter for _ in range(numBilateralFilters): img_color = cv2.bilateralFilter(img_color, 9, 9, 7) #cv2.imshow("bilateral filter",img_color) #cv2.waitKey(0) # upsample image to original size for _ in range(numDownSamples): img_color = cv2.pyrUp(img_color) #cv2.imshow("upscaling",img_color) #cv2.waitKey(0) # -- STEPS 2 and 3 -- # convert to grayscale and apply median blur img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY) img_blur = cv2.medianBlur(img_gray, 3) #cv2.imshow("grayscale+median blur",img_color) #cv2.waitKey(0) # -- STEP 4 -- # detect and enhance edges img_edge = cv2.adaptiveThreshold(img_blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 2) #cv2.imshow("edge",img_edge) #cv2.waitKey(0) # -- STEP 5 -- # convert back to color so that it can be bit-ANDed with color image (x,y,z) = img_color.shape img_edge = cv2.resize(img_edge,(y,x)) img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2RGB) cv2.imwrite("edge.png",img_edge) #cv2.imshow("step 5", img_edge) #cv2.waitKey(0) #img_edge = cv2.resize(img_edge,(i for i in img_color.shape[:2])) #print img_edge.shape, img_color.shape return cv2.bitwise_and(img_color, img_edge) tmp_canvas = Cartoonizer() file_name = "Screenshot.png" #File_name will come here res = tmp_canvas.render(file_name) cv2.imwrite("Cartoon version.jpg", res) cv2.imshow("Cartoon version", res) cv2.waitKey(0) cv2.destroyAllWindows()
Explicación:
Básicamente, vamos a utilizar una serie de filtros y conversiones de imágenes.
- Primero, reducimos la escala de la imagen y luego aplicamos un filtro bilateral para obtener un sabor de dibujos animados. Luego, nuevamente aumentamos la imagen.
- El siguiente paso es obtener una versión borrosa de la imagen original. Ahora, no queremos que los colores interfieran en este proceso. Solo queremos que se difuminen los límites. Para esto, primero convertimos la imagen a escala de grises y luego aplicamos el filtro de desenfoque de medios.
- El siguiente paso es identificar los bordes de la imagen y luego agregar esto a las imágenes modificadas previamente para obtener un efecto de pluma de boceto. Para esto primero estamos usando un umbral adaptativo. También puede experimentar con otros tipos de técnicas de umbral. Porque Computer Vision se trata de experimentar. En el paso 5, compilamos las imágenes finales obtenidas de los pasos anteriores.
Implementación más simple –
# importing libraries import cv2 import numpy as np # reading image img = cv2.imread("koala.jpeg") # Edges gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray = cv2.medianBlur(gray, 5) edges = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 9) # Cartoonization color = cv2.bilateralFilter(img, 9, 250, 250) cartoon = cv2.bitwise_and(color, color, mask=edges) cv2.imshow("Image", img) cv2.imshow("edges", edges) cv2.imshow("Cartoon", cartoon) cv2.waitKey(0) cv2.destroyAllWindows()
¿Lo que puedes hacer?
¡Experimento! Intente cambiar los pasos de muestra hacia abajo, o la cantidad de filtros bilaterales aplicados, o incluso el tamaño del filtro, o la técnica de umbral para obtener los bordes. Ahora, una cosa a tener en cuenta. Este proceso es general y no dará el mejor resultado para diferentes imágenes. Por eso, debe experimentar con diferentes valores para tener una idea de todo el proceso.
¡Eso es todo por mi parte! ¡Auf Wiedersehen!
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA