[PYTHON] J'ai essayé de traiter l'image en "style croquis" avec OpenCV

introduction

Je pense qu'il y a beaucoup de gens qui partagent des photos sur SNS, y compris Instagram. À ce moment-là, je pense que vous pouvez utiliser l'application pour traiter l'image. Il dispose de diverses fonctions telles que le réglage de la luminosité et de la couleur, la retouche pour rendre la peau belle et le traitement des photos dans un style d'esquisse.

Cette fois, j'ai essayé un simple traitement d'image de type croquis en utilisant OpenCV.

Traitement d'image en "style d'esquisse" avec OpenCV

environnement

L'environnement utilise Google Colaboratory. La version Python est ci-dessous.

import platform
print("python " + platform.python_version())
# python 3.6.9

Affichage de l'image

Maintenant écrivons le code. Tout d'abord, importez et définissez la bibliothèque requise pour afficher l'image.

import cv2
import matplotlib.pyplot as plt
import matplotlib

%matplotlib inline
matplotlib.rcParams['image.cmap'] = 'gray'

Préparez également un exemple d'image. Cette fois, j'utiliserai l'image gratuite de Pixabay.

Maintenant, affichons l'exemple d'image préparé.

image = cv2.imread(input_file) # input_file est le chemin de l'image

plt.figure(figsize=[10,10])
plt.axis('off')
plt.imshow(image[:,:,::-1])

image.png

Conclusion

Utilisons maintenant OpenCV pour traiter cette image comme un croquis. Le code est ci-dessous.

def sketch(image):
    pencilSketch_img = pencilSketch(image)
    bilateral_img = cv2.bilateralFilter(image, 75, 100, 100)
    sketch_img = cv2.bitwise_and(bilateral_img, pencilSketch_img)
    return sketch_img

def pencilSketch(image):
    gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    median_img = cv2.medianBlur(gray_img, 5)
    laplacian_img = cv2.Laplacian(median_img, cv2.CV_8U, ksize=5)
    _, thresh_img = cv2.threshold(laplacian_img, 100, 255, cv2.THRESH_BINARY_INV)
    pencilSketch_img = cv2.cvtColor(thresh_img, cv2.COLOR_GRAY2BGR)
    return pencilSketch_img

sketch = sketch(image)

plt.figure(figsize=[20,10])
plt.subplot(121);plt.imshow(image[:,:,::-1]);plt.axis('off')
plt.title("original image")
plt.subplot(122);plt.imshow(sketch[:,:,::-1]);plt.axis('off')
plt.title("sketch image")

image.png

Le processus de traitement comme une esquisse est défini comme la fonction d'esquisse. Le flux de traitement de la fonction d'esquisse est le suivant.

--Création d'image de style de dessin au crayon (fonction PencilSketch)

L'ordre est de dessiner une ligne avec un crayon et de la peindre.

Description de chaque processus

Chaque processus sera expliqué ci-dessous.

Création d'images de style crayon (fonction PencilSketch)

Le processus de traitement comme un dessin au crayon est défini comme la fonction PencilSketch. Le flux de traitement de la fonction PencilSketch est le suivant.

J'afficherai l'image.

image = cv2.imread(input_file) #Chargement de l'image originale
pencilSketch_img = pencilSketch(image) #Image de style crayon

plt.figure(figsize=[20,10])
plt.subplot(121);plt.axis('off');plt.imshow(image[:,:,::-1])
plt.subplot(122);plt.axis('off');plt.imshow(pencilSketch_img[:,:,::-1])[

image.png

Pour plus de détails sur la fonction PencilSketch, consultez ici.

Lissage (cv2.bilateralFilter)

** Le lissage ** ou le lissage est simplement ** un flou de l'image **. On peut également dire que le flou de l'image adoucit le changement de valeur de pixel. Le bruit et les bords sont des changements soudains des valeurs de pixels. Le lissage peut éliminer ou rendre les bords moins visibles.

Il existe plusieurs méthodes de lissage, et le filtre bilatéral en fait partie. Bilatéral signifie «les deux», mais ce filtre peut bien laisser des bords. Le filtre de lissage rend l'image floue, y compris les pics tels que les bords. Vous pouvez utiliser le ** filtre bilatéral ** pour rendre l'image floue tout en laissant ** les bords **.

Pour plus d'informations sur le lissage, veuillez consulter ici.

Le code de bilatéralFilter est ci-dessous.

bilateral_img = cv2.bilateralFilter(image, 75, 100, 100)

plt.figure(figsize=[20,10])
plt.subplot(121);plt.axis('off');plt.imshow(image[:,:,::-1])
plt.subplot(122);plt.axis('off');plt.imshow(bilateral_img[:,:,::-1])

image.png

Vous pouvez voir que l'image est floue.

J'ai utilisé cv2.bilateralFilter pour lisser l'image. L'utilisation de cv2.bilateralFilter est la suivante.

Traitement du masque (cv2.bitwise_and)

Enfin, le traitement du masque est utilisé pour combiner l'image couleur et l'image d'esquisse de style dessin au crayon. Utilisez cv2.bitwise_and pour le masquage. cv2.bitwise_and est une fonction qui effectue un traitement ET bit par bit de deux images.

Le code de masquage est ci-dessous.

merged_img = cv2.bitwise_and(bilateral_img, pencilSketch_img)

plt.figure(figsize=[20,10])
plt.subplot(121);plt.axis('off');plt.imshow(bilateral_img[:,:,::-1])
plt.subplot(122);plt.axis('off');plt.imshow(merged_img[:,:,::-1])

image.png

J'ai réussi à mettre un croquis de style de dessin au crayon sur une image en couleur.

Résumé

Comment était-ce.

Cette fois, j'ai essayé le traitement d'image de type croquis en utilisant OpenCV. Passons en revue le flux de traitement.

--Création d'image de style de dessin au crayon (fonction PencilSketch)

Je pense qu'il serait intéressant de sortir une image en modifiant divers paramètres.

Recommended Posts

J'ai essayé de traiter l'image en "style croquis" avec OpenCV
J'ai essayé de traiter l'image dans un "style de dessin au crayon" avec OpenCV
J'ai essayé de "lisser" l'image avec Python + OpenCV
J'ai essayé de "différencier" l'image avec Python + OpenCV
J'ai essayé de "binariser" l'image avec Python + OpenCV
Python Open CV a essayé d'afficher l'image sous forme de texte.
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de jouer avec l'image avec Pillow
J'ai essayé de décrire le trafic en temps réel avec WebSocket
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé d'intégrer Keras dans TFv1.1
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai essayé d'entraîner la fonction péché avec chainer
J'ai essayé d'extraire des fonctionnalités avec SIFT d'OpenCV
J'ai essayé de détecter l'iris à partir de l'image de la caméra
J'ai essayé de toucher un fichier CSV avec Python
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé de prédire les chevaux qui seront dans le top 3 avec LightGBM
Convertissez l'image au format .zip en PDF avec Python
J'ai essayé de traiter et de transformer l'image et d'élargir les données pour l'apprentissage automatique
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
J'ai essayé d'extraire le texte du fichier image en utilisant Tesseract du moteur OCR
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé d'analyser les émotions de tout le roman "Weather Child" ☔️
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de notifier les informations de retard de train avec LINE Notify
J'ai essayé de résumer le code souvent utilisé dans Pandas
J'ai essayé d'illustrer le temps et le temps du langage C
J'ai essayé de résumer les commandes souvent utilisées en entreprise
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
Je n'arrive pas à me connecter à la page d'administration avec Django 3
J'ai essayé de créer un article dans Wiki.js avec SQL Alchemy
Essayez de brouiller l'image avec opencv2
J'ai essayé de déplacer le ballon
J'ai essayé la reconnaissance faciale avec OpenCV
J'ai essayé d'estimer la section.
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
J'ai essayé de trouver la matrice affine dans l'alignement de l'image (correspondance des points caractéristiques) en utilisant la transformation affine
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
J'ai essayé de résoudre l'édition du débutant du livre des fourmis avec python
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
J'ai essayé de créer l'image de démarrage SD de LicheePi Nano
J'ai essayé de numériser le tampon estampé sur papier en utilisant OpenCV
J'ai essayé d'afficher le temps de lecture de la vidéo (OpenCV: version Python)
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de démarrer avec Bitcoin Systre le week-end
J'ai essayé d'agrandir la taille du volume logique avec LVM
J'ai essayé de couper une image fixe de la vidéo
Je veux vérifier la position de mon visage avec OpenCV!
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de me connecter automatiquement à Twitter avec du sélénium (RPA, scraping)
J'ai eu une erreur lorsque j'ai essayé de traiter luigi en parallèle dans Windows, mais la solution
J'ai essayé d'implémenter PLSA en Python
Je veux détecter des objets avec OpenCV