Une série d'implémentation des tâches de programmation Machine Learning Matlab / Octave de Coursera en Python. Cette fois, nous allons effectuer la première tâche d'apprentissage non supervisé, le clustering moyen K.
L'image originale (.png) a 256 gradations pour chaque RVB et 16,77 millions de couleurs. Le défi consiste à classer ces informations de couleur en 16 clusters par regroupement moyen K pour créer une image 16 couleurs.
Une bibliothèque appelée oreiller est utilisée pour le traitement d'image, alors installez-la.
pip install pillow
La documentation de l'oreiller est ici [http://pillow.readthedocs.org/en/3.0.x/).
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
Utilisez PIL.Image.open ()
pour lire les données d'image et les charger dans un tableau numpy 3D de 128 x 128 x 3. Ceci est «remodelé (128 * 128, 3)» et aplati en une matrice bidimensionnelle de 16384 x 3 qui peut être passée au clustering.
img = np.array(Image.open('bird_small.png')) #img est une matrice 3D 128x128x3
img_flat = img.reshape(128*128,3)/255 #Convertir en une matrice bidimensionnelle 16384x3
Le clustering peut être fait en une seule fois KMeans.fit (data)
. Le paramètre KMeans spécifie «n_clusters = 16» à diviser en 16 clusters.
model = KMeans(n_clusters=16).fit(img_flat)
À la suite du regroupement, le cluster dans lequel chaque pixel a été classé est stocké dans model.labels_
(numéro 0-15), et la valeur du centre de gravité de chaque cluster est stockée dans model.cluster_centers_
(matrice 16x3).
Vous pouvez l'utiliser pour créer une matrice avec la valeur de chaque pixel remplacée par le centre de gravité du cluster comme model.cluster_centers_ [model.labels_]
(matrice à deux dimensions 16384 x 3). Remodeler (128, 128, 3)
pour le reconvertir en une matrice tridimensionnelle de 128 x 128 x 3 qui peut être affichée dans l'image.
img_comp = model.cluster_centers_[model.labels_].reshape(128,128,3)
plt.imshow(img_comp)
Cliquez ici pour l'image originale et l'image résultante. Vous pouvez voir qu'il a été réduit à 16 couleurs.
Le code complet est ici. C'est court.
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
img = np.array(Image.open('bird_small.png')) #img est une matrice 3D 128x128x3
img_flat = img.reshape(128*128,3)/255 #Convertir en une matrice bidimensionnelle 16384x3
model = KMeans(n_clusters=16).fit(img_flat)
img_comp = model.cluster_centers_[model.labels_].reshape(128,128,3)
plt.imshow(img_comp)
Quand j'étais étudiant en traitement d'image il y a 10 ans, j'ai implémenté le clustering moyen K en C ++, mais il semble que c'était un programme avec des centaines de lignes ... C'est un bon moment avec la bibliothèque en place.
Recommended Posts