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

Detección de una celda mediante segmentación de imágenes

En este ejemplo se muestra cómo detectar una celda mediante la detección de bordes y la morfología básica. Un objeto se puede detectar fácilmente en una imagen si el objeto tiene suficiente contraste con el fondo. En este ejemplo, las células son células cancerosas de la próstata.

Paso 1: Leer imagen

Leer en la imagen cell.tif, que es una imagen de una célula de cáncer de próstata.

I = imread('cell.tif'); figure, 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');

Paso 2: Detectar células enteras

Dos células están presentes en esta imagen, pero sólo una célula se puede ver en su totalidad. Vamos a detectar esta célula. Otra palabra para la detección de objetos es la segmentación. El objeto a segmentar difiere enormemente en contraste con la imagen de fondo. Los cambios en el contraste pueden ser detectados por los operadores que calculan el gradiente de una imagen. Se puede calcular la imagen de degradado y se puede aplicar un umbral para crear una máscara binaria que contenga la celda segmentada. En primer lugar, usamos edge y el operador Sobel para calcular el valor de umbral. A continuación, afinamos el valor de umbral y usamos edge de nuevo para obtener una máscara binaria que contenga la celda segmentada.

[~, threshold] = edge(I, 'sobel'); fudgeFactor = .5; BWs = edge(I,'sobel', threshold * fudgeFactor); figure, imshow(BWs), title('binary gradient mask');

Paso 3: Dilatar la imagen

La máscara de degradado binario muestra líneas de alto contraste en la imagen. Estas líneas no delinean del todo el contorno del objeto de interés. En comparación con la imagen original, puede ver las brechas en las líneas que rodean al objeto en la máscara de degradado. Estas brechas lineales desaparecerán si la imagen Sobel se dilata utilizando elementos de estructuración lineal, que podemos crear con la función strel.

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

La máscara de degradado binario se dilata utilizando el elemento de estructuración vertical seguido del elemento de estructuración horizontal. La función imdilate dilata la imagen.

BWsdil = imdilate(BWs, [se90 se0]); figure, imshow(BWsdil), title('dilated gradient mask');

Paso 4: Llenar huecos interiores

La máscara de gradiente dilatada muestra el contorno de la célula bastante bien, pero todavía hay agujeros en el interior de la célula. Para llenar estos orificios usamos la función de relleno.

BWdfill = imfill(BWsdil, 'holes'); figure, imshow(BWdfill); title('binary image with filled holes');

Paso 5: Quitar objetos conectados en el borde

La célula de interés se ha segmentado con éxito, pero no es el único objeto que se ha encontrado. Los objetos que estén conectados al borde de la imagen se pueden quitar mediante la función imclearborder. La conectividad de la función imclearborder se ha establecido en 4 para eliminar las conexiones diagonales.

BWnobord = imclearborder(BWdfill, 4); figure, imshow(BWnobord), title('cleared border image');

Paso 6: Suavizar el objeto

Finalmente, para hacer que el objeto segmentado parezca natural, alisamos el objeto erosionando la imagen dos veces con un elemento de estructuración de diamante. Creamos el elemento de estructuración de diamante utilizando la función strel.

seD = strel('diamond',1); BWfinal = imerode(BWnobord,seD); BWfinal = imerode(BWfinal,seD); figure, imshow(BWfinal), title('segmented image');

Un método alternativo para mostrar el objeto segmentado sería colocar un contorno alrededor de la celda segmentada. El contorno es creado por la función bwperim.

BWoutline = bwperim(BWfinal); Segout = I;  Segout(BWoutline) = 255;  figure, imshow(Segout), title('outlined original image');