В этом примере показано, как автоматически сегментировать цвета с использованием цветового пространства L * a * b * и кластеризации K-means.
Чтение в hestain.png, который представляет собой изображение ткани, окрашенной гемотоксилином и эозином (H&E). Этот метод окрашивания помогает патологоанатомам различать различные типы тканей.
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');

Сколько цветов вы видите на изображении, если игнорировать изменения яркости? Существует три цвета: белый, синий и розовый. Обратите внимание, как легко можно визуально отличить эти цвета друг от друга. Цветовое пространство L * a * b * (также известное как CIELAB или CIE L * a * b *) позволяет количественно определить эти визуальные различия.
Цветовое пространство L * a * b * получено из значений тристимула CIE XYZ. Пространство L * a * b * состоит из слоя светимости 'L *', слоя цветности 'a *', указывающего, где цвет падает вдоль красно-зеленой оси, и слоя цветности 'b *', указывающего, где цвет падает вдоль сине-желтой оси. Вся информация о цвете находится в слоях «a *» и «b *». Разность между двумя цветами можно измерить с помощью евклидовой метрики расстояния.
Преобразование изображения в цветовое пространство L * a * b * с помощьюrgb2lab.
lab_he = rgb2lab(he);
Кластеризация - это способ разделения групп объектов. Кластеризация K-означает, что каждый объект имеет расположение в пространстве. Он находит такие разделы, что объекты в каждом кластере находятся как можно ближе друг к другу и как можно дальше от объектов в других кластерах. Для кластеризации K-means необходимо указать количество кластеров, подлежащих секционированию, и метрику расстояния, чтобы количественно определить, насколько близки два объекта друг к другу.
Поскольку информация о цвете существует в цветовом пространстве «a * b *», объекты представляют собой пикселы со значениями «a *» и «b *». Преобразование данных в тип данныхsingle для использования с imsegkmeans. Использовать 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);
Для каждого объекта на входе: imsegkmeans возвращает индекс или метку, соответствующую кластеру. Пометить каждый пиксель изображения меткой пикселя.
imshow(pixel_labels,[])
title('Image Labeled by Cluster Index');
Используя pixel_labels, можно разделить объекты в hestain.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');
Кластер 3 содержит синие объекты. Обратите внимание, что имеются темные и светло-синие объекты. Можно отделить темно-синий от светло-синего с помощью слоя «L *» в цветовом пространстве L * a * b *. Ядра клеток темно-синие.
Напомним, что слой 'L *' содержит значения яркости каждого цвета. Извлечение значений яркости пикселов в этом кластере и пороговое значение для них с глобальным порогом с помощьюimbinarize. Маска is_light_blue дает индексы светло-синих пикселей.
L = lab_he(:,:,1); L_blue = L .* double(mask3); L_blue = rescale(L_blue); idx_light_blue = imbinarize(nonzeros(L_blue));
Копирование маски синих объектов, mask3, затем удалите светло-синие пикселы из маски. Примените новую маску к исходному изображению и отобразите результат. Видны только темно-синие ядра клеток.
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');