✅作者简介:热爱科研的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 图像与游程编码的适配性:为啥它对图像 “格外友好”
游程编码之所以在图像压缩领域备受青睐,是因为它与图像的像素分布特性有着天然的适配性。
先看二值图像,这类图像只有两种像素值,比如常见的黑白图像,非黑即白。在黑白图像中,背景区域往往是大片连续的白色像素,而文字、图形部分则是连续的黑色像素。像扫描的文档图像,白色纸张背景占据了大部分画面,游程编码可以轻松地将连续的白色像素编码成一个二元组,比如 “(白色像素值,连续白色像素个数)”,对黑色文字部分同样如此。这种情况下,游程编码能发挥出极高的压缩效率,大幅减小文件体积。
灰度图像也是游程编码的 “用武之地”。虽然灰度图像的像素值有更多变化,但在一些简单场景下,比如一个渐变的天空图像,从亮到暗的过渡区域,可能存在很多连续且相近灰度值的像素。即使像素值不完全相同,但如果我们将灰度值划分成一定范围的区间,在某个局部区域内,仍会有大量像素落在同一区间,表现出类似连续重复的特性,游程编码也能对其进行有效的压缩处理。
对比文本压缩场景,就能更清晰地看出游程编码对图像的 “偏爱”。文本内容的字符分布随机性很强,很少会出现大量连续重复的字符。就算有重复,也多是个别单词或短语,不像图像中的像素那样,能在二维矩阵结构中形成大面积的连续重复区域。而且图像是由像素组成的矩阵,我们可以方便地逐行或逐列扫描,按顺序统计像素的游程。这种规则的矩阵结构,为游程编码的高效实现提供了便利条件,让游程编码能够快速、准确地捕捉到重复像素序列,完成编码操作,这也是它在图像压缩中优势尽显的重要原因 。
⛳️ 运行结果
Image
Image
Image
📣 部分代码
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仿真,助力科研梦: