主要内容

基于颜色的K-均值聚类分割

此示例演示如何使用L*a*b*颜色空间和K-means聚类以自动方式分割颜色。

步骤1:读取图像

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

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

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

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

如果忽略亮度变化,您会在图像中看到多少颜色?有三种颜色:白色、蓝色和粉色。请注意,您可以很容易地从视觉上区分这些颜色。L*a*b*颜色空间(也称为CIELAB或CIE L*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-均值聚类对“a*b*”空间中的颜色进行分类

群集是一种分离对象组的方法。K-means群集将每个对象视为在空间中有一个位置。它查找分区,使每个群集中的对象尽可能彼此靠近,并尽可能远离其他群集中的对象。K-means群集要求您指定要访问的群集数RTI和距离度量,用于量化两个对象之间的距离。

因为颜色信息存在于“a*b*”颜色空间中,你的对象是带有“a*”和“b*”值的像素。将数据转换为数据类型仅有一个的使用imsegkmeans使用imsegkmeans将对象聚集成三个集群。

ab = lab_he (:,: 2:3);ab = im2single (ab);nColors = 3;%重复聚类3次以避免局部极小值像素标签=imsegkmeans(ab、nColors、,“Numatempts”,3);

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

imshow(像素标签,[])标题('按群集索引标记的图像');

图中包含Axis对象。标题图像由群集索引标记的Axis对象包含Image类型的对象。

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

使用像素标签,可以在中分隔对象hestain.png通过颜色,可以得到三张图片。

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

图中包含一个Axis对象。集群1中标题对象所在的Axis对象包含一个image类型的对象。

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

图2包含一个标题轴类型的对象。

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

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

第五步:分割细胞核

簇3包含蓝色对象。请注意,有深蓝色和浅蓝色对象。您可以使用L*a*b*颜色空间中的“L*”层来区分深蓝色和浅蓝色。细胞核为深蓝色。

回想一下,“L*”层包含每种颜色的亮度值。提取该簇中像素的亮度值,并使用全局阈值对其设置阈值imbinarize.面具是浅蓝色的吗给出浅蓝色像素的指数。

L=lab_he(:,:,1);L_蓝=L.*双色(mask3);L_蓝=重新缩放(L_蓝);idx_浅_蓝=imbinarize(非零(L_蓝));

复制蓝色物体的蒙版,mask3,然后从遮罩中移除浅蓝色像素。将新的蒙版应用到原始图像并显示结果。只有深蓝色的细胞核可见。

蓝色idx=find(mask3);遮罩深蓝色=mask3;遮罩深蓝色(蓝色idx(idx浅蓝色))=0;蓝色原子核=he.*uint8(遮罩深蓝色);imshow(蓝色原子核)标题(“蓝色细胞核”);

图中包含axes对象。标题为Blue Nucleus的axes对象包含image类型的对象。