Eine Reihe von Implementierungen der Matlab / Octave-Programmieraufgaben von Coursera für maschinelles Lernen in Python. Dieses Mal werden wir die erste Aufgabe des unbeaufsichtigten Lernens erledigen, das K-durchschnittliche Clustering.
Das Originalbild (.png) hat 256 Abstufungen für jedes RGB und 16,77 Millionen Farben. Die Herausforderung besteht darin, diese Farbinformationen durch K-Durchschnittscluster in 16 Cluster zu klassifizieren, um ein 16-Farben-Bild zu erstellen.
Eine Bibliothek namens Pillow wird für die Bildverarbeitung verwendet. Installieren Sie sie daher.
pip install pillow
Die Dokumentation zum Kissen finden Sie hier [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
Verwenden Sie PIL.Image.open (), um die Bilddaten zu lesen und in ein 128 x 128 x 3 3D-Numpy-Array zu laden. Dies wird "umgeformt (128 * 128, 3)" und zu einer zweidimensionalen Matrix von 16384 x 3 abgeflacht, die an das Clustering übergeben werden kann.
img = np.array(Image.open('bird_small.png')) #img ist eine 128x128x3 3D-Matrix
img_flat = img.reshape(128*128,3)/255 #In eine zweidimensionale 16384x3-Matrix konvertieren
Clustering kann in einem Schuss "KMeans.fit (Daten)" durchgeführt werden. Der Parameter KMeans gibt "n_clusters = 16" an, um in 16 Cluster zu unterteilen.
model = KMeans(n_clusters=16).fit(img_flat)
Als Ergebnis der Clusterbildung wird in "model.labels_" (Nummer 0-15) gespeichert, in welchen Cluster jedes Pixel klassifiziert wurde, und der Wert des Schwerpunkts jedes Clusters wird in "model.cluster_centers_" (16x3-Matrix) gespeichert.
Sie können dies verwenden, um eine Matrix zu erstellen, bei der der Wert jedes Pixels durch den Schwerpunkt des Clusters als "model.cluster_centers_ [model.labels_]" (zweidimensionale Matrix 16384 x 3) ersetzt wird. Reshape (128, 128, 3)
, um dies wieder in eine dreidimensionale Matrix von 128 x 128 x 3 umzuwandeln, die im Bild angezeigt werden kann.
img_comp = model.cluster_centers_[model.labels_].reshape(128,128,3)
plt.imshow(img_comp)
Klicken Sie hier für das Originalbild und das resultierende Bild. Sie können sehen, dass es auf 16 Farben reduziert wurde.
Der vollständige Code ist hier. Es ist kurz.
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 ist eine 128x128x3 3D-Matrix
img_flat = img.reshape(128*128,3)/255 #In eine zweidimensionale 16384x3-Matrix konvertieren
model = KMeans(n_clusters=16).fit(img_flat)
img_comp = model.cluster_centers_[model.labels_].reshape(128,128,3)
plt.imshow(img_comp)
Als ich vor 10 Jahren als Student Bildverarbeitung studierte, habe ich K-Average-Clustering in C ++ von Grund auf neu implementiert, aber es scheint, dass es ein Programm mit Hunderten von Zeilen war ... Es ist eine gute Zeit mit der Bibliothek.
Recommended Posts