K означает кластеризацию и Matlab - PullRequest
3 голосов
/ 05 ноября 2011

Мне нужно использовать функцию kmeans на изображении RGB.Каждый элемент алгоритма должен иметь 3 измерения, по одному на каждый канал изображения.Количество элементов будет общим количеством пикселей изображения.Мне нужно использовать kmeans на кластере № 5.

Так вот, что я пытался:

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)

Кто-нибудь может мне помочь?Спасибо

Ответы [ 3 ]

5 голосов
/ 05 ноября 2011

Ваше исключение связано с тем, что kmeans ожидает данные типа double (то есть вызов double во второй строке ниже).Но у вас есть дополнительная проблема в том, что вы не передаете нужные данные в kmeans.Вам необходимо создать одну матрицу с числовым индексом 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 голос
/ 05 ноября 2011

Попробуйте img = double(imread('mypic.jpg'))/255.;

0 голосов
/ 01 февраля 2013
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,[])
...