Files
scikit-image/doc/examples/plot_segmentations.py
T
Andreas Mueller f22ae2871a Pep8
2012-08-05 13:54:02 +01:00

85 lines
3.3 KiB
Python

"""
====================================================
Comparison of segmentation and superpixel algorithms
====================================================
This example compares three popular low-level image segmentation methods. As
it is difficult do obtain good segmentations, and the definition of "good"
often depends on the application, these methods are usually used for optaining
an oversegmentation, also known as superpixels. These superpixels then serve as
the level of operation for more sophisticated algorithms such as CRFs.
Felzenszwalb's efficient graph based segmentation
-------------------------------------------------
This fast 2d image segmentation algorithm, proposed in [1]_ is popular in the
computer vision community.
The algorithm has a single ``scale`` parameter that influences the segment
size. The actual size and number of segments can vary greatly, depending on
local contrast.
.. [1] Efficient graph-based image segmentation, Felzenszwalb, P.F. and
Huttenlocher, D.P. International Journal of Computer Vision, 2004
Quickshift image segmentation
-----------------------------
Quickshift is a relatively recent 2d image segmentation algorithm, based on an
approximation of kernelized mean-shift. Therefore it belongs to the family
of local mode-seeking algorithms and is applied to the color+coordinate space,
see [2]_.
One of the benefits of quickshift is that it actually computes a
hierarchical segmentation on multiple scales simultaneously.
Quickshift has two parameters, one controlling the scale of the local
density approximation, the other selecting a level in the hierarchical
segmentation that is produced.
.. [2] Quick shift and kernel methods for mode seeking,
Vedaldi, A. and Soatto, S.
European Conference on Computer Vision, 2008
SLIC - K-Means based image segmentation
---------------------------------------
This algorithm simply performs K-kmeans in the 5d color-coordinate space and is
therefore closely related to quickshift. As the clustering method is simpler,
it is very efficient. It is essential for this algorithm to work in Lab color
space to obtain good results. The algorithm quickly gained momentum and is now
widely used. See [3] for details.
.. [3] Radhakrishna Achanta, Appu Shaji, Kevin Smith, Aurelien Lucchi,
Pascal Fua, and Sabine Suesstrunk, SLIC Superpixels Compared to
State-of-the-art Superpixel Methods, TPAMI, May 2012.
"""
print __doc__
import matplotlib.pyplot as plt
import numpy as np
from skimage.data import lena
from skimage.segmentation import felzenszwalb_segmentation, \
visualize_boundaries, slic, quickshift
from skimage.util import img_as_float
img = img_as_float(lena()[::2, ::2])
segments_fz = felzenszwalb_segmentation(img, scale=100, sigma=0.5, min_size=50)
segments_slic = slic(img, ratio=10, n_segments=250, sigma=1)
segments_quick = quickshift(img, kernel_size=3, max_dist=6, ratio=0.5)
print("Felzenszwalb's number of segments: %d" % len(np.unique(segments_fz)))
print("Slic number of segments: %d" % len(np.unique(segments_slic)))
print("Quickshift number of segments: %d" % len(np.unique(segments_quick)))
fig, ax = plt.subplots(1, 3)
ax[0].imshow(visualize_boundaries(img, segments_fz))
ax[1].imshow(visualize_boundaries(img, segments_slic))
ax[2].imshow(visualize_boundaries(img, segments_quick))
for a in ax:
a.set_xticks(())
a.set_yticks(())
plt.show()