图像的 k 均值分割
Posted
技术标签:
【中文标题】图像的 k 均值分割【英文标题】:k-means segmentation of an image 【发布时间】:2015-09-23 03:47:44 【问题描述】:我遇到了以下代码,它使用num
no 分割图像。聚类,通过 k-means 聚类算法。但是,我无法理解第一个 for
循环中第二个语句的含义。请帮助我了解该声明的作用以及~=
的含义(此处)。
另外,当我运行代码时,我收到以下错误:
??? Attempt to grow array along ambiguous dimension.
Error in ==> kmeansseg at 42
color(rgb_label ~= k) = 0;
似乎除了num=3
之外的每个值都出现此错误。那么,这是否意味着我不能将 rgb 图像聚集成超过 3 种颜色?输入图像有 6 种颜色,我可以区分。有人可以为此提出解决方案吗?
函数调用:
>> f=imread('peppers.png');
>> kmeansseg(f,6)
代码如下:
function kmeansseg(im,num)
figure(1),imshow(im), title('original image');
cform = makecform('srgb2lab');
lab_im = applycform(im,cform);
ab = double(lab_im(:,:,2:3));
nrows = size(ab,1);
ncols = size(ab,2);
ab = reshape(ab,nrows*ncols,2);
nColors = num;
[cluster_idx, cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean', ...
'Replicates',3);
pixel_labels = reshape(cluster_idx,nrows,ncols);
figure(2),imshow(pixel_labels,[]), title('image labeled by cluster index');
segmented_images = cell(1,nColors);
rgb_label = repmat(pixel_labels,[1 1 nColors]);
for k = 1:nColors
color = im;
color(rgb_label ~= k) = 0; %meaning?
segmented_imagesk = color;
end
figure(3),imshow(segmented_images1), title('objects in cluster 1');
figure(4),imshow(segmented_images2), title('objects in cluster 2');
figure(5),imshow(segmented_images3), title('objects in cluster 3');
end
end
【问题讨论】:
如何调用这个函数?您使用什么输入参数?请添加函数调用。 @kkuilla,函数调用:>> f=imread('peppers.png');
>> kmeansseg(f,6)
请将其添加到问题中。
【参考方案1】:
它将图像中与该特定标签不对应的任何元素设置为零。这就是您获得一系列分段图像的方式。它从rgb_label
变量中获取隔离标签。
什么~=意思是“对于分割图像的每个像素不等于当前分割数,将图像像素设置为零,其他图像像素不变”
关于您的编辑 - 看起来颜色和 rgb_label 矩阵没有相同的尺寸。
【讨论】:
在不知道矩阵维度的情况下很难判断,但我怀疑这就是问题所在 我使用的是标准的peppers.png
图像,尺寸为<384x512x3 uint8>
。
你能不能得到代码来输出颜色和 rgb_label 在这一行之后的尺寸:color = im;
rgb_label
大小:384x512x6
和 color
大小 384x512x3
。是因为我试图将图像分割成 6 个集群吗?我的输入是>>kmeansseg(f,6)
(f
是输入图像)。
我无法深入验证,但感觉该功能设置为期望单色图像,而不是 RGB。您应该能够根据需要选择尽可能多的集群,它不应该与图像中颜色通道的数量相关联以上是关于图像的 k 均值分割的主要内容,如果未能解决你的问题,请参考以下文章
youcans 的 OpenCV 例程200篇170.图像分割之K均值聚类
MATLAB教程案例23基于MATLAB图像分割算法仿真——阈值分割法Otsu阈值分割法K均值聚类分割法等