Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

Detectar células mediante la detección de bordes y la morfología

Este ejemplo muestra cómo detectar una célula utilizando la detección de bordes y la morfología básica. Un objeto puede detectarse fácilmente en una imagen si el objeto tiene suficiente contraste con el fondo.

Paso 1: Leer la imagen

Lea la imagen cell.tif, que es una imagen de una célula de cáncer de próstata. En esta imagen hay dos células, pero solo se puede ver una en su totalidad. El objetivo es detectar o segmentar la célula que es completamente visible.

I = imread('cell.tif');
imshow(I)
title('Original Image');
text(size(I,2),size(I,1)+15, ...
    'Image courtesy of Alan Partin', ...
    'FontSize',7,'HorizontalAlignment','right');
text(size(I,2),size(I,1)+25, ....
    'Johns Hopkins University', ...
    'FontSize',7,'HorizontalAlignment','right');

Figure contains an axes object. The axes object with title Original Image contains 3 objects of type image, text.

Paso 2: Detectar la totalidad de la célula

El objeto que se desea segmentar difiere en gran medida del contraste de la imagen de fondo. Los operadores que calculan el gradiente de una imagen pueden detectar los cambios en el contraste. Para crear una máscara binaria que contenga la célula segmentada, calcule la imagen del gradiente y aplique un umbral.

Utilice edge y el operador Sobel para calcular el valor umbral. Ajuste el valor umbral y utilice edge de nuevo para obtener una máscara binaria que contenga la célula segmentada.

[~,threshold] = edge(I,'sobel');
fudgeFactor = 0.5;
BWs = edge(I,'sobel',threshold * fudgeFactor);

Muestre la máscara de gradiente binaria resultante.

imshow(BWs)
title('Binary Gradient Mask')

Figure contains an axes object. The axes object with title Binary Gradient Mask contains an object of type image.

Paso 3: Dilatar la imagen

La máscara de gradiente binaria muestra líneas de alto contraste en la imagen. Estas líneas no delimitan del todo el contorno del objeto que se pretende detectar. En comparación con la imagen original, hay huecos en las líneas que rodean el objeto de la máscara de gradiente. Estos huecos lineales desaparecerán si la imagen Sobel se dilata utilizando elementos estructurantes lineales. Cree dos elementos estructurantes lineales perpendiculares mediante la función strel.

se90 = strel('line',3,90);
se0 = strel('line',3,0);

Dilate la máscara de gradiente binario utilizando el elemento estructurante vertical seguido del elemento estructurante horizontal. La función imdilate dilata la imagen.

BWsdil = imdilate(BWs,[se90 se0]);
imshow(BWsdil)
title('Dilated Gradient Mask')

Figure contains an axes object. The axes object with title Dilated Gradient Mask contains an object of type image.

Paso 4: Llenar los huecos interiores

La máscara de gradiente dilatada muestra el contorno de la célula bastante bien, pero todavía hay huecos en el interior de la célula. Para rellenar estos huecos, utilice la función imfill.

BWdfill = imfill(BWsdil,'holes');
imshow(BWdfill)
title('Binary Image with Filled Holes')

Figure contains an axes object. The axes object with title Binary Image with Filled Holes contains an object of type image.

Paso 5: Eliminar los objetos conectados en los bordes

La célula objeto de estudio se ha segmentado con éxito, pero no es el único objeto que se ha encontrado. Cualquier objeto que esté conectado al borde de la imagen puede eliminarse con la función imclearborder. Para eliminar las conexiones diagonales, ajuste la conectividad de la función imclearborder a 4.

BWnobord = imclearborder(BWdfill,4);
imshow(BWnobord)
title('Cleared Border Image')

Figure contains an axes object. The axes object with title Cleared Border Image contains an object of type image.

Paso 6: Suavizar el objeto

Por último, para que el objeto segmentado tenga un aspecto natural, suavice el objeto erosionando la imagen dos veces con un elemento estructurante de diamante. Cree el elemento estructurante de diamante con la función strel.

seD = strel('diamond',1);
BWfinal = imerode(BWnobord,seD);
BWfinal = imerode(BWfinal,seD);
imshow(BWfinal)
title('Segmented Image');

Figure contains an axes object. The axes object with title Segmented Image contains an object of type image.

Paso 7: Visualizar la segmentación

Puede utilizar la función labeloverlay para mostrar la máscara sobre la imagen original.

imshow(labeloverlay(I,BWfinal))
title('Mask Over Original Image')

Figure contains an axes object. The axes object with title Mask Over Original Image contains an object of type image.

Otro método para mostrar el objeto segmentado es dibujar un contorno alrededor de la célula segmentada. Dibuje un contorno utilizando la función bwperim.

BWoutline = bwperim(BWfinal);
Segout = I; 
Segout(BWoutline) = 255; 
imshow(Segout)
title('Outlined Original Image')

Figure contains an axes object. The axes object with title Outlined Original Image contains an object of type image.

Consulte también

| | | | | |

Temas relacionados