Compute the segmentation of a 2D image with Ward hierarchical clustering. The clustering is spatially constrained in order for each segmented region to be in one piece.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # Author : Vincent Michel, 2010 # Alexandre Gramfort, 2011 # License: BSD 3 clause print (__doc__) import time as time import numpy as np import scipy as sp import matplotlib.pyplot as plt from sklearn.feature_extraction.image import grid_to_graph from sklearn.cluster import AgglomerativeClustering from sklearn.utils.testing import SkipTest from sklearn.utils.fixes import sp_version if sp_version < ( 0 , 12 ): raise SkipTest( "Skipping because SciPy version earlier than 0.12.0 and " "thus does not include the scipy.misc.face() image." ) |
Generate data
1 2 3 4 5 6 7 8 9 10 11 | try : face = sp.face(gray = True ) except AttributeError: # Newer versions of scipy have face in misc from scipy import misc face = misc.face(gray = True ) # Resize it to 10% of the original size to speed up the processing face = sp.misc.imresize(face, 0.10 ) / 255. X = np.reshape(face, ( - 1 , 1 )) |
Define the structure A of the data. Pixels connected to their neighbors.
1 | connectivity = grid_to_graph( * face.shape) |
Compute clustering
1 2 3 4 5 6 7 8 9 10 | print ( "Compute structured hierarchical clustering..." ) st = time.time() n_clusters = 15 # number of regions ward = AgglomerativeClustering(n_clusters = n_clusters, linkage = 'ward' , connectivity = connectivity) ward.fit(X) label = np.reshape(ward.labels_, face.shape) print ( "Elapsed time: " , time.time() - st) print ( "Number of pixels: " , label.size) print ( "Number of clusters: " , np.unique(label).size) |
Out:
1 2 3 4 | Compute structured hierarchical clustering... Elapsed time: 0.624880075455 Number of pixels: 7752 Number of clusters: 15 |
Plot the results on an image
1 2 3 4 5 6 7 8 | plt.figure(figsize = ( 5 , 5 )) plt.imshow(face, cmap = plt.cm.gray) for l in range (n_clusters): plt.contour(label = = l, contours = 1 , colors = [plt.cm.spectral(l / float (n_clusters)), ]) plt.xticks(()) plt.yticks(()) plt.show() |
Total running time of the script: (0 minutes 1.010 seconds)
Download Python source code:
plot_face_ward_segmentation.py
Download IPython notebook:
plot_face_ward_segmentation.ipynb
Please login to continue.