【ML实验6】K-means(图像压缩)

实验代码获取 github repo
山东大学机器学习课程资源索引


实验目的

在这里插入图片描述

实验内容

在这里插入图片描述
code

[m, n, color] = size(A);
k = 16;     % 簇数
center = zeros(k, 3);

% 随机采样图像中16个pixel作为初始中心点
for i = 1 : k
    rp = randperm(m, 2);
    center(i, :) = A(rp(1), rp(2), :);
end

% 迭代
maxiter = 60;
label = zeros(m, n);
% K-means loss function
Loss = zeros(1, maxiter);
for i = 1 : maxiter
    for x = 1 : m
        for y = 1 : n   % 遍历所有pixel
            min_dis = 1e10;
            for j = 1 : k   % calculate its nearest mean
                dis = [A(x, y, 1) - center(j, 1), A(x, y, 2) - center(j, 2), A(x, y, 3) - center(j, 3)];
                % A(x, y, :): 1 * 1 * 3
                % center(k, :): 1 * 3
                dis = dis * dis';
                if min_dis > dis
                    min_dis = dis;
                    label(x, y) = j;
                end
            end
            Loss(i) = Loss(i) + min_dis;
        end
    end
    
    % Update the values of the means
    cluster_size = zeros(k, 1);
    new_center = zeros(k, 3);
    for x = 1 : m
        for y = 1 : n
            lb = label(x, y);
            cluster_size(lb) = cluster_size(lb) + 1;
            new_center(lb, :) = new_center(lb, :) + [A(x, y, 1), A(x, y, 2), A(x, y, 3)];
        end
    end
    for j = 1 : k
        if cluster_size(k) ~= 0
            center(k, :) = new_center(k, :) / cluster_size(k);
        end
    end
end

聚类对象是颜色,由(r,g,b)表达,共 25 6 3 256^3 2563种,距离是颜色在颜色空间中的距离,设颜色 c 1 = [ r 1 , g 1 , b 1 ] c_1=[r_1,g_1,b_1] c1=[r1,g1,b1] c 2 = [ r 2 , g 2 , b 2 ] c_2=[r_2,g_2,b_2] c2=[r2,g2,b2],两种颜色的距离为 ∣ ∣ c 1 − c 2 ∣ ∣ ||c_1-c_2|| ∣∣c1c2∣∣.

在这里插入图片描述
在这里插入图片描述
这里是在 Small Image 上运行 k-means 算法得到16个颜色中心,将其作为压缩图像的颜色(就是压缩后的图像仅包含这16种颜色),压缩 Small Image 以及 Large Image.
code

% Reassigning Colors to The Large Image
B = double(imread('bird_large.tiff'));
[M, N, ~] = size(B);
for x = 1 : M
    for y = 1 : N
        min_dis = 1e18; lb = -1;
        for j = 1 : k
            dis = [B(x, y, 1) - center(j, 1), B(x, y, 2) - center(j, 2), B(x, y, 3) - center(j, 3)];
            dis = dis * dis';
            if min_dis > dis
                min_dis = dis;
                lb = j;
            end
        end
        B(x, y, :) = [center(lb, 1), center(lb, 2), center(lb, 3)];
    end
end

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

u小鬼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值