主要内容

使用k-means聚类的基于颜色的分段

此示例显示如何使用L * A * B *颜色空间和k均值群集以自动方式进行分段颜色。

第1步:读取图像

阅读hestain.png.,这是用血红素毒素和曙红(H&E)染色的组织的图像。该染色方法有助于病理学家区分不同的组织类型。

他= imread('hestain.png');imshow(他),标题('H&E Image');文字(大小(他,2),尺寸(他,1)+15,......'图片由艾伦·霍普金斯大学提供alan partin'......'字体大小'7,'水平对齐''对');

图包含轴。具有标题H&E图像的轴包含2个类型图像的对象,文本。

步骤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(他);

步骤3:使用K-means群集将颜色分类为“A * B *”空间中的颜色

群集是分离对象组的方法。K-means群集将每个对象视为在空间中的位置。它发现分区,使得每个群集内的对象尽可能彼此靠近,并且远离尽可能的其他集群中的物体。K-means群集要求您指定要分区的群集数量以及距离度量,以量化两个对象彼此的接近程度。

由于颜色信息存在于“A * B *”颜色空间中,因此您的对象是具有“*”和“B *”值的像素。将数据转换为数据类型单身的使用Imsegkmeans.。用Imsegkmeans.将对象群集成三个集群。

ab = lab_he(:,:,2:3);ab = im2single(ab);ncolors = 3;%重复聚类3次以避免局部最小值Pixel_Labels = IMSEGKMeans(AB,NColors,'numattempts',3);

对于输入中的每个对象,Imsegkmeans.返回对应于群集的索引或标签。用其像素标签标记图像中的每个像素。

imshow(pixel_labels,[])标题('由群集索引标记的图像');

图包含轴。具有由群集索引标记的标题图像的轴包含类型图像的对象。

第4步:通过颜色创建段分段H&E图像的图像

使用Pixel_Labels.,可以将对象分开hestain.png.按颜色,将导致三个图像。

mask1 = pixel_labels == 1;cluster1 =他。* uint8(mask1);imshow(cluster1)标题('集群中的对象1');

图包含轴。集群1中标题对象的轴包含类型图像的对象。

mask2 = pixel_labels == 2;cluster2 =他。* uint8(mask2);imshow(cluster2)标题('集群中的对象2');

图包含轴。具有群集2中标题对象的轴包含类型图像的对象。

mask3 = Pixel_Labels == 3;cluster3 =他。* uint8(mask3);imshow(cluster3)标题('集群中的对象3');

图包含轴。具有群集3中标题对象的轴包含类型图像的对象。

第5步:细胞核

群集3包含蓝色对象。请注意,有黑暗和浅蓝色的物体。您可以使用L * A * B *颜色空间中的“L *”图层将深蓝色与浅蓝色分开。细胞核是深蓝色。

回想一下,'l *'图层包含每种颜色的亮度值。提取此集群中的像素的亮度值,并使用全局阈值阈值imbinarize.。面具is_light_blue.给出浅蓝色像素的指数。

l = lab_he(:,:,1);l_blue = l。* double(mask3);l_blue = Rescale(L_Blue);idx_light_blue = imbinarize(非安利斯(l_blue));

复制蓝色对象的掩码,mask3.然后从掩模上删除浅蓝色像素。将新掩码应用于原始图像并显示结果。只有深蓝色细胞核是可见的。

blue_idx = find(mask3);mask_dark_blue = mask3;mask_dark_blue(blue_idx(idx_light_blue))= 0;blue_nuclei =他。* uint8(mask_dark_blue);imshow(blue_nuclei)标题('蓝色核心');

图包含轴。具有标题蓝核的轴包含类型图像的对象。