Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

imsegkmeans

基于 K 均值聚类的图像分割

说明

示例

L = imsegkmeans(I,k) 通过执行 k 均值聚类将图像 I 分割成 k 个簇,并在 L 中返回分割后带标签的输出。

示例

[L,centers] = imsegkmeans(I,k) 还返回簇质心位置 centers

L = imsegkmeans(I,k,Name,Value) 使用名称-值参数来控制 k 均值聚类算法的各个方面。

示例

全部折叠

将图像读入工作区。

I = imread("cameraman.tif");
imshow(I)
title("Original Image")

Figure contains an axes object. The axes object with title Original Image contains an object of type image.

使用 k 均值聚类将图像分割成三个区域。

[L,Centers] = imsegkmeans(I,3);
B = labeloverlay(I,L);
imshow(B)
title("Labeled Image")

Figure contains an axes object. The axes object with title Labeled Image contains an object of type image.

将图像读入工作区。减小图像大小以使示例运行得更快。

RGB = imread("kobi.png");
RGB = imresize(RGB,0.5);
imshow(RGB)

Figure contains an axes object. The axes object contains an object of type image.

使用 k 均值聚类将图像分割成两个区域。

L = imsegkmeans(RGB,2);
B = labeloverlay(RGB,L);
imshow(B)
title("Labeled Image")

Figure contains an axes object. The axes object with title Labeled Image contains an object of type image.

一些像素的标签有误。该示例的后续部分将说明如何通过补充关于每个像素的信息来改进 k 均值分割。

使用每个像素邻域中的纹理信息来补充图像。要获取纹理信息,请使用一组 Gabor 滤波器对图像的灰度版本进行滤波。

创建一组 Gabor 滤波器(包含 24 个),覆盖 6 个波长和 4 个方向。

wavelength = 2.^(0:5) * 3;
orientation = 0:45:135;
g = gabor(wavelength,orientation);

将图像转换为灰度。

I = im2gray(im2single(RGB));

使用 Gabor 滤波器对灰度图像进行滤波。以蒙太奇方式显示 24 个滤波后的图像。

gabormag = imgaborfilt(I,g);
montage(gabormag,"Size",[4 6])

Figure contains an axes object. The axes object contains an object of type image.

对每个滤波后的图像进行平滑处理以消除局部变化。以蒙太奇方式显示平滑处理后的图像。

for i = 1:length(g)
    sigma = 0.5*g(i).Wavelength;
    gabormag(:,:,i) = imgaussfilt(gabormag(:,:,i),3*sigma); 
end
montage(gabormag,"Size",[4 6])

Figure contains an axes object. The axes object contains an object of type image.

用空间位置信息补充关于每个像素的信息。此额外信息让 k 均值聚类算法能够在分组时优先考虑空间上相近的像素。

获取输入图像中所有像素的 xy 坐标。

nrows = size(RGB,1);
ncols = size(RGB,2);
[X,Y] = meshgrid(1:ncols,1:nrows);

串联有关每个像素的强度信息、邻域纹理信息和空间信息。

对于此示例,特征集使用强度图像 I,而不是原始彩色图像 RGB。特征集省略了颜色信息,因为狗毛的黄色与图块的黄色相似。颜色通道无法提供足够多有关狗和背景的差异信息来进行清晰的分割。

featureSet = cat(3,I,gabormag,X,Y);

使用 k 均值聚类基于补充特征集将图像分割成两个区域。

L2 = imsegkmeans(featureSet,2,"NormalizeInput",true);
C = labeloverlay(RGB,L2);
imshow(C)
title("Labeled Image with Additional Pixel Information")

Figure contains an axes object. The axes object with title Labeled Image with Additional Pixel Information contains an object of type image.

将图像读入工作区。

I = imread("peppers.png");
imshow(I)
title("Original Image")

Figure contains an axes object. The axes object with title Original Image contains an object of type image.

使用 k 均值聚类将图像分割成 50 个区域。返回标签矩阵 L 和簇质心位置 C。簇质心位置是 50 种颜色中每种颜色的 RGB 值。

[L,C] = imsegkmeans(I,50);

将标签矩阵转换为 RGB 图像。指定簇质心位置 C 作为新图像的颜色图。

J = label2rgb(L,im2double(C));

显示量化图像。

imshow(J)
title("Color Quantized Image")

Figure contains an axes object. The axes object with title Color Quantized Image contains an object of type image.

将原始图像和压缩图像写入文件。量化的图像文件大约是原始图像文件大小的四分之一。

imwrite(I,"peppersOriginal.png");
imwrite(J,"peppersQuantized.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");

Figure contains an axes object. The axes object with title H&E image contains 2 objects of type image, text.

使用 rgb2lab 函数将图像转换到 L*a*b* 颜色空间。L*a*b* 颜色空间将图像的光度和颜色分开。这使得按颜色分割区域变得更加容易并且与亮度无关。

lab_he = rgb2lab(he);

要仅使用颜色信息分割图像,请将图像限制为 lab_he 中的 a* 和 b* 值。将图像转换为数据类型 single,以便与 imsegkmeans 结合使用。使用 imsegkmeans 函数将图像分割成三个区域。

ab = lab_he(:,:,2:3);
ab = im2single(ab);
numColors = 3;
L2 = imsegkmeans(ab,numColors);

将标注图像叠加显示在原始图像上。标注图像将白色、蓝紫色和粉色染色组织区域分开。

B2 = labeloverlay(he,L2);
imshow(B2)
title("Labeled Image a*b*")

Figure contains an axes object. The axes object with title Labeled Image a*b* contains an object of type image.

输入参数

全部折叠

要分割的图像,指定为二维灰度图像、二维彩色图像或二维多光谱图像。如果原始图像的数据类型为 double,请使用 im2single 函数将图像转换为 single 数据类型。

数据类型: single | int8 | int16 | uint8 | uint16

要创建的簇的数量,指定为正整数。

名称-值参数

将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参数名称,Value 是对应的值。名称-值参数必须出现在其他参数后,但对各个参数对组的顺序没有要求。

示例: imsegkmeans(I,k,NumAttempts=5) 重复聚类过程五次。

如果使用的是 R2021a 之前的版本,请使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: imsegkmeans(I,k,"NumAttempts",5) 重复聚类过程五次。

将输入数据归一化为零均值和单位方差,指定为数值或逻辑值 1 (true) 或 0 (false)。如果您指定 true,则 imsegkmeans 单独归一化输入的每个通道。

使用新初始簇质心位置重复聚类过程的次数,指定为正整数。

迭代的最大次数,指定为正整数。

准确度阈值,指定为正值。当每个簇中心在连续迭代中的移动小于阈值时,算法停止。

输出参数

全部折叠

标签矩阵,指定为正整数矩阵。标签为 1 的像素属于第一个簇,标签为 2 的像素属于第二个簇,对全部 k 个簇依此类推。L 的前两个维度与图像 I 相同。L 的数据类型取决于簇的数量。

L 的数据类型簇的数量
uint8k <= 255
uint16256 <= k <= 65535
uint3265536 <= k <= 2^32-1
double2^32 <= k

簇质心位置,以数值矩阵形式返回,大小为 k×c,其中 k 是簇的数量,c 是通道数量。centers 与图像 I 属于同一种数据类型。

提示

  • 该函数生成可重现的结果。给定相同的输入参数,输出不会在多次运行中发生变化。

  • imsegkmeans 函数接受所有支持的颜色空间中的输入图像。使用不同颜色空间会生成不同结果。如果输入图像的结果不令人满意,请考虑尝试其他颜色空间。有关 MATLAB® 中颜色空间的详细信息,请参阅Understanding Color Spaces and Color Space Conversion

  • 要对数据类型为 double 的图像执行 k 均值聚类,请使用 im2single 函数将图像转换为 single 数据类型。对于需要 double 类型输入数据的应用,请参阅 kmeans (Statistics and Machine Learning Toolbox) 函数。

参考

[1] Arthur, David, and Sergei Vassilvitskii. “K-Means++: The Advantages of Careful Seeding.” In Proceedings of the Eighteenth Annual ACM-SIAM Symposium on Discrete Algorithms, 1027–35. SODA ’07. USA: Society for Industrial and Applied Mathematics, 2007.

版本历史记录

在 R2018b 中推出