图像的 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 大小:384x512x6color 大小 384x512x3。是因为我试图将图像分割成 6 个集群吗?我的输入是>>kmeansseg(f,6)f 是输入图像)。 我无法深入验证,但感觉该功能设置为期望单色图像,而不是 RGB。您应该能够根据需要选择尽可能多的集群,它不应该与图像中颜色通道的数量相关联

以上是关于图像的 k 均值分割的主要内容,如果未能解决你的问题,请参考以下文章

youcans 的 OpenCV 例程200篇170.图像分割之K均值聚类

使用 K 均值聚类误差从 CT 灰度图像中进行肺分割

MATLAB教程案例23基于MATLAB图像分割算法仿真——阈值分割法Otsu阈值分割法K均值聚类分割法等

在执行语义分割任务时我应该减去图像均值吗?为啥或者为啥不?

youcans 的 OpenCV 例程200篇176.图像分割之均值漂移算法 Mean Shift

Android OpenCV之基于均值实现图像二值分割