步骤 1:读取图像

在 hestain.png 中读取,这是一个带有苏木精和曙红染色组织 (H&E) 的图像。这种染色方法有助于病理学家区分不同组织类型。

he = imread('hestain.png');

imshow(he), title('H&E image');

text(size(he,2),size(he,1)+15,...

'Image courtesy of Alan Partin, Johns Hopkins University', ...

'FontSize',7,'HorizontalAlignment','right');

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

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

L*a*b* 颜色空间是从 CIE XYZ 三色值派生的。L*a*b* 空间包含光度层 'L*'、色度层 'a*'(表示颜色落在沿红-绿轴的位置)和色度层 'b*'(表示颜色落在沿蓝-黄轴的位置)。所有颜色信息都在 'a*' 和 'b*' 层。您可以使用欧几里德距离度量来测量两种颜色之间的差异。

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

lab_he = rgb2lab(he);

步骤 3:用 K 均值聚类对基于 'a*b*' 空间的颜色进行分类

聚类是一种分离对象组的方法。K 均值聚类将每个对象视为在空间中有一个位置。它将对象划分为若干分区,使每个簇中的对象尽可能彼此靠近,并尽可能远离其他簇中的对象。K 均值聚类要求您指定要划分的簇数和用于量化两个对象之间距离的距离度量。

由于颜色信息基于 'a*b*' 颜色空间,因此您的对象是具有 'a*' 和 'b*' 值的像素。将数据转换为数据类型 single,以便与 imsegkmeans 结合使用。使用 imsegkmeans 对对象进行聚类以分为三个簇。

ab = lab_he(:,:,2:3);

ab = im2single(ab);

nColors = 3;

% repeat the clustering 3 times to avoid local minima

pixel_labels = imsegkmeans(ab,nColors,'NumAttempts',3);

对于您的输入中的每个对象,imsegkmeans 会返回一个对应于簇的索引或标签。用像素的标签标注图像中的每个像素。

imshow(pixel_labels,[])

title('Image Labeled by Cluster Index');

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

使用 pixel_labels,您可以按颜色分离 hestain.png 中的对象,这将产生三个图像。

mask1 = pixel_labels==1;

cluster1 = he .* uint8(mask1);

imshow(cluster1)

title('Objects in Cluster 1');

mask2 = pixel_labels==2;

cluster2 = he .* uint8(mask2);

imshow(cluster2)

title('Objects in Cluster 2');

mask3 = pixel_labels==3;

cluster3 = he .* uint8(mask3);

imshow(cluster3)

title('Objects in Cluster 3');

步骤 5:分割核

簇 3 包含蓝色对象。请注意,有深蓝色和浅蓝色对象。您可以使用 L*a*b* 颜色空间中的 'L*' 层来分离深蓝色和浅蓝色。细胞核为深蓝色。

前面提到过,'L*' 层包含每种颜色的亮度值。提取此簇中像素的亮度值,并使用 imbinarize 用全局阈值对其设置阈值。掩膜 is_light_blue 给出了浅蓝色像素的索引。

L = lab_he(:,:,1);

L_blue = L .* double(mask3);

L_blue = rescale(L_blue);

idx_light_blue = imbinarize(nonzeros(L_blue));

复制蓝色对象的掩膜 mask3,然后从掩膜中删除浅蓝色像素。将新掩膜应用于原始图像并显示结果。只有深蓝色细胞核可见。

blue_idx = find(mask3);

mask_dark_blue = mask3;

mask_dark_blue(blue_idx(idx_light_blue)) = 0;

blue_nuclei = he .* uint8(mask_dark_blue);

imshow(blue_nuclei)

title('Blue Nuclei');

matlab调用kmeans_使用 K 均值聚类实现基于颜色的分割相关推荐

  1. 计算机视觉与深度学习 | 使用K均值聚类实现基于颜色的分割(matlab版)

    ================================================ 博主github:https://github.com/MichaelBeechan 博主CSDN:h ...

  2. k均值聚类图像分割matlab代码_用K均值聚类法为人类拍摄的首张黑洞照片进行分割...

    众所周知,人类最近拍摄了首张黑洞照片.网友们纷纷表示,这明明就是一个甜甜圈嘛!以前以为黑洞是这个世界上最最高冷的存在,而此刻突然现出真身,形象却是如此的人畜无害!不但如此,还勾起了网友的食欲!简直是罪 ...

  3. matlab实现k-l算法,K均值聚类算法的MATLAB实现

    K-means算法是最简单的一种聚类算法.算法的目的是使各个样本与所在类均值的误差平方和达到最小(这也是评价K-means算法最后聚类效果的评价标准) K-means聚类算法的一般步骤: 初始化.输入 ...

  4. 聚类之K均值聚类和EM算法

    这篇博客整理K均值聚类的内容,包括: 1.K均值聚类的原理: 2.初始类中心的选择和类别数K的确定: 3.K均值聚类和EM算法.高斯混合模型的关系. 一.K均值聚类的原理 K均值聚类(K-means) ...

  5. 机器学习--K均值聚类

    机器学习--聚类 一.无监督学习 二.KMeans聚类 2.1 概览 2.2 理论介绍 2.2.1 模型 2.2.2 策略 2.2.3 算法 2.3 案例讲解 2.4 Python实现 2.4.1 导 ...

  6. 聚类算法之K均值聚类

    K-Means聚类方法 1. 介绍 k均值聚类是基于样本集合划分的聚类算法.由于每个样本在划分的过程中只能属于一个类别,所以k-Means算法属于硬聚类. 2. 算法过程 k均值聚类算法是一个迭代的过 ...

  7. K均值聚类关于初始聚类中心的探讨(matlab程序)

    对应之前发过的:K均值聚类关于初始聚类中心的探讨,补发MATLAB的程序代码. matlab程序: 1. %利用传统K均值随机选取点聚类 clear all; close all; clc; %生成五 ...

  8. 聚类分析 | MATLAB实现k-Means(k均值聚类)分析

    目录 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k-均值聚类简介 相关描述 程序设计 学习小结 参考资料 致谢 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k ...

  9. K均值聚类算法的MATLAB实现

    K均值聚类算法的MATLAB实现 1.K-均值聚类法的概述 之前在参加数学建模的过程中用到过这种聚类方法,但是当时只是简单知道了在matlab中如何调用工具箱进行聚类,并不是特别清楚它的原理.最近因为 ...

最新文章

  1. 惠普企业第三财季净利润23亿美元 同比增长914%
  2. 【Vue.js 牛刀小试】:第九章 - 组件基础再探(data、props)
  3. 计算机网络是啥意思啊,no signal是什么意思啊
  4. 剑指Offer #07 斐波那契数列(四种解法)| 图文详解
  5. 汇编语言数据类型以及数据定义详解
  6. 使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件
  7. SparkSQL之操作Mysql
  8. break 与continue的区别
  9. windows配置gvim高效率编程(cc++)带自动补全代码
  10. 如何编写一个d.ts文件
  11. 笔记本电脑键盘失灵怎么办
  12. NAS 和 SAN 服务器概述
  13. 培养好习惯是很难,但也有方法
  14. 什么是zigbee?
  15. pyspark系列--统计基础
  16. 基于MFC的圆环的消隐实现
  17. 速来,围观阿里出品的泰山版Java开发手册
  18. 联想拯救者pro装华为鸿蒙OS,网友Mate 40 Pro+升级鸿蒙2.0:谷歌服务照样能用
  19. 《C语言》罗马数字问题
  20. 寻回失落的“纸人李”——四川大学团队用3D技术平台重现传统纸人工艺

热门文章

  1. 判断系统是64位还是32位的bat方法
  2. grafana-----Time Range Controls
  3. 服务器和客户端Socket单向通信例子
  4. Git学习05 --分支管理02
  5. PHP如何实现网址伪静态
  6. 如何在Java的特定范围内生成随机整数? [英]How do I generate random integers within a specific range in Java?
  7. 【报告分享】2021年视频号发展年中报告.pdf(附下载链接)
  8. 【报告分享】中国智慧金融行业洞察及2021年发展趋势研究报告.pdf(附下载链接)...
  9. function declaration isn't a prototype解决办法
  10. 游戏王计算机兽,游戏王星杯卡——迅猛龙,再生圣经,入侵蠕虫,鼹鼠,幽世之血樱...