卡通图片的压缩
昨天看到一个好玩的项目 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
Anime 和 Cartoon 是两码事,不要搞错措辞了,可以叫成「动漫」。
Posted by: 御宅暴君 | (20) April 22, 2016 12:45 PM
说起压缩图像,想起mozjpeg,虽然是压缩jpeg的...png压缩有个pngquant,压缩率不错,不过没试过太大的图...
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
不如让美术直接输出矢量信息,像AI里存成svg格式,游戏里再读这个信息。
如果实时画太慢的话,就在loading时画到贴图上。
美术输出RGB的图片,把画的思路和图片是怎么组成的这些信息丢失了;程序再用人工智能的方法找出这些信息,来做进一步的压缩。还不如美术那边直接提供这些信息。
Posted by: zz | (16) June 3, 2015 08:44 AM
你就是一逗比
Posted by: kkingh | (15) June 1, 2015 08:01 AM
关于透明,可以先用先把图片的alpha通道提取出来,最后合成透明图哦
Posted by: 老鬼 | (14) May 28, 2015 11:28 AM
听说这算法性能很低, 不适合在游戏中实时运算.
Posted by: dwing | (13) May 27, 2015 03:04 PM
这样的话 能不能用8:2:0呢 这样就压缩4倍了 呵呵
Posted by: cat | (12) May 27, 2015 08:55 AM
仔细想想好像是WIN95,我不清楚……
Posted by: NEO | (11) May 26, 2015 09:53 PM
http://2chcn.com/html/2015/05/43983.html
这是我当时看到的网页,我就猜是怎么做的,所以就有了上面的话。
这个技术很可能是抄袭别人的,很久以前我就看到过一个软件有这个技术,那时还是WIN98,由于我曾经在大约8年前提到过这个软件,今天微软的视频编辑器就是根据它做的,在两个照片或者视频中插入特效,让菜鸟也能轻松地编辑视频。
至于作者名字,我当时年纪很小,才15岁,不会英文,忘记了名字,只记得这个软件的图标是一个很漂亮的绿色播放键在一个绿圈内。
Posted by: NEO | (10) May 26, 2015 09:38 PM
前天刚好在2CH中文网看到,不过网页打不开需要翻墙。
这个东西呀,其实当年我就提出过全屏补隙技术,就是后来的N卡的抗锯齿技术。
现在这个东西的问题在于现在基本就是3D时代了,这样压缩的话卡通还不如FLASH那样的3D渲染……
就算2D重新运算也不如RAR,除非这个文件真的很大很大……但是那样压缩比也不合算,因为很大的话肯定很多不对称和难以压缩的多边形,扩展出来还是有怪异的感觉。
这个东西的主要人工智能运算应该在于去掉噪点,强化边界。
另外我根本不知道YUV格式是什么……我查查……
最近在查一种分布式计算技术,叫做朱鹭,可惜没查到到底是什么。
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
C:\Users\Administrator>convert d:\aa.png -size 1024x1024 -depth 8 -sampling-fact
or 4:2:0 -interlace plane yuv:image.raw
Delphi Form Conversion Utility Version 7.0
Copyright (c) 1995,2002 Borland Software Corporation
Error converting d:\aa.png: OBJECT expected on line 1
1 files processed in d:\aa.png
No files found matching 1024x1024.
No files found matching 8.
No files found matching 4:2:0.
No files found matching plane.
No files found matching yuv:image.raw.
Posted by: cy | (3) May 21, 2015 05:52 PM
留个爪吧
Posted by: hannah | (2) May 20, 2015 12:04 PM
直接把卡通转成svg如何
Posted by: zz | (1) May 20, 2015 11:07 AM