L'objectif de cet article est d'expérimenter l'algorithme de division d'image par clustering. Visons le caméraman. (Tous fonctionnent sur ipython --pylab.)
from skimage import data,io
image=data.camera()
io.imshow(image)
La cible de clustering est chaque pixel. Lorsque le nombre de données est n et le nombre de dimensions est d, une matrice n × d doit être créée afin d'utiliser l'algorithme de clustering. Puisque la cible est chaque pixel cette fois, créez d'abord une matrice 262144 × 1 avec n = 512 × 512 = 262144 et d = 1.
X=image.reshape((-1,1))
Vous êtes maintenant prêt. Let's cluster. Utilisez le clustering Mean-Shift. Le regroupement par décalage moyen est considéré comme approprié pour la division d'image car il n'est pas nécessaire de déterminer le nombre de clusters à l'avance. Ceci est déjà implémenté dans scicit-learn. Comme c'est pratique ... Il y a quelques paramètres, mais je vais essayer de respecter les références.
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)
Ceci termine la mise en cluster. Voyons le résultat.
segmented_image=ms.labels_
segmented_image.shape=image.shape
imshow(segmented_image)
#matshow(segmented_image)
Regardons également le nombre de clusters.
print len(unique(ms.labels_))
3
Le caméraman a été divisé en trois parties. Des données de réponse correctes sont nécessaires pour évaluer si cela est bon ou mauvais, mais est-ce quelque part? Les performances du clustering Mean-Shift dépendent en grande partie de la bande passante. Cette fois, sklearn avait une fonction pour estimer la bande passante, alors j'ai essayé de l'utiliser, mais je ne peux rien dire car je n'ai pas vu ce que je fais à l'intérieur. Pour le moment, je suis heureux d'avoir pu expérimenter la division d'image en utilisant la série scicit.
Merci beaucoup.
Recommended Posts