kmeans--第一个matlab算法

本文介绍了一种基于K均值算法的图像量化方法,通过迭代更新聚类中心来实现图像颜色的压缩。该方法首先定义了初始聚类中心,然后通过不断分配像素到最近的聚类中心并更新这些中心来逐步优化图像的颜色表示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

%k均值算法
imMatrix = imread('../pic/qiushuzhen.jpg'); % 404x500x3
imMatrix = imMatrix(150:350,150:350,1:end);


KM = 32; %最终聚类的大小
%图像的大小
rgbSize = size(imMatrix); %数组下标从1开始
%imshow(imMatrix); %显示图片
%imMatrix(1,1,1:end)
%for i=1:1:rgbSize(1)
%    for j=1:1:rgbSize(2)
%        imMatrix(i,j,1) = 0; %为了方便显示
%        imMatrix(i,j,2) = 0;
%    end
%end


%算法开始
%原始的切分点(转置)
repeat_max_count = 50;
sp = [zeros(1,KM);zeros(1,KM);linspace(1,255,KM)]';
sp_res = cell(repeat_max_count);
sp_res{1} = sp;
all_sp_dis = 100000000;
repeat_count = 1;
while 1
    sp_point_sum = zeros(KM,3); %收集到的点的各个维度的像素和
    sp_sum = zeros(KM,1); %收集到的像素点在切分点之和
    sp_cnt = zeros(KM,1); %收集到的像素点在切分点的个数
    %im2sp imMatrix归属于哪个切分点(数组下标)
    %im2sp=zeros(rgbSize(1), rgbSize(2));
    for i=1:1:rgbSize(1)
        for j=1:1:rgbSize(2)
            dis = 100000;
            selectp = 1;
            for k=1:1:KM %选出最近的那个点
                ss=sp(k,1:end,1:end)';
                tp = [imMatrix(i,j,1) imMatrix(i,j,2) imMatrix(i,j,3)]';
                dis_p = ss-double(tp);  
                dis2 = norm(dis_p,3);
                if dis2 < dis
                    dis = dis2;
                    selectp = k;
                end
            end
            tt = sp_point_sum(selectp,1:end);
            tp = double([imMatrix(i,j,1) imMatrix(i,j,2) imMatrix(i,j,3)]);
            sp_point_sum(selectp,1:end) = tt + tp;
            sp_sum = sp_sum + dis;
            sp_cnt(selectp) = sp_cnt(selectp) + 1;
        end
    end
    sp_new = zeros(KM,3);
    sp_all_change = 0; %两次计算的原始点之间的变化率,判断结束的条件
    for ii=1:1:KM
        if sp_cnt(ii) == 0
            sp_new(ii) = sp(ii);
        else
            sp_new(ii,1:end) = sp_point_sum(ii,1:end)/sp_cnt(ii);
            sp_all_change = sp_all_change + norm(sp_new(1:end)-sp(1:end), 3);
        end
    end
    
    repeat_count = repeat_count + 1
    if repeat_count >= repeat_max_count
        break
    end
    sp = sp_new;
    %sp_res = [sp_res;sp];
    sp_res{repeat_count} = sp;
    if all_sp_dis - sp_all_change < 1
        break
    end
    all_sp_dis = sp_all_change;
    %length(x1)-length(unique(x1))
end


y_count = 5;
x_count = double(int8((repeat_count + y_count - 1 + 1) / y_count));
subplot(x_count,y_count,1);
imshow(imMatrix);
for ii=1:1:repeat_count
    imMatrixTmp = imMatrix;
    ssp = cell2mat(sp_res(ii));
    for i=1:1:rgbSize(1)
        for j=1:1:rgbSize(2)
            dis = 100000;
            selectp = 1;
            for k=1:1:KM %选出最近的那个点
                ss=ssp(k,1:end,1:end)';
                tp = [imMatrixTmp(i,j,1) imMatrixTmp(i,j,2) imMatrixTmp(i,j,3)]';
                dis_p = ss-double(tp);  
                dis2 = norm(dis_p,3);
                if dis2 < dis
                    dis = dis2;
                    selectp = k;
                end
            end
            imMatrixTmp(i,j,1:end) = uint8(ssp(selectp,1:end));
        end
    end
    [x_count y_count ii]
    subplot(x_count,y_count,ii+1);
    imshow(imMatrixTmp);
end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值