基于颜色的使用k - means聚类分割
这个例子展示了如何在一个自动化的部分颜色时尚使用k - means聚类。
聚类是一种单独的对象组。k - means聚类将在太空中每个对象都有一个位置。它发现分区,这样对象在每个集群尽可能接近彼此,和尽可能远离其他集群中的对象。您可以使用imsegkmeans
函数将图像颜色空间内的像素值到集群。这个例子执行k - means聚类图像的RGB和L * a * b *颜色空间展示如何使用不同的颜色空间可以改善分割结果。
步骤1:读取图像
读到hestain.png
,这是一个组织的形象沾hemotoxylin和伊红())。这种染色法有助于病理学家区分染成蓝紫色和粉红色的组织类型。
他= imread (“hestain.png”);imshow(他)标题(“他走时形象”)文本(大小(他,2),大小(他,1)+ 15,…”阿兰同谋,图片由约翰霍普金斯大学”,…字形大小= 7,HorizontalAlignment =“正确”)
步骤2:使用k - means聚类分类颜色在篮板上空间
使用k - means聚类图像分割成三个区域在RGB颜色空间。输入图像中的每个像素的imsegkmeans
函数返回一个标签对应一个集群。
显示标签图像作为原始图像上叠加。标签图像错误组白色,光蓝紫色花,亮粉红色区域。因为RGB颜色空间结合亮度和颜色信息在每个频道(红,绿,蓝),轻版本的两个不同的颜色比深色紧密和更有挑战性的部分版本的相同的两种颜色。
numColors = 3;L = imsegkmeans(他numColors);B = labeloverlay(左);imshow (B)标题(“标记图像RGB”)
步骤3:将图像从RGB颜色空间转换成L * a * b *颜色空间
L * a * b *彩色空间分割图像的亮度和颜色。这使得它更容易段区域的颜色,独立于轻盈。颜色空间也更符合人类的视觉感知不同的白色,蓝紫色花,粉红色的地区形象。
L * a * b *彩色空间来源于CIE XYZ三色值。L * a * b *光度层的空间由L *,色度层*表明,沿着红绿轴,颜色和色度层b *表明颜色瀑布沿着自民党轴。所有的颜色信息*和b *层。
将图像转换为L * a * b *颜色空间使用rgb2lab
函数。
lab_he = rgb2lab(他);
步骤4:分类颜色* b *空间使用k - means聚类
段图像只使用颜色信息,限制*和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 *”)
第五步:创建段)图像的颜色的图片
使用pixel_labels
,你可以单独的原始图像中的对象hestain.png
根据颜色,导致三个蒙面的图像。
mask1 = pixel_labels = = 1;cluster1 =他。* uint8 (mask1);imshow (cluster1)标题(“集群对象1”);
mask2 = pixel_labels = = 2;cluster2 =他。* uint8 (mask2);imshow (cluster2)标题(“集群对象2”);
mask3 = pixel_labels = = 3;cluster3 =他。* uint8 (mask3);imshow (cluster3)标题(“对象集群3”);
第六步:段核
集群3只包含蓝色对象。注意,有黑色和浅蓝色的对象。你可以使用L深蓝色和浅蓝色分开在L * a * b * *层颜色空间。细胞核是深蓝色的。
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)标题(“蓝核”)