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

时间:2015-05-21 04:37:40

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

我尝试过以下代码。

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需要真正的矩阵。 帮助会很感激。

1 个答案:

答案 0 :(得分:1)

MATLAB / Octave中的

edge返回二进制/ logical 矩阵。 kmeans要求输入为doublesingle矩阵。

因此,只需将ed投射到double并继续:

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