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

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

步骤1:读取图像

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

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

步骤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*'颜色空间中,所以你的对象是具有'a*'和'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[])标题(“按聚类索引标记的图像”);

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

使用pixel_labels,你可以在hestain.png按颜色排列,会产生三幅图像。

mask1 = pixel_labels = = 1;Cluster1 = he .* uint8(mask1);imshow (cluster1)标题(“集群1中的对象”);

mask2 = pixel_labels = = 2;Cluster2 = he .* uint8(mask2);imshow (cluster2)标题(“群集2中的对象”);

mask3 = pixel_labels = = 3;Cluster3 = he .* uint8(mask3);imshow (cluster3)标题(“集群3中的对象”);

第五步:分割细胞核

集群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);imshow (blue_nuclei)标题(“蓝色细胞核”);