[PYTHON] [Maschinelles Lernen] Ich habe versucht, so etwas wie Bilder weiterzugeben

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.

Überblick

Folgendes habe ich im letzten Artikel getan:

  1. Clustering der Pixelwerte für jedes Pixel des Bildes mit K-Mitteln

  2. 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) Parrots_with_k9.png

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.

Ergebnis

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 Parrots.png

K = 5 Parrots_K05.png

K = 8 Parrots_K08.png

K = 11 Parrots_K11.png

K = 14 Parrots_K14.png

K = 17 Parrots_K17.png

K = 20 Parrots_K20.png

Bei der Aufteilung in Cluster wird nicht nur der Pixelwert, sondern auch die Position berücksichtigt, sodass es wie ein Pfad aussieht!

Referenz

Recommended Posts

[Maschinelles Lernen] Ich habe versucht, so etwas wie Bilder weiterzugeben
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Ich wollte so etwas wie Elixirs Pipe in Python machen
Ich habe versucht, durch Schaben ein Bild zu bekommen
Ich habe versucht, maschinelles Lernen (Objekterkennung) mit TouchDesigner zu verschieben
Eine Einführung in das maschinelle Lernen
Ich habe versucht, die Strichzeichnung mit Deep Learning aus dem Bild zu extrahieren
Ich habe versucht, das Bild zu verarbeiten und zu transformieren und die Daten für maschinelles Lernen zu erweitern
Ich habe versucht, mit Python (Mac OS X) eine Umgebung für maschinelles Lernen zu erstellen.
Ich möchte so etwas wie Uniq in Python sortieren
Ich habe versucht, durch maschinelles Lernen Sätze in den XX-Stil umzuwandeln
Ich habe maschinelles Lernen mit liblinear versucht
Ich wollte es so machen, als würde ich einen Testfall für AtCoder ausführen.
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Ich habe versucht, das überwachte Lernen des maschinellen Lernens auch für Serveringenieure auf leicht verständliche Weise zu verstehen 1
Eine Einführung in OpenCV für maschinelles Lernen
Ich habe HR Tech versucht, eine Expertensuchmaschine zu entwickeln, indem ich interne Besprechungsinformationen maschinell gelernt habe
Eine Einführung in Python für maschinelles Lernen
Ich habe versucht, das überwachte Lernen des maschinellen Lernens auch für Serveringenieure auf leicht verständliche Weise zu verstehen 2
# Ich habe so etwas wie Vlookup mit Python # 2 ausprobiert
Ich habe versucht, Gitarrenakkorde in Echtzeit mithilfe von maschinellem Lernen zu klassifizieren
(Maschinelles Lernen) Ich habe versucht, die Bayes'sche lineare Regression bei der Implementierung sorgfältig zu verstehen
Ich habe versucht, das Modell mit der Low-Code-Bibliothek für maschinelles Lernen "PyCaret" zu visualisieren.
Ich möchte die Effizienz mit Python auch in einem experimentellen System verbessern. (3) Ich möchte mit Pandas so etwas wie Excel machen
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich habe versucht, ein Objekt mit M2Det zu erkennen!
Mayungos Python Learning Episode 5: Ich habe versucht, vier Regeln mit Zahlen zu machen
Ich habe ein Bildklassifizierungsmodell erstellt und versucht, es auf dem Handy zu verschieben
Ich habe versucht, das Vorhandensein oder Nichtvorhandensein von Schnee durch maschinelles Lernen vorherzusagen.
Ich habe versucht, die Veränderung der Schneemenge für 2 Jahre durch maschinelles Lernen vorherzusagen
Ich habe versucht, verschiedene Methoden für maschinelles Lernen (Vorhersagemodell) mithilfe von Scicit-Learn zu implementieren
Ich möchte maschinelles Lernen auch ohne Server durchführen - Time Series Edition -
[Keras] Ich habe versucht, das Problem der Klassifizierung des Donut-Typ-Bereichs durch maschinelles Lernen zu lösen. [Studie]
Ich habe versucht, mit dem Seq2Seq-Modell von TensorFlow so etwas wie einen Chatbot zu erstellen
Ich habe versucht, mit Python Machine Learning ein Echtzeit-Modell zur Trennung von Tonquellen zu erstellen
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich habe versucht, tief zu lernen
Ich habe versucht zu debuggen.
Ich habe versucht, mit AWS Lambda einen AMI zu erhalten
Ich habe versucht, mit OpenCV Ann Man zu werden
Ich habe versucht, eine OCR-App mit PySimpleGUI zu erstellen
Al mittleres Rasseln! Reinkarniert einen wichtigen Schlüssel in einer anderen Welt! Habe ich wieder etwas gemacht
Ich habe versucht, die alternative Klasse mit Tensorflow zu finden
Ich möchte am Ende etwas mit Python machen
Einführung in das maschinelle Lernen
Einführung in das maschinelle Lernen mit Simple Perceptron
Alles für Anfänger, um maschinelles Lernen zu können
Passende App Ich habe versucht, Statistiken über starke Leute zu erstellen und ein Modell für maschinelles Lernen zu erstellen
[Deep Learning von Grund auf neu] Ich habe versucht, die Gradientenbestätigung auf leicht verständliche Weise zu erklären.
Ich habe versucht, die Yin- und Yang-Klassifikation hololiver Mitglieder durch maschinelles Lernen zu überprüfen
Onkel SE mit verhärtetem Gehirn versuchte, maschinelles Lernen zu studieren
Ich habe versucht, Tensorboard zu verwenden, ein Visualisierungstool für maschinelles Lernen
Mayungos Python Learning Episode 3: Ich habe versucht, Zahlen zu drucken
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren
Ich habe versucht, Perceptron Teil 1 [Deep Learning von Grund auf neu] zu implementieren.
Ich habe versucht, in einem tief erlernten Sprachmodell zu schreiben
Ich habe versucht, einen Artikel mit SQL Alchemy auf Wiki.js zu erstellen
Ich habe die Bildklassifizierung von AutoGluon ausprobiert