8种图形模式怎么选?Primitive 三角形/矩形/椭圆/贝塞尔对比与选型指南
【免费下载链接】primitiveReproducing images with geometric primitives.项目地址: https://gitcode.com/gh_mirrors/pr/primitive
Primitive 是一个用 Go 语言编写的几何图元重绘工具:它能用三角形、矩形、椭圆、贝塞尔曲线等几何图元,把一张普通照片逐块"画"成富有艺术感的抽象作品。整个算法一次只添加一个图形,50~200 个图形就能得到既 recognizable 又抽象的效果。本文带你快速搞懂它的8 种图形模式该怎么选、各适合什么照片。
🎨 原理速览:为什么"一次画一个图形"就够好?
算法的核心思路非常直观(详见 README.md 的 "How it Works" 一节):
- 用目标图的平均色铺满画布,作为"当前图";
- 随机生成一个图形,通过爬山优化不断微调它的形状参数(顶点、半径、角度);
- 用 RMSE(均方根误差)给每个图形打分,只保留让误差变小的调整;
- 找到最优图形后"钉"在画布上,再找下一个图形,循环往复。
所有候选图形都由多个并行 Worker 同时探索,取全局最优(多起点爬山,见 primitive/worker.go),这也是它比同类项目快的关键之一。
📋 8 种图形模式速查表
通过命令行参数-m指定模式,默认值是 1(三角形):
| 模式值 | 图形 | 特点 | 适合的照片类型 | 代价(相对) |
|---|---|---|---|---|
0 | combo | 每轮随机混用各种图形 | 通用、不想纠结时 | 中 |
1 | triangle | 三顶点多边形,表现力最强 | 纹理复杂、细节多的图 | 中 |
2 | rect | 轴对齐矩形 | 大面积色块、天空、墙面 | 低 |
3 | ellipse | 轴对齐椭圆 | 人脸、圆形物体 | 低 |
4 | circle | 椭圆特例(两半径相等) | 光斑、颗粒、点缀 | 低 |
5 | rotatedrect | 可旋转矩形 | 建筑、线性结构 | 中 |
6 | beziers | 二次贝塞尔曲线描边 | 头发、线条、笔触感 | 高 |
7 | rotatedellipse | 可旋转椭圆 | 有角度的圆润物体 | 中 |
8 | polygon | 默认 4 边形(可凹) | 不规则色块 | 中 |
💡 代价一栏指光栅化与优化的相对计算量趋势:矩形/椭圆按扫描线直接算,快;贝塞尔和旋转图形需要路径填充,稍慢。
🔍 重点模式深度对比
三角形(模式 1):默认首选,表现力天花板
三角形是唯一的"通用多边形"——三个顶点可以拼出几乎任何形状。Primitive 约束了每个内角必须 ≥15°,避免细长三角把画面画碎(见 primitive/triangle.go)。羽毛、毛发、树叶这类细碎纹理用它效果最好。
矩形(模式 2)与旋转矩形(模式 5):大面积色块之王
轴对齐矩形光栅化最快,扫过天空、墙壁、纯色背景非常高效;旋转矩形则多了角度参数,可以"斜着"贴合建筑与线条(长宽比限制在 5 以内,见 primitive/rectangle.go)。
椭圆(模式 3)、圆形(模式 4)与旋转椭圆(模式 7):圆润物体的三件套
三者共用同一套实现(圆形只是强制两半径相等),代码见 primitive/ellipse.go。椭圆光栅化是纯数学计算,速度很快;旋转椭圆多了角度,适合倾斜的果盘、车窗、眼睛等。
贝塞尔曲线(模式 6):给画面加"笔触"
模式 6 实际是一条带粗细的二次贝塞尔描边(见 primitive/quadratic.go),画出来像手绘线条,非常适合头发、水流、枝干。因为单条曲线覆盖面积小,官方建议配合-rep参数每轮追加多个曲线,收敛才够快。
多边形(模式 8)与混用模式(模式 0)
多边形默认生成 4 个顶点、允许凹形(见 primitive/polygon.go),比矩形灵活、比三角形省事。而 combo 模式最省心:每次迭代都会随机挑选一种图形来生成(分发逻辑在 primitive/worker.go),画面风格更丰富,新手可以无脑从它开始。
🧭 选型指南:按照片类型对号入座
| 你的照片是…… | 推荐模式 | 理由 |
|---|---|---|
| 人物肖像(头发多) | 6+-rep 2 | 贝塞尔曲线还原发丝 |
| 风景 / 建筑 / 大面积色块 | 5或2 | 旋转矩形贴合结构,快且省图形 |
| 羽毛、树叶等细碎纹理 | 1 | 三角形表现力最强 |
| 圆形物体 / 光斑夜景 | 4或3 | 圆与椭圆最贴合 |
| 不想纠结 | 0 | 混用模式,通用效果稳 |
另外两个通用经验:人物照片把-a(透明度)设为0,让算法自行决定每个图形的透明度,层次感更强;想要"一笔一笔画出来"的过程动画,输出.gif即可(需安装 ImageMagick)。
⚙️ 常用参数速查
| 参数 | 默认 | 作用 |
|---|---|---|
-i/-o | 必填 | 输入 / 输出文件(可多个-o,同时出 PNG + SVG) |
-n | 必填 | 图形数量,50~200 起步,越多越接近原图 |
-m | 1 | 图形模式(上表 0~8) |
-a | 128 | 透明度,设0让算法自选 |
-rep | 0 | 每轮额外追加 N 个图形,贝塞尔模式建议调大 |
-r/-s | 256/1024 | 输入缩放到 256px 处理、输出 1024px,提速又清晰 |
-j | 全部核心 | 并行 Worker 数,CPU 核多就快 |
-v/-vv | 关 | 打印每帧分数,观察收敛过程 |
完整参数说明见 README.md 的 Command-line Usage 表格,核心调度逻辑在 primitive/model.go 的Step方法中。
🚀 一句话上手
安装 Go 后获取本项目源码,在仓库根目录用go build编译出可执行文件,然后:
./primitive -i input.png -o output.png -n 100 -m 0想换风格?只改-m一个数字即可。从0跑一张图,再用上表对照切换模式,基本 10 分钟就能找到最适合你照片的"图形配方"。
(项目附带的 bot/main.py 展示了一个有趣的玩法:自动抓取新照片、随机参数重绘,让同一算法持续产出不同的几何图元作品,感兴趣可以翻翻源码找找灵感。)
【免费下载链接】primitiveReproducing images with geometric primitives.项目地址: https://gitcode.com/gh_mirrors/pr/primitive
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考