基于深度学习的图像压缩

article/2025/9/25 0:50:04

近年来,深度学习在计算机视觉领域已经占据主导地位,不论是在图像识别还是超分辨重现上,深度学习已成为图片研究的重要技术,但它们的能力并不仅限于这些任务;现在深度学习技术已进入图片压缩领域。下面就说说神经网络在图像压缩领域的应用。

当前主要图片压缩算法

说到图像压缩算法,目前市面上影响力比较大的图片压缩技术是WebP和BPG

WebP:谷歌在2010年推出的一款可以同时提供有损压缩和无损压缩的图片文件格式,其以VP8为编码内核,在2011年11月开始可以支持无损和透明色功能。目前facebook、Ebay等网站都已采用此图片格式。

BPG:知名程序员、ffmpeg和QEMU等项目作者Fabrice Bellard推出的图像格式,它以HEVC为编码内核,在相同体积下,BPG文件大小只有JPEG的一半。另外BPG还支持8位和16位通道等等。尽管BPG有很好的压缩效果,但是HEVC的专利费很高,所以目前的市场使用比较少。

就压缩效果来说,BPG更优于WebP,但是BPG采用的HEVC内核所带来的专利费,导致其无法在市场进行大范围使用。在这种情况下,运用深度学习来设计图片压缩算法就应运而生。
 

早在 2016 年的时候,谷歌的研究人员就提出了一种基于神经网络的全分辨率有损图像压缩法《Full Resolution Image Compression with Recurrent Neural Networks》(利用循环神经网络进行全分辨率图像压缩)。

此后也陆续出现了不少这方面的研究,比如去年的IEEE大会上,来自哈尔滨工业大学的一组研究人员联合提交了一篇论文《An End-to-End Compression Framework Based on Convolutional Neural Networks》(基于卷积神经网络的端到端压缩框架)。

 

他们在这篇论文中就提出了一种新的基于卷积神经网络的压缩框架,能够实现图像的高质量压缩。这个框架由两部分组成:一个 ComCNN 用于学习输入图像中最优的紧凑表示,然后编码图像,一个 RecCNN 用于重构出高质量的解码图像。下面集智就说说这篇论文中利用深度学习技术进行图像压缩的方法。

 

什么是图像压缩?

图像压缩就是转换图像的过程,让图像占据更少的空间。很多图像如果直接存储的话或占据很大的空间,所以出现了不少编解码器,比如 JPEG 和 PNG,目的就是减少原始图像的大小。

 

有损压缩 VS 无损压缩

目前有两种压缩形式:有损压缩和无损压缩。从名字上就能看出来,无损压缩能够恢复原始图像的全部数据,而有损压缩则在图像转换过程中会丢失一些数据。

 

比如,JPG 就是一种有损压缩算法,而 PNG 就是一种无损压缩算法。

 

 

图:无损压缩和有损压缩对比

 

注意右侧图像上有很多块状的类似马赛克的透明斑点,这就表示图像的信息丢失了。同一颜色的相邻像素会被压缩为一个区域以节省空间,但是也会导致实际像素丢失信息。当然了,像 JPEG,PNG 等这样的算法更复杂些,但上面这个例子应该能很直观地展示出了有损压缩。无损压缩很好,不过最终会在硬盘上占据大量空间。

 

还有一些更好的图片压缩方法,不会损失太多的图像信息,但是压缩速度很慢。不少还是使用迭代方法,意味着无法在多个 CPU 和 GPU 上并行运行。因而在日常生活中用起来不太实际。

 

引入卷积神经网络

如果有什么东西能够进行计算,还能近似实现,那就使用神经网络吧。在哈工大的这篇论文中,作者就使用了非常标准的卷积神经网络用来优化图像压缩。他们的方法不仅能很好地的完成图像压缩,而且还能应用并行计算,大幅提高了压缩速度。

 

这种方法背后的原理就是卷积神经网络非常善于从图像中提取空间信息,然后将信息表示为更复杂的形式(比如,只存储图像的“重要”比特)。作者想借助 CNN 的这种能力来更好地表示图像。

 

模型架构

作者提出了一种双元网络架构,第一个网络会提取图像的信息并生成紧凑的表示(ComCNN),然后用一个标准的编解码器(比如 JPEG)处理该网络的输出结果。再通过编解码器处理后,图像会被传递到第二个神经网络,它会“修复”来自编解码器的图像,试图恢复原始图像的信息,这个网络被作者称为重构 CNN(RecCNN)。这两个网络都经过迭代训练,和 GAN 类似。

图:ComCNN模型架构。图像的紧凑表示通过它传入编解码器。

 

图:压缩图像的端到端框架。Co(.) 表示图像压缩算法;作者使用了JPEG,JPEG2000和BPG

 

编解码器的输出结果经过分辨率提高后,传输到 RecCNN 中。RecCNN 会输出一张最大限度与原始图像一致的照片。

 

什么是残差?

残差可以看作对编解码器解码出的图像进行“优化”的后期处理步骤。神经网络经过学习后,对图像有了丰富的认知,能够决定“修复”哪些东西。这里的理念基于深度残差学习。

 

损失函数

由于有两个神经网络,所以应用了两个损失函数。第一个是用于 ComCNN 网络的损失函数,定义为:

图:ComCNN的损失函数

 

解释

该等式看着很复杂,但实际上它就是个均方误差(MSE)。这里的||²表示它们封装进的向量的正则项。

图:公式1.1

 

Cr 表示 ComCNN 的输出结果。θ 表示 ComCNN 的可训练参数,Xk 表示输入图像。

 

Re() 表示 RecCNN,该公式只将公式 1.1 的值传入 RecCNN 中。估量符号 θ 表示 RecCNN 的可训练参数。

直观定义

公式 1.0 会让 ComCNN 修改其权重,从而使图像经过 RecCNN 重建之后,能尽可能地接近原始输入图像。

 

第二个是用于 RecCNN 的损失函数,定义如下:

解释

同样,这个损失函数看着也很复杂,但实际上仍是个标准的神经网络损失函数——MSE。

Co() 表示编解码器的输出结果,估量符号 x 表示 ComCNN 的输出,θ2 表示 RecCNN 的可训练参数。Res() 表示神经网络学习的残差,只是 RecCNN 的输出结果。值得一提的是,RecCNN 的训练基于 Co() 和输入图像,并非直接基于输入图像。

直观定义

公式 2.0 会让 RecCNN 修改其权重,让它的输出最大限度接近原始图像。

训练机制

模型以迭代的方式进行训练,和 GAN 模型的训练方式相同。其中一个模型的权重固定不变,只更新第二个模型的权重;然后让第二个模型的权重保持不变,只更新第一个模型的权重。

 

基准

论文作者将他们的方法和现存方法进行了比较,包括普通的编解码在内。最终证明他们的方法效果要优于其它方法,在保持较高的压缩速度的同时,图像的质量也得到了保证。

图:SSIM(结构相似度指数)比较。值越高表示和原图越相似。加粗值表示论文方法的结果。

 

结语

本篇论文向我们展示了深度学习技术在图像压缩领域的应用,不仅压缩效果比肩当前最先进的方法,而且具有更快的压缩速度。我们从中也可以看到深度神经网络在诸如图像分类和图像处理等常见任务以外的领域,同样大有可为。

 

除了本文讲解的这篇论文外,我们也收集了最近出现的一些相关研究成果,比如:

  • 《DeepN-JPEG: A Deep Neural Network Favorable JPEG-based Image Compression Framework》(DeepN-JPEG:基于JPEG的深度神经网络图像压缩框架)

论文地址:

https://arxiv.org/pdf/1803.05788.pdf

 

  • 《Deep Image Compression via End-to-End Learning》(通过端到端学习进行深度图像压缩)

论文地址:

https://arxiv.org/pdf/1806.01496.pdf

 

  • 《Semantic Perceptual Image Compression using Deep Convolution Networks》(利用深度卷积神经网络进行语义感知图像压缩)

 

论文地址:

https://arxiv.org/abs/1612.08712

 

该论文的代码实现地址:

https://github.com/iamaaditya/image-compression-cnn

 

  • 《Real-Time Adaptive Image Compression》(实时自适应图像压缩)
  • https://arxiv.org/pdf/1705.05823.pdf

http://chatgpt.dhexx.cn/article/0AAeAwAl.shtml

相关文章

JPEG压缩算法步骤原理

目录 JPEG压缩算法解密 步骤一:图像分割 步骤二:颜色空间转换RGB->YCbCr 步骤三:离散余弦变换 步骤四:数据量化 步骤五:哈弗曼编码 JPEG压缩算法解密 by jinchao 图片压缩有多重要,可能很多人可能…

影像算法解析——JPEG 压缩算法

由于视频是由一帧帧图像构成的,研究视频编码首先先要研究图像编码。这篇文章就详细说一下 JPEG 是如何压缩一个图像的。 先简单介绍一下 JPEG(Joint Photographic Experts Group,联合图像专家小组):此团队创立于1986年…

数字图像处理(七)图像压缩-无损编码/压缩算法+matlab

要求: 无损编码/压缩算法: 问题1: 实现行程编码压缩, 肉眼观察压缩效果,并计算原图和压缩以后的尺寸,计算压缩率并比较分析;问题2: 实现哈夫曼压缩, 肉眼观察压缩效果,并计算原图和压缩以后的尺寸&#x…

图像压缩原理-JPEG

搬来一个基础啊 给自己看~~ 非技术指正勿扰 图像的格式有很多种,比如PNG,JPEG等等,但当我们把一张图用工具变成各种其他格式时,其在计算机文件系统显示的文件大小各不一样,但是当你打开显示时,从视觉角度…

图像压缩算法简介

理论基础 香农的信息论,在不产生任何失真的前提下,通过合理的编码,对于每个信源符号分配不等长的码字,平均码长可以任意接近于信源的熵。在这个理论框架下产生了几种不同的无失真的信源编码方法:哈夫曼编码&#xff0c…

图像压缩原理

原文网址:http://blog.csdn.net/newchenxf/article/details/51693753 转载请注明出处。 1 图像可压缩的原因 一张原始图像(1920x1080),如果每个像素32bit表示(RGBA),那么,图像需要的内存大小 1920x1080x…

JPEG图像压缩算法详解

转载自 http://www.ibm.com/developerworks/cn/linux/l-cn-jpeg/ JPEG压缩算法之前已有很多前辈详细讲解过,我就不在这里画蛇添足了(主要是我懒。。),转载两篇JPEG压缩算法介绍,拼为一篇。侵删。 JPEG图像压缩算法详解…

图片压缩知识

一、图片压缩算法 有损算法: JPEG,我们最为常用的算法。他是通过离散余弦变换,对图片质量尽量小的时候进行有损压缩,该算法对高中波特率下效果很好,但是对低波特率下,就会出现方格之类的,比如1…

imadjust函数分析一

声明:本文涉及到的行数皆指本文提供的附件imadjust.m的代码中行数 本文只讨论imadjust函数是一种用法,即 J IMADJUST(I,[LOW_IN; HIGH_IN],[LOW_OUT; HIGH_OUT],GAMMA) 处理效果如下图 图像矩阵I要求数据类型uint8、uint16、double、single和int16&…

matlab灰度变换函数imadjust、stretchlim

1、imadjust函数 gimadjust(f,[low_in,high_in],[low_out,high_out],gamma) f为输入灰度图像,将low_in和high_in之间的灰度值映射到low_out到high_out之间 gamma大于1,映射函数下凸;小于1,上凸;gamma默认为1&#x…

Matlab中库函数imadjust()的使用细节

不知道大家有没有使用这个函数时,出现结果异常、过曝的情况我在使用时,发现在官方文档中并未声明的细节。 结合开源的程序源码和实验结果发现该函数对矩阵进行处理时,会对参数指明的处理数据以外的内容进行调整,错误使用会导致图像…

stretchlim matlab,matlab灰阶变换函数imadjust和stretchlim的c++实现

灰阶变换 首先介绍一下灰阶变换,一幅图像数据本身在存储的数据结构上为一个二维的矩阵,即一幅图像为m*n个密密麻麻的像素点构成。 image.png 然后,这些像素点有着一个值,这个值成为灰度值或者亮度值,值的范围为[0,255]…

在OpenCV里实现函数imadjust

imadjust 函数是针对灰度图像进行灰度变换的基本图像。 J = imadjust(f,[low_in; high_in],[low_out; high_out],gamma) 此函数将 f 的灰度值映像到 g 中的新值, 也就是将 low_in 与high in 之间的值映射到 low out 与 high out 之间的值。 low in 以下与 high in 以上的值可…

imadjust使用opencv实现

实现函数功能 J low_out (high_out - low_out).* ((I - low_in)/(high_in - low_in)).^ gamma [cpp] view plain copy print ? IplImage* ImageAdjust(IplImage *src, IplImage *dst, double low_in, double high_in, double low_out, double h…

python实现matlab stretchlim函数和imadjust函数

matlab 代码: [img,map]imread(“/home/zhongjia/test.png”); LOW_HIGHstretchlim(img); Jimadjust(img,[LOW_HIGH(1) LOW_HIGH(2)],[0 1],1); imwrite(J,"/home/zhongjia/test_result.png"); 实现功能是:对16位深度1024*1024大小的test.…

MATLAB图像处理imadjust()函数调节图像的对比度示例

imadjust()函数 Jimadjust(I) 将强度图像为I的值映射到J中的新值,使得1%的数据在低强度和高强度I时饱和。这将增加了输出图像J的对比度。 J imadjust(I,[LOW_IN; HIGH_IN],[LOW_OUT; HIGH_OUT])将强度图…

matlab常用语句imadjust作用,matlab中imadjust函数的作用及应用举例

imadjust简介 imadjust是一个计算机函数,该函数用于调节灰度图像的亮度或彩色图像的颜色矩阵。在matlab的命令窗口中键入: doc imadjust或者help imadjust就行了获得该函数的帮助信息, 键入type imadjust可以查看函数的源码。 调用格式&#…

matlab imadjust函数,imadjust从用法到原理—Matlab灰度变换函数之一

imadjust函数是MATLAB的一个工具箱函数,一般的语法调用格式为: f1=imadjust(f,[low_in high_in],[low_out high_out],gamma) (注:本文所述图像数据均为Uint8,对于Matlab,矩阵中的一个元素即是一个像素点) 该函数的意义如图1所示,把图像f灰度变换到新图像f1的过程中,f…

matlab imadjust函数,浅析matlab中imadjust函数

imadjust imadjust是一个计算机函数,该函数用于调节灰度图像的亮度或彩色图像的颜色矩阵。在matlab的命令窗口中键入: doc imadjust或者help imadjust即可获得该函数的帮助信息, 键入type imadjust可以查看函数的源代码。 函数功能&#xff1…

matlab图像灰度调整——imadjust函数的使用

在MATLAB中,通过函数imadjust()进行图像灰度的调整,该函数调用格式如下: Jimadjust( I ) 对图像I进行灰度调整 Jimadjust( I,[low_in;high_in],[low_out;high_out]) [low_in;high_in]为原图像…