2015-05-21 36 views
1

我試過下面的代碼。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_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然後把該圖像的紅色成分,然後所得到的圖像上施加的閉合操作然後我使用canny方法進行邊緣檢測。然後我嘗試在邊緣檢測的結果上使用kmeans。

我得到一個錯誤,說kmeans需要真正的矩陣。 幫助將不勝感激。

回答

1

edge在MATLAB/Octave中返回一個二進制/ logical矩陣。 kmeans要求輸入爲doublesingle矩陣。

因此,簡單地投eddouble並繼續:

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

它的工作謝謝。 –

+0

完全沒問題。祝你好運! – rayryeng