【问题标题】:Octave: Kmeans clustering not working on an image matrixOctave:Kmeans 聚类不适用于图像矩阵
【发布时间】:2015-08-02 14:06:03
【问题描述】:

我试过下面的代码。

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);

我所做的是拍摄一张图像并提取其灰度。我专注于图像强度非常高的部分。然后我拍摄图像的红色部分,然后对生成的图像应用关闭操作。之后我使用canny方法应用边缘检测。然后我尝试在边缘检测结果上使用kmeans。

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

【问题讨论】:

    标签: matlab image-processing machine-learning octave k-means


    【解决方案1】:

    edge 在 MATLAB / Octave 中返回一个 binary / logical 矩阵。 kmeans 要求输入是 doublesingle 矩阵。

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

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

    【讨论】:

    • 完全没问题。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 2019-05-08
    • 2023-03-12
    • 1970-01-01
    • 2018-09-25
    • 2016-01-19
    相关资源
    最近更新 更多