Reduce all objects to lines in 2-D binary image or 3-D binary volume



B = bwskel(A) reduces all objects in the 2-D binary image A to 1-pixel wide curved lines, without changing the essential structure of the image. This process, called skeletonization, extracts the centerline while preserving the topology and Euler number of the objects.


B = bwskel(V) returns the skeleton of a 3-D binary volume.


B = bwskel(___,'MinBranchLength',N) specifies the minimum branch length N of the skeleton. bwskel removes (prunes) all branches shorter than the specified length. bwskel calculates the length as the number of pixels in a branch using 8-connectivity for 2-D and 26-connectivity for 3-D.


collapse all

Read a 2-D grayscale image into the workspace. Display the image. Objects of interest are dark threads against a light background.

I = imread('threads.png');

Skeletonization requires a binary image in which foreground pixels are 1 (white) and the background is 0 (black). To make the original image suitable for skeletonization, take the complement of the image so that the objects are light and the background is dark. Then, binarize the result.

Icomplement = imcomplement(I);
BW = imbinarize(Icomplement);

Perform skeletonization of the binary image using bwskel.

out = bwskel(BW);

Display the skeleton over the original image by using the labeloverlay function. The skeleton appears as a 1-pixel wide cyan line over the dark threads.


Prune small spurs that appear on the skeleton and view the result. One short branch is pruned from a thread near the center of the image.

out2 = bwskel(BW,'MinBranchLength',15);

Read a binary image into the workspace.

BW1 = imread('circbw.tif');

Skeletonize objects in the image using the bwskel function.

BW2 = bwskel(BW1);

View the original image and the skeletonized image side by side.


Load a volumetric data set into the workspace. The name of the data set is spiralVol. Display the volume using volshow.

load spiralVol.mat;

Convert the spiralVol data set to a binary format which is required by the bwskel function.

spiralVolLogical = imbinarize(spiralVol);

Skeletonize the spiral shape in the data set. Display the skeletonized volume with volshow.

spiralVolSkel = bwskel(spiralVolLogical);


Input Arguments

collapse all

Binary image, specified as a 2-D logical array.

Data Types: logical

3-D binary volume, specified as a 3-D logical array.

Data Types: logical

Minimum branch length, specified as a nonnegative integer. bwskel prunes branches shorter than N. By default, bwskel does not prune branches.

Output Arguments

collapse all

Skeletonized image or volume, returned as a 2-D or 3-D logical array of the same size as the input image or volume.


  • While both bwskel and bwmorph can skeletonize 2-D images, you might get different results using bwmorph than when using bwskel. Because they use different algorithms, the bwskel function uses 4-connectivity with 2-D images; bwmorph uses 8-connectivity.

  • bwskel assumes that foreground objects in the binary image are white (logical true). If your image has a white background and black objects, then use the complement of your image as the input to bwskel. You can compute the complement using imcomplement.


  • The bwskel function uses the medial axis transform.


[1] Ta-Chih Lee, Rangasami L. Kashyap and Chong-Nam Chu. Building skeleton models via 3-D medial surface/axis thinning algorithms. Computer Vision, Graphics, and Image Processing, 56(6):462-478, 1994.

[2] Kerschnitzki, M, Kollmannsberger, P, Burghammer, M. et al. Architecture of the osteocyte network correlates with bone material quality. Journal of Bone and Mineral Research, 28(8):1837-1845, 2013.

Introduced in R2018a