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.
Voici ce que j'ai fait dans le dernier article:
Regroupement des valeurs de pixel pour chaque pixel de l'image à l'aide de K-means
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)
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é.
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
K = 5
K = 8
K = 11
K = 14
K = 17
K = 20
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!