Main Content

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 basada en color mediante clustering de medios K

En este ejemplo se muestra cómo segmentar los colores de forma automatizada utilizando el espacio de color L*a*b* y la agrupación en clústeres de K-means.

Paso 1: Leer imagen

Leer en , que es una imagen de tejido manchado con hemotoxina y eosina (H&E).hestain.png Este método de tinción ayuda a los patólogos a distinguir diferentes tipos de tejido.

he = imread('hestain.png'); imshow(he), title('H&E image'); text(size(he,2),size(he,1)+15,...      'Image courtesy of Alan Partin, Johns Hopkins University', ...      'FontSize',7,'HorizontalAlignment','right');

Paso 2: Convertir imagen de espacio de color RGB a L * a * b * Espacio de color

¿Cuántos colores ves en la imagen si ignoras las variaciones de brillo? Hay tres colores: blanco, azul y rosa. Observe lo fácil que puede distinguir visualmente estos colores entre sí. El espacio de color L*a*b* (también conocido como CIELAB o CIE L*a*b*) le permite cuantificar estas diferencias visuales.

El espacio de color L*a*b* se deriva de los valores de triestímulo de CIE XYZ. El espacio L*a*b* consiste en una capa de luminosidad 'L*', capa de cromaticicidad 'a*' que indica dónde cae el color a lo largo del eje rojo-verde, y la capa de cromaticidad 'b*' que indica dónde cae el color a lo largo del eje azul-amarillo. Toda la información de color se encuentra en las capas 'a*' y 'b*'. Puede medir la diferencia entre dos colores mediante la métrica de distancia euclidiana.

Convierta la imagen al espacio de color L*a*b* utilizando .rgb2lab

lab_he = rgb2lab(he);

Paso 3: Clasifica los colores en el espacio 'a*b*' usando la agrupación en clústeres k-means

La agrupación en clústeres es una forma de separar grupos de objetos. K-means clustering trata cada objeto como tener una ubicación en el espacio. Encuentra particiones de forma que los objetos de cada clúster estén lo más cerca posible entre sí y lo más lejos posible de los objetos de otros clústeres. La agrupación en clústeres de K-means requiere que especifique el número de clústeres que se van a particionar y una métrica de distancia para cuantificar qué tan cerca están dos objetos entre sí.

Dado que la información de color existe en el espacio de color 'a*b*', los objetos son píxeles con valores 'a*' y 'b*'. Convierta los datos al tipo de datos para utilizarlos con .singleimsegkmeans Se utiliza para agrupar los objetos en tres clústeres.imsegkmeans

ab = lab_he(:,:,2:3); ab = im2single(ab); nColors = 3; % repeat the clustering 3 times to avoid local minima pixel_labels = imsegkmeans(ab,nColors,'NumAttempts',3);

Para cada objeto de la entrada, devuelve un índice o una etiqueta, correspondiente a un clúster.imsegkmeans Etiquete cada píxel de la imagen con su etiqueta de píxel.

imshow(pixel_labels,[]) title('Image Labeled by Cluster Index');

Paso 4: Crear imágenes que segmenten la imagen de H&E por color

Usando , puede separar objetos por color, lo que dará como resultado tres imágenes.pixel_labelshestain.png

mask1 = pixel_labels==1; cluster1 = he .* uint8(mask1); imshow(cluster1) title('Objects in Cluster 1');

mask2 = pixel_labels==2; cluster2 = he .* uint8(mask2); imshow(cluster2) title('Objects in Cluster 2');

mask3 = pixel_labels==3; cluster3 = he .* uint8(mask3); imshow(cluster3) title('Objects in Cluster 3');

Paso 5: Segmentar los núcleos

El clúster 3 contiene los objetos azules. Observe que hay objetos oscuros y azules claros. Puede separar el azul oscuro del azul claro usando la capa 'L*' en el espacio de color L*a*b*. Los núcleos celulares son de color azul oscuro.

Recuerde que la capa 'L*' contiene los valores de brillo de cada color. Extraiga los valores de brillo de los píxeles de este clúster y umbral con un umbral global mediante .imbinarize La máscara proporciona los índices de píxeles azul claro.is_light_blue

L = lab_he(:,:,1); L_blue = L .* double(mask3); L_blue = rescale(L_blue); idx_light_blue = imbinarize(nonzeros(L_blue));

Copie la máscara de objetos azules y, a continuación, elimine los píxeles azulclaro de la máscara.mask3 Aplique la nueva máscara a la imagen original y muestre el resultado. Sólo los núcleos celulares de color azul oscuro son visibles.

blue_idx = find(mask3); mask_dark_blue = mask3; mask_dark_blue(blue_idx(idx_light_blue)) = 0;  blue_nuclei = he .* uint8(mask_dark_blue); imshow(blue_nuclei) title('Blue Nuclei');