# 4 circles img = circle1 + circle2 + circle3 + circle4 mask = img.astype(bool) img = img.astype(float) img += 1 + 0.2*np.random.randn(*img.shape) # Convert the image into a graph with the value of the gradient on the # edges. graph = image.img_to_graph(img, mask=mask) # Take a decreasing function of the gradient: we take it weakly # dependant from the gradient the segmentation is close to a voronoi graph.data = np.exp(-graph.data/graph.data.std()) labels = spectral_clustering(graph, k=4) label_im = -np.ones(mask.shape) label_im[mask] = labels pl.figure(1, figsize=(8, 8)) pl.clf() pl.subplot(2, 2, 1) pl.imshow(img) pl.subplot(2, 2, 3) pl.imshow(label_im) ################################################################################ # 2 circles img = circle1 + circle2 mask = img.astype(bool) img = img.astype(float)
mask = img.astype(bool) img = img.astype(float) img += 1 + 0.2 * np.random.randn(*img.shape) # Convert the image into a graph with the value of the gradient on the # edges. graph = image.img_to_graph(img, mask=mask) # Take a decreasing function of the gradient: we take it weakly # dependant from the gradient the segmentation is close to a voronoi graph.data = np.exp(-graph.data / graph.data.std()) # Force the solver to be arpack, since amg is numerically # unstable on this example labels = spectral_clustering(graph, k=4, mode='arpack') label_im = -np.ones(mask.shape) label_im[mask] = labels plt.figure(figsize=(6, 3)) plt.subplot(121) plt.imshow(img, cmap=plt.cm.spectral, interpolation='nearest') plt.axis('off') plt.subplot(122) plt.imshow(label_im, cmap=plt.cm.spectral, interpolation='nearest') plt.axis('off') plt.subplots_adjust(wspace=0, hspace=0., top=0.99, bottom=0.01,
lena = lena[::2, ::2] + lena[1::2, ::2] + lena[::2, 1::2] + lena[1::2, 1::2] lena = lena[::2, ::2] + lena[1::2, ::2] + lena[::2, 1::2] + lena[1::2, 1::2] # Convert the image into a graph with the value of the gradient on the # edges. graph = image.img_to_graph(lena) # Take a decreasing function of the gradient: an exponential # The smaller beta is, the more independant the segmentation is of the # actual image. For beta=1, the segmentation is close to a voronoi beta = 5 eps = 1e-6 graph.data = np.exp(-beta*graph.data/lena.std()) + eps # Apply spectral clustering (this step goes much faster if you have pyamg # installed) N_REGIONS = 11 labels = spectral_clustering(graph, k=N_REGIONS) labels = labels.reshape(lena.shape) ################################################################################ # Visualize the resulting regions pl.figure(figsize=(5, 5)) pl.imshow(lena, cmap=pl.cm.gray) for l in range(N_REGIONS): pl.contour(labels == l, contours=1, colors=[pl.cm.spectral(l/float(N_REGIONS)), ]) pl.xticks(()) pl.yticks(()) pl.show()
# 4 circles img = circle1 + circle2 + circle3 + circle4 mask = img.astype(bool) img = img.astype(float) img += 1 + 0.2 * np.random.randn(*img.shape) # Convert the image into a graph with the value of the gradient on the # edges. graph = image.img_to_graph(img, mask=mask) # Take a decreasing function of the gradient: we take it weakly # dependant from the gradient the segmentation is close to a voronoi graph.data = np.exp(-graph.data / graph.data.std()) labels = spectral_clustering(graph, k=4) label_im = -np.ones(mask.shape) label_im[mask] = labels pl.figure(1, figsize=(8, 8)) pl.clf() pl.subplot(2, 2, 1) pl.imshow(img) pl.subplot(2, 2, 3) pl.imshow(label_im) ################################################################################ # 2 circles img = circle1 + circle2 mask = img.astype(bool) img = img.astype(float)
img = circle1 + circle2 + circle3 + circle4 mask = img.astype(bool) img = img.astype(float) img += 1 + 0.2*np.random.randn(*img.shape) # Convert the image into a graph with the value of the gradient on the # edges. graph = image.img_to_graph(img, mask=mask) # Take a decreasing function of the gradient: we take it weakly # dependant from the gradient the segmentation is close to a voronoi graph.data = np.exp(-graph.data/graph.data.std()) # Force the solver to be arpack, since amg is numerically # unstable on this example labels = spectral_clustering(graph, k=4, mode='arpack') label_im = -np.ones(mask.shape) label_im[mask] = labels plt.figure(figsize=(6, 3)) plt.subplot(121) plt.imshow(img, cmap=plt.cm.spectral, interpolation='nearest') plt.axis('off') plt.subplot(122) plt.imshow(label_im, cmap=plt.cm.spectral, interpolation='nearest') plt.axis('off') plt.subplots_adjust(wspace=0, hspace=0., top=0.99, bottom=0.01, left=0.01, right=0.99) plt.show()