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.
Die Umgebung verwendet Google Colaboratory. Die Python-Version ist unten.
import platform
print("python " + platform.python_version())
# python 3.6.9
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])
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")
Der Prozess der Verarbeitung wie eine Bleistiftzeichnung wird als Bleistift-Skizzen-Funktion definiert. Der Verarbeitungsablauf der PencilSketch-Funktion ist wie folgt.
Jeder Prozess wird unten erklärt.
** 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)
Ich verwende cv2.cvtColor, um von Farbe in Graustufen zu konvertieren. Die Verwendung von cv2.cvtColor ist wie folgt.
** 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)
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 ** 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)
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.
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)
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.
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