This is machine translation

Translated by Microsoft
Mouseover text to see original. Click the button below to return to the English version of the page.

Note: This page has been translated by MathWorks. Click here to see
To view all translated materials including this page, select Country from the country navigator on the bottom of this page.


Segment image into foreground and background using active contours (snakes)


bw = activecontour(A,mask)
bw = activecontour(A,mask,n)
bw = activecontour(A,mask,method)
bw = activecontour(A,mask,n,method)
bw = activecontour(___,Name,Value)



bw = activecontour(A,mask) segments the image A into foreground (object) and background regions using active contours. Using the active contour algorithm, also called snakes, you specify curves on the image that move to find object boundaries. The activecontour function evolves the segmentation using an iterative process and, by default, activecontour performs 100 iterations.

The mask argument is a binary image that specifies the initial state of the active contour. The boundaries of the object regions (white) in mask define the initial contour position used for contour evolution to segment the image. The output image bw is a binary image where the foreground is white (logical true) and the background is black (logical false).

To obtain faster and more accurate segmentation results, specify an initial contour position that is close to the desired object boundaries.

bw = activecontour(A,mask,n) segments the image by evolving the contour for a maximum of n iterations.


bw = activecontour(A,mask,method) specifies the active contour method used for segmentation, either 'Chan-Vese' or 'edge'.


bw = activecontour(A,mask,n,method) segments the image by evolving the contour for a maximum of n iterations using the specified method.

bw = activecontour(___,Name,Value) specifies parameters that control various aspects of the segmentation. Parameter names can be abbreviated, and case does not matter.


collapse all

This example shows how to segment an image using the default settings of the activecontour function.

Read a grayscale image and display it.

I = imread('coins.png');
title('Original Image')

Specify the initial contour and display it.

mask = zeros(size(I));
mask(25:end-25,25:end-25) = 1;
title('Initial Contour Location')

Segment the image using the default method and 300 iterations.

bw = activecontour(I,mask,300);

Display the result.

title('Segmented Image')

Read image and display it.

I = imread('toyobjects.png');
hold on
title('Original Image');

Specify initial contour location close to the object that is to be segmented.

mask = false(size(I));
mask(50:150,40:170) = true;

Display the initial contour on the original image in blue.


Segment the image using the 'edge' method and 200 iterations.

bw = activecontour(I, mask, 200, 'edge');

Display the final contour on the original image in red.

title('Initial contour (blue) and final contour (red)');

Display segmented image.

figure, imshow(bw)
title('Segmented Image');

Read image into the workspace and display it. Display instructions to specify initial contour location.

I = imread('toyobjects.png');
str = 'Click to select initial contour location. Double-click to confirm and proceed.';
disp(sprintf('\nNote: Click close to object boundaries for more accurate result.'))

Specify initial contour interactively.

mask = roipoly;
figure, imshow(mask)
title('Initial MASK');

Segment the image, specifying 200 iterations.

maxIterations = 200; 
bw = activecontour(I, mask, maxIterations, 'Chan-Vese');
% Display segmented image
figure, imshow(bw)
title('Segmented Image');

Load 3-D volumetric image data, removing the singleton dimension.

D = load('mri.mat');
A  = squeeze(D.D);

Create 2-D mask for initial seed points.

seedLevel = 10;
seed = A(:,:,seedLevel) > 75;

Create an empty 3-D seed mask and put the seed points into it.

mask = zeros(size(A));
mask(:,:,seedLevel) = seed;

Perform the segmentation using active contours, specifying the seed mask.

bw = activecontour(A,mask,300);

Display the 3-D segmented image.

p = patch(isosurface(double(bw)));
p.FaceColor = 'red';
p.EdgeColor = 'none';
daspect([1 1 27/128]);
lighting phong

Input Arguments

collapse all

Image to segmented, specified as a nonsparse, 2-D or 3-D, numeric array.

Data Types: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32

Initial contour at which the evolution of the segmentation begins, specified as a binary image the same size as A.

For 2-D and 3-D grayscale images, the size of mask must match the size of the image A. For color and multi-channel images, mask must be a 2-D logical array where the first two dimensions match the first two dimensions of the image A.

Data Types: logical

Maximum number of iterations to perform in evolution of the segmentation, specified as a numeric scalar. activecontour stops the evolution of the active contour when it reaches the maximum number of iterations. activecontour also stops the evolution if the contour position in the current iteration is the same as the contour position in one of the most recent five iterations.

If the initial contour position (specified by mask) is far from the object boundaries, specify higher values of n to achieve desired segmentation results.

Data Types: double

Active contour method used for segmentation, specified as 'Chan-Vese' or 'edge'. The Chan and Vese region-based energy model is described in [1]. The edge-based model, similar to Geodesic Active Contour, is described in [2].

Data Types: char | string

Name-Value Pair Arguments

Specify optional comma-separated pairs of Name,Value arguments. Name is the argument name and Value is the corresponding value. Name must appear inside quotes. You can specify several name and value pair arguments in any order as Name1,Value1,...,NameN,ValueN.

Example: bw = activecontour(I, mask, 200, 'edge','SmoothFactor',1.5);

Degree of smoothness or regularity of the boundaries of the segmented regions, specified as the comma-separated pair consisting of 'SmoothFactor' and a positive numeric scalar. Higher values produce smoother region boundaries but can also smooth out finer details. Lower values produce more irregularities (less smoothing) in the region boundaries but allow finer details to be captured. The default smoothness value depends on the method chosen.

Example: bw = activecontour(I, mask, 200, 'edge','SmoothFactor',1.5);

Data Types: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32

Tendency of the contour to grow outwards or shrink inwards, specified as the comma-separated pair consisting of 'ContractionBias' and a scalar. Positive values bias the contour to shrink inwards (contract). Negative values bias the contour to grow outwards (expand). This parameter does not guarantee that the contour contracts (or expands). It is possible that even with a positive value for this parameter, the contour could actually expand. However, by specifying a bias, you slow the expansion when compared to an unbiased contour. Typical values for this parameter are between -1 and 1.

Example: bw = activecontour(I, mask, 200, 'edge','ContractionBias',0.4);

Data Types: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32

Output Arguments

collapse all

Segmented image, returned as a binary image the same size as the input image A. The foreground is white (logical true) and the background is black (logical false).


  • activecontour uses the boundaries of the regions in mask as the initial state of the contour from where the evolution starts. mask regions with holes can cause unpredictable results. Use imfill to fill any holes in the regions in mask.

  • If a region touches the image borders, activecontour removes a single-pixel layer from the region, before further processing, so that the region does not touch the image border.

  • To get faster and more accurate results, specify an initial contour position that is close to the desired object boundaries, especially for the 'edge' method.

  • For the 'edge' method, the active contour is naturally biased towards shrinking inwards (collapsing). In the absence of any image gradient, the active contour shrinks on its own. Conversely, with the 'Chan-Vese' method, where the contour is unbiased, the contour is free to either shrink or expand based on the image features.

  • To achieve an accurate segmentation with the 'edge' method, specify an initial contour that lies outside the boundaries of the object. The active contour with the 'edge' method is biased to shrink, by default.

  • If object regions are of significantly different grayscale intensities, the 'Chan-Vese' method [1] might not segment all objects in the image. For example, if the image contains objects that are brighter than the background and some that are darker, the 'Chan-Vese' method typically segments out either the dark or the bright objects only.


activecontour uses the Sparse-Field level-set method, similar to the method described in [3], for implementing active contour evolution.


[1] T. F. Chan, L. A. Vese, Active contours without edges. IEEE Transactions on Image Processing, Volume 10, Issue 2, pp. 266-277, 2001

[2] V. Caselles, R. Kimmel, G. Sapiro, Geodesic active contours. International Journal of Computer Vision, Volume 22, Issue 1, pp. 61-79, 1997.

[3] R. T. Whitaker, A level-set approach to 3d reconstruction from range data. International Journal of Computer Vision, Volume 29, Issue 3, pp.203-231, 1998.

Introduced in R2013a