Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

activecontour

Segmentar la imagen en primer plano y fondo usando contornos activos (serpientes)

Descripción

ejemplo

bw = activecontour(A,mask) segmenta la imagen en regiones de primer plano (objeto) y fondo utilizando curvas de nivel activas.A Mediante el algoritmo de curva de nivel activo, también denominado , se especifican curvas en la imagen que se mueven para buscar límites de objeto.Serpientes La función evoluciona la segmentación mediante un proceso iterativo y, de forma predeterminada, realiza 100 iteraciones.activecontouractivecontour

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

Para obtener resultados de segmentación más rápidos y precisos, especifique una posición de contorno inicial que esté cerca de los límites de objeto deseados.

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

ejemplo

bw = activecontour(A,mask,method) especifica el método de contorno activo utilizado para la segmentación, ya sea o .'Chan-Vese''edge'

ejemplo

bw = activecontour(A,mask,n,method) segmenta la imagen evolucionando el contorno para un máximo de iteraciones utilizando el archivo .nmethod

bw = activecontour(___,Name,Value) especifica parámetros que controlan varios aspectos de la segmentación. Los nombres de los parámetros se pueden abreviar y el caso no importa.

Ejemplos

contraer todo

En este ejemplo se muestra cómo segmentar una imagen utilizando la configuración predeterminada de la función.activecontour

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

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

Especifique el contorno inicial y muéselo.

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

Segmente la imagen utilizando el método predeterminado y 300 iteraciones.

bw = activecontour(I,mask,300);

Muestre el resultado.

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

Lea la imagen y muésela.

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

Especifique la ubicación inicial del contorno cerca del objeto que se va a segmentar.

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

Muestre el contorno inicial en la imagen original en azul.

visboundaries(mask,'Color','b');

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

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

Muestre el contorno final en la imagen original en rojo.

visboundaries(bw,'Color','r');  title('Initial contour (blue) and final contour (red)');

Mostrar imagen segmentada.

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

Lea la imagen en el espacio de trabajo y muéstrala. Visualice las instrucciones para especificar la ubicación inicial del contorno.

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

Especifique el contorno inicial de forma interactiva.

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

Segmente la imagen, especificando 200 iteraciones.

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

Cargue datos de imagen volumétrica 3D, eliminando la dimensión singleton.

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

Cree una máscara 2D para los puntos iniciales de inicialización.

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

Crea una máscara de semilla 3D vacía y pon los puntos de semilla en ella.

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

Realice la segmentación utilizando curvas de nivel activas, especificando la máscara de semilla.

bw = activecontour(A,mask,300);

Muestre la imagen segmentada en 3D.

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

Argumentos de entrada

contraer todo

Imagen a segmentada, especificada como una matriz numérica no dispersa, 2-D o 3-D.

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 una imagen binaria del mismo tamaño que .A

Para las imágenes en escala de grises 2D y 3D, el tamaño debe coincidir con el tamaño de la imagen.maskA Para las imágenes en color y multicanal, debe ser una matriz lógica 2D donde las dos primeras dimensiones coincidan con las dos primeras dimensiones de la imagen.maskA

Tipos de datos: logical

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

Si la posición de curva de nivel inicial (especificada por ) está lejos de los límites del objeto, especifique valores más altos de para lograr los resultados de segmentación deseados.maskn

Tipos de datos: double

Método de curva de nivel activo utilizado para la segmentación, especificado como o .'Chan-Vese''edge' El modelo energético basado en la región Chan y Vese se describe en .[1] El modelo basado en aristas, similar a Geodesic Active Contour, se describe en .[2]

Tipos de datos: char | string

Argumentos de par nombre-valor

Especifique pares opcionales separados por comas de argumentos. es el nombre del argumento y es el valor correspondiente. deben aparecer entre comillas.Name,ValueNameValueName Puede especificar varios argumentos de par de nombre y valor en cualquier orden como .Name1,Value1,...,NameN,ValueN

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

Grado de suavidad o regularidad de los límites de las regiones segmentadas, especificado como el par separado por comas que consta de un escalar numérico positivo.'SmoothFactor' Los valores más altos producen límites de región más suaves, pero también pueden suavizar los detalles más finos. Los valores más bajos producen más irregularidades (menos suavizado) en los límites de la región, pero permiten capturar detalles más finos. El valor de suavizado predeterminado depende del método elegido.

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

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

Tendencia del contorno a crecer hacia afuera o encogerse hacia adentro, especificada como el par separado por comas que consta de y un escalar.'ContractionBias' Los valores positivos sesgan el contorno para reducir hacia adentro (contrato). Los valores negativos sesgan el contorno para crecer hacia afuera (expandir). Este parámetro no garantiza que el contorno se contrae (o se expande). Es posible que incluso con un valor positivo para este parámetro, el contorno realmente podría expandirse. Sin embargo, al especificar un sesgo, se ralentiza la expansión en comparación con un contorno imparcial. Los valores típicos de este parámetro están entre -1 y 1.

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

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

Argumentos de salida

contraer todo

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

Sugerencias

  • utiliza los límites de las regiones como el estado inicial del contorno desde donde comienza la evolución. regiones con agujeros pueden causar resultados impredecibles.activecontourmaskmask Se utiliza para rellenar los agujeros de las regiones de .imfillmask

  • Si una región toca los bordes de la imagen, elimina una capa de un solo píxel de la región, antes de su posterior procesamiento, de modo que la región no toque el borde de la imagen.activecontour

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

  • Para el método, el contorno activo está naturalmente sesgado hacia la contracción hacia adentro (colapsado).'edge' En ausencia de degradado de imagen, el contorno activo se reduce por sí solo. Por el contrario, con el método, donde el contorno es imparcial, el contorno es libre de reducir o expandir en función de las entidades de imagen.'Chan-Vese'

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

  • Si las regiones de objeto tienen intensidades de escala de grises significativamente diferentes, es posible que el método no segmente todos los objetos de la imagen.'Chan-Vese'[1] Por ejemplo, si la imagen contiene objetos que son más brillantes que el fondo y algunos que son más oscuros, el método normalmente segmenta los objetos oscuros o brillantes solamente.'Chan-Vese'

Algoritmos

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

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.

Introducido en R2013a