mirror of
https://github.com/wassname/scikit-image.git
synced 2026-06-28 03:03:07 +08:00
85 lines
3.3 KiB
Python
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()
|