
.. DO NOT EDIT.
.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY.
.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE:
.. "auto_examples/cluster/plot_coin_segmentation.py"
.. LINE NUMBERS ARE GIVEN BELOW.

.. only:: html

    .. note::
        :class: sphx-glr-download-link-note

        :ref:`Go to the end <sphx_glr_download_auto_examples_cluster_plot_coin_segmentation.py>`
        to download the full example code or to run this example in your browser via JupyterLite or Binder.

.. rst-class:: sphx-glr-example-title

.. _sphx_glr_auto_examples_cluster_plot_coin_segmentation.py:


================================================
Segmenting the picture of greek coins in regions
================================================

This example uses :ref:`spectral_clustering` on a graph created from
voxel-to-voxel difference on an image to break this image into multiple
partly-homogeneous regions.

This procedure (spectral clustering on an image) is an efficient
approximate solution for finding normalized graph cuts.

There are three options to assign labels:

* 'kmeans' spectral clustering clusters samples in the embedding space
  using a kmeans algorithm
* 'discrete' iteratively searches for the closest partition
  space to the embedding space of spectral clustering.
* 'cluster_qr' assigns labels using the QR factorization with pivoting
  that directly determines the partition in the embedding space.

.. GENERATED FROM PYTHON SOURCE LINES 22-62

.. code-block:: Python


    # Authors: The scikit-learn developers
    # SPDX-License-Identifier: BSD-3-Clause

    import time

    import matplotlib.pyplot as plt
    import numpy as np
    from scipy.ndimage import gaussian_filter
    from skimage.data import coins
    from skimage.transform import rescale

    from sklearn.cluster import spectral_clustering
    from sklearn.feature_extraction import image

    # load the coins as a numpy array
    orig_coins = coins()

    # Resize it to 20% of the original size to speed up the processing
    # Applying a Gaussian filter for smoothing prior to down-scaling
    # reduces aliasing artifacts.
    smoothened_coins = gaussian_filter(orig_coins, sigma=2)
    rescaled_coins = rescale(smoothened_coins, 0.2, mode="reflect", anti_aliasing=False)

    # Convert the image into a graph with the value of the gradient on the
    # edges.
    graph = image.img_to_graph(rescaled_coins)

    # Take a decreasing function of the gradient: an exponential
    # The smaller beta is, the more independent the segmentation is of the
    # actual image. For beta=1, the segmentation is close to a voronoi
    beta = 10
    eps = 1e-6
    graph.data = np.exp(-beta * graph.data / graph.data.std()) + eps

    # The number of segmented regions to display needs to be chosen manually.
    # The current version of 'spectral_clustering' does not support determining
    # the number of good quality clusters automatically.
    n_regions = 26








.. GENERATED FROM PYTHON SOURCE LINES 63-64

Compute and visualize the resulting regions

.. GENERATED FROM PYTHON SOURCE LINES 64-105

.. code-block:: Python


    # Computing a few extra eigenvectors may speed up the eigen_solver.
    # The spectral clustering quality may also benefit from requesting
    # extra regions for segmentation.
    n_regions_plus = 3

    # Apply spectral clustering using the default eigen_solver='arpack'.
    # Any implemented solver can be used: eigen_solver='arpack', 'lobpcg', or 'amg'.
    # Choosing eigen_solver='amg' requires an extra package called 'pyamg'.
    # The quality of segmentation and the speed of calculations is mostly determined
    # by the choice of the solver and the value of the tolerance 'eigen_tol'.
    # TODO: varying eigen_tol seems to have no effect for 'lobpcg' and 'amg' #21243.
    for assign_labels in ("kmeans", "discretize", "cluster_qr"):
        t0 = time.time()
        labels = spectral_clustering(
            graph,
            n_clusters=(n_regions + n_regions_plus),
            eigen_tol=1e-7,
            assign_labels=assign_labels,
            random_state=42,
        )

        t1 = time.time()
        labels = labels.reshape(rescaled_coins.shape)
        plt.figure(figsize=(5, 5))
        plt.imshow(rescaled_coins, cmap=plt.cm.gray)

        plt.xticks(())
        plt.yticks(())
        title = "Spectral clustering: %s, %.2fs" % (assign_labels, (t1 - t0))
        print(title)
        plt.title(title)
        for l in range(n_regions):
            colors = [plt.cm.nipy_spectral((l + 4) / float(n_regions + 4))]
            plt.contour(labels == l, colors=colors)
            # To view individual segments as appear comment in plt.pause(0.5)
    plt.show()

    # TODO: After #21194 is merged and #21243 is fixed, check which eigen_solver
    # is the best and set eigen_solver='arpack', 'lobpcg', or 'amg' and eigen_tol
    # explicitly in this example.



.. rst-class:: sphx-glr-horizontal


    *

      .. image-sg:: /auto_examples/cluster/images/sphx_glr_plot_coin_segmentation_001.png
         :alt: Spectral clustering: kmeans, 1.76s
         :srcset: /auto_examples/cluster/images/sphx_glr_plot_coin_segmentation_001.png
         :class: sphx-glr-multi-img

    *

      .. image-sg:: /auto_examples/cluster/images/sphx_glr_plot_coin_segmentation_002.png
         :alt: Spectral clustering: discretize, 1.62s
         :srcset: /auto_examples/cluster/images/sphx_glr_plot_coin_segmentation_002.png
         :class: sphx-glr-multi-img

    *

      .. image-sg:: /auto_examples/cluster/images/sphx_glr_plot_coin_segmentation_003.png
         :alt: Spectral clustering: cluster_qr, 1.56s
         :srcset: /auto_examples/cluster/images/sphx_glr_plot_coin_segmentation_003.png
         :class: sphx-glr-multi-img


.. rst-class:: sphx-glr-script-out

 .. code-block:: none

    Spectral clustering: kmeans, 1.76s
    Spectral clustering: discretize, 1.62s
    Spectral clustering: cluster_qr, 1.56s





.. rst-class:: sphx-glr-timing

   **Total running time of the script:** (0 minutes 5.263 seconds)


.. _sphx_glr_download_auto_examples_cluster_plot_coin_segmentation.py:

.. only:: html

  .. container:: sphx-glr-footer sphx-glr-footer-example

    .. container:: binder-badge

      .. image:: images/binder_badge_logo.svg
        :target: https://mybinder.org/v2/gh/scikit-learn/scikit-learn/1.8.X?urlpath=lab/tree/notebooks/auto_examples/cluster/plot_coin_segmentation.ipynb
        :alt: Launch binder
        :width: 150 px

    .. container:: lite-badge

      .. image:: images/jupyterlite_badge_logo.svg
        :target: ../../lite/lab/index.html?path=auto_examples/cluster/plot_coin_segmentation.ipynb
        :alt: Launch JupyterLite
        :width: 150 px

    .. container:: sphx-glr-download sphx-glr-download-jupyter

      :download:`Download Jupyter notebook: plot_coin_segmentation.ipynb <plot_coin_segmentation.ipynb>`

    .. container:: sphx-glr-download sphx-glr-download-python

      :download:`Download Python source code: plot_coin_segmentation.py <plot_coin_segmentation.py>`

    .. container:: sphx-glr-download sphx-glr-download-zip

      :download:`Download zipped: plot_coin_segmentation.zip <plot_coin_segmentation.zip>`


.. include:: plot_coin_segmentation.recommendations


.. only:: html

 .. rst-class:: sphx-glr-signature

    `Gallery generated by Sphinx-Gallery <https://sphinx-gallery.github.io>`_
