[PYTHON] Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" zu verarbeiten

Einführung

Ich denke, es gibt viele Leute, die Fotos auf SNS teilen, einschließlich Instagram. Zu diesem Zeitpunkt denke ich, dass Sie die App verwenden können, um das Bild zu verarbeiten. Es verfügt über verschiedene Funktionen wie das Anpassen von Helligkeit und Farbe, das Retuschieren, um die Haut schön aussehen zu lassen, und das Verarbeiten von Fotos in einem Skizzenstil.

Dieses Mal habe ich eine einfache skizzenhafte Bildverarbeitung mit OpenCV versucht.

Bildverarbeitung im "Sketch Style" mit OpenCV

Umgebung

Die Umgebung verwendet Google Colaboratory. Die Python-Version ist unten.

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

Bildschirm

Jetzt schreiben wir den Code. Importieren und stellen Sie zunächst die Bibliothek ein, die zum Anzeigen des Bildes erforderlich ist.

import cv2
import matplotlib.pyplot as plt
import matplotlib

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

Bereiten Sie auch ein Beispielbild vor. Dieses Mal werde ich das kostenlose Bild von Pixabay verwenden.

Lassen Sie uns nun das vorbereitete Beispielbild anzeigen.

image = cv2.imread(input_file) # input_Datei ist der Pfad des Bildes

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

image.png

Fazit

Verwenden wir nun OpenCV, um dieses Bild wie eine Skizze zu verarbeiten. Der Code ist unten.

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

Der Prozess der Verarbeitung wie eine Skizze wird als Skizzenfunktion definiert. Der Verarbeitungsablauf der Skizzenfunktion ist wie folgt.

Die Reihenfolge ist, eine Linie mit einem Bleistift zu zeichnen und sie zu malen.

Beschreibung jedes Prozesses

Jeder Prozess wird unten erklärt.

Bilderzeugung im Bleistiftstil (Bleistift-Skizzen-Funktion)

Der Prozess der Verarbeitung wie eine Bleistiftzeichnung wird als Bleistift-Skizzen-Funktion definiert. Der Verarbeitungsablauf der PencilSketch-Funktion ist wie folgt.

Ich werde das Bild anzeigen.

image = cv2.imread(input_file) #Laden des Originalbildes
pencilSketch_img = pencilSketch(image) #Bleistift-Stil Bild

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

Einzelheiten zur Funktion PencilSketch finden Sie unter hier.

Glätten (cv2.bilateralFilter)

** Glätten ** oder Glätten ist einfach ** Unschärfe des Bildes **. Man kann auch sagen, dass das Verwischen des Bildes die Änderung des Pixelwerts glättet. Rauschen und Kanten sind plötzliche Änderungen der Pixelwerte. Durch das Glätten können Kanten beseitigt oder weniger auffällig gemacht werden.

Es gibt verschiedene Methoden zum Glätten, und der bilaterale Filter ist eine davon. Bilateral bedeutet "beides", aber dieser Filter kann Kanten schön hinterlassen. Der Glättungsfilter verwischt das Bild, einschließlich Spitzen wie Kanten. Sie können den ** bilateralen Filter ** verwenden, um das Bild zu verwischen, während Sie ** Kanten ** lassen.

Weitere Informationen zum Glätten finden Sie unter hier.

Der Code für bilateralFilter ist unten.

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

Sie können sehen, dass das Bild verschwommen ist.

Ich habe cv2.bilateralFilter verwendet, um das Bild zu glätten. Die Verwendung von cv2.bilateralFilter ist wie folgt.

Maskenverarbeitung (cv2.bitwise_and)

Schließlich wird die Maskenverarbeitung verwendet, um das Farbbild und das Skizzenbild im Bleistiftzeichnungsstil zu kombinieren. Verwenden Sie cv2.bitwise_and zum Maskieren. cv2.bitwise_and ist eine Funktion, die die bitweise UND-Verarbeitung von zwei Bildern durchführt.

Der Maskierungscode ist unten.

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

Ich konnte erfolgreich eine Skizze im Bleistiftzeichnungsstil auf ein Farbbild setzen.

Zusammenfassung

Wie war das.

Dieses Mal habe ich versucht, eine skizzenhafte Bildverarbeitung mit OpenCV durchzuführen. Lassen Sie uns den Verarbeitungsablauf überprüfen.

Ich denke, es wäre interessant, ein Bild durch Ändern verschiedener Parameter auszugeben.

Recommended Posts

Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" zu verarbeiten
Ich habe versucht, das Bild mit OpenCV im "Bleistift-Zeichenstil" zu verarbeiten
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Python Open CV hat versucht, das Bild im Text anzuzeigen.
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, mit Pillow mit dem Bild zu spielen
Ich habe versucht, den Datenverkehr mit WebSocket in Echtzeit zu beschreiben
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, Keras in TFv1.1 zu integrieren
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich habe versucht, Funktionen mit SIFT von OpenCV zu extrahieren
Ich habe versucht, Iris aus dem Kamerabild zu erkennen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, die Pferde vorherzusagen, die mit LightGBM unter den Top 3 sein werden
Konvertieren Sie das Bild in .zip mit Python in PDF
Ich habe versucht, das Bild zu verarbeiten und zu transformieren und die Daten für maschinelles Lernen zu erweitern
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Ich habe versucht, den Text in der Bilddatei mit Tesseract der OCR-Engine zu extrahieren
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, die Emotionen des gesamten Romans "Wetterkind" zu analysieren
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, die Zugverspätungsinformationen mit LINE Notify zu benachrichtigen
Ich habe versucht, den in Pandas häufig verwendeten Code zusammenzufassen
Ich habe versucht, die Zeit und die Zeit der C-Sprache zu veranschaulichen
Ich habe versucht, die im Geschäftsleben häufig verwendeten Befehle zusammenzufassen
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
Ich kann mich mit Django 3 nicht auf der Admin-Seite anmelden
Ich habe versucht, einen Artikel mit SQL Alchemy auf Wiki.js zu erstellen
Versuchen Sie, das Bild mit opencv2 zu verwischen
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, das Gesicht mit OpenCV zu erkennen
Ich habe versucht, den Abschnitt zu schätzen.
Ich habe auch versucht, die Funktionsmonade und die Zustandsmonade mit dem Generator in Python nachzuahmen
Ich habe versucht, die affine Matrix in der Bildausrichtung (Feature-Point-Matching) mithilfe der affinen Transformation zu finden
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
Ich habe versucht, die Anfängerausgabe des Ameisenbuchs mit Python zu lösen
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
Ich habe versucht, das SD-Boot-Image von LicheePi Nano zu erstellen
Ich habe versucht, den auf Papier gestempelten Stempel mit OpenCV zu digitalisieren
Ich habe versucht, die Videowiedergabezeit anzuzeigen (OpenCV: Python-Version)
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe am Wochenende versucht, mit Bitcoin Systre zu beginnen
Ich habe versucht, die Größe des logischen Volumes mit LVM zu erweitern
Ich habe versucht, ein Standbild aus dem Video auszuschneiden
Ich möchte die Position meines Gesichts mit OpenCV überprüfen!
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe versucht, mich automatisch mit Selen bei Twitter anzumelden (RPA, Scraping)
Ich habe einen Fehler bekommen, als ich versucht habe, Luigi parallel in Windows zu verarbeiten, aber die Lösung
Ich habe versucht, PLSA in Python zu implementieren
Ich möchte Objekte mit OpenCV erkennen