主要内容

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

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

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

第一步:读取图像

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

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

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

步骤2:使用k -均值聚类对RBG颜色空间中的颜色进行分类

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

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

numColors = 3;L = imsegkmeans(他numColors);B = labeloverlay(左);imshow (B)标题(“标记图像RGB”

图中包含一个axes对象。标题为labels Image RGB的axes对象包含一个类型为Image的对象。

第三步:将图像从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(他);

第四步:使用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(他pixel_labels);imshow (B2)标题(“标记图像* b *”

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

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

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

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

图中包含一个axes对象。Cluster 1中标题为Objects的axis对象包含一个image类型的对象。

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

图中包含一个axes对象。Cluster 2中标题为Objects的axis对象包含一个image类型的对象。

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

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

第六步:分割细胞核

集群3只包含蓝色的对象。注意有深蓝和浅蓝的物体。你可以使用L*a*b*颜色空间中的L*层来区分深蓝色和浅蓝色。细胞核呈深蓝色。

L*层包含每个像素的亮度值。方法提取该集群中像素的亮度值,并用全局阈值对其进行阈值imbinarize函数。面具idx_light_blue给出浅蓝色像素的索引。

L = lab_he (:: 1);L_blue = l . *双(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_nuclei =他。* uint8 (mask_dark_blue);imshow (blue_nuclei)标题(“蓝核”

图中包含一个axes对象。标题为Blue原子核的axis对象包含一个类型为image的对象。

另请参阅

相关的话题

Baidu
map