Основанная на цвете сегментация с использованием K-средних значений

В этом примере показано, как сегментировать цвета автоматически с помощью цветового пространства L * a * b * и кластеризации K-означает.

Шаг 1: Чтение изображения

Чтение в 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');

Figure contains an axes. The axes with title H&E image contains 2 objects of type image, text.

Шаг 2: Преобразуйте изображение из цветового пространства RGB в цветовое

пространство

L * a * b *

Сколько цветов вы видите на изображении, если игнорировать изменения яркости? Существует три цвета: белый, синий и розовый. Заметьте, как легко вы можете визуально отличить эти цвета друг от друга. Цветовое пространство L * a * b * (также известное как CIELAB или CIE L * a * b *) позволяет вам количественно определить эти визуальные различия.

Цветовое пространство L * a * b * определяется из значений CIE XYZ tristimulus. Пространство L * a * b * состоит из слоя светимости 'L *', слоя цветности 'a *', указывающего, где цвет падает вдоль красно-зеленой оси, и слоя цветности 'b *', указывающего, где цвет падает вдоль сине-желтой оси. Вся информация о цвете находится в слоях 'a *' и 'b *'. Вы можете измерить различие между двумя цветами, используя метрику Евклидова расстояния.

Преобразуйте изображение в цветовое пространство L * a * b * с помощью rgb2lab.

lab_he = rgb2lab(he);

Шаг 3: Классификация цветов в пространстве 'a * b *' с помощью кластеризации K-средних значений

Кластеризация - это способ разделения групп объектов. Кластеризация K-означает, что каждый объект имеет местоположение в пространстве. Он находит разделы таким образом, чтобы объекты внутри каждого кластера были как можно ближе друг к другу и как можно дальше от объектов в других кластерах. Кластеризация K-означает требует, чтобы вы задали количество кластеров, которые будут разбиты, и метрику расстояния, чтобы количественно определить, насколько близки друг к другу два объекта.

Поскольку информация о цвете существует в цветовом пространстве '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');

Figure contains an axes. The axes with title Image Labeled by Cluster Index contains an object of type image.

Шаг 4: Создайте изображения, которые сегментируют изображение H&E по цвету

Использование pixel_labelsможно разделять объекты в hestain.png по цвету, что приведет к трем изображениям.

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

Figure contains an axes. The axes with title Objects in Cluster 1 contains an object of type image.

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

Figure contains an axes. The axes with title Objects in Cluster 2 contains an object of type image.

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

Figure contains an axes. The axes with title Objects in Cluster 3 contains an object of type image.

Шаг 5: Сегмент ядер

Кластер 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');

Figure contains an axes. The axes with title Blue Nuclei contains an object of type image.