Das Ziel dieses Artikels ist es, den Bildteilungsalgorithmus durch Clustering zu erfahren. Lassen Sie uns Kameramann anvisieren. (Alle laufen auf ipython --pylab.)
from skimage import data,io
image=data.camera()
io.imshow(image)
Das Clustering-Ziel ist jedes Pixel. Wenn die Anzahl der Daten n und die Anzahl der Dimensionen d ist, muss eine n × d-Matrix erstellt werden, um den Clustering-Algorithmus verwenden zu können. Da das Ziel diesmal jedes Pixel ist, erstellen Sie zuerst eine 262144 × 1-Matrix mit n = 512 × 512 = 262144 und d = 1.
X=image.reshape((-1,1))
Jetzt bist du bereit. Lassen Sie uns gruppieren. Verwenden Sie Mean-Shift-Clustering. Mean-Shift-Clustering wird als für die Bildteilung geeignet angesehen, da die Anzahl der Cluster nicht im Voraus bestimmt werden muss. Dies ist bereits in scicit-learn implementiert. Wie praktisch ... Es gibt einige Parameter, aber ich werde versuchen, die Referenzen einzuhalten.
from sklearn.cluster import MeanShift,estimate_bandwidth
bandwidth=estimate_bandwidth(X,quantile=0.2,n_samples=500)
ms=MeanShift(bandwidth=bandwidth,bin_seeding=True)
ms.fit(X)
Damit ist das Clustering abgeschlossen. Mal sehen, das Ergebnis.
segmented_image=ms.labels_
segmented_image.shape=image.shape
imshow(segmented_image)
#matshow(segmented_image)
Schauen wir uns auch die Anzahl der Cluster an.
print len(unique(ms.labels_))
3
Der Kameramann wurde in drei Teile geteilt. Richtige Bewertungsdaten werden benötigt, um zu bewerten, ob dies gut oder schlecht ist, aber ist es irgendwo? Die Leistung des Mean-Shift-Clusters hängt weitgehend von der Bandbreite ab. Dieses Mal hatte sklearn eine Funktion zum Schätzen der Bandbreite, also habe ich versucht, sie zu verwenden, aber ich kann nichts sagen, weil ich nicht gesehen habe, was ich im Inneren mache. Ich bin vorerst froh, dass ich mit der Scicit-Serie eine Bildteilung erleben konnte.
Vielen Dank.
Recommended Posts