此示例演示如何使用L*a*b*颜色空间和K-means聚类以自动方式分割颜色。
读入hestain.png
,这是用血红蛋白和伊红(H&E)染色的组织图像。这种染色方法有助于病理学家区分不同的组织类型。
他不识字(“hestain.png”);imshow(他)、标题(“他走时形象”); 文本(大小(he,2),大小(he,1)+15,...“图片由约翰·霍普金斯大学艾伦·帕廷提供”,...“字体大小”7.“水平对齐”,“对”);
如果忽略亮度变化,您会在图像中看到多少颜色?有三种颜色:白色、蓝色和粉色。请注意,您可以很容易地从视觉上区分这些颜色。L*a*b*颜色空间(也称为CIELAB或CIE L*a*b*)使您能够量化这些视觉差异。
颜色空间L*a*b*由CIE XYZ三刺激值导出。L*a*b*空间由光度层“L*”、色度层“a*”和色度层“b*”组成。色度层“a*”表示颜色沿红绿轴落在何处,色度层“b*”表示颜色沿蓝黄轴落在何处。所有的颜色信息都在“a*”和“b*”图层中。你可以用欧几里得距离度量来测量两种颜色之间的差异。
使用将图像转换为L*a*b*颜色空间rgb2lab
.
lab_he = rgb2lab(他);
群集是一种分离对象组的方法。K-means群集将每个对象视为在空间中有一个位置。它查找分区,使每个群集中的对象尽可能彼此靠近,并尽可能远离其他群集中的对象。K-means群集要求您指定要访问的群集数RTI和距离度量,用于量化两个对象之间的距离。
因为颜色信息存在于“a*b*”颜色空间中,你的对象是带有“a*”和“b*”值的像素。将数据转换为数据类型仅有一个的
使用imsegkmeans
使用imsegkmeans
将对象聚集成三个集群。
ab = lab_he (:,: 2:3);ab = im2single (ab);nColors = 3;%重复聚类3次以避免局部极小值像素标签=imsegkmeans(ab、nColors、,“Numatempts”,3);
对于你输入的每个对象,imsegkmeans
返回与群集相对应的索引或标签。使用其像素标签标记图像中的每个像素。
imshow(像素标签,[])标题('按群集索引标记的图像');
使用像素标签
,可以在中分隔对象hestain.png
通过颜色,可以得到三张图片。
mask1 = pixel_labels = = 1;uint8(mask1);imshow (cluster1)标题(“群集1中的对象”);
mask2 = pixel_labels = = 2;=他.* uint8(mask2);imshow (cluster2)标题(“群集2中的对象”);
mask3 = pixel_labels = = 3;=他.* uint8(mask3);imshow (cluster3)标题(“群集3中的对象”);
簇3包含蓝色对象。请注意,有深蓝色和浅蓝色对象。您可以使用L*a*b*颜色空间中的“L*”层来区分深蓝色和浅蓝色。细胞核为深蓝色。
回想一下,“L*”层包含每种颜色的亮度值。提取该簇中像素的亮度值,并使用全局阈值对其设置阈值imbinarize
.面具是浅蓝色的吗
给出浅蓝色像素的指数。
L=lab_he(:,:,1);L_蓝=L.*双色(mask3);L_蓝=重新缩放(L_蓝);idx_浅_蓝=imbinarize(非零(L_蓝));
复制蓝色物体的蒙版,mask3
,然后从遮罩中移除浅蓝色像素。将新的蒙版应用到原始图像并显示结果。只有深蓝色的细胞核可见。
蓝色idx=find(mask3);遮罩深蓝色=mask3;遮罩深蓝色(蓝色idx(idx浅蓝色))=0;蓝色原子核=he.*uint8(遮罩深蓝色);imshow(蓝色原子核)标题(“蓝色细胞核”);