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');
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')
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')
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')
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')
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');
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')
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')
Consulte también
imfill
| imclearborder
| edge
| imdilate
| imerode
| bwperim
| strel