狂信者
精华
|
战斗力 鹅
|
回帖 0
注册时间 2018-1-7
|
本帖最后由 余生皆假期 于 2018-2-8 13:08 编辑
直接压缩显然是不对的,对于重复率较高的图片,有着更好的压缩方法。
对于无损压缩,目前主流的压缩算法 lzss, lzw 及其变体等,等于文本处理效果显著,对于图像处理却十分勉强。
对于重复率较高的图片,考虑以下方案:
假设目前有两张相似的图片 A, B。
1.将 B 划分为 8*8 的图块,在 A 中查找最相似的图块的坐标,例如对于 B 中一个坐标(8, 8)的图块,在 A 中搜索 x(0-15), y(0-15) 的范围。
比较图块的相似度有很多种算法(SAD, SSD等),这里我们用 SAD 计算【图块中【每个像素的差的绝对值】的和】。
我们给搜索加上一个终止条件,比如误差小于 200 就认为搜索到了而不必一定要找到最小误差。
这样我们可以得到一个数组,表示图像 B 的所有图块信息,数组中每个元素是一个保存了一份图块信息的字典:
{
'x': 0, // 图块在 A 中的坐标
'y': 0, // 同上
}
暂且将这个文件以 json 格式保存为 B.json。
2.以 A 为参照,对 B.json 进行还原,还原以后会生成一个充满马赛克的图片 B1,计算 B 和 B1 的差值,生成图片 B2。
现在,我们可以通过 B.json + B2 + A,还原出无损的图片 B,看起来,相对于之前的 B + A,不但没有减少文件体积,反而还多了一个 B.json。
然而需要注意的是,差值图 B2 是存在大量重复数据的,因此可以用压缩算法进行压缩,同样的,B.json 也可以直接优化为自定义的二进制格式(例如 x, y 仅用 4 字节存储),所以文件体积反而变小了。
3.对于图片 A, B, C,以同样方法压缩,A 为关键图,其余每张图以上一张图为参照进行还原。
4.将所有数据整合为一个自定义格式的文件后进行压缩。
这其实就是视频压缩的原理,以上仅仅只是一个非常朴素的编码方案,目前主流算法例如 H.264 要先进得多,即便如此,这个方案也比直接压缩效率要高。(我做 galgame CG包时测试过)
结论:楼主用关键帧/临近帧处理把图片压缩最优。
ps:刚刚又测试了一下,这个方案还是略优的,素材是万华镜CG包。
|
|