ImageMagick: Connected Components Labeling
Author: ImageMagick Studio LLC
Description: ImageMagick® is a software suite to create, edit, compose, or convert bitmap images. It can read and write images in a variety of formats (over 200) including PNG, JPEG, JPEG-2000, GIF, WebP, Postscript, PDF, and SVG. Use ImageMagick to resize, flip, mirror, rotate, distort, shear and transform images, adjust image colors, apply various special effects, or draw text, lines, polygons, ellipses and Bézier curves.
Keywords: connected, components, labeling, ImageMagick, PerlMagick, image processing, image, photo, software, Magick++, OpenMP, convert

Connected-component labeling (alternatively connected-component analysis, blob extraction, region labeling, blob discovery, or region extraction) uniquely labels connected components in an image. The labeling process scans the image, pixel-by-pixel from top-left to bottom-right, in order to identify connected pixel regions, i.e. regions of adjacent pixels which share the same set of intensity values. For example, let's find the objects in this image:

To identify the objects in this image, use this command:

    convert objects.gif -connected-components 4 -auto-level -depth 8 objects.png

The detected objects are uniquely labeled starting with 1. Use auto leveling to visualize the detected objects:

Note, the `-connected-components` option requires ImageMagick version 6.8.9-10 or later.

Object statistics is useful to review. To display them, use this command:

    convert objects.gif -define connected-components:verbose=true -connected-components 4 objects.png

Five objects were detected with these statistics:

    Objects (id: bounding-box centroid area mean-color):
      0: 256x171+0+0 +119.2,+80.8 33117 gray(0)
      2: 120x135+104+18 +159.5,+106.5 8690 gray(255)
      3: 50x36+129+44 +154.2,+63.4 1529 gray(0)
      4: 21x23+0+45 +8.8,+55.9 409 gray(255)
      1: 4x10+252+0 +253.9,+4.1 31 gray(255)

Use `-connected-components 8` to visit 8 neighbors rather than 4. By default, neighbor colors must be exact to be part of a unique object. Use -fuzz to include pixels that are close in color.

You might want to eliminate small objects by merging them with their larger neighbors. If so, use this command:

    convert objects.gif -define connected-components:area-threshold=410 -connected-components 4 \
      -auto-level objects.jpg

Here are the expected results. Notice, how the small objects are now merged with the background.

Use the -fuzz option to identify objects that are made up of pixels similiar in color (e.g. `-fuzz 3%`).