Octave: Kmeans聚类在图像矩阵上不起作用

我尝试了以下代码。

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_region1ybar = sum(y .* double(gimg(idx))) / sum_region1hold onfor 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, '*')endhold offa=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 / Octave中,edge返回一个二进制 / logical矩阵。kmeans要求输入是一个doublesingle矩阵。

因此,只需将ed转换为double类型即可继续:

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

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注