1、K 均值聚类实现基于颜色的分割原理及流程
K 均值聚类是一种常用的聚类算法,通过将数据点分配到 K 个簇中,每个簇的中心代表簇的平均值来实现聚类的目的。
基于颜色的分割的原理是利用像素的颜色信息来对图像进行分割。首先需要将图像的每个像素点表示为一个特征向量,可以选择 RGB 颜色空间中的颜色分量作为特征向量。然后将这些特征向量作为输入数据,使用 K 均值聚类算法来对图像进行分割。
流程如下:
- 初始化 K 个聚类中心,可以随机选择 K 个像素点的颜色作为初始聚类中心。
- 对每个像素点计算其到每个聚类中心的距离,将其分配到距离最近的聚类中心所代表的簇中。
- 更新每个聚类的中心,即计算每个簇中所有像素点的平均值,并将该平均值作为新的聚类中心。
- 重复步骤 2 和 3 直到满足停止条件,如聚类中心不再发生变化或达到指定的迭代次数。
- 最终得到 K 个簇,每个簇代表一个颜色分割区域。
通过 K 均值聚类算法实现基于颜色的分割可以将图像分成具有相似颜色的区域,从而实现图像的分割和聚类任务。
2、 K 均值聚类实现基于颜色的分割说明
1)方案
使用 K 均值聚类自动分割颜色
2)简介
聚类是一种分离对象组的方法。K 均值聚类将每个对象视为在空间中有一个位置。它将对象划分为若干分区,使每个簇中的对象尽可能彼此靠近,并尽可能远离其他簇中的对象。
使用 imsegkmeans 函数将图像像素按值分成一个颜色空间内的若干个簇。
RGB 和 L*a*b* 颜色空间中执行图像的k 均值聚类,以显示使用不同颜色空间如何改进分割结果。
3、读取图片(彩色图片)
代码
Matlab
he = imread("CT1.png");
imshow(he)
title("H&E Image")
视图效果
4、用 K 均值聚类对 RGB 颜色空间的颜色进行分类
1)说明
在 RGB 颜色空间中使用 k 均值聚类将图像分割成三个区域。对于输入图像中的每个像素,imsegkmeans 函数返回一个对应的簇标签。
将标注图像叠加显示在原始图像上。
标注图像将白色、浅蓝-紫色和浅粉色区域组合在一起,这是不正确的由于 RGB 颜色空间合并了每个通道(红、绿、蓝)内的亮度和颜色信息,因此两种不同颜色的较亮版本比这两种颜色的较暗版本更接近,也更难分割。
代码
Matlab
numColors = 3;
L = imsegkmeans(he,numColors);
B = labeloverlay(he,L);
imshow(B)
title("K均值聚类效果")
视图效果
5、将图像从 RGB 颜色空间转换为 L*a*b* 颜色空间
1)说明
使用 rgb2lab 函数将图像转换为 L*a*b* 颜色空间。
L*a*b* 颜色空间将图像的光度和颜色分开。这使得按颜色分割区域变得更加容易并且与亮度无关。颜色空间也更符合人类对图像中不同的白色、蓝-紫色和粉色区域的视觉感知。
L*a*b* 颜色空间是从 CIE XYZ 三色值派生的。L*a*b* 空间包含光度层 L*、色度层 a*(表示颜色落在沿红-绿轴的位置)和色度层 b*(表示颜色落在沿蓝-黄轴的位置)。所有颜色信息都在 a* 和 b* 层。
代码
Matlab
lab_he = rgb2lab(he);
6、用 K 均值聚类对基于 a*b* 空间的颜色进行分类
1)说明
仅使用颜色信息分割图像,请将图像限制为 lab_he 中的 a* 和 b* 值。
将图像转换为 single 数据类型,以便于 imsegkmeans 函数使用。使用 imsegkmeans 函数将图像像素分成三个簇。将 NumAttempts 名称-值参数的值设置为使用不同的初始簇质心位置重复聚类三次,以避免拟合局部最小值。
2)imsegkmeans()基于 K 均值聚类的图像分割
语法
L = imsegkmeans(
I,
k)
通过执行 k 均值聚类将图像 I
分割成 k
个簇,并在 L
中返回分割后带标签的输出。
[
L,
centers] = imsegkmeans(
I,
k)
还返回簇质心位置 centers
。
L = imsegkmeans(
I,
k,
Name,Value)
使用名称-值参数来控制 k 均值聚类算法的各个方面。
代码
Matlab
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代码
Matlab
figure(3)
mask1 = pixel_labels == 1;
cluster1 = he.*uint8(mask1);
imshow(cluster1)
title("按颜色分割 H&E 图像1");
视图效果
2)掩膜图像2代码
Matlab
figure(4)
mask2 = pixel_labels == 2;
cluster2 = he.*uint8(mask2);
imshow(cluster2)
title("按颜色分割 H&E 图像2");
视图效果
3)掩膜图像3代码
Matlab
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均值聚类,具体操作可以参考MATLAB官方文档和相关教程。
9、源代码
代码
Matlab
%% 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");