Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

activecontour

Segmentar una imagen para separar el primer plano y el fondo mediante la técnica de crecimiento regional de contornos activos (snakes)

Descripción

La técnica de contornos activos, también llamada snakes, es un algoritmo iterativo de segmentación de imágenes por regiones. Mediante el algoritmo de contornos activos, se especifican curvas iniciales en una imagen y, a continuación, se utiliza la función activecontour para hacer evolucionar las curvas hacia los límites del objeto.

ejemplo

BW = activecontour(A,mask) segmenta la imagen A en regiones de primer plano (objeto) y de fondo mediante contornos activos.

El argumento mask es una imagen binaria que especifica el estado inicial del contorno activo. Los límites de las regiones del objeto (blanco) en mask definen la posición inicial del contorno utilizada para evolucionarlo con el fin de segmentar la imagen. La imagen de salida BW es una imagen binaria en la que el primer plano es blanco (true lógico) y el fondo es negro (false lógico).

Para obtener resultados de segmentación más rápidos y precisos, especifique una posición inicial del contorno cercana a los límites del objeto deseado.

BW = activecontour(A,mask,n) segmenta la imagen evolucionando el contorno durante un máximo de n iteraciones.

ejemplo

BW = activecontour(A,mask,method) especifica el método de contornos activos utilizado en la segmentación como "Chan-Vese" o "edge". Para imágenes RGB, el método debe ser "Chan-Vese".

BW = activecontour(A,mask,n,method) segmenta la imagen evolucionando el contorno durante un máximo de n iteraciones mediante el method especificado.

BW = activecontour(___,Name,Value) especifica argumentos de par nombre-valor que controlan varios aspectos de la segmentación.

Ejemplos

contraer todo

Lea una imagen en escala de grises y muéstrela.

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

Figure contains an axes object. The axes object with title Original Image contains an object of type image.

Especifique un contorno inicial que rodee los objetos de interés. Muestre el contorno.

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

Figure contains an axes object. The axes object with title Initial Contour Location contains an object of type image.

Segmente la imagen usando la función activecontour. De forma predeterminada, la función evoluciona la segmentación durante 100 iteraciones.

bw = activecontour(I,mask);

Muestre el resultado. Después de 100 iteraciones, los objetos no están completamente segmentados del fondo porque el contorno original no está cerca de los límites del objeto.

imshow(bw)
title('Segmented Image, 100 Iterations')

Figure contains an axes object. The axes object with title Segmented Image, 100 Iterations contains an object of type image.

Para seguir evolucionando la segmentación, aumente el número de iteraciones. Después de 300 iteraciones, los objetos están completamente segmentados del fondo.

bw = activecontour(I,mask,300);
imshow(bw)
title('Segmented Image, 300 Iterations')

Figure contains an axes object. The axes object with title Segmented Image, 300 Iterations contains an object of type image.

Lea una imagen en escala de grises y muéstrela.

I = imread('toyobjects.png');
imshow(I)

Dibuje un contorno inicial cerca del objeto de interés usando la función drawrectangle. Después de dibujar el contorno, cree una máscara con la función createMask.

r = drawrectangle;

mask = createMask(r);

Segmente la imagen usando el método 'edge' y 200 iteraciones.

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

Muestre el contorno final sobre la imagen original en rojo.

hold on;
visboundaries(bw,'Color','r'); 

Muestre el resultado de la segmentación sobre la imagen original. El objeto que aparece en primer plano es de color azul.

figure
imshow(labeloverlay(I,bw));

Cargue los datos de las imágenes volumétricas en 3D y elimine la dimensión singleton.

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

Cree una máscara 2D para los puntos semilla iniciales.

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

Figure contains an axes object. The axes object contains an object of type image.

Cree una máscara semilla 3D vacía y coloque en ella los puntos semilla.

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

Realice la segmentación usando contornos activos, especificando la máscara semilla.

bw = activecontour(A,mask,300);

Muestre la imagen 3D segmentada.

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

Figure contains an axes object. The axes object contains an object of type patch.

Argumentos de entrada

contraer todo

Imagen que se desea segmentar, especificada como matriz numérica 2D o arreglo numérico 3D.

Tipos de datos: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32

Contorno inicial en el que comienza la evolución de la segmentación, especificado como imagen binaria del mismo tamaño que A. Para imágenes 2D y 3D en escala de grises, el tamaño de mask debe coincidir con el tamaño de la imagen A. Para imágenes en color y multicanal, mask debe ser un arreglo lógico 2D en el que las dos primeras dimensiones coincidan con las dos primeras dimensiones de la imagen A.

Puede crear una máscara de forma interactiva con objetos de ROI. Por ejemplo, dibuje una ROI poligonal con la función drawpolygon y, a continuación, cree una máscara a partir de dicha ROI utilizando la función createMask.

Tipos de datos: logical

Número máximo de iteraciones que realizar en la evolución de la segmentación, especificado como entero positivo. activecontour detiene la evolución del contorno activo cuando alcanza el número máximo de iteraciones. activecontour también detiene la evolución si la posición del contorno en la iteración actual es la misma que en una de las cinco iteraciones más recientes.

Si la posición inicial del contorno (especificada por mask) está lejos de los límites del objeto, especifique valores mayores de n para lograr los resultados de segmentación deseados.

Método de contornos activos utilizado para la segmentación, especificado como "Chan-Vese" o "edge". El modelo energético basado en regiones Chan-Vese se describe en [1]. El modelo basado en la función edge, similar a los contornos activos geodésicos, se describe en [2].

Para imágenes RGB, el método debe ser "Chan-Vese".

Tipos de datos: char | string

Argumentos de par nombre-valor

Especifique pares de argumentos opcionales como Name1=Value1,...,NameN=ValueN, donde Name es el nombre del argumento y Value es el valor correspondiente. Los argumentos de nombre-valor deben aparecer después de otros argumentos. Sin embargo, el orden de los pares no importa.

Ejemplo: SmoothFactor=1.5

En las versiones anteriores a la R2021a, utilice comas para separar cada nombre y valor, y encierre Name entre comillas.

Ejemplo: "SmoothFactor",1.5

Grado de suavidad o regularidad de los límites de las regiones segmentadas, especificado como número no negativo. Los valores más altos suavizan los límites de las regiones, pero también difuminan los detalles más pequeños. Los valores más bajos producen más irregularidades (menos suavizado) en los límites de las regiones, pero permiten captar detalles más pequeños. El valor de suavidad predeterminado es 0 para el método "Chan-Vese" y 1 para el método "edge".

Tipos de datos: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32

Tendencia del contorno a crecer hacia el exterior o encogerse hacia el interior, especificada como número. Los valores positivos introducen un sesgo para que el contorno se encoja hacia el interior (se contrae). Los valores positivos introducen un sesgo para que el contorno crezca hacia el exterior (se expande). Este argumento no garantiza que el contorno se contraiga o se expanda. Es posible que incluso usando un valor positivo en este argumento, el contorno se expanda. Sin embargo, si se especifica un sesgo se ralentiza la expansión en comparación con un contorno sin sesgo. Los valores típicos para este argumento están entre -1 y 1. El sesgo de contracción predeterminado es 0 para el método "Chan-Vese" y 0.3 para el método "edge".

Tipos de datos: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32

Argumentos de salida

contraer todo

Imagen segmentada, devuelta como arreglo lógico del mismo tamaño que la imagen de entrada A. El primer plano es blanco (true lógico) y el fondo es negro (false lógico).

Tipos de datos: logical

Sugerencias

  • activecontour utiliza los límites de las regiones de mask como estado inicial del contorno a partir del cual empieza la evolución. La existencia de huecos en la máscara puede causar resultados impredecibles. Utilice imfill para rellenar los huecos que haya en las regiones de mask.

  • Si una región toca los bordes de la imagen, activecontour elimina una capa de un solo píxel de la región, antes de seguir procesándola, para que la región no toque el borde de la imagen.

  • Para obtener resultados más rápidos y precisos, especifique una posición inicial del contorno que esté cerca de los límites deseados del objeto, especialmente en el caso del método "edge".

  • En el método "edge", el contorno activo está sesgado a encogerse hacia el interior (contraerse). Si no hay ningún gradiente en la imagen, el contorno activo se encoge por sí solo. Por el contrario, con el método "Chan-Vese", en el que no está sesgado, el contorno es libre de contraerse o expandirse en función de las características de la imagen.

  • Para lograr una segmentación precisa con el método "edge", especifique un contorno inicial que se encuentre fuera de los límites del objeto. El contorno activo con el método "edge" está sesgado a encogerse de forma predeterminada.

  • Si las regiones de los objetos tienen intensidades de escala de grises significativamente diferentes, es posible que el método "Chan-Vese"[1] no segmente todos los objetos de la imagen. Por ejemplo, si la imagen contiene objetos más claros que el fondo y otros más oscuros, el método "Chan-Vese" suele segmentar bien los objetos oscuros, bien los brillantes únicamente.

Algoritmos

activecontour utiliza el método Sparse-Field level-set, similar al método descrito en [3], para implementar la evolución activa del contorno.

Referencias

[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.

Historial de versiones

Introducido en R2013a