使用k均值聚类的基于颜色的分割
这个例子展示了如何使用k-means聚类以自动的方式分割颜色。
聚类是一种分离对象组的方法。k -均值聚类将每个对象视为在空间中有一个位置。它找到分区,使每个集群中的对象尽可能靠近彼此,并且尽可能远离其他集群中的对象。您可以使用imsegkmeans
函数将图像像素按值分离为颜色空间内的群集。这个例子在RGB和L*a*b*颜色空间中对图像进行k-均值聚类,以展示如何使用不同的颜色空间提高分割结果。
第一步:读取图像
读到hestain.png
,为血氧甲素和伊红染色的组织图像。这种染色方法有助于病理学家区分被染成蓝紫色和粉红色的组织类型。
He = imread)“hestain.png”);imshow(他)标题(“他走时形象”)文本(大小(他,2),大小(他,1)+ 15,...“图片由约翰霍普金斯大学的艾伦·帕丁提供”,...字形大小= 7,HorizontalAlignment =“正确”)
步骤2:使用k均值聚类对RBG颜色空间中的颜色进行分类
在RGB颜色空间中使用k-means聚类将图像分割为三个区域。对于输入图像中的每个像素,imsegkmeans
函数返回一个与集群对应的标签。
将标签图像显示为原始图像的覆盖。标签图像错误地将白色、浅蓝紫色和浅粉色区域组合在一起。因为RGB颜色空间在每个通道(红、绿、蓝)中结合了亮度和颜色信息,所以两种不同颜色的浅色版本比相同两种颜色的深色版本更接近,更难以分割。
numColors = 3;L = imsegkmeans(he,numColors);B = labeloverlay(he,L);imshow (B)标题(标签图像RGB)
第三步:将图像从RGB颜色空间转换为L*a*b*颜色空间
L*a*b*颜色空间分离图像亮度和颜色。这使得它更容易分割区域的颜色,独立于亮度。色彩空间也更符合人类对图像中明显的白色、蓝紫色和粉色区域的视觉感知。
L*a*b*颜色空间来源于CIE XYZ三刺激值。L*a*b*空间由光度层L*、色度层a*(表示颜色沿红绿轴落在何处)和色度层b*(表示颜色沿蓝黄轴落在何处)组成。所有的颜色信息都在a*和b*层中。
方法将图像转换为L*a*b*颜色空间rgb2lab
函数。
Lab_he = rgb2lab(he);
第四步:使用k均值聚类在*b*空间中分类颜色
若要仅使用颜色信息分割图像,请将图像限制为中的a*和b*值lab_he
.将图像转换为数据类型单
与imsegkmeans
函数。使用imsegkmeans
函数将图像像素分离为三个集群。的值NumAttempts
参数以不同的初始聚类质心位置重复聚类三次,以避免拟合到局部最小值。
Ab = lab_he(:,:,2:3);Ab = im2single(Ab);pixel_labels = imsegkmeans(ab,numColors,NumAttempts=3);
将标签图像显示为原始图像的覆盖。新的标签图像更清楚地区分了白色、蓝紫色和粉红色染色的组织区域。
B2 = labeloverlay(he,pixel_labels);imshow (B2)标题(标签图像a*b*)
步骤5:创建图像,分割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
函数。面具idx_light_blue
给出浅蓝色像素的索引。
L = lab_he(:,:,1);L_blue = L.*double(mask3);L_blue = rescale(L_blue);idx_light_blue = imbinalize(非零(L_blue));
复制蓝色物体的蒙版,mask3
,然后从蒙版中删除浅蓝色像素。将新蒙版应用于原始图像并显示结果。只有深蓝色的细胞核可见。
Blue_idx = find(mask3);Mask_dark_blue = mask3;Mask_dark_blue (blue_idx(idx_light_blue)) = 0;blue_nucleus = he.*uint8(mask_dark_blue);imshow (blue_nuclei)标题(“蓝核”)