2011-11-04 87 views
3

我需要在rgb图像上使用kmeans函数。算法的每个元素都需要3个维度,每个图像的每个通道都有一个维度。元素的数量将是图像的总像素数量。我需要在群集#5上使用kmeansK表示聚类和Matlab

所以这是我的尝试:

img = imread('mypic.jpg'); 
red = img(:,:,1); 
green = img(:,:,2); 
blue = img(:,:,3); 

kmeans(red,5) 


我不知道如果我正确或者不这样做。我有此错误:

??? Error using ==> plus 
Integers can only be combined with integers of the same class, or scalar doubles. 

Error in ==> kmeans>distfun at 704 
      D(:,i) = D(:,i) + (X(:,j) - C(i,j)).^2; 

Error in ==> kmeans at 313 
    D = distfun(X, C, distance, 0); 

Error in ==> mysegmentation at 9 
kmeans(R,2) 

谁能给我个忙吗?由于

回答

5

你的例外,是由于这样的事实,kmeans期待double类型的数据(因此,在下面的第二行调用double)。但是你有一个额外的问题,因为你没有将正确的数据传递给kmeans。您需要创建一个numpixels x 3矩阵。 reshape是你这个东西的朋友。这是一个例子。祝你好运。

img = imread('mypic.jpg'); 
flatImg = double(reshape(img,size(img,1)*size(img,2),size(img,3))); 
idx = kmeans(flatImg,5); 
imagesc(reshape(idx,size(img,1),size(img,2))); 
+0

是!这就是我需要的,一个numpixels x 3矩阵。我很难理解一点重塑的功能。该函数返回一个'size(img,1)* size(img,2)'x'size(img,3)'矩阵,对吧?你能解释一下吗?你在矩阵上放置了'R * G x B'?我很抱歉,但我很新的图像处理,我需要一些帮助:) – user1030373

+0

img(1,1,:)的值是一个3元素向量,其中包含索引(1 ,1)。 flatImg(1,:)的值与img(1,1,:)的值相同。同样,img(1,2,:)中的3个元素与flatImg(2,:)中的3个元素相同。我们正在重新组织img矩阵的结构,将像素视为RGB值的向量,并忽略其空间关系。 – John

+0

太好了,我明白了,我一点一点地理解它!如果我想加入2个维度(现在总共有5个维度),该怎么办?一个具有像素的行号,另一个具有列的编号。我怎样才能改变'flatImg'重塑?提前致谢。 – user1030373

1

尝试img = double(imread('mypic.jpg'))/255.;

+3

或:'IMG = im2double(imread( 'mypic.jpg'));' – Amro

0
I1= imread('d:\flowers.jpg'); 
I2=rgb2gray(I1); 

I=double(I2); 
figure 
subplot(1,3,1) 
imshow(I1) 
subplot(1,3,2) 
imshow(I2) 
g=kmeans(I(:),4); 
J = reshape(g,size(I)); 
subplot(1,3,3) 
imshow(J,[])