矩阵分析:基于SVD的彩色图像压缩技术 | 您所在的位置:网站首页 › 奇异值分解流程图 › 矩阵分析:基于SVD的彩色图像压缩技术 |
题目:基于SVD的彩色图片压缩技术 摘要:本文首先研究图片的构成原理,结合矩阵分析,将图片分解为三种颜色矩阵,然后通过矩阵的奇异值分解将原本的颜色矩阵分解为两个酉矩阵和一个对角矩阵的乘积,然后通过选择对角矩阵中特征值的个数对图像进行一定程度的压缩。经实验证明利用矩阵奇异值分解可以做到图片的无损压缩以及允许极小误差下的有损压缩,并且效果显著,不仅有利于网络传输,还减轻了图片存储压力。 关键字:SVD;奇异值分解;压缩;有色图片; 1,引言在人类获取的所有信息中,83%来源于眼睛,也就是视觉。眼睛获得的信息可以类比于每秒获取24帧的图片,甚至更多。大部分情况下,一张图片可以代替繁长冗余的描述,可以轻松便捷地表达信息。一个典型的例子是:春运返程,编辑者可以通过折线图和人流拥挤照片表达几百字甚至几千字所要描述的信息,不仅不需要描述春运的各种数据量和春运现场场景就能让读者身临其境。而且通过图片存储下来的信息可以永久的留存下来,不会丢失,不会破坏,更不需要大脑去刻意记忆。论文[1]中也提到图片更多更详细的作用。 随着信息化时代的到来,计算机技术(硬件技术和软件技术)的不断发展[2],使得人们可以通过一些物理设备(摄像机等)捕捉外部图像信息并以数字形式传输和存储下来。主流颜色空间分为:RGB三原色颜色空间和单通道灰度空间。RGB三通道颜色空间将图片拆解为三张颜色不同的图片(红色、绿色和蓝色),可以根据每种颜色的取值不同然后进行叠加表示出所有的颜色,单独的某种颜色只能表示出当前颜色的灰度值。为了减少在网络中的数据传输量,通常采用单通道灰度空间,即图片的每个像素块不再需要三个数值(RGB值)来表示,图片只表达亮度信息,每个像素块只有白到黑组成,取值[0,255]。 如图1所示。 互联网中为了保障及时性和实时性,通常对数据的传输速率要求很高,特别是金融、军事和人工智能软件[3]。由于单通道灰度空间图片辨识度低,不符合大众潮流,因此互联网中的图像数据通常采用RGB空间式图片进行传输。例如将一张像素为 2*2 图片使用RGB三通道颜色空间会产生如下结果:图片的每个像素会被分解成三个数值,分别表示RGB的三个值。2*2 个像素点组成的矩阵则被拆分为三个矩阵,分别代表R矩阵、G矩阵和B矩阵[5]。 大量的图片信息会给客户机,服务器以及网络链路带来沉重的负担。例如,一个2000*1024分辨率的图片,如果每个像素为2字节。在无压缩的bmp格式下其大小为:2000*1024*2B约4M。这是显然无法接受的,这不仅仅给网络传输带来的挑战,也给存储带来了挑战。当使用jpg或png等格式的时候[4],这时图片已经有所压缩,缩小大小可能小于1M,这往往还不够,对于网络情况差以及大规模图片存储等情况还是有一定挑战。因此,对图片进行数据压缩是必要的。 本论文通过对彩色图像的三个矩阵:R矩阵、G矩阵和B矩阵进行奇异值分解,然后选取指定数量的特征值对原矩阵进行压缩,进而到达压缩图片的目的。 2,压缩原理当前有很多图像压缩方法并被证明是有效的。例如:JPG、GIF和JPEG的广泛使用。对于一张图片来说,能被压缩的主要原因在于:图像中存在着冗余数据。如何消除这些冗余的数据做用尽可能少的数据表时原本的图片就需要利用矩阵的奇异值分解。第一节中讲到可以把一张图片解析成三个矩阵的形式,然后我们通过奇异值分解,将每个矩阵分解为三个矩阵的乘积,然后通过选择特征值的数量做到对图片的压缩。当选取全部特征值时即为无损压缩。 矩阵的奇异值的定义:设 矩阵奇异值分解的定义:设
其中
将
即,对
当 随着 根据图片压缩的原理,设计出如下图片压缩流程: 实验环境:Python 3.7+Numpy+PIL。 实验平台:Pycharm。 实验过程:利用PIL包下的Image类读取图片,使用numpy将图片转换为 ndarray 类型,将ndarray类型的数据分解为R、G、B矩阵,利用numpy将三个矩阵进行分解,得到奇异值分解矩阵 读取彩色图片: img = Image.open(u'1.jpg', 'r')图片信息:800*540像素,218KB。 获取图片对应的数组: a = np.array(img) print(a.shape,type(a)) ====================== (540, 800, 3)从结果可以看出,上面图片对应的数组为:540*800像素,R、G、B三类数组。 求解三原色矩阵: u, sigma, v = np.linalg.svd(a[:, :, 0]) R = rebuild_img(u, sigma, v, k) u, sigma, v = np.linalg.svd(a[:, :, 1]) G = rebuild_img(u, sigma, v, k) u, sigma, v = np.linalg.svd(a[:, :, 2]) B = rebuild_img(u, sigma, v, k)其中, 求解压缩矩阵: I = np.stack((R, G, B), 2)利用numpy将三个压缩后的颜色矩阵,重新组合,即得到最简化矩阵。 3.3,实验结果对特征值数量 在一般情况下,对于256≤m,n≤2048的图像,选取25≤k≤100 时都有较好的效果[6],因此选取结果如表所示。 1 10 20 30 40 50 60 70 80 90 100 322 32.2 16 10.7 8.0 6.4 5.3 4.6 4.0 3.5 3.2 压缩后图片效果如下: 通过统计压缩后的图片信息,得到图片文件大小如表2所示: k 1 10 20 30 40 50 60 70 80 90 100 原图 ρ 322 32.2 16 10.7 8.0 6.4 5.3 4.6 4.0 3.5 3.2 1 size(KB) 36 56 66 73 78 82 85 88 90 92 94 219 3.4,实验小结通过实验结果可以看出,在不影响图片清晰度的情况下,可以对图片进行一定程度的压缩使得图片在文件大小上大幅度减少。实验结果表明,在该图片下, 实验结果也表明,在选取一定数量的特征之后,图片的质量也就不会发生改变,即此时的值为无损压缩选取的特征向量的个数,在本实验中无损压缩所取的特征值的个数为: 本文利用矩阵的奇异值分解对彩色图像进行压缩,将一张彩色图像分解为三个颜色矩阵:R矩阵、G矩阵和B矩阵,将每个颜色矩阵进行奇异值分解,然后选择指定数量的特征对矩阵进行压缩。随着选取特征数量的增加,存在某个特征值数量,当选取特征值数量大于该值时,图片压缩比的变化趋近于0,即图片的清晰度没有实质性的改变。实验结果显著,在不影响图片清晰度的情况下可以极大减少图片的文件大小,减轻图片传输时的网络负担,减轻文件存储压力。同时实验也证实了利用矩阵奇异值分解对图片压缩这种方法的可行性。 虽然利用矩阵奇异值分解对图可以实现对图片的压缩,有较好的应用价值。但是上述方法仍然有一定的不足:对于超大型图片,矩阵利用上述方法求矩阵的奇异值分解时速度较慢,尤其是选取特征值数量较多时,因此后续可以考虑能否设计或者实现某种快速求解高维度矩阵奇异值分解的算法。 引用[1]周二立. 简论图片的优势和作用[J]. 新闻爱好者:上半月, 2009. [2]孙亚辉. 计算机技术与电子商务发展的关系[J]. 电子技术与软件工程, 2017(19):1. [3]吴俊政. 一种基于奇异值分解的图像压缩方法[J]. 计算机与数字工程, 2009, 37(005):136-138. [4]邓子云. 基于奇异值分解的图像压缩技术. 计算机系统应用, 2021, 30(2): 35-42. [5]胡乡峰, 卫金茂. 基于奇异值分解(SVD)的图像压缩[J]. 东北师大学报:自然科学版, 2006, 38(3):4. [6]徐冲,张凯院等. 矩阵论简明教程[M]. 科学出版社, 2014. [7]曾超,张卫东,徐永利.基于奇异值分解的图像压缩及其Matlab实现[J].科技信息,2010(14):484-484. |
CopyRight 2018-2019 实验室设备网 版权所有 |