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.

Segmentación de cuencas controladas por marcadores

Este ejemplo muestra cómo utilizar la segmentación de cuencas hidrográficas para separar los objetos en contacto de una imagen. La transformación de cuenca hidrográfica se aplica a menudo a este problema. La transformación de cuenca hidrográfica encuentra "cuencas de captación" y "líneas de cresta de Cuenca" en una imagen tratándola como una superficie donde los píxeles de luz son altos y los píxeles oscuros son bajos.

La segmentación mediante la transformación de cuenca hidrográfica funciona mejor si puede identificar, o "marcar", objetos en primer plano y ubicaciones de fondo. La segmentación de cuencas controladas 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 está tratando de segmentar.

2. Calcular marcadores de primer plano. Estos son blobs conectados de píxeles 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 solo tenga minima en las ubicaciones de marcador de primer plano y de fondo.

5. Calcule la transformación de cuenca hidrográfica de la función de segmentación modificada.

En este ejemplo se resaltan muchas funciones diferentes de cuadro de herramientas de procesamiento de imágenes™, incluidos,,,,,,,,, y.imgradientwatershedlabel2rgblabeloverlayimopenimcloseimreconstructimcomplementimregionalmaxbwareaopengraythreshimimposemin

Paso 1: leer en la imagen de color y convertirlo 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 del degradado como la función de segmentación

Calcule la magnitud del degradado. El degradado es alto en los bordes de los objetos y bajo (principalmente) dentro de los objetos.

gmag = imgradient(I); imshow(gmag,[]) title('Gradient Magnitude')

¿Puede segmentar la imagen utilizando la transformación de cuenca hidrográfica directamente en la magnitud del degradado?

L = watershed(gmag); Lrgb = label2rgb(L); imshow(Lrgb) title('Watershed Transform of Gradient Magnitude')

No. Sin preprocesamiento adicional como los cálculos de marcador a continuación, el uso de la transformación de cuenca hidrográfica directamente a menudo resulta en "sobresegmentación."

Paso 3: Marque los objetos de primer plano

Se pueden 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 en primer plano. En este ejemplo, utilizará técnicas morfológicas denominadas "apertura por reconstrucción" y "cierre por reconstrucción" para "limpiar" la imagen. Estas operaciones crearán el maxima plano dentro de cada objeto que se pueda utilizar.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. Comparemos los dos. En primer lugar, calcule la apertura utilizando.imopen

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

A continuación, calcule la apertura por reconstrucción utilizando y.imerodeimreconstruct

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

Después de la abertura con un cierre puede eliminar las manchas oscuras y las marcas de tallo. Compare un cierre morfológico regular con un cierre por reconstrucción. Primer intento:imclose

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

Ahora usa seguido de.imdilateimreconstruct Tenga en cuenta 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); imshow(Iobrcbr) title('Opening-Closing by Reconstruction')

Como puede ver comparando con, la apertura y el cierre basados en la reconstrucción son más efectivos que la apertura y el cierre estándar en la eliminación de manchas pequeñas sin afectar a las formas generales de los objetos.IobrcbrIoc Calcule el maxima regional para obtener buenos marcadores de primer plano.Iobrcbr

fgm = imregionalmax(Iobrcbr); imshow(fgm) title('Regional Maxima of Opening-Closing by Reconstruction')

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

I2 = labeloverlay(I,fgm); imshow(I2) title('Regional Maxima Superimposed on Original Image')

Tenga en cuenta que algunos de los objetos mayormente ocluded 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 directamente hasta el borde de los objetos. Esto significa que debe limpiar los bordes de los blobs de marcador y, a continuación, reducirlos un poco. Puede hacerlo 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 perdidos que se deben quitar. Puede hacerlo utilizando, lo que elimina todos los blobs que tienen menos de un cierto número de píxeles.bwareaopen

fgm4 = bwareaopen(fgm3,20); I3 = labeloverlay(I,fgm4); imshow(I3) title('Modified Regional Maxima Superimposed on Original Image')

Paso 4: calcular marcadores de fondo

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

bw = imbinarize(Iobrcbr); imshow(bw) title('Thresholded Opening-Closing by Reconstruction')

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 intentamos segmentar. Vamos a "adelgazar" el fondo calculando el "esqueleto por zonas de influencia", o SKIZ, del primer plano.bw Esto se puede hacer calculando la transformación de cuencas de la transformación de distancia de, y luego buscando las líneas de cresta de Cuenca () del resultado.bwDL == 0

D = bwdist(bw); DL = watershed(D); bgm = DL == 0; imshow(bgm) title('Watershed Ridge Lines)')

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

La función se puede utilizar para modificar una imagen de modo que tenga mínimos regionales sólo en determinadas ubicaciones deseadas.imimposemin Aquí puede usar para modificar la imagen de magnitud de degradado para que su único minima regional se produzca en los píxeles del marcador de primer plano y de fondo.imimposemin

gmag2 = imimposemin(gmag, bgm | fgm4);

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

L = watershed(gmag2);

Paso 6: visualice el resultado

Una técnica de visualización consiste en superponer los marcadores de primer plano, los marcadores de fondo y los contornos 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 del objeto, sean más visibles. Los límites de objeto se encuentran donde.L == 0 Los marcadores binarios de primer plano y de fondo se escalan a valores enteros diferentes para que se les asignen etiquetas diferentes.

labels = imdilate(L==0,ones(3,3)) + 2*bgm + 3*fgm4; I4 = labeloverlay(I,labels); imshow(I4) title('Markers and Object Boundaries Superimposed on Original Image')

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

Otra técnica de visualización útil es mostrar la matriz de etiquetas como una imagen en color. Las matrices de etiquetas, como las producidas por y, se pueden convertir en imágenes de color verdadero para fines de visualización mediante el uso de.watershedbwlabellabel2rgb

Lrgb = label2rgb(L,'jet','w','shuffle'); imshow(Lrgb) title('Colored Watershed Label Matrix')

Puede utilizar la transparencia para superponer esta matriz de etiquetas de pseudo-color en la parte superior de la imagen de intensidad original.

figure imshow(I) hold on himage = imshow(Lrgb); himage.AlphaData = 0.3; title('Colored Labels Superimposed Transparently on Original Image')

Consulte también

| | | | | | | | | | | |