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 en segundo plano utilizando contornos activos (serpientes)

Descripción

ejemplo

bw = activecontour(A,mask) segmenta la imagen en primer plano (objeto) y regiones de fondo mediante contornos activos.A Utilizando el algoritmo de contorno activo, también llamado, se especifican las curvas en la imagen que se mueven para encontrar los límites del objeto.Serpientes La función evoluciona la segmentación utilizando un proceso iterativo y, por defecto, 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) 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 en la que el primer plano es blanco (true lógico) 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 especificado.nmethod

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

Ejemplos

contraer todo

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

Lea una imagen en escala de grises y mostrarla.

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

Especifique el contorno inicial y mostrarlo.

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

Segmenta la imagen usando el método predeterminado y las iteraciones 300.

bw = activecontour(I,mask,300);

Mostrar el resultado.

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

Leer la imagen y mostrarla.

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

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

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

Visualice el contorno inicial en la imagen original en azul.

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

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

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

Muestra el contorno final de 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');

Leer la imagen en el espacio de trabajo y mostrarla. Mostrar 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'); 

Segmenta 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 3-D, eliminando la dimensión singleton.

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

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

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

Cree una máscara de semilla 3-D vacía y coloque los puntos de semilla en él.

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

Realice la segmentación utilizando contornos activos, especificando la máscara de inicialización.

bw = activecontour(A,mask,300);

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

Para imágenes en escala de grises en 2-D y 3-D, el tamaño de debe coincidir con el tamaño de la imagen.maskA Para las imágenes de color y multicanal, debe ser una matriz lógica 2-D 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 que se realizan en la evolución de la segmentación, especificada 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 de contorno en la iteración actual es la misma que la posición de contorno en una de las cinco iteraciones más recientes.activecontouractivecontour

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

Tipos de datos: double

Método de contorno 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 bordes, similar a Geodesic Active Contour, se describe en.2

Tipos de datos: char | string

Argumentos de par nombre-valor

Especifique pares de argumentos separados por comas opcionales. es el nombre del argumento y es el valor correspondiente. deben aparecer dentro de las cotizaciones.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 para crecer hacia el exterior o encoger hacia adentro, especificado como el par separado por comas que consta de y un escalar.'ContractionBias' Los valores positivos sesgar el contorno para encoger hacia dentro (contrato). Los valores negativos sesgar el contorno para crecer hacia fuera (expandir). Este parámetro no garantiza que el contorno se contrate (o se amplíe). 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 (true lógico) 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 producir resultados impredecibles.activecontourmaskmask Utilínela para rellenar los agujeros de las regiones.imfillmask

  • Si una región toca los bordes de la imagen, quita una capa de un solo píxel de la región, antes de procesarla, para 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 del objeto deseado, especialmente para el método.'edge'

  • Para el método, el contorno activo es naturalmente tendencioso hacia la contracción hacia adentro (colapso).'edge' En ausencia de cualquier degradado de imagen, el contorno activo se encoge por sí solo. Por el contrario, con el método, donde el contorno es imparcial, el contorno es libre de encoger o expandir en función de las características de la imagen.'Chan-Vese'

  • Para lograr una segmentación precisa con el método, especifique un contorno inicial que se encuentra fuera de los límites del objeto.'edge' El contorno activo con el método está sesgado para encoger, 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 de campo disperso, similar al método descrito en, para implementar la evolución de contorno activa.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