网上很少关于Fractal压缩的质料,特此记录。
先说说自然界事物构成的一种潜在规则。自然界中一切事物的构成都具有巨大的相似性,包括:山、花、树、人、车 ......。当你仔细观察一个物体时就会发现,此物体许多部分都是由同一个细小的结构构成。下图人造栗子:
一个大的形状可由四个小的相同形状图形构成。
四个小的形状又是由更小的相同形状构成。
因此物体是可以通过找寻其中某种细小的结构,对这种细小结构进过某种重复的迭代系统多次循环后,便可以得到完整的物体。
-
碎形压缩:
- 在1988年,Barnsley和Sloan提出了一套碎形影像压缩的算法。他们的算法是,对原始图像找出一种特殊的迭代系统,然后便可以使用任意的图像经过此迭代系统多次迭代,生成原始图像。
- 如下图:不同的初始图形,经过同一种迭代方式,多次迭代后,都形成了形状一致的三角形模型。
- 所以根据图形成像的这种特性,碎形压缩诞生了。说白点,碎形压缩和其它压缩不同的就是:改记录pixel变成记录迭代系统数据。这样一来对图像解压缩的灵活性和效果都大幅提升,因为它可以使用任何图案通过压缩档的迭代数据还原压缩图像,并且随着迭代次数的增加,解码的效果会越来越好。
具体步骤:
碎形压缩的总体步骤:先将要压缩的图像按一定大小的块(16X16,8X8,4X4...)分割成定义域区块集和值域区块集,然后将值域的每一块与定义域中所有的块(经过收缩、旋转、偏移参数s/o变换后的块)进行对比,记录与此值域块最相似的定义域块的块号、旋转种类、偏移参数s/o(成为碎形码)。记录值域中每一块的碎形码,就构成了压缩文档。
- 一:分割定义域区块集合(Domain Block)和值域区块集合(Range Block) 。
- 下面使用D和R分别指定义域区块集合和值域区块集合中的某一块。R块是目标块,D块是参考块。
- R是不可重叠的区块,通常由左至右,由上至下,大小为BxB(常用8X8)。假设图像大小LxL,则m和n都为L/B,R有
块。
-
- D是重叠区块,大小去R块的两倍,2Bx2B。取D块还有一个关键值,步长:
,每次间隔
取一个D块。
通常去D块边的一半,你也可以1pixel移动一次,但是这样D块就太多压缩非常耗时。 假设图像大小LxL,则D会有
块。
- 二:定义域区块D,收缩:
- D块要与R块比较,首先要收缩成与R块一样的大小。收缩方式通常用两种:像素均值和欠采样。如图:
-
- 三:定义域区块D,尺度系数(s)和偏移系数(o):
- D块经过收缩后与R块大小相同,可计算s/o。
- 计算s/o公式:
- 解释下公式:s = R块每个Pixel与其均值的差 同 D块每个Pixel与其均值的差 乘积的累加和,除 D块每pixel与其均值差的平方的累加和。 o = R块pixel均值 - D块pixel均值乘上面算出的s。
- 算出s和o之后还要对这两个参数进行比特量化,s的范围通常在[-1,1]之间,超过的可以认为是0。通常s量化乘2bit,即四种:0.25、0.5、0.75、1。o通常量化成7bit,即 0 ~ 128之间。
- 算完s/o后就进行对比:R块与D集合中每一个D块都计算出对应的s/o,然后D块的每个pixel乘上对应的s,再加上o。然后与R块对比,(即:
),记录与R块差异最小的D块号和此D块的s/o。保存已经*和+上偏移参数的D块进行下一步骤。
- 四:定义域区块D,旋转:
- 经过偏移参数变换后的D块,就要进行旋转。旋转通常采用8种,如下图:
-
-
D块要进行8种旋转,每一种旋转都要与R块比较,找到差异值最小的旋转记录下此旋转种类。
- 五:D块与R块比较的方法:主要两种。
- MAD(Mean Absolute Difference):
, mn即区块总Pixel数,i,j 分别是区块第j行第i列的像素。
- RMSE(Root Mean Square Error):
, mn即区块总Pixel数,i,j 分别是区块第j行第i列的像素。
- MAD(Mean Absolute Difference):
经过上面的步骤,将每一个值域区块都与定义域区块比较,然后找到最合适的区块,记录好此区块在定义域区块中的位置、旋转类型、s/o,就构成了每一个值域区块的分形码,总合后就构成了压缩文档(压缩文档除分形码外,还要记录原图尺寸,块的尺寸的细节)。
<