[PYTHON] Ich habe versucht, das Bild mit OpenCV im "Bleistift-Zeichenstil" 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 Bildverarbeitung im Bleistiftzeichnungsstil mit OpenCV versucht.

Bildverarbeitung im "Bleistiftzeichnungsstil" 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 Bleistiftzeichnung zu verarbeiten. Ich habe versucht, es zusammen mit dem Originalbild anzuzeigen.

def pencilSketch(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    median = cv2.medianBlur(gray, 5)
    laplacian = cv2.Laplacian(median, cv2.CV_8U, ksize=5)
    _, thresh = cv2.threshold(laplacian, 100, 255, cv2.THRESH_BINARY_INV)
    pencilSketchImage = cv2.cvtColor(thresh, cv2.COLOR_GRAY2BGR)
    return pencilSketchImage

pencilSketchImage = pencilSketch(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(pencilSketchImage[:,:,::-1]);plt.axis('off')
plt.title("pencil sketch image")

image.png

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

Beschreibung jedes Prozesses

Jeder Prozess wird unten erklärt.

Graustufen

** Graustufen ** (Graustufen oder Graustufen) ist eine Art Farbdarstellung. Einfach ausgedrückt, verwandeln Sie ein Farbbild in ein Schwarzweißbild.

Der Graustufencode ist unten.

image = cv2.imread(input_file) #Laden des Originalbildes
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) #Graustufen

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

image.png

Ich verwende cv2.cvtColor, um von Farbe in Graustufen zu konvertieren. Die Verwendung von cv2.cvtColor ist wie folgt.

Glättung (medianBlur)

** Glätten ** oder Glätten verwischt einfach ** das Bild **. 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 Geräusche und Kanten beseitigt oder verdeckt werden.

Es gibt verschiedene Methoden zum Glätten, und die mittlere Unschärfe ist eine davon. Median ist der "Medianwert", der den Medianwert aus den im angegebenen Kernel enthaltenen Pixeln entnimmt und den gesamten Kernel mit diesem Wert füllt.

Weitere Informationen zum Glätten finden Sie unter hier.

Der Code für medianBlur ist unten.

median = cv2.medianBlur(gray, 5) # medianBlur

plt.figure(figsize=[20,10])
plt.subplot(121);plt.axis('off');plt.imshow(gray)
plt.subplot(122);plt.axis('off');plt.imshow(median)

image.png

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

Ich habe cv2.medianBlur verwendet, um ein Graustufenbild zu verwischen. Die Verwendung von cv2.medianBlur ist wie folgt.

Bilddifferenzierung (Laplace)

** Bilddifferenzierung ** erkennt Bereiche, in denen sich die Pixelwerte schnell ändern, dh ** Kanten **.

Es gibt verschiedene Möglichkeiten, ein Bild zu unterscheiden. Laplace ist eine davon. Der Laplace-Filter ist doppelt differenziert und nützlich, wenn Sie eine feinere Kantenerkennung wünschen als der einseitige Sobel-Filter.

Weitere Informationen zur Bilddifferenzierung finden Sie unter hier.

Der Code für Laplace ist unten.

laplacian = cv2.Laplacian(median, cv2.CV_8U, ksize=5) # Laplacian

plt.figure(figsize=[20,10])
plt.subplot(121);plt.axis('off');plt.imshow(median)
plt.subplot(122);plt.axis('off');plt.imshow(laplacian)

image.png

Sie können sehen, dass die Kanten erkannt wurden.

Ich habe cv2.Laplacian verwendet, um das Bild zu unterscheiden. Die Verwendung von cv2.Laplacian ist wie folgt.

Binarisierung

Bei der Binarisierung wird ein Bild in zwei Werte (binär) umgewandelt, Weiß und Schwarz. Es unterscheidet sich von der Graustufe, die schrittweise zwischen Weiß und Schwarz angezeigt wird. Ein Wert, der als Schwelle (Schwelle) bezeichnet wird, wird bestimmt, und wenn der Pixelwert größer als dieser ist, wird er in Weiß umgewandelt, und wenn er kleiner ist, wird er in Schwarz umgewandelt.

Es gibt verschiedene Möglichkeiten, ein Bild zu binarisieren. Dieses Mal haben wir eine allgemeine Binärisierung durchgeführt.

Weitere Informationen zur Binarisierung finden Sie unter hier.

Der Binärisierungscode ist unten.

_, thresh = cv2.threshold(laplacian, 100, 255, cv2.THRESH_BINARY_INV) #Binarisierung

plt.figure(figsize=[20,10])
plt.subplot(121);plt.axis('off');plt.imshow(laplacian)
plt.subplot(122);plt.axis('off');plt.imshow(thresh)

image.png

Ich konnte nur solche mit relativ hohen Pixelwerten belassen.

Ich habe cv2.threshold verwendet, um das Bild zu binarisieren. Die Verwendung von cv2.threshold ist wie folgt.

Diesmal ist der Schwellenwert auf 100 eingestellt. Dieses Mal wird der Rückgabewertschwellenwert (100) nicht verwendet, daher wird er auf _ (Unterstrich) gesetzt.

Bei der Schwellenwertverarbeitung wird cv2.THRESH_BINARY_INV für die Schwarzweißinversion verwendet. cv2.THRESH_BINARY_INV ist der Prozess zum Setzen von 0 (schwarz) für Pixel, die den Schwellenwert (diesmal 100) und maxVal (diesmal 255) für andere Pixel überschreiten.

Zusammenfassung

Wie war das.

Dieses Mal habe ich mit OpenCV eine Skizze im Bleistiftzeichnungsstil ausprobiert. Lassen Sie uns den Verarbeitungsablauf überprüfen.

Durch Ändern von Parametern wie Schwellenwert und Kernelgröße können Sie die Feinheit der Zeile ändern. Ich denke, es wäre interessant, ein Bild durch Ändern verschiedener Parameter auszugeben.

Recommended Posts

Ich habe versucht, das Bild mit OpenCV im "Bleistift-Zeichenstil" zu verarbeiten
Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" 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, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Ich habe versucht, mit Pillow mit dem Bild zu spielen
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, mit OpenCV Bewegungen schnell zu erkennen
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, die in Python installierten Pakete grafisch darzustellen
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 möchte Objekte mit OpenCV erkennen