%tableofcontents;

Quick shift is a mode seeking algorithm (like mean shift) which instead of iteratively shifting each point towards a local mean instead forms a tree of links to the nearest neighbor which increases the density. For a more in-depth description of the algorithm, see our API reference for quick shift

# Using quick shift to find superpixels

This demo shows quick shift in a simple superpixelization problem where we seek to segment this image:

The image we wish to segment

As a feature vector, we choose the LAB colorspace representation of the image augmented with the x,y location of the pixel. `vl_quickseg` is a convenient wrapper function which takes care of the transformation of the image to LAB and performs segmentation, making our job as easy as:

ratio = 0.5; kernelsize = 2; Iseg = vl_quickseg(I, ratio, kernelsize, maxdist);

where `ratio` is the tradeoff between color importance and spatial importance (larger values give more importance to color), `kernelsize` is the size of the kernel used to estimate the density, and `maxdist` is the maximum distance between points in the feature space that may be linked if the density is increased.

The effect of `maxdist` on the superpixelization. As we increase `maxdist`, superpixels become larger and larger since we can link less similar points. Top: `maxdist=10`. Bottom: `maxdist=20`.

# Multiple segmentations

Quick shift arranges all of the data points into a tree where parents in the tree are the nearest neighbors in the feature space which increase the estimate of the density. By imposing a limit on the distance between nearest neighbors (`maxdist`), we decrease the amount of computation required to search for the nearest neighbors. However, we also break our tree into a forest, because local modes of the density will now have no neighbor which is close enough in the feature space to form a link.

In the previous section, we created a superpixel segmentation by taking each of the trees in this forest as a distinct cluster. However, since `maxdist` simply prevents new links from forming, the segmentation formed by every `dist < maxdist` is contained in the result. `vl_quickvis` lets us visualize this by running quick shift once and forming multiple segmentations by cutting links in the tree which are smaller and smaller.

maxdist = 50; ndists = 10; Iedge = vl_quickvis(I, ratio, kernelsize, maxdist, ndists) imagesc(Iedge); axis equal off tight; colormap gray;
A visualization of multiple `maxdist` thresholds on a single image. Here, boundaries are colored by the largest `maxdist` where the boundary is preserved.