Pikanote

波函数坍缩——一种根据局部信息生成图案的方法

这是一篇旧文,最初发表在知乎专栏

Github 上的 这个仓库 介绍了一种生成像素图案的方法,作者借用量子力学的词汇,称之为“波函数坍缩”。

我们假定你有图案的一些“局部信息”,也就是说,图案中的一小块应该长成什么样子,以及这些小块之间的一些重叠关系能否出现。图案中的一小块我们用一个固定大小的小图片来表示(大概 2x2 到 4x4 左右)。如果你还知道这些小块之间出现几率的比例就更好了。当然不知道也没有关系,我们可以假定它们的出现几率差不多。那么我们的目标就是生成一个图片,使得其所有的局部(也就是固定大小的小区域)都是在之前的“局部信息”中出现过的,并且出现的几率和之前给出的“局部信息”的几率尽量相近。

所谓“波函数坍缩”的算法如下:

这个算法是有可能生成失败的,但是这个概率不算大,可以接受,况且要保证生成不失败是一件很困难的事情。

那么图案的“局部信息”从哪里来呢?我们从现成的小图案中取样即可。我们可以从小图案中获得各种小块的频率。我们也可以假定或不假定取样时是否考虑旋转对称,镜面反射,以及图案是否循环,也可以自行选择取样的小块的大小。当然,生成图案的时候我们也可以选择要不要生成循环的图案。

我们还可以人工选好一些位置的颜色,并以此为限制条件生成图片。

以下是一些示例:

图片来自原仓库

如果我们把小区域改为图块,把小块之间的重叠关系改为图块之间的相邻关系,我们就可以生成基于图块的图案了(也许还能用来生成游戏地图?)。

以下是一些示例:

图片来自原仓库

这种生成方式还可以从二维扩展到三维。

以下是示例:

图片来自原仓库

这个仓库的作者还把中间状态过程录成了视频,可以清楚地看到图片从一片模糊到最终生成的过程。感谢 indienova 从 Youtube 把视频转载到了 B 站。建议加速播放。

Wave function collapse 波函数坍塌

题图是 Benpigchu 设计,使用该仓库中的代码生成的图案。

你还可以在以下平台阅读本文: 知乎专栏