imsegkmeans
基于 K 均值聚类的图像分割
说明
示例
使用 k 均值聚类分割灰度图像
将图像读入工作区。
I = imread("cameraman.tif"); imshow(I) title("Original Image")
使用 k 均值聚类将图像分割成三个区域。
[L,Centers] = imsegkmeans(I,3);
B = labeloverlay(I,L);
imshow(B)
title("Labeled Image")
使用纹理和空间信息改进 k 均值分割
将图像读入工作区。减小图像大小以使示例运行得更快。
RGB = imread("kobi.png");
RGB = imresize(RGB,0.5);
imshow(RGB)
使用 k 均值聚类将图像分割成两个区域。
L = imsegkmeans(RGB,2);
B = labeloverlay(RGB,L);
imshow(B)
title("Labeled 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])
对每个滤波后的图像进行平滑处理以消除局部变化。以蒙太奇方式显示平滑处理后的图像。
for i = 1:length(g) sigma = 0.5*g(i).Wavelength; gabormag(:,:,i) = imgaussfilt(gabormag(:,:,i),3*sigma); end montage(gabormag,"Size",[4 6])
用空间位置信息补充关于每个像素的信息。此额外信息让 k 均值聚类算法能够在分组时优先考虑空间上相近的像素。
获取输入图像中所有像素的 x 和 y 坐标。
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")
使用 k 均值分割压缩彩色图像
将图像读入工作区。
I = imread("peppers.png"); imshow(I) title("Original 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")
将原始图像和压缩图像写入文件。量化的图像文件大约是原始图像文件大小的四分之一。
imwrite(I,"peppersOriginal.png"); imwrite(J,"peppersQuantized.png");
使用备用颜色空间改进 K 均值分割
将图像读入工作区。图像显示用苏木精和曙红 (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");
使用 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*")
输入参数
I
— 要分割的图像
二维灰度图像 | 二维彩色图像 | 二维多光谱图像
要分割的图像,指定为二维灰度图像、二维彩色图像或二维多光谱图像。如果原始图像的数据类型为 double
,请使用 im2single
函数将图像转换为 single
数据类型。
数据类型: single
| int8
| int16
| uint8
| uint16
k
— 簇的数量
正整数
要创建的簇的数量,指定为正整数。
名称-值参数
将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN
,其中 Name
是参数名称,Value
是对应的值。名称-值参数必须出现在其他参数后,但对各个参数对组的顺序没有要求。
示例: imsegkmeans(I,k,NumAttempts=5)
重复聚类过程五次。
如果使用的是 R2021a 之前的版本,请使用逗号分隔每个名称和值,并用引号将 Name
引起来。
示例: imsegkmeans(I,k,"NumAttempts",5)
重复聚类过程五次。
NormalizeInput
— 归一化输入数据
true
或 1
(默认) | false
或 0
将输入数据归一化为零均值和单位方差,指定为数值或逻辑值 1
(true
) 或 0
(false
)。如果您指定 true
,则 imsegkmeans
单独归一化输入的每个通道。
NumAttempts
— 重复聚类过程的次数
3
(默认) | 正整数
使用新初始簇质心位置重复聚类过程的次数,指定为正整数。
MaxIterations
— 最大迭代次数
100
(默认) | 正整数
迭代的最大次数,指定为正整数。
Threshold
— 准确度阈值
1e-4
(默认) | 正数
准确度阈值,指定为正值。当每个簇中心在连续迭代中的移动小于阈值时,算法停止。
输出参数
提示
该函数生成可重现的结果。给定相同的输入参数,输出不会在多次运行中发生变化。
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 中推出
另请参阅
App
函数
imsegkmeans3
|gabor
|imgaborfilt
|labeloverlay
|label2rgb
|superpixels
|lazysnapping
|watershed
|labelmatrix
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)