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');