用几何原始素重现图像。
提供目标图像作为输入。该算法试图找到可以绘制的最佳形状,以最大程度地减少目标图像和绘制图像之间的误差。它重复此过程,一次添加一种形状。需要大约50至200个形状才能达到可识别但艺术和抽象的结果。
现在作为本机Mac应用程序可用!
https://primitive.lol/
在Twitter上关注@primitivePic,每30分钟查看一次新的原始图片!
Twitter机器人使用Flickr API寻找有趣的照片,使用随机参数运行算法,并使用Twitter API发布图片。
您可以向机器人发推文,它将为您处理。
用自己的图像运行!首先,安装去。
go get -u github.com/fogleman/primitive
primitive -i input.png -o output.png -n 100
应使用小输入图像(例如256x256px)。无论如何,您都不需要细节,并且代码运行速度会更快。
旗帜 | 默认 | 描述 |
---|---|---|
i | N/A。 | 输入文件 |
o | N/A。 | 输出文件 |
n | N/A。 | 形状数 |
m | 1 | 模式:0 =组合,1 =三角形,2 = rect,3 =椭圆,4 =圆,5 =旋转式,6 = beziers,7 = rotatedellipse,8 =多边形 |
rep | 0 | 通过减少搜索添加n个额外形状的每次迭代(主要对beziers有益) |
nth | 1 | 保存每个n帧(仅当%d 在输出路径中时) |
r | 256 | 在处理之前,将大型输入图像调整到此大小 |
s | 1024 | 输出图像大小 |
a | 128 | 颜色alpha(使用0 让算法为每种形状选择alpha) |
bg | avg | 开始背景颜色(十六进制) |
j | 0 | 并行工人的数量(默认使用所有内核) |
v | 离开 | 详细输出 |
vv | 离开 | 非常详细的输出 |
根据提供的输出文件扩展名,您可以产生不同类型的输出。
PNG
:栅格输出JPG
:栅格输出SVG
:向量输出GIF
:动画输出显示正在添加形状 - 需要ImageMagick(特别是convert
命令)对于PNG和SVG输出,您还可以在文件名中包括%d
, %03d
等。在这种情况下,每个帧将分别保存。
您可以多次使用-o
标志。这样,您可以同时保存PNG和SVG。
该GIF展示了算法的迭代性质,试图通过一次添加一种形状来最大程度地减少平方误差。 (使用“ .gif”输出文件自己生成一个!)
由于该算法具有随机的组件,因此您可以多次在相同的输入图像上运行它,以使生命成为静态图像。
如果您愿意涉足代码,则可以在形状上执行约束,以产生更有趣的结果。在这里,在金字塔日落的这张照片中,矩形被限制为指向太阳。
下面的矩阵显示了50、100和200迭代的三角形,椭圆和矩形。
说我们有Target Image
。这就是我们正在努力重新创建的方法。我们从空白的画布开始,但是我们用单个纯色填充它。目前,这是Target Image
的平均颜色。我们将此新的空白画布称为Current Image
。现在,我们开始评估形状。为了评估形状,我们将其绘制在Current Image
的顶部,从而产生New Image
。将此New Image
与Target Image
进行比较以计算分数。我们为分数使用根平方的错误。
Current Image + Shape => New Image
RMSE(New Image, Target Image) => Score
形状是随机生成的。我们可以生成一个随机的形状并为其进行评分。然后,我们可以突变形状(通过调整三角顶点,调整椭圆半径或中心等)并再次对其进行评分。如果突变改善了分数,我们将其保留。否则,我们回滚至先前的状态。重复此过程称为爬山。爬山很容易陷入当地的最小值,因此我们实际上以几种不同的起始形状进行了许多不同的时代。在开始爬山之前,我们还可以产生n个随机形状,并选择最好的形状。模拟退火是另一个不错的选择,但是在我的测试中,我发现爬山技术的速度同样好,至少对于这个特定的问题。
一旦找到了得分良好的形状,我们就将其添加到Current Image
中,在该图像将保持不变。然后,我们再次开始该过程,以找到要绘制的下一个形状。该过程根据需要重复多次。
支持以下原语:
通过实现以下接口可以添加更多形状:
type Shape interface {
Rasterize () [] Scanline
Copy () Shape
Mutate ()
Draw ( dc * gg. Context )
SVG ( attrs string ) string
}
该项目最初是受罗杰·约翰逊(Roger Johansson)流行而出色的作品的启发 - 遗传编程:莫娜·丽莎(Mona Lisa)的演变。自从看到这篇文章时,我多年来就在这里和那里都对此问题进行了修补。但是直到现在我对结果感到满意。
应当指出的是,与罗杰的原始作品相比,我的实施情况有很大差异。我的不是遗传算法。我的一次只能以一种形状运行。我的速度要快得多(AFAIK),并支持许多类型的形状。
这是Flickr上有趣的照片中的更多示例。