数字图像处理(冈萨雷斯第三版)学习笔记 - Chapter 2 Image Compression(3)

一、量化的基本思想(Quantization)

我们现在可以开始学习会引起误差的主要步骤,那就是量化。这也是进行很大压缩的一步,没有量化, 我们不可能做到很大压缩。我们先回忆一下之前学过的步骤,首先从一个 8 x 8 图像开始的,然后将它进行DCT变换,变换后我们得到了变换系数T(u,v)。为了方便理解,我们再把变换系数的公式写在下面。
T ( u , v ) = ∑ x = 0 n − 1 ∑ y = 0 n − 1 f ( x , y ) r ( x , y , u , v ) T(u,v)=\sum^{n-1}_{x=0}\sum^{n-1}_{y=0}{f(x,y)r(x,y,u,v)} T(u,v)=x=0n1y=0n1f(x,y)r(x,y,u,v)

从公式中可以看到,我们沿图像的坐标轴,对图像与基函数的乘积,进行二重求和,得到变换系数T。我们由一个 8 x 8 的图像得到了一个 8 x 8 的系数矩阵,矩阵如下图所示。我们在不同的变换域会得到不同的图像(系数矩阵),而在余弦域得到了如下的图像。

在上一节中,我们在变换后,f(x,y) 接着将要被重建,重建过程由下面的公式可以得到,f(x,y)是T(u,v)求和得到的,T(u,v) 是变换系数。 现在假如我们要量化T,而不是重构f,此时我们会有一个 T(u,v) 的近似值,记作T '。接着我们需要重构出 f(x,y) 的近似值,记作f '。量化后的重建公式如下。请理解这里发生变化,我们所得到的的 f(x,y) 是系数乘了基函数的一个线性组合,这个系数要么是原始系数,要么是量化后的系数。
f ^ ( x , y ) = ∑ u = 0 n − 1 ∑ v = 0 n − 1 T ^ ( u , v ) r ( x , y , u , v ) \hat{f}(x,y)=\sum^{n-1}_{u=0}\sum^{n-1}_{v=0}{\hat{T}(u,v)r(x,y,u,v)} f^(x,y)=u=0n1v=0n1T^(u,v)r(x,y,u,v)
所以的系数主要是用来说明,我们接着要使用多少基函数。而我们的视觉感知是,假如本来我要使用 7.7乘以这些基函数,或许我最后只乘以了7.5,却不会有很大影响,而且我的视觉系统不会察觉到有什么不同。这就是量化的思想,量化主要思想是数值修约,或者说,如果让这个分量里的值稍稍变化一点,无论T(u,v)这部分代表的是什么,在重构时都不会产生太大影响。
在这里插入图片描述
接着我们就要对这些系数做一定的处理了。上图是我们得到的系数矩阵,我们只需要取一部分的系数,忽略其他的系数。 我们可以像上图a一样,取左上角阴影部分的系数,忽略掉其他的,我们也可以像图c一样取用系数。其中这些带阴影或者说值为1的系数是将要传输的系数,那些值为0或者说没有阴影的系数是不准备传输或存储下来的。

顶部区域将使用一些值代替 ,代替值的比特数越多,量化效果就越好。而在底角部分,将要做一些非常非常剧烈的量化,实在是太剧烈了,导致T(u,v)中的很多系数都会变成0 。比如把7、8、9、10都变成0,然后我们就能压缩很多。并且,量化实际上是按照锯齿形的方式来进行的,即量化的顺序从上图看应该是T(0,0) ->T(1,0) ->T(0,1) ->T(2,0)…,以此类推。这很重要,因为当JPEG进行到某一个系数的时候,发现后续其他所有系数都变成了0,本质上是在表示结束,这意味着这个8x8传输系数矩阵结束了 ,剩下所有系数都变成了0。

我们还可以做一些其它处理,如上图b中的处理方法。图中的数字表示每个像素灰度值所占的位数。比如,在T(0,0)上,我们要做的是把系数取到这里来,并且用8位比特数表示它,这样它的量化级数就为256。再比如,在系数T(0,6)上,则只用 1个比特位来表示它,所以我们只能用两个不同级别来表示这个系数。

二、JPEG的量化方法

在这里插入图片描述

让我们来看一下如何做到的。量化的一个非常简单的方式是,像这样上图这样均匀量化,这也是JPEG主要所做的工作。所有落在某一区间的数,都可以用这个区间对应的纵坐标来表示。这就很重要了,因为我们之后要开始哈夫曼编码,我们现在把一个区间上的所有点用一个数来代替,就可以增大这个数出现的概率。这对于压缩最后的哈夫曼编码或者其他任何编码器来说都很重要。这种方法很简单,却很有效。或许并不是最好的方式,但是JPEG被提倡不仅因为其高性能,同样因为简便性。我们所做的这些会帮助霍夫曼编码传输更少的数,这些数也更多的浓缩了。

举个例子来说,用上图b中的矩阵,我们除以16、11、12、12,或者也可以用两倍的这个矩阵来除,就是除以32、22、24、24。让我们看一下效果如下图。我们逐步所除的矩阵是同一个矩阵,只是按比例扩大了而已,我们能看到质量是如何变低的。就是除的数越大,则压缩的就越多,但图的质量越差。
在这里插入图片描述

在一些软件包里,当保存一张图像时,它会询问我们想保存的JPEG图像质量。它所询问的其实就是要乘以量化矩阵的倍数大小,所以量化矩阵在软件包里是一个固定矩阵,我们可以通过按比例扩大或者缩小量化矩阵,实现压缩更多或者更少。

这就是JPEG如何实现压缩的。它使用一种非常简单的均匀量化,通过按比例划分再乘回原来的比例。 当然,乘的过程是在解码器中完成的。

三、Max-Lloyd最优量化器

在这里插入图片描述
现在有先进的技术能够随着信号的类型尝试调整量化。例如,我们可以构造上图中的这些区间,他们的宽度不同,就是根据我们输入的不同,准备除以不同的值。有一种关于如何把量化做得更好的理论,叫做Max-Lloyd最优量化器。其主要思想相对简单,如果要测量一个给定的像素和其输出像素之间的方差作为误差,误差可以用均方计算,要在考虑这个误差尽可能小。 还要考虑到比特数的分配,当然如果不考虑使用比特的多少,那就根本不用量化了,自然就会变成零误差了。但是如果我们只能使用8个比特位,只能拥有256个区间在横坐标上。所以我们应该事先定义好比特数,即确定区间的个数。

我们在每个区间产生的误差呢如何计算呢? 计算公式如下,在这里的每一个区间,都要从s_(i-1)到s_(i+1)对误差进行积分 ,我们用t代替s,这个就是产生的误差的原因。接着需要把它和概率相乘,因为如果那个值在输入数据中不出现的话,就不需要再关注它了,因为这个值永远不会产生误差。这个方程式中的未知量,有基本区间的上下边界,以及代替值t 。
∫ s i − 1 s i ( s i − t i ) 2 p ( s ) d s \displaystyle \int^{s_i}_{s_{i-1}}{(s_i-t_i)^2p(s)ds} si1si(siti)2p(s)ds
s i − a v e r a g e ( t i , t i + 1 ) s_i-average(t_i,t_{i+1}) siaverage(ti,ti+1)
我们还可以得到第二个方程,它可以表示为 s_i减去t_i和t_(i+1)的平均值。我们现在在每一个连续区间上,就有了两个方程,接着我们要解方程。*这并不容易,大部分的概率分布中闭合解并不存在,但是如果我们假定概率分布是均匀的,那么闭合解确实存在。*比如JPEG使用的方程,概率分布是均匀的,我们只要做数值取整。前提是如果我们知道概率分布p(s),就可以获得比均匀量化更好的效果。JPEG使用的是均匀量化,为了简单起见,同样也是所谓的普遍性,不需要知道概率分布,就可以进行JPEG的工作,几乎对所有图像的处理效果都很好,或许在一些分布上我们的效果会更好。另外,大家可以修改JPEG,在大家自己的量化表里,它仍然是标准的一部分,它或许会遵循一个你知道的分布。所以如果大家要压缩一类非常特殊的图像,可以优化出自己的JPEG来进行处理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值