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 la agrupación en clústeres K-means

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

Paso 1: leer imagen

Leer en, que es una imagen de tejido manchado con hemotoxylin 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: convierta la imagen del espacio de color RGB a L * a * b * espacio de color

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

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

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

lab_he = rgb2lab(he);

Paso 3: clasifique los colores en ' a * b * ' espacio usando K-means clustering

La agrupación en clústeres es una forma de separar grupos de objetos. K-means clustering trata a cada objeto como si tuviera una ubicación en el espacio. Encuentra particiones de tal manera que los objetos dentro de cada clúster están tan cerca entre sí como sea posible, y tan lejos de los objetos de otros clústeres como sea posible. K-means clustering requiere que especifique el número de clústeres que se van a particionar y una métrica de distancia para cuantificar el cierre de 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 los valores ' a * ' y ' b * '. Convierta los datos al tipo de datos para utilizarlos con.singleimsegkmeans Se usa 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 segmentan la imagen de H&E por color

Usando, puede separar los objetos por color, lo que resultará en 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: segmenta los núcleos

El Cluster 3 contiene los objetos azules. Observe que hay objetos oscuros y de color azul claro. Puede separar el azul oscuro de 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 umbrales con un umbral global utilizando.imbinarize La máscara da los índices de píxeles de color 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 los objetos azules y, a continuación, quite los píxeles de color azul claro de la máscara.mask3 Aplique la nueva máscara a la imagen original y visualice el resultado. Sólo los núcleos de células 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');