Octave:Kmeans 聚类不适用于图像矩阵

Octave: Kmeans clustering not working on an image matrix

我试过下面的代码。

img=imread("test1.jpg");
gimg=rgb2gray(img);
imshow(gimg);
bw = gimg < 255;
L = bwlabel(bw);
imshow(label2rgb(L, @jet, [.7 .7 .7]))
s = regionprops(L, 'PixelIdxList', 'PixelList');
s(1).PixelList(1:4, :)
idx = s(1).PixelIdxList;
sum_region1 = sum(gimg(idx));
x = s(1).PixelList(:, 1); 
y = s(1).PixelList(:, 2);

xbar = sum(x .* double(gimg(idx))) / sum_region1
ybar = sum(y .* double(gimg(idx))) / sum_region1
hold on
for k = 1:numel(s)
    idx = s(k).PixelIdxList;
    pixel_values = double(gimg(idx));
    sum_pixel_values = sum(pixel_values);
    x = s(k).PixelList(:, 1);
    y = s(k).PixelList(:, 2);
    xbar = sum(x .* pixel_values) / sum_pixel_values;
    ybar = sum(y .* pixel_values) / sum_pixel_values;
    plot(xbar, ybar, '*')
end
hold off
a=round(xbar)-90;
b=round(xbar)+90;
c=round(ybar)-90;
d=round(ybar)+90;
roi=gimg(a:b,c:d);
imshow(roi);
roi(:,:,2)=0;
roi(:,:,3)=0;
se = strel('cube',20);
closeBW = imclose(roi,se);
figure 
imshow(closeBW);
de=rgb2gray(closeBW);
ed=edge(de,"canny");
imshow(ed);
j=kmeans(ed,3);

我所做的是拍摄图像并提取其 grayscale.I 集中在具有非常高 intensity.I 的图像部分,然后获取图像的红色分量,然后对图像应用闭运算结果 image.After 我使用 canny 应用了边缘检测 method.Then 我尝试对边缘检测的结果使用 kmeans。

我收到一条错误消息,提示 kmeans 需要实数矩阵。 帮助将不胜感激。

edge in MATLAB / Octave returns 一个 binary / logical 矩阵。 kmeans 要求输入是 doublesingle 矩阵。

因此,只需将 ed 转换为 double 并继续:

ed=edge(de,"canny");
imshow(ed);
ed = double(ed); %// Change
j=kmeans(ed,3);