Основанная на цвете сегментация Используя кластеризацию k-средних значений

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

Шаг 1: Readimage

Читайте в hestain.png, который является изображением ткани, окрашенной hemotoxylin и эозином (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. L*a*b* пробел состоит из слоя 'L *' яркости, слой цветности '*' указание, где цвет падает вдоль красно-зеленой оси и слоя цветности 'b*' указание, где цвет падает вдоль сине-желтой оси. Вся информация о цвете находится в '*' и 'b*' слои. Можно измерить различие между двумя цветами с помощью Евклидовой метрики расстояния.

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

lab_he = rgb2lab(he);

Шаг 3: классифицируйте цвета на 'a*b*' пробел Используя кластеризацию k-средних значений

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

Поскольку информация о цвете существует в 'a*b*' цветовое пространство, ваши объекты являются пикселями с '*' и '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.