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.
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 del fondo.
Lea en la imagen, que es una imagen de una célula de cáncer de próstata.cell.tif
Dos celdas están presentes en esta imagen, pero solo se puede ver una celda en su totalidad. El objetivo es detectar o segmentar la celda 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');
El objeto que se va a segmentar difiere mucho en contraste de la imagen de fondo. Los cambios de contraste pueden ser detectados por operadores que calculan el degradado de una imagen. Para crear una máscara binaria que contenga la celda segmentada, calcule la imagen de degradado y aplique un umbral.
Utilice y el operador Sobel para calcular el valor de umbral.edge
Ajuste el valor de umbral y utilícelo de nuevo para obtener una máscara binaria que contenga la celda segmentada.edge
[~,threshold] = edge(I,'sobel'); fudgeFactor = 0.5; BWs = edge(I,'sobel',threshold * fudgeFactor);
Mostrar la máscara de degradado binario resultante.
imshow(BWs) title('Binary Gradient Mask')
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, hay huecos en las líneas que rodean el objeto en la máscara de degradado. Estos huecos lineales desaparecerán si la imagen de Sobel se dilata mediante elementos de estructuración lineal. Cree dos elementos de estructuración lineal perpindicular mediante la función.strel
se90 = strel('line',3,90); se0 = strel('line',3,0);
Dilatar la máscara de degradado binario utilizando el elemento de estructuración vertical seguido por el elemento de estructuración horizontal. La función dilata la imagen.imdilate
BWsdil = imdilate(BWs,[se90 se0]); imshow(BWsdil) title('Dilated Gradient Mask')
La máscara de degradado dilatada muestra el contorno de la celda muy bien, pero todavía hay agujeros en el interior de la celda. Para rellenar estos agujeros, utilice la función.imfill
BWdfill = imfill(BWsdil,'holes'); imshow(BWdfill) title('Binary Image with Filled Holes')
La celda de interés se ha segmentado correctamente, 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
Para eliminar conexiones diagonales, establezca la conectividad de la función en .imclearborder
4
BWnobord = imclearborder(BWdfill,4); imshow(BWnobord) title('Cleared Border Image')
Por último, para que el objeto segmentado se vea natural, suaviza el objeto erosionando la imagen dos veces con un elemento estructurante de diamante. Cree el elemento de estructuración de diamantes utilizando la función.strel
seD = strel('diamond',1); BWfinal = imerode(BWnobord,seD); BWfinal = imerode(BWfinal,seD); imshow(BWfinal) title('Segmented Image');
Puede utilizar la función para mostrar la máscara sobre la imagen original.labeloverlay
imshow(labeloverlay(I,BWfinal)) title('Mask Over Original Image')
Un método alternativo para mostrar el objeto segmentado es dibujar un contorno alrededor de la celda segmentada. Dibuje un contorno utilizando la función.bwperim
BWoutline = bwperim(BWfinal); Segout = I; Segout(BWoutline) = 255; imshow(Segout) title('Outlined Original Image')
bwperim
| edge
| imclearborder
| imdilate
| imerode
| imfill
| strel