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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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