主要内容

基于颜色的K-Means聚类分割

这个例子展示了如何使用L*a*b*颜色空间和K-means聚类以自动化的方式分割颜色。

第一步:阅读图像

读到hestain.png,这是用血红蛋白和伊红(H&E)染色的组织图像。这种染色方法有助于病理学家区分不同的组织类型。

他= imread (“hestain.png”);imshow(他),标题('H&E Image');文本(大小(他,2),大小(他,1)+ 15,...图片由约翰霍普金斯大学艾伦·帕廷提供...“字形大小”7“HorizontalAlignment”'对');

图中包含一个坐标轴。标题为H&E image的轴包含两个类型为image, text的对象。

步骤2:将图像从RGB颜色空间转换为L*a*b*颜色空间

如果忽略亮度的变化,你能在图像中看到多少种颜色?有三种颜色:白色、蓝色和粉红色。注意你是多么容易从视觉上区分这些颜色。L*a*b*颜色空间(也称为CIELAB或CIEL *a*b*)使您能够量化这些视觉差异。

颜色空间L*a*b*由CIE XYZ三刺激值导出。L*a*b*空间由光度层“L*”、色度层“a*”和色度层“b*”组成。色度层“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次,以避免局部极小nColors pixel_labels = imsegkmeans (ab),“NumAttempts”3);

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

imshow (pixel_labels[])标题(“以群集索引标记的图像”);

图中包含一个坐标轴。标题为Image(由聚类索引标记)的轴包含一个Image类型的对象。

步骤4:创建图像,按颜色分割H&E图像

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

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

图中包含一个坐标轴。集群1中标题为Objects的轴包含一个image类型的对象。

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

图中包含一个坐标轴。集群2中标题为Objects的轴包含一个image类型的对象。

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 =重新调节(L_blue);idx_light_blue = imbinarize(非零(L_blue));

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

blue_idx =找到(mask3);mask_dark_blue = mask3;mask_dark_blue (blue_idx (idx_light_blue)) = 0;uint8(mask_dark_blue); / * uint8(mask_dark_blue);imshow (blue_nuclei)标题('蓝色核心');

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