文档

基于颜色的使用k - means聚类分割

这个例子展示了如何在一个自动化的部分颜色款式使用L * a * b *颜色空间和k - means聚类。

这个例子需要统计和机器学习的工具箱™。

步骤1:读取图像

读到hestain.png,这是一个组织的形象沾hemotoxylin和伊红())。这种染色法有助于病理学家区分不同的组织类型。

他= imread (“hestain.png”);imshow(他)、标题(“他走时形象”);文本(大小(他,2),大小(他,1)+ 15,图片由阿兰同谋,约翰霍普金斯大学的,“字形大小”7“HorizontalAlignment”,“对”);

步骤2:将图像从RGB颜色空间转换成L * a * b *颜色空间

多少颜色你看到的图片如果你忽略亮度的变化?有三种颜色:白色,蓝色,粉色。注意很容易你可以视觉上区分这些颜色。L * a * b *颜色空间(也称为CIELAB或CIE L * a * b *)使您能够量化这些视觉差异。

L * a * b *彩色空间来源于CIE XYZ三色值。L * a * b *空间由一个光度层L *, chromaticity-layer“*”表示颜色瀑布沿着红绿轴,和chromaticity-layer b *的瀑布沿着自民党轴指示的颜色。所有的颜色信息是在“*”和“b *”层。你可以测量两种颜色之间的差别使用欧氏距离度量。

将图像转换为L * a * b *颜色空间使用rgb2lab

lab_he = rgb2lab(他);

步骤3:分类的颜色的a * b *使用k - means聚类空间

聚类是一种单独的对象组。k - means聚类将在太空中每个对象都有一个位置。它发现分区,这样对象在每个集群尽可能接近彼此,和尽可能远离其他集群中的对象。k - means聚类要求您指定数量的集群分区的距离度量和量化两个物体间距离,彼此。

因为颜色信息存在于“a * b *”空间,你的对象是像素与“*”和“b *”值。使用kmeans集群的对象分为三个集群使用欧氏距离度量。

ab = lab_he (:,: 2:3);nrows =大小(ab, 1);ncols =大小(ab, 2);ab =重塑(ab nrows * ncols 2);nColors = 3;%重复集群3次,以避免局部最小值[cluster_idx, cluster_center] = kmeans (ab、nColors“距离”,“sqEuclidean”,“复制”3);

步骤4:标签图像中每个像素使用KMEANS的结果

为每个对象在你的输入,kmeans返回索引对应一个集群。的cluster_center输出kmeans将使用后的例子。标签图像中每个像素的cluster_idx

pixel_labels =重塑(cluster_idx、nrows ncols);imshow (pixel_labels[])、标题(集群的图像标记指数”);

第五步:创建段)图像的颜色的图片。

使用pixel_labels,你可以单独的对象hestain.png的颜色,这将导致三个图片。

segmented_images =细胞(1、3);rgb_label = repmat (pixel_labels [1 1 3]);k = 1: nColors颜色=他;颜色(rgb_label ~ = k) = 0;segmented_images {k} =颜色;结束imshow (segmented_images{1})、标题(“对象在集群1”);

imshow (segmented_images{2})、标题(《集群对象2》);

imshow (segmented_images{3})、标题(在集群对象3 ');

第六步:细胞核分割成一个单独的图像

注意,有黑色和浅蓝色的对象在一个集群。可以深蓝色和浅蓝色分开使用中的“L *”层L * a * b *颜色空间。细胞核是深蓝色的。

回想一下,‘L *层包含每个颜色的亮度值。发现集群包含蓝色对象。提取像素的亮度值在这个集群,用全局阈值阈值使用imbinarize

你必须以编程方式确定的索引包含蓝色对象因为集群kmeans不会返回相同的吗cluster_idx每次都值。您可以使用cluster_center值,其中包含的意思是‘*’和‘b *值为每个集群。蓝色的集群具有最小的cluster_center价值(实验确定)。

mean_cluster_value =意味着(cluster_center, 2);(tmp, idx) = (mean_cluster_value)进行排序;blue_cluster_num = idx (1);L = lab_he (:: 1);blue_idx =找到(pixel_labels = = blue_cluster_num);L_blue = L (blue_idx);is_light_blue = imbinarize(重新调节(L_blue));

使用面膜is_light_blue标签的像素属于蓝色的细胞核。然后在一个单独的图像显示蓝色的细胞核。

nuclei_labels = repmat (uint8 (0) [nrows ncols]);nuclei_labels (blue_idx (is_light_blue = = false)) = 1;nuclei_labels = repmat (nuclei_labels [1 1 3]);blue_nuclei =他;blue_nuclei (nuclei_labels ~ = 1) = 0;imshow (blue_nuclei)、标题(“蓝色细胞核”);

这个主题有帮助吗?