matlab利用K-Means图像压缩

matlab利用K-Means图像压缩

应用K-Means算法来压缩图像

原理为:先对图像的每个像素运行K-Means算法,然后将每个像素映射为最近的质心。

应用K-Means算法来压缩图像代码

设置k值,即将图像压缩为几色,设置最大迭代次数。

% 可以尝试修改如下的K值及最大迭代次数max_iters
K = input('请输入K值(2~16):');
max_iters = input('请输入最大迭代次数(10~50):');

%  加载图像文件
A = double(imread('img.jpg'));
A = A / 255;  % 除以255将三原色的值转换为0~1之间

% 图像尺寸
img_size = size(A)

% 重新调整图像数据为Nx3矩阵,N为像素数目。每行有三列,分别为RGB三色
X = reshape(A, img_size(1) * img_size(2), 3);

% 随机设置初始质心
initial_centroids = initCentroids(X, K);

% 运行K-Means算法
%[centroids, ~] = runkMeans(X, initial_centroids, max_iters);
% Initialize values
[n , ~] = size(X);
K = size(initial_centroids, 1);
centroids = initial_centroids;
previous_centroids = centroids;
idx = zeros(n, 1);

% 迭代运行K-Means算法
for ii = 1 : max_iters
    % 输出迭代次数
    %fprintf('K-Means迭代次数:%d/%d...\n', ii, max_iters);
    
    % 将数据集中的每一个样本分配给离它最近的质心
    idx = EStep(X, centroids);
    
    % 计算新质心
    centroids = MStep(X, idx, K);
end

%% 图像压缩
% 查找最近的质心
idx = EStep(X, centroids);

% 压缩的实质是:将原始图像数据X用质心来表示
% 因此,将每个像素映射为质心颜色值
X_recovered = centroids(idx, :);

% 重新调整矩阵为适合的图像尺寸
X_recovered = reshape(X_recovered, img_size(1), img_size(2), 3);

% 显示原始图像
subplot(1, 2, 1);
imshow(A);
axis image;
title('原始图像');

% 显示压缩图像
subplot(1, 2, 2);
imshow(X_recovered);
axis image;
title(sprintf('压缩图像(%d色)', K));

% 保存压缩图像
imwrite(X_recovered, '4.jpg');
fprintf('\nK-Means运行完毕。\n\n');

图像显示:

如图是将原始图像压缩为四色,即为四个聚类中心。
在这里插入图片描述

计算图像压缩率

原始图像的分辨率为4000×2992,也就是N=4000×2992=11968000个像素,共需要24×11968000=287232000比特。压缩图像为4色,即为k等于4, l o g 2 ⁡ K = 2 log_2⁡K=2 log2K=2,则图像压缩后需 24 K + N l o g 2 ⁡ K = 24 × 4 + 11968000 × 2 = 23936096 24K+Nlog_2⁡K=24×4+11968000×2=23936096 24K+Nlog2K=24×4+11968000×2=23936096比特,压缩率为8.3%。
文件会有头部信息等其它信息,实际文件大小会较大,因此计算实际压缩率,原始图像文件实际占1847296字节,压缩图像文件占516096字节,实际压缩率约为27.9%。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
调用自定义函数解决题目: 1.读取自然图像、生成合成图像、高相关图像、高去相关图像,调用yasuo.m函数,完成压缩,并显示不同像素值的图像 2.读取自然图像、生成合成图像、高相关图像、高去相关图像,调用yasuo.m函数,完成压缩,并显示不同像素值的图像;调用dfff.m,得到傅里叶变换后的图像 3.读取自然图像、生成合成图像、高相关图像、高去相关图像,fft中心变换,得到傅里叶变换后的图像,调用fwhtdya2d.m,得到walsh变换后的图像,进行两种变换的对比 4.读取自然图像、生成合成图像、高相关图像、高去相关图像,调用yasuo.m函数,完成压缩,并显示不同像素值的图像;调用dfff.m,得到傅里叶变换后的图像和傅里叶变换需要的时间,显示变换后的图像,显示傅里叶变换时间随图像像素的变化 5.调用butterworthw.m,使用不同的阶数:2,5,10,显示不同阶数butterworth高通滤波和低通滤波滤波器的传递函数和处理后的图像,用于对比阶数对图像处理的影响 6.调用butterworthw.m,显示原图像、原图像频谱、低通滤波、高通滤波的传递函数,以及滤波器处理后的图像 7.读取自然图像、生成合成图像、高相关图像、高去相关图像,使用标准差为0.1、0.5、0.9的拉普拉斯高斯滤波器进行滤波处理4种图像,同时显示原图像和滤波处理后图像 8.读取自然图像,转换成灰度图片,计算其直方图,并两次增强,储存两次增强的图像,同时显示原图像、增强图像、再次增强图像和它们的直方图 9.读出自然图象,转换成灰度图片,生成合成图片,调用kirsch.m,提取图像边缘并显示,调用sobele.m,提取图像边缘并显示,同时显示自然图像、合成图像、它们kirsch提取边缘处理的图像、它们sobel提取边缘处理的图像,便于对比 10.读取自然图像、生成合成图像、高相关图像、高去相关图像,调用yasuo.m函数,完成压缩,并显示不同像素值的图像;调用dfff.m,得到傅里叶变换后的图像、傅里叶变换、傅里叶中心变换需要的时间,显示不同种类图像变换后的图像,显示傅里叶变换、傅里叶中心变换所需时间时间随图像像素的变化

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值