卡通图片的压缩
昨天看到一个好玩的项目 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 通道)。
这里做个笔记,为以后做更多研究留个记录。
Comments
Posted by: 御宅暴君 | (21) April 22, 2016 12:50 PM
Posted by: 御宅暴君 | (20) April 22, 2016 12:45 PM
Posted by: wuqi | (19) June 27, 2015 04:29 PM
Posted by: 五轴加工中心 | (18) June 21, 2015 05:28 PM
Posted by: 数控加工中心 | (17) June 21, 2015 05:27 PM
Posted by: zz | (16) June 3, 2015 08:44 AM
Posted by: kkingh | (15) June 1, 2015 08:01 AM
Posted by: 老鬼 | (14) May 28, 2015 11:28 AM
Posted by: dwing | (13) May 27, 2015 03:04 PM
Posted by: cat | (12) May 27, 2015 08:55 AM
Posted by: NEO | (11) May 26, 2015 09:53 PM
Posted by: NEO | (10) May 26, 2015 09:38 PM
Posted by: NEO | (9) May 26, 2015 09:27 PM
Posted by: 李磊 | (8) May 25, 2015 10:48 AM
Posted by: DarkTime | (7) May 24, 2015 05:22 PM
Posted by: 圣战 | (6) May 23, 2015 06:39 PM
Posted by: 圣战 | (5) May 23, 2015 05:54 PM
Posted by: Ephay Tang | (4) May 23, 2015 08:37 AM
Posted by: cy | (3) May 21, 2015 05:52 PM
Posted by: hannah | (2) May 20, 2015 12:04 PM
Posted by: zz | (1) May 20, 2015 11:07 AM