转载

卡通图片的压缩

昨天看到一个好玩的项目 https://github.com/nagadomi/waifu2x 可以将卡通图片高质量的放大到 2x ,比直接用普通过滤器放大效果好的多。我试了将那张小的卡通妹子不断迭代放大到 8 倍,效果依然是很不错的。

公司的程序群里,有同学提出,能不能把算法提取出来,用来做游戏资源图片的压缩。针对卡通类的图片,可以用很小的文件保存,在加载或安装时放大。我觉得有点意思,就做了一些研究。

这个放大算法是基于深度学习训练出的一组数据做过滤器的。提取出来做一个不依赖 cuda 的 CPU 实现也不是不可以。不过我在阅读代码时发现了一个有趣的东西先做一下记录。

和原始论文不同,这个开源项目是针对卡通图片的。除了他用卡通图片做训练外,我注意到另一个细节。那就是这段程序是先将 RGB 图片转换为 YUV 格式,然后只对 Y 部分做了处理。而 UV 部分都是简单的将值复制了 4 份,也就是说在放大过程中,并没有对 UV 做特别处理。

这可能是因为卡通图片一般都是大色块,对色度变化不敏感吧。

那么,如果我们将 RGB 图片直接转换为 YUV420 的格式,是不是就可以直接将图片压缩到原来的 50% 呢?

我用 imagemagick 对我们的游戏资源做了一下试验,发现转换为 YUV420 再转换回来后,人眼基本分辨不出差别。而 YUV420 到 RGB 的转换是非常容易的(甚至可以直接在 shader 里写,而节省显存。当然很可能不太划算)。这恐怕是最廉价的压缩图片资源而不太损失质量的方法了吧。

ps. 如果你想自己做试验,可以使用这行命令转换一张 1024 的贴图测试:

convert image.png -size 1024x1024 -depth 8 -sampling-factor 4:2:0 -interlace plane yuv:image.raw

然后用

convert -size 1024x1024 -depth 8 -sampling-factor 4:2:0 -interlace plane yuv:image.raw image2.png

转换回来,然后可以请专业美术来判断画质损失是否可以接受。

游戏里的加载和转换工具的代码自己写(主要是要额外支持 alpha 通道)。

这里做个笔记,为以后做更多研究留个记录。

正文到此结束
Loading...