我需要在rgb图像上使用kmeans
函数。算法的每个元素需要具有3个维度,每个维度对应于图像的每个通道。元素的数量将是图像的总像素数。我需要在群集#5上使用kmeans
。
所以这就是我的尝试:
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)
任何人都可以帮我一把吗?感谢
答案 0 :(得分: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)));
答案 1 :(得分:1)
尝试img = double(imread('mypic.jpg'))/255.;
答案 2 :(得分: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,[])