这个示例展示了如何使用L*a*b*颜色空间和K-means聚类以自动方式分割颜色。
读到hestain.png
,这是用血红素和伊红(H&E)染色的组织图像。这种染色方法有助于病理学家区分不同的组织类型。
他= imread (“hestain.png”);imshow(他)、标题(“他走时形象”);文本(大小(他,2),大小(他,1)+ 15,...图片由约翰霍普金斯大学艾伦·帕廷提供,...“字形大小”7“HorizontalAlignment”,“对”);
如果忽略亮度变化,你会在图像中看到多少种颜色?有三种颜色:白色、蓝色和粉红色。注意你是多么容易在视觉上区分这些颜色。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(他);
集群是一种分离对象组的方法。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[])标题(“由聚类索引标记的图像”);
使用pixel_labels
,你可以分离对象hestain.png
按颜色,这样就会产生三幅图像。
mask1 = pixel_labels = = 1;Cluster1 = he .* uint8(mask1);imshow (cluster1)标题(“集群1中的对象”);
mask2 = pixel_labels = = 2;=他.* uint8(mask2);imshow (cluster2)标题('群集2中的对象');
mask3 = pixel_labels = = 3;Cluster3 = uint8(uint8);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;blue_nucleus = he .* uint8(mask_dark_blue);imshow (blue_nuclei)标题(“蓝色细胞核”);