主要内容

基于颜色的k均值聚类分割

这个例子展示了如何使用k-means聚类以自动化的方式分割颜色。

聚类是一种分离对象组的方法。K-means聚类将每个对象视为在空间中有一个位置。它查找分区,使每个集群中的对象尽可能彼此靠近,并尽可能远离其他集群中的对象。你可以使用imsegkmeans函数将图像像素按值划分为色彩空间中的簇。这个例子在RGB和L*a*b*颜色空间中对图像执行k-means聚类,以展示如何使用不同的颜色空间来改善分割结果。

第一步:阅读图片

读到hestain.png血红素和伊红(H&E)染色的组织图像。这种染色方法帮助病理学家区分被染成蓝紫色和粉红色的组织类型。

他=我…“hestain.png”);imshow(他)标题(“他走时形象”)文本(大小(他,2),大小(他,1)+ 15,“图片由约翰霍普金斯大学的Alan Partin提供”字形大小= 7,HorizontalAlignment =“正确”

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

步骤2:使用K-Means聚类对RBG色彩空间中的颜色进行分类

在RGB色彩空间中使用k-means聚类将图像分割成三个区域。对于输入图像中的每个像素imsegkmeans函数返回与集群对应的标签。

将标签图像显示为覆盖在原始图像上。标签图像不正确地将白色、浅蓝紫色和浅粉红色区域组合在一起。因为RGB色彩空间结合了每个通道(红、绿、蓝)内的亮度和色彩信息,两种不同颜色的较浅版本比相同两种颜色的较深版本更接近,更难分割。

numColors = 3;L = imsegkmeans(he,numColors);B = labeloverlay(he,L);imshow (B)标题(标签图像RGB

图包含一个轴对象。标题为Labeled Image RGB的坐标轴对象包含一个Image类型的对象。

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

L*a*b*色彩空间将图像亮度和色彩分开。这使得独立于亮度的颜色更容易分割区域。色彩空间也更符合人类对图像中明显的白色、蓝紫色和粉红色区域的视觉感知。

L*a*b*色彩空间是从CIE XYZ三刺激值派生出来的。L*a*b*空间由亮度层L*、色度层a*组成,色度层a*表示一种颜色沿红绿轴落在哪里,色度层b*表示一种颜色沿蓝黄轴落在哪里。所有的颜色信息都在a*和b*层中。

将图像转换为L*a*b*颜色空间rgb2lab函数。

Lab_he = rgb2lab(he);

步骤4:使用K-Means聚类对a*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*”

图包含一个轴对象。标题为Image a*b*的axes对象包含一个Image类型的对象。

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

使用pixel_labels,您可以在原始图像中分离物体hestain.png通过颜色,得到三张遮罩图像。

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

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

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

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

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

图包含一个轴对象。在Cluster 3中,标题为Objects的坐标轴对象包含一个类型为image的对象。

步骤6:分割细胞核

集群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 (nonzero (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)标题(“蓝核”

图包含一个轴对象。标题为Blue nucleus的轴对象包含一个类型为image的对象。

另请参阅

相关的话题

Baidu
map