2013-05-16 46 views
1

我正尝试在h矩阵(来自原始图片)上使用kmeans群集,并且我与使用kmeans的矩阵的大小有关。我知道我需要重塑它,但注意我尝试过。
这里是我的尝试:如何在hsv矩阵上使用kmeans

x = imread('4.jpg'); 
hsv=rgb2hsv(x); 
H=c(:,:,1); 
[m,n]=size(H); 
X = reshape(H,[m,n,3]); 
X = double(squeeze(X)); 
IDX = kmeans(double(H),3); 

我得到的错误:

to reshape the number of elements must not change.

请帮帮忙, 谢谢!

+0

有什么'reshape'和'squeeze'行的目的。我认为它应该没有它们。 –

回答

1

注意你的整形不起作用,因为原始尺寸是m * n,而你正在试图重塑成尺寸为m * n * 3的东西。您不能通过重塑来改变尺寸。

这工作:

x = imread('peppers.png'); 
hsv=rgb2hsv(x); 
H=hsv(:,:,1); %******H=c(:,:,1); 
[m,n]=size(H); 
figure(1), imshow(H); 
%X = reshape(H,[m,n,3]); 
%X = double(squeeze(X)); 
IDX = kmeans(double(H(:)),3); % NOTE change to this line 
H = reshape(IDX,[m,n]); 
figure(2), imagesc(H) 
+0

好的非常感谢你的帮助! 我还有一个问题,我需要取kmeans(IDX)的结果并通过H矩阵,并用kmeans给它的值替换每个picsel:1或2或3. 我试过写: H (IDX == 1)= 0; H(IDX == 2)= 100; H(IDX == 3)= 255; 但它并不能代替所有的矩阵,只是它的一部分。 其实我的目的是将图片分成使用kmeans的集群,但不是原始图片。只在H矩阵上。 有什么建议吗? – user2339198

+1

@ user2339198您只需通过重塑H就可以将图像索引放入图像中。此外,如果您发现帖子有帮助,最好是投票或接受它。 – Bull