Hallo. Dies ist Yuki Ando (@ Holiday1173).
In diesem Artikel verwenden wir eine Art Clustering-Methode namens K-means-Methode, die im vorherigen Artikel eingeführt wurde, um Bilder (https: // school) zu [pathisieren (vektorisieren)], die häufig in Illustrator usw. verwendet werden. .dhw.co.jp / word / design / vector.html) Ich habe so etwas versucht.
Folgendes habe ich im letzten Artikel getan:
Clustering der Pixelwerte für jedes Pixel des Bildes mit K-Mitteln
Weisen Sie jedem Cluster den durchschnittlichen Pixelwert im Cluster zu, reduzieren Sie die Anzahl der Farben und zeichnen Sie
Vorheriger Artikel → [Maschinelles Lernen] Erklären der Farbquantisierung
Hier ist das Ergebnis der eigentlichen Verarbeitung. (Links: Vor der Verarbeitung, Rechts: Nach der Verarbeitung)
Das Bild rechts zeigt das Ergebnis der K-Mittel-Verarbeitung mit 9 Clustern. Da die Anzahl der Cluster = die Anzahl der Farben ist, wird das verarbeitete Bild nur in 9 Farben gezeichnet. Es sieht aus wie ein leicht flaches Gemälde.
Im vorherigen Artikel wurde nur der Pixelwert als Eingabe für K-Mittel verwendet. Wenn also die Farben ähnlich wären, würden Pixel in einem etwas entfernten Bereich des Bildes in denselben Cluster unterteilt.
Ich dachte also, wenn ich die Pixelkoordinateninformationen zusätzlich zum Pixelwert gruppiere, könnte ich ein pfadähnliches vektorähnliches Bild erhalten, also habe ich es versucht.
Hier ist der Code, den ich verwendet habe.
import os
import argparse
import numpy as np
import cv2
if __name__ == "__main__":
#Geben Sie den Pfad mit einem Argument an
parser = argparse.ArgumentParser()
parser.add_argument('--img', '-i', help='Der Pfad des Bildes, das Sie verarbeiten möchten')
parser.add_argument('--output', '-o', help='Verzeichnis zur Ausgabe des Ergebnisbildes')
args = parser.parse_args()
#Bilder laden
img = cv2.imread(args.img)
#Bild wie es ist k-Da es nicht auf Mittel angewendet werden kann, formen(Anzahl der Pixel, 3(BGR))Umstellung auf
Z1 = img.reshape((-1, 3))
"""
Holen Sie sich xy-Koordinaten für jedes Pixel
"""
#Vertikale und horizontale Breite des Bildes
h, w = img.shape[:-1]
#Zweidimensionale Liste der xy-Koordinaten von Bildern
Z2 = [[i, j] for i in range(h) for j in range(w)]
# RGB +Xy-Koordinaten verketten
Z = np.hstack((Z1, Z2))
# np.In den Typ float32 konvertieren
Z = np.float32(Z)
# k-Endbedingung der Mittel
#Standardwert verwenden
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
#Anzahl der Gruppen nach der Aufteilung
for K in range(5, 21, 3):
# K = 10
# k-bedeutet Verarbeitung
_, label, center = cv2.kmeans(
Z, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
# np.In den Typ uint8 konvertieren
center = np.uint8(center)
#Weisen Sie jeder Gruppe einen gruppeninternen Durchschnittswert zu
res = center[label.flatten()]
res = res[:, :-2]
#Stellen Sie die ursprüngliche Bildgröße wieder her
res2 = res.reshape((img.shape))
output_path = os.path.join(args.output, 'Parrots_K{:02}.png'.format(K))
#Bild speichern
cv2.imwrite(output_path, res2)
Hier sind die wichtigsten Prozesse, die dem vorherigen Code hinzugefügt wurden.
"""
Holen Sie sich xy-Koordinaten für jedes Pixel
"""
#Vertikale und horizontale Breite des Bildes
h, w = img.shape[:-1]
#Zweidimensionale Liste der xy-Koordinaten von Bildern
Z2 = [[i, j] for i in range(h) for j in range(w)]
Dieser Teil des Prozesses erhält die xy-Koordinaten für jedes Pixel. Durch Kombinieren der hier erhaltenen xy-Koordinaten mit der Liste der Pixelwerte wird eine Liste erzeugt, die RGB + xy-Koordinaten verkettet. Ermitteln Sie zunächst die vertikale Breite (h) und die horizontale Breite (w) von img. In der Zeile Z2 = ~ erstellen wir eine xy-Koordinatenliste mit [[0, 0], [0, 1], [0, 2] ...].
# RGB +Xy-Koordinaten verketten
Z = np.hstack((Z1, Z2))
Diese Zeile kombiniert die Liste der Pixelwerte und xy-Koordinaten, und die in K-means einzugebenden Daten sind vollständig.
Unten sind die Ergebnisse. Das Originalbild
K = 5
K = 8
K = 11
K = 14
K = 17
K = 20
Bei der Aufteilung in Cluster wird nicht nur der Pixelwert, sondern auch die Position berücksichtigt, sodass es wie ein Pfad aussieht!
Recommended Posts