Crate skeletonize[][src]

A line thinning library for binary images, including edge detection and threshold functions for preprocessing images into binary images.

The goal of thinning is to remove excess pixels from the image until the lines present are one pixel wide, resembling a “skeleton” of the original pattern.

The thinning algorithms are based on the papers Zhang & Suen, 1984 and Chen & Hsu, 1988. See Reference.


There are three main workflows for thinning images with this library. The second and third workflows produce binarized images with library functions before thinning the image.

The generic ForegroundColor parameter on edge_detection::sobel, edge_detection::sobel4, and thin_image_edges specifies what foreground and background colors the resulting thin_image_edges image will produce. The foreground color is the color of the line to be thinned. A foreground color of white will have a black background and a foreground of black will have a white background. The generic parameters must match when using an edge detection function in combination with the thinning function.

An example program can be viewed at /examples/

No preprocessing

The image is already binarized so the edges can be thinned immediately.

use skeletonize::{foreground, thin_image_edges, MarkingMethod};

let method = MarkingMethod::Modified;

thin_image_edges::<foreground::Black>(&mut img, method, None)?;

If this produces poor results and/or takes a long time to run:

  • the incorrect foreground color may have been chosen - try using the opposite color, or
  • the image may not be binary and needs to be thresholded.

Edge detection

Run an edge detection filter on the image and threshold those results before thinning the lines. Note that the foreground color parameters must match on the edge detection function and the thinning function.

use skeletonize::edge_detection::sobel4;
use skeletonize::{foreground, thin_image_edges, MarkingMethod};

let method = MarkingMethod::Modified;
let threshold = Some(0.1);

let mut filtered = sobel4::<foreground::White>(&img, threshold)?;
thin_image_edges::<foreground::White>(&mut filtered, method, None)?;


Threshold the image before thinning, e.g., cleaning up a grayscale image.

use skeletonize::{foreground, thin_image_edges, threshold, MarkingMethod};

let method = MarkingMethod::Modified;
let threshold = 0.1;

skeletonize::threshold(&mut img, threshold)?;
thin_image_edges::<foreground::Black>(&mut img, method, None)?;


Zhang, T. Y. & Suen, C. Y. (1984). A fast parallel algorithm for thinning digital patterns. Commun. ACM 27, 3 (March 1984), 236–239. DOI:10.1145/357994.358023

Chen, Yung-Sheng & Hsu, Wen-Hsing. (1988). A modified fast parallel algorithm for thinning digital patterns. Pattern Recognition Letters. 7. 99-106. DOI:10.1016/0167-8655(88)90124-9



Edge detection algorithms for preprocessing images.


Image thinning error enums.


Implementations of ForegroundColor.


Struct and utilities for calculating the status of neighboring pixels.



Classification of pixels in an image used for edge thinning.


The algorithm that determines which pixels are removed during the edge thinning process.



Represents the color of the foreground or features in a binary image. For example, white text on a black background has a white foreground color and black background color.



Perform image thinning on a binarized image img using one of the methods in MarkingMethod. Returns the number of iterations needed for thinning on successful completion.


Create a binary image where values below threshold become black and above become white. threshold ranges from 0.0 to 1.0.