¡Usa Python para hacer una gran cantidad de bocetos de señoritas!

El boceto como técnica de expresión casi perfecta tiene su propio encanto único. Con el desarrollo de la tecnología digital, el boceto ya no es la patente de los pintores profesionales. Hoy, este artículo hablará sobre cómo usar Python para obtener el boceto de Miss Sister en lotes. retrato. El artículo se divide en dos partes:

  • La primera parte presenta dos ideas para usar Python para generar bocetos.

  • La segunda parte presenta cómo obtener bocetos en lotes.

 

1

 

Dos ideas para obtener croquis

 

Las dos ideas presentadas en esta sección se basan en opencv y no involucran contenido relacionado con el aprendizaje profundo. La idea básica es leer en un mapa fotográfico y transformarlo en un croquis mediante diversas transformaciones. Para la conveniencia de la demostración, busquemos primero una foto de la joven como material experimental.

 

1) estilo cómico

Primero, hablaré sobre el primer método. La idea central de este método es utilizar una técnica llamada "umbral", que se basa en la diferencia de escala de grises entre el objeto y el fondo de la imagen, y la segmentación a nivel de píxeles .

Si desea convertir una imagen en un boceto que solo presenta blanco y negro, debe realizar una operación de binarización en él. Opencv proporciona dos métodos de operación de binarización: umbral () y adaptiveThreshold (). En comparación con el umbral (), adaptiveThreshold () puede ajustarse automáticamente localmente de acuerdo con la distribución de brillo de diferentes áreas de la imagen, por lo que se denomina binarización adaptativa. La siguiente imagen es el efecto de binarizar la imagen en color.

Los conceptos mencionados anteriormente pueden ser bastante oscuros y no importa si no los comprende. Centrémonos en cómo realizar la operación real.

El primer paso es leer la imagen y convertirla a escala de grises. Este paso se considera una operación de rutina.Creo que los estudiantes que han usado opencv han escrito códigos similares.

img_rgb = cv2.imread(src_image)
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)

El segundo paso es utilizar el método adaptiveThreshold () para binarizar la imagen. Los parámetros de la función se utilizan principalmente para establecer el algoritmo y el umbral de binarización adaptativa.

img_edge = cv2.adaptiveThreshold(img_gray, 255,
                                 cv2.ADAPTIVE_THRESH_MEAN_C,
                                 cv2.THRESH_BINARY, blockSize=3, C=2)

El tercer paso es guardar la imagen convertida

cv2.imwrite(dst_image, img_edge)

Después de los pasos anteriores, obtuvimos una nueva imagen en blanco y negro, echemos un vistazo al efecto de imagen convertida.

A juzgar por la imagen convertida, aunque no hay ningún problema con el contorno, el efecto es muy insatisfactorio y no puede llamarse boceto. Esto se debe principalmente a que adaptiveThreshold () realizará una operación de binarización en cada área local pequeña de la imagen. Por lo tanto, para algunas imágenes con una definición más alta y una distinción de color más fina, aparecerá la situación densa anterior.

Este problema es realmente muy simple de resolver, solo agregue la siguiente línea de código para desenfocar la imagen original antes de la binarización.

img_gray = cv2.medianBlur(img_gray, 5)

Echemos un vistazo al croquis (abajo) generado esta vez. ¿Parece más cómodo y tiene una sensación de cómic dibujado a mano?

 

2) estilo realista

A través del método anterior, aunque finalmente se obtiene un boceto bastante bueno, parece algo "distorsionado", para obtener un boceto más realista, probamos otro método.

La idea central de este método es obtener algunas de las líneas más importantes de la imagen original mediante la "fusión de película". Los pasos específicos de implementación son los siguientes:

El primer paso es el mismo que el método anterior, usando opencv para leer la imagen y generar una imagen en escala de grises.

El segundo paso es desenfocar la imagen en escala de grises. Después de experimentar, usando la función de filtro mediano cv2.medianBlur () mencionada anteriormente para la operación de desenfoque, el efecto de boceto final no es bueno. Aquí intentamos usar el filtro Gaussiano para desenfocar la imagen. El código es el siguiente:

img_blur = cv2.GaussianBlur(img_gray, ksize=(21, 21),
                            sigmaX=0, sigmaY=0)

Entre ellos, el parámetro ksize representa el tamaño del kernel gaussiano, y sigmaX y sigmaY representan la desviación estándar del kernel gaussiano en las direcciones X e Y, respectivamente.

El tercer paso es utilizar el método cv2.divide () para fusionar la imagen original y la imagen borrosa. En esencia, cv2.divide () realiza una operación de división a nivel de píxel de las dos imágenes, y el resultado obtenido puede entenderse simplemente como dos imágenes Hay diferencias obvias entre las partes. Mira el código:

cv2.divide(img_gray, img_blur, scale=255)

 

El cuarto paso es guardar la imagen generada. El código es el mismo que en el método anterior. Veamos directamente el efecto de boceto obtenido.

De los resultados, las líneas del croquis obtenido por este método son más delicadas y el efecto de croquis es mejor.

 

 

2

 

Obtenga retratos de bocetos de Miss Sister en lote

 

En esta parte, queremos realizar la función de obtener los retratos de bocetos de una señorita en lotes. Basado en la comparación de los dos dibujos de arriba, el segundo método se utiliza para realizar la conversión de dibujos a dibujos de bocetos.

Entonces, lo siguiente que hay que resolver es el problema de la fuente de la imagen. Recientemente, muchos proyectos han implementado con éxito la operación de obtener bellas damas de Douyin o Zhihu De hecho, además de estas plataformas, hay muchos sitios web que pueden obtener bellas imágenes de mujeres.

No mostraré el contenido específico del sitio web en el artículo. Para especificar la idea del rastreo de imágenes, hablaré aproximadamente sobre la estructura de la página: la página de inicio del sitio web enumera N temas, y cada página de tema contiene M imágenes de Miss Sister. El diagrama esquemático es el siguiente:

La construcción de la URL de cada página también es muy clara. Por ejemplo, la URL de la página en la figura siguiente es http://www.waxjj.cn/2794.html, donde 2794 es el número de identificación de la página del tema. Verifique el código html de la página (que se muestra a continuación) y descubra que cada imagen está debajo de una <li>etiqueta.

 

 

En este caso, en general, podemos obtener la url de cada imagen a través de algún tipo de analizador. Sin embargo, después de una observación cuidadosa, se encuentra que solo la parte del código html de toda la página web que involucra la URL de la imagen tiene una conexión http completa, por lo que puede considerar el uso de expresiones regulares para extraer la URL de la imagen. El código para lograr esta parte de la función es el siguiente.

En el código anterior, extraemos el ID de la página del tema como parte del nombre de la imagen a guardar. En la función save_jpg (), cada imagen se convertirá en un boceto y se guardará localmente.

Dado que necesitamos usar opencv para realizar varias operaciones y conversiones en las imágenes capturadas, las imágenes obtenidas mediante solicitudes deben guardarse localmente y luego volver a leerse con opencv. Basándonos en las ideas anteriores, construimos la función save_jpg () como se muestra a continuación, donde la función rgb_to_sketch () es una encapsulación del segundo método para obtener bocetos mencionado en la primera parte anterior.

En la función principal, solo necesitamos especificar el número de identificación de la página del tema que queremos obtener y crear una lista de URL:

def main():
    idlist = ['id1', 'id2']
    urllist = ['http://www.waxjj.cn/'+x+'.html' for x in idlist]
    jpgurls = get_jpg_urls(urllist)

 

El anterior es el código completo, echemos un vistazo al efecto después de ejecutar ~~

 

De hecho, los programadores quieren prevenir la pérdida de cabello programadores todavía están preocupados por la pérdida de cabello , que creo que deberíamos hacer más ejercicio, menos tarde en la noche, por supuesto, para ver la hermana poco más seductora no es bueno!

Supongo que te gusta

Origin blog.csdn.net/weixin_43881394/article/details/109030981
Recomendado
Clasificación