阿尼亚是安妮亞 26-02-25 13:33
微博认证:AI博主

tk老师设计的“猫咪塔罗”系列卡牌,原分辨率是 768 x 1376,如果按照 70mm x 120mm 的尺寸印制实体卡牌,DPI大约在278到291之间。在裁剪掉原图外部的白边后,DPI会进一步下降。距离印刷标准的300DPI差距就有些大了。

为了提高图片的DPI,就需要提高图片的分辨率。一张图片可以理解成是n*m个像素格子,每个格子填入一种颜色。提高分辨率意味着格子变多了,那么这些多出来的格子应该用什么方式填入何种颜色,就决定了最终图片的效果。

所以为什么有时候提升分辨率也被称作“插值”,意思就是在原有像素之间插入一些新的像素。“插值”最简单的办法就是按照一定规则让新的像素复制周边已有的颜色,但这样的操作会让图片的线条、边缘变模糊。再复杂一些的办法就不直接复制,而是根据周边已有的颜色进行“融合”,这样像素之间的过渡会更加自然,但结果也是模糊。

那有没有更加“智能”的填色算法呢?这就涉及到AI超分辨率算法,比如早期的FSRCNN,到后来的Real-ESRGAN和扩散模型。简单一点说明的话,CNN流派更像是一种高级滤镜,把图片分割成一小块一小块去处理,比直接插值要更加平滑。GAN流派有点像左右脑互搏,左脑负责填充,右脑负责判断这涂色会不会“太假”。而扩散模型流派则是先把原图块模糊掉,再基于概率去做“二创”画清晰。

但这些都是“不完美的”,归根结底都是在“猜测”多出来的像素格子要填什么颜色,没有一种办法可以准确地在面对任意图片下都可以猜对。所以通过超分算法处理后的卡牌图案总会有一些不自然的痕迹。这是算法带来的大量“猜你想要”后的结果。

我尝试了很多模型,最终还算比较满意的是一个基于Real-ESRGAN的衍生版本,扩图稍微克制一些。但仔细看还是会有很多不自然的痕迹(图1)。



直接扩图、裁剪、调整比例(70:120)后,84张卡片图的分辨率都达到1579x2707,但这引入了一个新的问题,文件体积变大了许多,84张图达到了563MB。

我不想再重新降低分辨率去卡300DPI的标准,这时候又需要用到一些图片压缩方案。我选择的是ppduck。这个工具的具体算法没有公开,但我觉得比较关键的应该是调色板优化,把难以察觉的微小色彩差异合并到一起。使用ppduck处理后,体积骤降66%,只剩下190.27MB。

压缩工作其实到这儿就可以zip后发给工厂去加工。但我在想,如果不考虑压缩与解压的代价,仅看压缩率有没有更加好的方案呢?带着这个疑问请教了一下Gemini,给出的思路是先用Precomp进行“结构化脱水”,然后再送到ZPAQ进行极致的压缩。

我尝试了一下,190.27MB的图片经过Precomp脱水后产生了一系列的*.pcf文件,总体积膨胀到377MB,而经过ZPAQ长达294秒的压缩后,最终产物只有151.51MB。

我也测试对比了几种压缩方案,比如不经过Precomp脱水的纯ZPAQ。整个结果汇总到图2的表格中。另外我把这个方案C的压缩成果分发出来,感兴趣的朋友可以尝试“解压”感受一下。

地址: assets.closeai.moe/Neko_Tarot_Archive.zpaq
SHA256: 2928a5164aefff47341acf6d80554b1e0070681dddfc1956e61ee39e80b8bafc

发布于 广东