.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_examples/segmentation/plot_rag_merge.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code or to run this example in your browser via Binder .. rst-class:: sphx-glr-example-title .. _sphx_glr_auto_examples_segmentation_plot_rag_merge.py: ==================================== Region adjacency graph (RAG) Merging ==================================== This example constructs a Region Adjacency Graph (RAG) and progressively merges regions that are similar in color. Merging two adjacent regions produces a new region with all the pixels from the merged regions. Regions are merged until no highly similar region pairs remain. .. GENERATED FROM PYTHON SOURCE LINES 12-81 .. image-sg:: /auto_examples/segmentation/images/sphx_glr_plot_rag_merge_001.png :alt: plot rag merge :srcset: /auto_examples/segmentation/images/sphx_glr_plot_rag_merge_001.png :class: sphx-glr-single-img .. code-block:: Python from skimage import data, io, segmentation, color from skimage import graph import numpy as np def _weight_mean_color(graph, src, dst, n): """Callback to handle merging nodes by recomputing mean color. The method expects that the mean color of `dst` is already computed. Parameters ---------- graph : RAG The graph under consideration. src, dst : int The vertices in `graph` to be merged. n : int A neighbor of `src` or `dst` or both. Returns ------- data : dict A dictionary with the `"weight"` attribute set as the absolute difference of the mean color between node `dst` and `n`. """ diff = graph.nodes[dst]['mean color'] - graph.nodes[n]['mean color'] diff = np.linalg.norm(diff) return {'weight': diff} def merge_mean_color(graph, src, dst): """Callback called before merging two nodes of a mean color distance graph. This method computes the mean color of `dst`. Parameters ---------- graph : RAG The graph under consideration. src, dst : int The vertices in `graph` to be merged. """ graph.nodes[dst]['total color'] += graph.nodes[src]['total color'] graph.nodes[dst]['pixel count'] += graph.nodes[src]['pixel count'] graph.nodes[dst]['mean color'] = ( graph.nodes[dst]['total color'] / graph.nodes[dst]['pixel count'] ) img = data.coffee() labels = segmentation.slic(img, compactness=30, n_segments=400, start_label=1) g = graph.rag_mean_color(img, labels) labels2 = graph.merge_hierarchical( labels, g, thresh=35, rag_copy=False, in_place_merge=True, merge_func=merge_mean_color, weight_func=_weight_mean_color, ) out = color.label2rgb(labels2, img, kind='avg', bg_label=0) out = segmentation.mark_boundaries(out, labels2, (0, 0, 0)) io.imshow(out) io.show() .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 1.610 seconds) .. _sphx_glr_download_auto_examples_segmentation_plot_rag_merge.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-image/scikit-image/v0.23.2?filepath=notebooks/auto_examples/segmentation/plot_rag_merge.ipynb :alt: Launch binder :width: 150 px .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_rag_merge.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_rag_merge.py ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_