Esta página es para la versión anterior. La página correspondiente en inglés se eliminó en la versión actual.

Segmentación basada en color mediante clustering K-means

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

Este ejemplo requiere estadísticas y máquina de aprendizaje de herramientas ™.

Paso 1: Leer imagen

Leer en hestain.png, que es una imagen de tejido teñido con hemotoxylin y eosina (H & E). 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 en el brillo? Hay tres colores: blanco, azul, y rosado. Observe con qué facilidad puede distinguir visualmente estos colores unos de otros. 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ímulos CIE XYZ. El espacio l * a * b * consiste en una capa de luminosidad ' l * ', cromática-capa ' a * ' que indica donde el color cae a lo largo del eje rojo-verde, y la cromática-capa ' b * ' que indica donde el color cae 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 usando la métrica de distancia euclidiana.

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

lab_he = rgb2lab(he);

Paso 3: Clasificar los colores en el espacio ' a * b * ' utilizando el clustering K-means

El agrupamiento es una forma de separar grupos de objetos. K-means clustering trata a cada objeto como tener una ubicación en el espacio. Encuentra particiones tales que los objetos dentro de cada clúster están lo más cerca el uno del otro como sea posible, y tan lejos de objetos en otros clusters como sea posible. El clustering 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 el cierre de dos objetos entre sí.

Dado que la información de color existe en el espacio ' a * b * ', los objetos son píxeles con valores ' a * ' y ' b * '. Utilice kmeans para agrupar los objetos en tres clústeres utilizando la métrica de distancia euclidiana.

ab = lab_he(:,:,2:3); nrows = size(ab,1); ncols = size(ab,2); ab = reshape(ab,nrows*ncols,2);  nColors = 3; % repeat the clustering 3 times to avoid local minima [cluster_idx, cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean', ...                                       'Replicates',3);

Paso 4: Etiquete cada píxel de la imagen utilizando los resultados de KMEANS

Para cada objeto de la entrada, kmeans devuelve un índice correspondiente a un clúster. La salida cluster_center de kmeans se usará más adelante en el ejemplo. Etiquete cada píxel de la imagen con su cluster_idx.

pixel_labels = reshape(cluster_idx,nrows,ncols); imshow(pixel_labels,[]), title('image labeled by cluster index');

Paso 5: Cree imágenes que segmentan la imagen de H & E por color.

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

segmented_images = cell(1,3); rgb_label = repmat(pixel_labels,[1 1 3]);  for k = 1:nColors     color = he;     color(rgb_label ~= k) = 0;     segmented_images{k} = color; end  imshow(segmented_images{1}), title('objects in cluster 1');

imshow(segmented_images{2}), title('objects in cluster 2');

imshow(segmented_images{3}), title('objects in cluster 3');

Paso 6: Segmentar los núcleos en una imagen separada

Observe que hay objetos oscuros y azules claros en uno de los clústeres. 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. Busque el clúster que contiene los objetos azules. Extraiga los valores de brillo de los píxeles de este clúster y los umbrales con un umbral global utilizando imbinarize.

Debe determinar mediante programación el índice del clúster que contiene los objetos azules porque kmeans no devolverá el mismo valor cluster_idx cada vez. Puede hacerlo utilizando el valor cluster_center, que contiene el valor medio ' a * ' y ' b * ' para cada clúster. El clúster azul tiene el valor cluster_center más pequeño (determinado experimentalmente).

mean_cluster_value = mean(cluster_center,2); [tmp, idx] = sort(mean_cluster_value); blue_cluster_num = idx(1);  L = lab_he(:,:,1); blue_idx = find(pixel_labels == blue_cluster_num); L_blue = L(blue_idx); is_light_blue = imbinarize(rescale(L_blue));

Utilice la máscara is_light_blue para etiquetar qué píxeles pertenecen a los núcleos azules. A continuación, muestre los núcleos azules en una imagen separada.

nuclei_labels = repmat(uint8(0),[nrows ncols]); nuclei_labels(blue_idx(is_light_blue==false)) = 1; nuclei_labels = repmat(nuclei_labels,[1 1 3]); blue_nuclei = he; blue_nuclei(nuclei_labels ~= 1) = 0; imshow(blue_nuclei), title('blue nuclei');