news 2026/4/3 5:31:43

【图像压缩】基于游值算法实现图像压缩附Matlab代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【图像压缩】基于游值算法实现图像压缩附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。

🍎 往期回顾关注个人主页:Matlab科研工作室

👇 关注我领取海量matlab电子书和数学建模资料

🍊个人信条:格物致知,完整Matlab代码获取及仿真咨询内容私信。

🔥 内容介绍

一、开篇:为啥我强推游程编码?图像压缩的刚需与痛点

1.1 博主亲测:图像存储传输的 “老大难” 问题

作为一个在图像处理领域摸爬滚打许久的博主,我踩过的坑、遇过的难题可真不少,其中图像存储与传输问题,堪称 “老大难”。就拿之前我做的一个小型图像处理项目来说,项目里涉及大量高清图像。这些图像的分辨率动不动就好几千像素,色彩深度也很高,随便一张图,内存占用都是好几兆起步。每次运行程序加载这些图像时,电脑内存就像被 “吸血鬼” 盯上了一样,急剧飙升,电脑运行速度也变得迟缓不堪,卡顿到让人怀疑人生。

而当需要将处理后的图像传输到服务器时,问题更是接踵而至。在低带宽网络环境下,传输这些大体积图像简直就是一场噩梦。一个简单的图像上传操作,都要等上漫长的时间,进度条像是故意和我作对,半天都不动一下,还时不时因为网络不稳定而中断传输,前功尽弃。

为了解决这些问题,我尝试了多种图像压缩算法。从常见的 JPEG 压缩,到一些相对小众的无损压缩算法,可结果都不太理想。JPEG 压缩虽然能大幅减小文件体积,但它是有损压缩,图像质量会明显下降,一些细节丢失严重,对于对图像质量要求较高的项目来说,根本无法接受。而其他无损压缩算法呢,要么实现起来过于复杂,需要大量的代码编写和调试工作;要么压缩效果不尽人意,无法在存储空间和传输效率上带来显著的改善。

直到我接触到游程编码(Run - Length Encoding,RLE),才仿佛在黑暗中找到了那一丝曙光。它的原理简单易懂,实现起来也相对轻松,更重要的是,它属于无损压缩算法,能够在不损失任何图像信息的前提下,对图像进行有效的压缩。特别是对于那些包含大量连续重复像素的图像,比如简单的图形图像、黑白图像或者低色彩变化的图像,游程编码的压缩效果堪称惊艳,能够极大地减少图像的数据量,从而降低存储成本和传输时间。这一发现让我兴奋不已,也迫不及待地想要在这篇文章里,把游程编码详细介绍给大家。

1.2 一分钟搞懂:图像压缩的核心诉求

在深入探讨游程编码之前,我们先来明确一下图像压缩的核心诉求,毕竟 “知己知彼,百战不殆” 嘛。图像压缩,说白了就是要在尽可能减少图像文件大小的同时,最大程度地保留图像的关键信息。总结起来,主要有两大核心需求:一是节省存储和传输成本,二是在特定场景下实现无损压缩。

在如今这个信息爆炸的时代,图像数据的规模呈指数级增长。无论是个人用户手机里成千上万张的照片,还是企业级应用中大量的产品图片、监控图像,存储这些图像都需要占用大量的硬盘空间。而随着云存储服务的兴起,存储成本更是与数据量直接挂钩。同样,在网络传输过程中,大体积的图像文件会消耗更多的带宽资源,增加传输成本,还会导致加载速度缓慢,影响用户体验。所以,降低图像文件大小,能够显著节省存储和传输成本,这对于个人、企业乃至整个互联网行业来说,都具有重要的经济意义。

无损压缩在很多场景下也是必不可少的。比如在医疗领域,X 光片、CT 扫描图像等对于疾病诊断至关重要,任何图像信息的丢失都可能导致误诊,因此必须保证图像在压缩和解压缩过程中不发生任何改变;在金融行业,一些重要的票据图像、合同图像也需要无损压缩,以确保数据的完整性和准确性,避免因图像信息缺失而引发的法律风险。

游程编码正是精准地瞄准了图像中连续重复像素这一数据冗余点,巧妙地对其进行编码处理,实现了图像的轻量化压缩。它的出现,为解决图像压缩难题提供了一种高效、简洁的方案,接下来,就让我们一起深入探究游程编码的神奇之处吧。

二、原理吃透:游程编码到底是怎么 “压缩” 图像的?

2.1 游程编码的核心逻辑:从 “重复像素” 到 “计数 + 值”

游程编码(Run - Length Encoding,RLE),从名字就能看出,它的核心在于对 “游程”,也就是连续重复数据的处理。其本质就是将连续重复出现的像素序列,巧妙地转化为 “像素值 + 连续出现次数” 这样的二元组形式 ,从而实现数据的精简存储。

以简单的二值图像为例,假设我们有一段像素序列 “00011100”,在未编码时,需要逐个记录每个像素值,一共 8 个数据。而运用游程编码后,就可以将其编码为 “(0,3)(1,3)(0,2)”。这里,“(0,3)” 表示像素值为 0,连续出现了 3 次;“(1,3)” 表示像素值为 1,连续出现 3 次;“(0,2)” 则是像素值为 0,连续出现 2 次。原本 8 个数据,现在通过 3 个二元组就表示清楚了,数据量大幅减少,这就是游程编码实现压缩的基本过程。

这种编码方式的精妙之处在于,它精准地抓住了图像数据中可能存在的冗余信息 —— 连续重复像素。在很多图像里,尤其是一些简单图形、纯色背景图像中,这类重复像素非常常见。通过游程编码,把这些重复信息用更紧凑的方式表达,既不会丢失任何原始数据,又极大地减少了存储空间,属于无损压缩的范畴。无论是对于早期存储空间极为有限的计算机系统,还是如今需要在海量图像数据中高效管理存储资源的大数据环境,游程编码的这种无损、高效压缩特性都显得尤为珍贵。

2.2 图像与游程编码的适配性:为啥它对图像 “格外友好”

游程编码之所以在图像压缩领域备受青睐,是因为它与图像的像素分布特性有着天然的适配性。

先看二值图像,这类图像只有两种像素值,比如常见的黑白图像,非黑即白。在黑白图像中,背景区域往往是大片连续的白色像素,而文字、图形部分则是连续的黑色像素。像扫描的文档图像,白色纸张背景占据了大部分画面,游程编码可以轻松地将连续的白色像素编码成一个二元组,比如 “(白色像素值,连续白色像素个数)”,对黑色文字部分同样如此。这种情况下,游程编码能发挥出极高的压缩效率,大幅减小文件体积。

灰度图像也是游程编码的 “用武之地”。虽然灰度图像的像素值有更多变化,但在一些简单场景下,比如一个渐变的天空图像,从亮到暗的过渡区域,可能存在很多连续且相近灰度值的像素。即使像素值不完全相同,但如果我们将灰度值划分成一定范围的区间,在某个局部区域内,仍会有大量像素落在同一区间,表现出类似连续重复的特性,游程编码也能对其进行有效的压缩处理。

对比文本压缩场景,就能更清晰地看出游程编码对图像的 “偏爱”。文本内容的字符分布随机性很强,很少会出现大量连续重复的字符。就算有重复,也多是个别单词或短语,不像图像中的像素那样,能在二维矩阵结构中形成大面积的连续重复区域。而且图像是由像素组成的矩阵,我们可以方便地逐行或逐列扫描,按顺序统计像素的游程。这种规则的矩阵结构,为游程编码的高效实现提供了便利条件,让游程编码能够快速、准确地捕捉到重复像素序列,完成编码操作,这也是它在图像压缩中优势尽显的重要原因 。

⛳️ 运行结果

📣 部分代码

clear

close all

% uiopen('~/Desktop/E.png',1)

image = imread('logo.png'); % 读取图像image

figure,imshow(image),title('原图');

% imageA = rgb2gray(image);

for i = 1:1:3

imageA = image(:,:,i);

imageB = imageA(:);

lengthB = length(imageB);

shape= size(image);

% for i=1:1:lengthB

% if imageB(i) >= 127

% imageB(i) = 255;

% else imageB(i) = 0;

% end

% end

imageC = reshape(imageB,shape(1),shape(2));

figure,imshow(imageC);

X = imageC(:);

x = 1:1:length(X);

figure,plot(x,X(x));

j = 1;

imageD = 0;

imageD(1) = 1;

for z = 1:1:(length(X)-1)

if X(z) == X(z+1)

imageD(j) = imageD(j)+1;

else

data(j) = X(z);

j = j+1;

imageD(j) = 1;

end

end

data(j) = X(length(X));

lengthD = length(imageD);

% y = 1:1:lengthD;

% figure,plot(y,imageD);

CR(i) = lengthB/lengthD;

l = 1;

for m = 1:lengthD

for n = 1:1:imageD(m)

rec_image(l) = data(m);

l = l + 1;

end

end

u = 1:1:length(rec_image);

figure,plot(u,rec_image(u)),title('压缩结果');

rec2_image(:,:,i) = reshape(rec_image,shape(1),shape(2));

% figure,imshow(rec2_image);

end

% for i = 1:1:3

% reImage(:,:,i) = rec2_image(i);

% end

figure,imshow(rec2_image);

🔗 参考文献

[1]王成优,侯正信.JPEG图像压缩编码及其MATLAB仿真实现[J].电子测量技术, 2007, 30(1):3.DOI:10.3969/j.issn.1002-7300.2007.01.045.

🏆团队擅长辅导定制多种科研领域MATLAB仿真,助力科研梦:

🌈 各类智能优化算法改进及应用
生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化、背包问题、 风电场布局、时隙分配优化、 最佳分布式发电单元分配、多阶段管道维修、 工厂-中心-需求点三级选址问题、 应急生活物质配送中心选址、 基站选址、 道路灯柱布置、 枢纽节点部署、 输电线路台风监测装置、 集装箱调度、 机组优化、 投资优化组合、云服务器组合优化、 天线线性阵列分布优化、CVRP问题、VRPPD问题、多中心VRP问题、多层网络的VRP问题、多中心多车型的VRP问题、 动态VRP问题、双层车辆路径规划(2E-VRP)、充电车辆路径规划(EVRP)、油电混合车辆路径规划、混合流水车间问题、 订单拆分调度问题、 公交车的调度排班优化问题、航班摆渡车辆调度问题、选址路径规划问题、港口调度、港口岸桥调度、停机位分配、机场航班调度、泄漏源定位
🌈 机器学习和深度学习时序、回归、分类、聚类和降维

2.1 bp时序、回归预测和分类

2.2 ENS声神经网络时序、回归预测和分类

2.3 SVM/CNN-SVM/LSSVM/RVM支持向量机系列时序、回归预测和分类

2.4 CNN|TCN|GCN卷积神经网络系列时序、回归预测和分类

2.5 ELM/KELM/RELM/DELM极限学习机系列时序、回归预测和分类
2.6 GRU/Bi-GRU/CNN-GRU/CNN-BiGRU门控神经网络时序、回归预测和分类

2.7 ELMAN递归神经网络时序、回归\预测和分类

2.8 LSTM/BiLSTM/CNN-LSTM/CNN-BiLSTM/长短记忆神经网络系列时序、回归预测和分类

2.9 RBF径向基神经网络时序、回归预测和分类

2.10 DBN深度置信网络时序、回归预测和分类
2.11 FNN模糊神经网络时序、回归预测
2.12 RF随机森林时序、回归预测和分类
2.13 BLS宽度学习时序、回归预测和分类
2.14 PNN脉冲神经网络分类
2.15 模糊小波神经网络预测和分类
2.16 时序、回归预测和分类
2.17 时序、回归预测预测和分类
2.18 XGBOOST集成学习时序、回归预测预测和分类
2.19 Transform各类组合时序、回归预测预测和分类
方向涵盖风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、用电量预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断
🌈图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知
🌈 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、 充电车辆路径规划(EVRP)、 双层车辆路径规划(2E-VRP)、 油电混合车辆路径规划、 船舶航迹规划、 全路径规划规划、 仓储巡逻
🌈 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配、无人机安全通信轨迹在线优化、车辆协同无人机路径规划
🌈 通信方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化、水声通信、通信上传下载分配
🌈 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化、心电信号、DOA估计、编码译码、变分模态分解、管道泄漏、滤波器、数字信号处理+传输+分析+去噪、数字信号调制、误码率、信号估计、DTMF、信号检测
🌈电力系统方面
微电网优化、无功优化、配电网重构、储能配置、有序充电、MPPT优化、家庭用电
🌈 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长 金属腐蚀
🌈 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合、SOC估计、阵列优化、NLOS识别
🌈 车间调度
零等待流水车间调度问题NWFSP 、 置换流水车间调度问题PFSP、 混合流水车间调度问题HFSP 、零空闲流水车间调度问题NIFSP、分布式置换流水车间调度问题 DPFSP、阻塞流水车间调度问题BFSP
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/1 18:51:52

未来办公自动化趋势:MinerU驱动的智能文档流部署教程

未来办公自动化趋势:MinerU驱动的智能文档流部署教程 在日常办公中,你是否也经历过这样的场景:收到一份几十页的PDF技术白皮书,需要把其中的公式、表格、图表和正文全部整理成可编辑的文档?手动复制粘贴不仅耗时&…

作者头像 李华
网站建设 2026/3/13 2:30:43

美团外卖霸王餐api接口对接过程中有哪些需要注意的问题?

美团霸王餐API核心价值美团霸王餐API接口是美团开放平台提供的应用程序编程接口,核心价值在于:提升用户粘性:通过霸王餐活动吸引用户,增加平台使用频次和停留时间拓展盈利渠道:通过CPS模式获得佣金收入,或作…

作者头像 李华
网站建设 2026/4/2 13:39:37

MindSpore昇腾性能分析与优化实战指南

一、Profiler深度使用指南 1.1 Profiler完整配置与数据收集 # profiler_setup.py import mindspore as ms import mindspore.nn as nn from mindspore import Profiler, GpuMemoryProfiler, AscendCollector import os import jsonclass ComprehensiveProfiler:""&…

作者头像 李华
网站建设 2026/4/1 4:26:25

C++流程控制

一、流程控制的核心概念 C 的流程控制分为三大类(结构化程序设计的核心): 顺序结构:代码从上到下逐行执行(默认逻辑);分支结构:根据条件执行不同代码(if/switch&#x…

作者头像 李华
网站建设 2026/3/23 0:45:35

基于Qwen的内容审核:情感极性识别部署案例

基于Qwen的内容审核:情感极性识别部署案例 1. 为什么一个模型就能干两件事? 你有没有遇到过这样的情况:想给用户评论加个“正面/负面”标签,又想顺便做个智能回复?结果一查方案,发现得装两个模型——一个…

作者头像 李华
网站建设 2026/3/29 3:27:12

Unsloth自动混合精度:AMP配置与稳定性平衡技巧

Unsloth自动混合精度:AMP配置与稳定性平衡技巧 1. unsloth 简介 用Unsloth训练你自己的模型,Unsloth是一个开源的LLM微调和强化学习框架。 在Unsloth,我们的使命是让人工智能尽可能准确且易于获取。训练并部署DeepSeek、gpt-oss、Llama、T…

作者头像 李华