图像处理(Image Processing) ---------- 碎形压缩(Fractal)(C#实现)

本文深入探讨了Fractal压缩算法的原理与实现过程,包括如何通过寻找图像中的重复模式进行高效压缩,以及如何利用迭代系统从压缩数据还原图像。文章详细讲解了算法的五个核心步骤:分割区块、定义域区块收缩、计算尺度与偏移系数、旋转操作及区块比较方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网上很少关于Fractal压缩的质料,特此记录。

先说说自然界事物构成的一种潜在规则。自然界中一切事物的构成都具有巨大的相似性,包括:山、花、树、人、车 ......。当你仔细观察一个物体时就会发现,此物体许多部分都是由同一个细小的结构构成。下图人造栗子:

一个大的形状可由四个小的相同形状图形构成。

四个小的形状又是由更小的相同形状构成。

因此物体是可以通过找寻其中某种细小的结构,对这种细小结构进过某种重复的迭代系统多次循环后,便可以得到完整的物体。

  • 碎形压缩:

    • 在1988年,Barnsley和Sloan提出了一套碎形影像压缩的算法。他们的算法是,对原始图像找出一种特殊的迭代系统,然后便可以使用任意的图像经过此迭代系统多次迭代,生成原始图像。
    • 如下图:不同的初始图形,经过同一种迭代方式,多次迭代后,都形成了形状一致的三角形模型。

  

  • 所以根据图形成像的这种特性,碎形压缩诞生了。说白点,碎形压缩和其它压缩不同的就是:改记录pixel变成记录迭代系统数据。这样一来对图像解压缩的灵活性和效果都大幅提升,因为它可以使用任何图案通过压缩档的迭代数据还原压缩图像,并且随着迭代次数的增加,解码的效果会越来越好。

具体步骤:

碎形压缩的总体步骤:先将要压缩的图像按一定大小的块(16X16,8X8,4X4...)分割成定义域区块集和值域区块集,然后将值域的每一块与定义域中所有的块(经过收缩、旋转、偏移参数s/o变换后的块)进行对比,记录与此值域块最相似的定义域块的块号、旋转种类、偏移参数s/o(成为碎形码)。记录值域中每一块的碎形码,就构成了压缩文档。

  • 一:分割定义域区块集合(Domain Block)和值域区块集合(Range Block) 。
    • 下面使用DR分别指定义域区块集合和值域区块集合中的某一块。R块是目标块,D块是参考块
    • R是不可重叠的区块,通常由左至右,由上至下,大小为BxB(常用8X8)。假设图像大小LxL,则m和n都为L/B,R有\frac{L}{B}\ast \frac{L}{B} 块。
    •  

    • D是重叠区块,大小去R块的两倍,2Bx2B。取D块还有一个关键值,步长:\delta,每次间隔\delta取一个D块。\delta通常去D块边的一半,你也可以1pixel移动一次,但是这样D块就太多压缩非常耗时。 假设图像大小LxL,则D会有(\frac{L-2B}{\delta }+1)\ast (\frac{L-2B}{\delta }+1) 块。
  • 二:定义域区块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列的像素。

经过上面的步骤,将每一个值域区块都与定义域区块比较,然后找到最合适的区块,记录好此区块在定义域区块中的位置、旋转类型、s/o,就构成了每一个值域区块的分形码,总合后就构成了压缩文档(压缩文档除分形码外,还要记录原图尺寸,块的尺寸的细节)。

<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值