⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kmeans1.m

📁 My version of k-means function. Improved so that there are no empty clusters after segmentation.
💻 M
字号:
function [ obraz, C ] = KMeans1( C, img, war_stopu )

k = size(C,2);
iter = 0;   % ilosc iteracji
ilosc_pix = 1:1:k;	% tablica ilosci pikseli nalezacych do poszczegolnych klastrow
C_new(3,k) = 0;     % zerowanie wektora centroidow
odleglosci = 200;   % wartosc poczatkowa dla war. stopu
while max(odleglosci) > war_stopu
    for i=1:1:size(img,1)
        for j = 1:1:size(img,2)
            for a = 1:1:k
                % sprawdzanie odleglosci piksela od poszczegolnych klastrow
                d(a) = ((double(img(i,j,1))-C(1,a))^2+(double(img(i,j,2))-C(2,a))^2+(double(img(i,j,3))-C(3,a))^2)^0.5;
            end
            [Y(i,j) V] = min(d);     % pobierz index minimum (numer klastra)
            etykiety(i,j) = V;  % zapisz index w tablicy etykiet
            ilosc_pix(V) = ilosc_pix(V)+1;  % powieksz liczbe pixeli nalezacych do klastra
            obraz(i,j,:) = uint8(C(:,etykiety(i,j)));
        end
	end
	[tmp row] = max(Y);		% znajdowanie piksela o najwiekszej odleglosci
	[tmp1 col] = max(tmp);	%	od przypisanego mu klastra
	row = row(col);
	
    for i=1:1:size(img,1)       % liczenie nowych srodkow klastrow
        for j = 1:1:size(img,2)
            C_new(1,etykiety(i,j)) = double(C_new(1,etykiety(i,j)) + double(img(i,j,1))/ilosc_pix(etykiety(i,j)));
            C_new(2,etykiety(i,j)) = double(C_new(2,etykiety(i,j)) + double(img(i,j,2))/ilosc_pix(etykiety(i,j)));
            C_new(3,etykiety(i,j)) = double(C_new(3,etykiety(i,j)) + double(img(i,j,3))/ilosc_pix(etykiety(i,j)));
        end
    end

    for i = 1:1:k
        if ilosc_pix(i) == 0    % jesli brak pixeli dla danego klastra
            C_new(:,i) = 0;     % wykluczenie klastra
			C_new(:,i) = img(row,col,:);	% przypisanie do klastra punktu znajdujacego sie najdalej od obecnego (niepustego) centroidu
        end
    end

    for i=1:1:k
        odleglosci(i) = distance3D(C(:,i), C_new(:,i));
    end
    odlegl_max = max(odleglosci);
    C = C_new;      % przyjecie nowych srodkow klastrow
    C_new(:,:) = 0; % zerowanie wektorow
    ilosc_pix(:) = 0;   
    iter = iter+1;  
    disp(['W iteracji ',num2str(iter), ' odleglosc max: ',num2str(odlegl_max)]);
	figure();
	imshow(obraz);
	title(['Obraz po ' num2str(iter) ' iteracji K-means']);
end
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -