[PYTHON] [Apprentissage automatique] J'ai essayé de faire quelque chose comme passer des images

Bonjour. Il s'agit de Yuki Ando (@ holiday1173).

Dans cet article, en utilisant un type de méthode de clustering appelée méthode K-means introduite dans l'article précédent, [pathization (vectorization)] d'images (https: // school), qui est souvent utilisée dans Illustrator, etc. .dhw.co.jp / word / design / vector.html) J'ai essayé quelque chose comme ça.

Aperçu

Voici ce que j'ai fait dans le dernier article:

  1. Regroupement des valeurs de pixel pour chaque pixel de l'image à l'aide de K-means

  2. Attribuez la valeur moyenne des pixels du cluster à chaque cluster, réduisez le nombre de couleurs et dessinez

Article précédent → [Machine learning] Explication de la quantification des couleurs

Voici le résultat du traitement réel. (À gauche: avant le traitement, à droite: après le traitement) Parrots_with_k9.png

L'image de droite montre le résultat du traitement K-means avec 9 clusters. Puisque le nombre de clusters = le nombre de couleurs, l'image traitée est dessinée en seulement 9 couleurs. Cela ressemble à une peinture légèrement plate.

Dans l'article précédent, seule la valeur de pixel était utilisée comme entrée pour K-means, donc si les couleurs étaient similaires, les pixels dans une zone légèrement distante de l'image seraient divisés dans le même cluster.

Donc, j'ai pensé que si je regroupais les informations de coordonnées de pixel en plus de la valeur de pixel, je pourrais obtenir une image de type vecteur en forme de chemin, alors j'ai essayé.

résultat

Voici le code que j'ai utilisé.

import os
import argparse
import numpy as np
import cv2


if __name__ == "__main__":
    #Spécifiez le chemin avec un argument
    parser = argparse.ArgumentParser()
    parser.add_argument('--img', '-i', help='Le chemin de l'image que vous souhaitez traiter')
    parser.add_argument('--output', '-o', help='Répertoire pour afficher l'image de résultat')
    args = parser.parse_args()

    #Chargement des images
    img = cv2.imread(args.img)

    #L'image telle qu'elle est k-Puisqu'il ne peut pas être appliqué aux moyens, forme(Nombre de pixels, 3(BGR))Conversion en
    Z1 = img.reshape((-1, 3))
    
    """
Obtenez les coordonnées xy pour chaque pixel
    """
    #Largeur verticale et horizontale de l'image
    h, w = img.shape[:-1]
    #Liste bidimensionnelle des coordonnées xy des images
    Z2 = [[i, j] for i in range(h) for j in range(w)]
    
    # RGB +Concaténer les coordonnées xy
    Z = np.hstack((Z1, Z2))
    # np.Convertir en type float32
    Z = np.float32(Z)

    # k-Condition finale des moyens
    #Utiliser la valeur par défaut
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
    #Nombre de groupes après séparation
    for K in range(5, 21, 3):
        # K = 10
        # k-signifie traiter
        _, label, center = cv2.kmeans(
            Z, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)

        # np.Convertir en type uint8
        center = np.uint8(center)
        #Attribuer une valeur moyenne intra-groupe pour chaque groupe
        res = center[label.flatten()]
        res = res[:, :-2]
        #Restaurer la taille de l'image d'origine
        res2 = res.reshape((img.shape))

        output_path = os.path.join(args.output, 'Parrots_K{:02}.png'.format(K))
        #Enregistrer l'image
        cv2.imwrite(output_path, res2)

Voici les principaux processus ajoutés au code précédent.

"""
Obtenez les coordonnées xy pour chaque pixel
"""
#Largeur verticale et horizontale de l'image
h, w = img.shape[:-1]
#Liste bidimensionnelle des coordonnées xy des images
Z2 = [[i, j] for i in range(h) for j in range(w)]

Cette partie du processus obtient les coordonnées xy de chaque pixel. En combinant les coordonnées xy obtenues ici avec la liste des valeurs de pixels, une liste concaténant les coordonnées RVB + xy est générée. Tout d'abord, obtenez la largeur verticale (h) et la largeur horizontale (w) de img. Dans la ligne Z2 = ~, nous créons une liste de coordonnées xy qui donne [[0, 0], [0, 1], [0, 2] ...].

# RGB +Concaténer les coordonnées xy
Z = np.hstack((Z1, Z2))

Cette ligne combine la liste des valeurs de pixels et des coordonnées xy, et les données à entrer dans K-means sont complétées.

Voici les résultats. L'image originale 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

Non seulement la valeur du pixel mais aussi la position sont prises en compte lors de la division en grappes, cela ressemble donc à un chemin!

référence

Recommended Posts

[Apprentissage automatique] J'ai essayé de faire quelque chose comme passer des images
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
Je voulais faire quelque chose comme la pipe d'Elixir en Python
J'ai essayé d'obtenir une image en grattant
J'ai essayé de déplacer l'apprentissage automatique (détection d'objet) avec TouchDesigner
Une introduction à l'apprentissage automatique
J'ai essayé d'extraire le dessin au trait de l'image avec Deep Learning
J'ai essayé de traiter et de transformer l'image et d'élargir les données pour l'apprentissage automatique
J'ai essayé de créer un environnement d'apprentissage automatique avec Python (Mac OS X)
Je veux faire quelque chose comme sort uniq en Python
J'ai essayé l'apprentissage automatique pour convertir des phrases en style XX
J'ai essayé l'apprentissage automatique avec liblinear
Je voulais le faire comme exécuter un cas de test pour AtCoder.
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
J'ai essayé de comprendre l'apprentissage supervisé de l'apprentissage automatique d'une manière facile à comprendre, même pour les ingénieurs serveurs 1
Une introduction à OpenCV pour l'apprentissage automatique
J'ai essayé HR Tech pour développer un moteur de recherche expert par apprentissage automatique des informations de réunion en interne
Une introduction à Python pour l'apprentissage automatique
J'ai essayé de comprendre l'apprentissage supervisé de l'apprentissage automatique d'une manière facile à comprendre, même pour les ingénieurs serveurs 2
# J'ai essayé quelque chose comme Vlookup avec Python # 2
J'ai essayé de classer les accords de guitare en temps réel en utilisant l'apprentissage automatique
(Apprentissage automatique) J'ai essayé de comprendre attentivement la régression linéaire bayésienne avec l'implémentation
J'ai essayé de visualiser le modèle avec la bibliothèque d'apprentissage automatique low-code "PyCaret"
Je veux améliorer l'efficacité avec Python même dans un système expérimental (3) Je veux faire quelque chose comme Excel avec Pandas
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé de détecter un objet avec M2Det!
Mayungo's Python Learning Episode 5: J'ai essayé de faire quatre règles avec des nombres
J'ai fait un modèle de classification d'images et essayé de le déplacer sur mobile
J'ai essayé de prédire la présence ou l'absence de neige par apprentissage automatique.
J'ai essayé de prédire l'évolution de la quantité de neige pendant 2 ans par apprentissage automatique
J'ai essayé d'implémenter diverses méthodes d'apprentissage automatique (modèle de prédiction) en utilisant scicit-learn
Je veux faire du machine learning même sans serveur - Time Series Edition -
[Keras] J'ai essayé de résoudre le problème de classification des zones de type beignet par apprentissage automatique [Étude]
J'ai essayé de faire quelque chose comme un chatbot avec le modèle Seq2Seq de TensorFlow
J'ai essayé de faire une simulation de séparation de source sonore en temps réel avec l'apprentissage automatique Python
J'ai essayé d'implémenter le perceptron artificiel avec python
J'ai essayé le deep learning
J'ai essayé de déboguer.
J'ai essayé d'obtenir une AMI en utilisant AWS Lambda
J'ai essayé de devenir un Ann Man en utilisant OpenCV
J'ai essayé de créer une application OCR avec PySimpleGUI
Al milieu cliquetis! Réincarné une clé importante dans un monde différent! Ai-je refait quelque chose?
J'ai essayé de trouver la classe alternative avec tensorflow
Je veux faire quelque chose avec Python à la fin
Introduction à l'apprentissage automatique
Introduction à l'apprentissage automatique à partir de Simple Perceptron
Tout pour que les débutants puissent faire du machine learning
Application correspondante, j'ai essayé de prendre des statistiques de personnes fortes et j'ai essayé de créer un modèle d'apprentissage automatique
[Deep Learning from scratch] J'ai essayé d'expliquer la confirmation du gradient d'une manière facile à comprendre.
J'ai essayé de vérifier la classification yin et yang des membres hololive par apprentissage automatique
Oncle SE avec un cerveau endurci a essayé d'étudier l'apprentissage automatique
J'ai essayé d'utiliser Tensorboard, un outil de visualisation pour l'apprentissage automatique
Mayungo's Python Learning Episode 3: J'ai essayé d'imprimer des nombres
J'ai essayé d'implémenter ListNet d'apprentissage de rang avec Chainer
J'ai essayé d'implémenter Perceptron Part 1 [Deep Learning from scratch]
J'ai essayé d'écrire dans un modèle de langage profondément appris
J'ai essayé de créer un article dans Wiki.js avec SQL Alchemy
J'ai essayé la classification d'image d'AutoGluon