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 hidrográficas controladas por marcadores

En este ejemplo se 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 cuencas hidrográficas encuentra "cuencas de captación" y "líneas de cresta de cuenca" en una imagen tratándola 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 cuenca hidrográfica funciona mejor si se puede identificar, o "marcar", objetos de primer plano y ubicaciones de fondo. La segmentación de cuencas hidrográficas 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 está intentando 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 mínimos en las ubicaciones de marcador de primer plano y de fondo.

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

En este ejemplo se resaltan muchas funciones diferentes de Image Processing Toolbox™, como , , , , , , , , , , , .imgradientwatershedlabel2rgblabeloverlayimopenimcloseimreconstructimcomplementimregionalmaxbwareaopengraythreshimimposemin

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

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

Paso 2: Utilice la Magnitud del Degradado como función de segmentación

Calcular 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 marcadores a continuación, el uso de la transformación de cuenca hidrográfica directamente a menudo da como resultado una "sobresegmentación".

Paso 3: Marca los objetos de primer plano

Aquí se podría aplicar una variedad de procedimientos para buscar 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 utilizará técnicas morfológicas llamadas "apertura por reconstrucción" y "cierre por reconstrucción" para "limpiar" la imagen. Estas operaciones crearán un máximo plano dentro de cada objeto que se pueda ubicar utilizando .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 abertura utilizando .imopen

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

A continuación, calcule la apertura por reconstrucción mediante 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 del 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 use seguido de .imdilateimreconstruct 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); imshow(Iobrcbr) title('Opening-Closing by Reconstruction')

Como se puede ver comparando con , apertura basada en reconstrucción y cierre son más eficaces que la apertura y el cierre estándar en la eliminación de pequeñas imperfecciones sin afectar a las formas generales de los objetos.IobrcbrIoc Calcular el máximo regional de 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, superponga la imagen del marcador de primer plano en la imagen original.

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

Observe que algunos de los objetos principalmente ocluidos 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. Esto significa que debe limpiar los bordes de los blobs de marcadores y, a continuación, reducirlos un poco. Puede hacerlo mediante 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 mediante , lo que quita todos los blobs que tienen menos de un número determinado 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 lo ideal es que no queremos que los marcadores de fondo estén demasiado cerca de los bordes de los objetos que estamos tratando de segmentar. Vamos a "delgada" el fondo calculando el "esqueleto por zonas de influencia", o SKIZ, del primer plano de .bw Esto se puede hacer calculando la transformación de cuenca hidrográfica de la transformación de distancia de , y luego buscando las líneas de cresta de cuenca hidrográfica ( ) 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 hidrográfica de la función de segmentación.

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

gmag2 = imimposemin(gmag, bgm | fgm4);

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

L = watershed(gmag2);

Paso 6: Visualizar el resultado

Una técnica de visualización consiste en 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 más visibles determinados aspectos, como los límites del objeto. Los límites de los objetos se encuentran donde .L == 0 Los marcadores binarios de primer plano y de fondo se escalan a diferentes valores enteros 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 afectan al 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 vecinos 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 en color. Las matrices de etiquetas, como las producidas por y , se pueden convertir en imágenes truecolor para fines de visualización mediante .watershedbwlabellabel2rgb

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

Puede utilizar la transparencia para superponer esta matriz de etiquetas pseudocolor encima 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

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