Esta página es para la versión anterior. La página correspondiente en inglés se eliminó en la versión actual.

Segmentación de cuencas controladas por marcadores

En este ejemplo se muestra cómo utilizar la segmentación de cuencas para separar los objetos que se tocan en una imagen. La transformación de la cuenca se aplica a menudo a este problema. La transformación de la cuenca encuentra "cuencas de captación" y "líneas de cresta de la cuenca" en una imagen al tratarla como una superficie donde los píxeles claros son altos y los píxeles oscuros son bajos.

La segmentación mediante la transformación de la cuenca funciona mejor si se puede identificar, o "marcar", objetos de primer plano y ubicaciones de fondo. La segmentación de cuencas controlada por marcadores sigue este procedimiento básico:

1. Calcular una función de segmentación. Esta es una imagen cuyas regiones oscuras son los objetos que intenta segmentar.

2. Calcular marcadores de primer plano. Se trata de blobs de píxeles conectados dentro de cada uno de los objetos.

3. Calcular marcadores de fondo. Estos son píxeles que no forman parte de ningún objeto.

4. Modifique la función de segmentación para que sólo tenga mínimos en las ubicaciones de primer plano y de marcador de fondo.

5. Calcular la transformación de la cuenca de la función de segmentación modificada.

En este ejemplo se destacan muchas funciones diferentes de procesamiento de imágenes Toolbox ™, incluidas fspecial, imfilter, watershed, label2rgb, imopen, imclose, imreconstruct, imcomplement, imregionalmax, bwareaopen, graythresh, y imimposemin.

Paso 1: Leer la imagen en color y convertirla a escala de grises

rgb = imread('pears.png'); I = rgb2gray(rgb); imshow(I)  text(732,501,'Image courtesy of Corel(R)',...      'FontSize',7,'HorizontalAlignment','right')

Paso 2: Utilice la magnitud de gradiente como la función de segmentación

Utilice las máscaras de borde del Sobel, imfilter, y una cierta aritmética simple para calcular la magnitud del gradiente. El gradiente es alto en los bordes de los objetos y bajo (sobre todo) dentro de los objetos.

hy = fspecial('sobel'); hx = hy'; Iy = imfilter(double(I), hy, 'replicate'); Ix = imfilter(double(I), hx, 'replicate'); gradmag = sqrt(Ix.^2 + Iy.^2); figure imshow(gradmag,[]), title('Gradient magnitude (gradmag)')

¿se puede segmentar la imagen mediante la transformación de la cuenca directamente en la magnitud del gradiente?

L = watershed(gradmag); Lrgb = label2rgb(L); figure, imshow(Lrgb), title('Watershed transform of gradient magnitude (Lrgb)')

Lol Sin un preprocesamiento adicional, como los cálculos de marcadores a continuación, el uso de la cuenca se transforma directamente a menudo resulta en "sobresegmentación".

Paso 3: Marcar los objetos de primer plano

Se puede aplicar una variedad de procedimientos aquí para encontrar los marcadores de primer plano, que deben estar conectados blobs de píxeles dentro de cada uno de los objetos de primer plano. En este ejemplo se usarán técnicas morfológicas llamadas "apertura por reconstrucción" y "cierre por reconstrucción" para "limpiar" la imagen. Estas operaciones crearán máximos planos dentro de cada objeto que se puede localizar usando imregionalmax.

La apertura es una erosión seguida de una dilatación, mientras que la apertura por reconstrucción es una erosión seguida de una reconstrucción morfológica. Vamos a comparar los dos. Primero, calcule la abertura usando imopen.

se = strel('disk', 20); Io = imopen(I, se); figure imshow(Io), title('Opening (Io)')

El siguiente computa la abrir-por-reconstrucción usando imerode y imreconstruct.

Ie = imerode(I, se); Iobr = imreconstruct(Ie, I); figure imshow(Iobr), title('Opening-by-reconstruction (Iobr)')

Después de la apertura con un cierre puede quitar las manchas oscuras y las marcas de vástago. Compare un cierre morfológico regular con un cierre por reconstrucción. Primera prueba imclose:

Ioc = imclose(Io, se); figure imshow(Ioc), title('Opening-closing (Ioc)')

Ahora use imdilate seguido de imreconstruct. Observe que debe complementar las entradas de imagen y la salida de imreconstruct.

Iobrd = imdilate(Iobr, se); Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr)); Iobrcbr = imcomplement(Iobrcbr); figure imshow(Iobrcbr), title('Opening-closing by reconstruction (Iobrcbr)')

Como se puede ver mediante la comparación de Iobrcbr con Ioc, la reconstrucción basada en la apertura y el cierre son más eficaces que la apertura y el cierre estándar en la eliminación de pequeñas manchas sin afectar a las formas generales de los objetos. Calcule los máximos regionales de Iobrcbr para obtener buenos marcadores de primer plano.

fgm = imregionalmax(Iobrcbr); figure imshow(fgm), title('Regional maxima of opening-closing by reconstruction (fgm)')

Para ayudar a interpretar el resultado, superponga la imagen del marcador de primer plano en la imagen original.

I2 = I; I2(fgm) = 255; figure imshow(I2), title('Regional maxima superimposed on original image (I2)')

Observe que algunos de los objetos con mayor oclusión y sombreados no están marcados, lo que significa que estos objetos no se segmentarán correctamente en el resultado final. Además, los marcadores de primer plano de algunos objetos van hasta el borde de los objetos. Eso significa que debe limpiar los bordes de los blobs de marcador y luego encogerlos un poco. Usted puede hacer esto por un cierre seguido de una erosión.

se2 = strel(ones(5,5)); fgm2 = imclose(fgm, se2); fgm3 = imerode(fgm2, se2);

Este procedimiento tiende a dejar algunos píxeles aislados extraviados que deben ser eliminados. Puede hacerlo utilizando bwareaopen, que elimina todos los blobs que tienen menos de un cierto número de píxeles.

fgm4 = bwareaopen(fgm3, 20); I3 = I; I3(fgm4) = 255; figure imshow(I3) title('Modified regional maxima superimposed on original image (fgm4)')

Paso 4: Calcular marcadores de fondo

Ahora necesitas marcar el fondo. En la imagen limpiada, Iobrcbr, los píxeles oscuros pertenecen al fondo, por lo que podría comenzar con una operación de umbral.

bw = imbinarize(Iobrcbr); figure imshow(bw), title('Thresholded opening-closing by reconstruction (bw)')

Los píxeles de fondo están en negro, pero idealmente no queremos que los marcadores de fondo estén demasiado cerca de los bordes de los objetos que estamos intentando segmentar. Vamos a "adelgazar" el fondo mediante la informática del "esqueleto por zonas de influencia", o SKIZ, del primer plano de bw. Esto se puede hacer componiendo la transformación de la línea divisoria de la distancia de bw, y luego buscando las líneas de cresta de la cuenca (DL == 0) del resultado.

D = bwdist(bw); DL = watershed(D); bgm = DL == 0; figure imshow(bgm), title('Watershed ridge lines (bgm)')

Paso 5: Calcular la transformación de la cuenca de la función de segmentación.

La función imimposemin se puede utilizar para modificar una imagen de modo que tenga mínimos regionales sólo en determinadas ubicaciones deseadas. Aquí puede utilizar imimposemin para modificar la imagen de magnitud de gradiente de modo que sus mínimos regionales sólo se produzcan en los píxeles de marcador de fondo y segundo plano.

gradmag2 = imimposemin(gradmag, bgm | fgm4);

Finalmente estamos listos para calcular la segmentación basada en cuencas.

L = watershed(gradmag2);

Paso 6: Visualizar el resultado

Una técnica de visualización es superponer los marcadores de primer plano, los marcadores de fondo y los límites de objetos segmentados en la imagen original. Puede utilizar la dilatación según sea necesario para hacer que ciertos aspectos, como los límites de los objetos, sean más visibles. Los límites de objetos se encuentran donde L == 0.

I4 = I; I4(imdilate(L == 0, ones(3, 3)) | bgm | fgm4) = 255; figure imshow(I4) title('Markers and object boundaries superimposed on original image (I4)')

Esta visualización ilustra cómo afectan el resultado las ubicaciones de los marcadores de primer plano y de fondo. En un par de ubicaciones, los objetos más oscuros parcialmente ocluidos se fusionaron con sus objetos de vecino más brillantes porque los objetos ocluidos no tenían marcadores de primer plano.

Otra técnica de visualización útil es mostrar la matriz de etiquetas como una imagen de color. Las matrices de etiquetas, como las producidas por watershed y bwlabel, se pueden convertir en imágenes truecolor con fines de visualización mediante label2rgb.

Lrgb = label2rgb(L, 'jet', 'w', 'shuffle'); figure imshow(Lrgb) title('Colored watershed label matrix (Lrgb)')

Puede utilizar transparencia para superponer esta matriz de etiqueta de pseudo-color encima de la imagen de intensidad original.

figure imshow(I) hold on himage = imshow(Lrgb); himage.AlphaData = 0.3; title('Lrgb superimposed transparently on original image')