1.16、基于K 均值聚类实现基于颜色的分割(matlab)
1、K 均值聚类实现基于颜色的分割原理及流程
K-means clustering is a widely used clustering algorithm. It operates by partitioning the dataset into K non-overlapping clusters, where each cluster's center, or centroid, represents the average of all its member data points.
遵循颜色信息进行图像划分
流程如下:
- 设定 K 个聚类中心点,并通过随机选取 K 个像素点的色彩特征来确定初始聚类中心。
- 计算所有像素点与各聚类中心之间的距离,并将该像素点归入与其距离最近的簇中。
- 重新计算各簇的质心位置,并以这些新质心坐标作为更新后的聚类中心。
- 反复执行上述两步操作直至满足终止条件(如质心位置不再变化或达到预定的最大迭代次数)。
- 最终确定 K 个数据群组,并每组数据群落对应特定的颜色分割区域。
K均值聚类算法被用来执行基于颜色的空间划分任务,从而将图像划分为具有相近色彩特征的空间区域。
2、 K 均值聚类实现基于颜色的分割说明
1)方案
使用 K 均值聚类自动分割颜色
2)简介
聚类是一种分类对象组的方式 ,即通过识别数据之间的相似性将它们分组。K均值算法假设每个数据点占据空间中的一个特定位置,并基于此进行数据分组。该算法通过构建多个区域(称为簇)来组织数据点,并确保同一簇内的点彼此接近且与其他簇的点保持较远的距离。
使用 image segmentation algorithm based on pixel values to partition the image pixels into multiple clusters within a color space.
在RGB和Lab*色彩空间中进行图像的k均值聚类处理,并用于比较分析不同色彩空间对分割结果带来的提升效果。
3、读取图片(彩色图片)
代码
he = imread("CT1.png");
imshow(he)
title("H&E Image")
视图效果

4、用 K 均值聚类对 RGB 颜色空间的颜色进行分类
1)说明
在 RGB 颜色空间内通过 k 均值聚类算法将图像划分为三个区域。对输入图像中的每一个像素应用 imsegkmeans 函数后会生成相应的簇标签。
代码
numColors = 3;
L = imsegkmeans(he,numColors);
B = labeloverlay(he,L);
imshow(B)
title("K均值聚类效果")
视图效果

5、将图像从 RGB 颜色空间转换为 Lab* 颜色空间
1)说明
使用 rgb2lab 函数将图像转换为 Lab* 颜色空间。
Lab* 颜色空间通过将图像的亮度与色调分离来实现对色彩信息的独立提取与处理过程。这一特性使得基于Lab*空间的颜色分割方法不仅更加容易操作而且完全不受亮度变化的影响,并且这种设计也更好地符合人眼对不同白度、蓝紫色调以及粉色调别的视觉辨识能力特征。
代码
lab_he = rgb2lab(he);
6、用 K 均值聚类对基于 ab 空间的颜色进行分类
1)说明
仅基于颜色信息对图像进行分割,并将图像限定为 lab_he 颜色空间中的 a* 和 b* 值。将图像转换为单精度数据类型以便于 imsegkmeans 函数处理。通过 imsegkmeans 函数对图像像素进行聚类分组为三个簇,并设置 NumAttempts 名称-值对的参数值为采用不同初始质心位置反复聚类三次以防止陷入局部极小值问题中。
2)imsegkmeans()基于 K 均值聚类的图像分割
语法
L 的值由 MathWorks 提供的功能 imsegkmeans 生成(其参数包括图像 I 和指定的 k),该功能通过 k 均值聚类算法对图像 I 进行图像分割为 k 个簇,在结果 L 中获得带有标签的信息。
[[L](https://ww2.mathworks.cn/help/images/ref/imsegkmeans.html#mw_67d07395-31d1-45bf-8913-7ce58bfb6e38 "L"),[centers](https://ww2.mathworks.cn/help/images/ref/imsegkmeans.html#mw_e71f078b-a246-41e4-ab5b-12ebf6989757 "centers")] = imsegkmeans([I](https://ww2.mathworks.cn/help/images/ref/imsegkmeans.html#mw_bc4fda8f-e11e-4430-8672-93761b693a85 "I"),[k](https://ww2.mathworks.cn/help/images/ref/imsegkmeans.html#mw_aa2fed45-8e50-4172-b007-881561c1fd92 "k")) 还返回簇质心位置 centers。
[L](https://ww2.mathworks.cn/help/images/ref/imsegkmeans.html#mw_67d07395-31d1-45bf-8913-7ce58bfb6e38 "L") = imsegkmeans([I](https://ww2.mathworks.cn/help/images/ref/imsegkmeans.html#mw_bc4fda8f-e11e-4430-8672-93761b693a85 "I"),[k](https://ww2.mathworks.cn/help/images/ref/imsegkmeans.html#mw_aa2fed45-8e50-4172-b007-881561c1fd92 "k"),[Name,Value](https://ww2.mathworks.cn/help/images/ref/imsegkmeans.html#namevaluepairarguments "Name,Value")) 使用名称-值参数来控制 k 均值聚类算法的各个方面。
代码
ab = lab_he(:,:,2:3);
ab = im2single(ab);
pixel_labels = imsegkmeans(ab,numColors,"NumAttempts",4);
%标注图像叠加显示在原始图像上。新标注图像将白色、蓝紫色和粉色染色组织区域更清晰地区分开来。
figure(2)
B2 = labeloverlay(he,pixel_labels);
imshow(B2)
title("聚类四次")
视图效果

7、创建按颜色分割 H&E 图像的图像
通过 pixel_labels 对原始图像中的对象进行颜色区分处理,进而生成三个对应的遮罩图。
1)掩膜图像1代码
figure(3)
mask1 = pixel_labels == 1;
cluster1 = he.*uint8(mask1);
imshow(cluster1)
title("按颜色分割 H&E 图像1");
视图效果

2)掩膜图像2代码
figure(4)
mask2 = pixel_labels == 2;
cluster2 = he.*uint8(mask2);
imshow(cluster2)
title("按颜色分割 H&E 图像2");
视图效果

3)掩膜图像3代码
figure(5)
mask3 = pixel_labels == 3;
cluster3 = he.*uint8(mask3);
imshow(cluster3)
title("按颜色分割 H&E 图像3");
视图效果

8、总结
基于K均值聚类实现基于颜色的分割的步骤可以总结为:
读取图像:为了实现目标图像的颜色分割处理,需要调用MATLAB内置的imread函数获取目标图像。
特征向量表示:通过将图像中的每一个像素点映射到对应的高维空间中来表达其特性;其中一种常见的做法是使用RGB颜色空间的各个通道值来构建这些特征向量。
初始化聚类中心:随机选择K个像素点的颜色作为初始聚类中心。
将像素点分派至各个簇:通过计算各像素点与所有聚类中心之间的距离特征值,并将它们归入离它最近的那个聚类中心对应的簇中。
重新确定聚类中心:通过求取每个簇内所有像素点集合的均值,并将其作为新的核心代表点来更新聚类中心。
不断进行重新计算并分配直至满足终止条件:反复执行第4步至第5步直至预设的最大迭代次数得到满足
通过聚类中心实现图像的颜色分割:基于最终聚类中心的结果来重新分配图像像素的颜色,并完成基于颜色特征的图像分割过程。
在MATLAB环境中运行时,默认配置下提供了kmeans函数来进行K均值聚类。具体操作建议查阅官方文档以及相关的学习资料。
9、源代码
代码
%% K 均值聚类实现基于颜色的分割
%使用 K 均值聚类自动分割颜色。
%聚类是一种分离对象组的方法。K 均值聚类将每个对象视为在空间中有一个位置。它将对象划分为若干分区,使每个簇中的对象尽可能彼此靠近,
%并尽可能远离其他簇中的对象。使用 imsegkmeans 函数将图像像素按值分成一个颜色空间内的若干个簇。 RGB 和 L*a*b* 颜色空间中执行图像的
%k 均值聚类,以显示使用不同颜色空间如何改进分割结果。
%% 读取图片(彩色图片)
he = imread("CT1.png");
imshow(he)
title("H&E Image")
%% 用 K 均值聚类对 RGB 颜色空间的颜色进行分类
%在 RGB 颜色空间中使用 k 均值聚类将图像分割成三个区域。对于输入图像中的每个像素,imsegkmeans 函数返回一个对应的簇标签。
%将标注图像叠加显示在原始图像上。
%标注图像将白色、浅蓝-紫色和浅粉色区域组合在一起,这是不正确的。由于 RGB 颜色空间合并了每个通道(红、绿、蓝)内的亮度和颜色信息,因此两种不同颜色的较亮版本比这两种颜色的较暗版本更接近,也更难分割。
numColors = 3;
L = imsegkmeans(he,numColors);
B = labeloverlay(he,L);
imshow(B)
title("K均值聚类效果")
%% 将图像从 RGB 颜色空间转换为 L*a*b* 颜色空间
%使用 rgb2lab 函数将图像转换为 L*a*b* 颜色空间。
%L*a*b* 颜色空间将图像的光度和颜色分开。这使得按颜色分割区域变得更加容易并且与亮度无关。颜色空间也更符合人类对图像中不同的白色、蓝-紫色和粉色区域的视觉感知。
%L*a*b* 颜色空间是从 CIE XYZ 三色值派生的。L*a*b* 空间包含光度层 L*、色度层 a*(表示颜色落在沿红-绿轴的位置)和色度层 b*(表示颜色落在沿蓝-黄轴的位置)。所有颜色信息都在 a* 和 b* 层。
lab_he = rgb2lab(he);
%% 用 K 均值聚类对基于 a*b* 空间的颜色进行分类
%仅使用颜色信息分割图像,请将图像限制为 lab_he 中的 a* 和 b* 值。
%将图像转换为 single 数据类型,以便于 imsegkmeans 函数使用。使用 imsegkmeans 函数将图像像素分成三个簇。将 NumAttempts 名称-值参数的值设置为使用不同的初始簇质心位置重复聚类三次,以避免拟合局部最小值。
ab = lab_he(:,:,2:3);
ab = im2single(ab);
pixel_labels = imsegkmeans(ab,numColors,"NumAttempts",4);
%标注图像叠加显示在原始图像上。新标注图像将白色、蓝紫色和粉色染色组织区域更清晰地区分开来。
figure(2)
B2 = labeloverlay(he,pixel_labels);
imshow(B2)
title("聚类四次")
%% 创建按颜色分割 H&E 图像的图像
%使用 pixel_labels,按颜色分离原始图像中的对象,从而产生三个掩膜图像
figure(3)
mask1 = pixel_labels == 1;
cluster1 = he.*uint8(mask1);
imshow(cluster1)
title("按颜色分割 H&E 图像1");
figure(4)
mask2 = pixel_labels == 2;
cluster2 = he.*uint8(mask2);
imshow(cluster2)
title("按颜色分割 H&E 图像2");
figure(5)
mask3 = pixel_labels == 3;
cluster3 = he.*uint8(mask3);
imshow(cluster3)
title("按颜色分割 H&E 图像3");
工程文件
<>
