« Lua C API 的正确用法 | 返回首页 | skynet 对客户端广播的方案 »

卡通图片的压缩

昨天看到一个好玩的项目 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

弄错了,是「动画」。

Anime 和 Cartoon 是两码事,不要搞错措辞了,可以叫成「动漫」。

说起压缩图像,想起mozjpeg,虽然是压缩jpeg的...png压缩有个pngquant,压缩率不错,不过没试过太大的图...

学习了 文章收藏下来了

学习了 文章收藏下来了

不如让美术直接输出矢量信息,像AI里存成svg格式,游戏里再读这个信息。
如果实时画太慢的话,就在loading时画到贴图上。
美术输出RGB的图片,把画的思路和图片是怎么组成的这些信息丢失了;程序再用人工智能的方法找出这些信息,来做进一步的压缩。还不如美术那边直接提供这些信息。

你就是一逗比

关于透明,可以先用先把图片的alpha通道提取出来,最后合成透明图哦

听说这算法性能很低, 不适合在游戏中实时运算.

这样的话 能不能用8:2:0呢 这样就压缩4倍了 呵呵

仔细想想好像是WIN95,我不清楚……

http://2chcn.com/html/2015/05/43983.html
这是我当时看到的网页,我就猜是怎么做的,所以就有了上面的话。
这个技术很可能是抄袭别人的,很久以前我就看到过一个软件有这个技术,那时还是WIN98,由于我曾经在大约8年前提到过这个软件,今天微软的视频编辑器就是根据它做的,在两个照片或者视频中插入特效,让菜鸟也能轻松地编辑视频。
至于作者名字,我当时年纪很小,才15岁,不会英文,忘记了名字,只记得这个软件的图标是一个很漂亮的绿色播放键在一个绿圈内。

前天刚好在2CH中文网看到,不过网页打不开需要翻墙。
这个东西呀,其实当年我就提出过全屏补隙技术,就是后来的N卡的抗锯齿技术。
现在这个东西的问题在于现在基本就是3D时代了,这样压缩的话卡通还不如FLASH那样的3D渲染……
就算2D重新运算也不如RAR,除非这个文件真的很大很大……但是那样压缩比也不合算,因为很大的话肯定很多不对称和难以压缩的多边形,扩展出来还是有怪异的感觉。
这个东西的主要人工智能运算应该在于去掉噪点,强化边界。
另外我根本不知道YUV格式是什么……我查查……
最近在查一种分布式计算技术,叫做朱鹭,可惜没查到到底是什么。

不支持透明,局限卡通,放大的效果用在游戏还是没问题的,不知道云风大大会不会更新?

可以把这个算法提取出来做本地的图片放大么?

我玩了下,让美术看,我们美术觉得不行,说像素感太强。

我玩了下,让美术看,我们美术说像素感太强。

这种如果加个图就好啦,看看云大喜欢啥样的卡通妹纸

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.

留个爪吧

直接把卡通转成svg如何

Post a comment

非这个主题相关的留言请到:留言本