二维高斯、结构张量和小波共同构成可交互数字画家。

不用生成式AI,传统算法也能把照片画成油画

把照片转成画作,关键不只是重建像素,而是决定笔触放在哪里、画多大、朝哪个方向流动。二维高斯泼溅很适合表示数字笔触。它有落点中心,协方差矩阵能描述拉伸和旋转,还带颜色与透明度。长轴对应笔触方向,短轴对应宽度。多个泼溅按透明度从后向前叠加,就能模拟颜料分层覆盖。

已有方案常先随机撒点,再用梯度下降不断调整位置、形状与颜色,直到接近目标图像。这种方法缓慢且不透明,结果往往只是有损复原,并不像绘画。新的做法直接读取图像结构。结构张量计算每个位置的颜色变化,主特征向量穿过轮廓,次特征向量沿着边缘,因此可给出笔触方向;特征值的相干性则区分清晰轮廓与无方向纹理。彩色Di Zenzo张量还能识别亮度相同但颜色不同的边界。

边缘仍不足以决定笔触密度。碎石路可能没有清晰轮廓,却含有大量高频细节;平滑脸颊只有外缘,内部适合宽笔。多尺度二维Haar小波把各尺度细节系数汇成能量图,再按局部亮度归一化,避免暗部纹理被淹没。小波决定哪里需要更多小笔触,结构张量决定笔触朝向和形状,两者合起来覆盖平坦背景、细密纹理与微弱轮廓。

规则网格会留下类似压缩方块的周期痕迹,因此程序用Wang雪崩哈希按索引生成无周期白噪声坐标。Perlin噪声则让笔触长度、颜色和方向产生平滑变化。强边缘处仍紧贴轮廓,平坦区域则形成自然流动。为避免相邻笔触同步弯曲形成织物纹,每个笔触还需独立的噪声相位。

不用生成式AI,传统算法也能把照片画成油画

绘制过程模仿真实作画。底层用大而不透明的笔触铺满画布,中层以较短、较透明的笔触建立形体,细节层用一串逐渐变细的高斯段沿边缘延伸,像抬起画笔一样减小尺寸和透明度。颜色差异过大时停止笔触,防止跨越边界。CPU每次渲染原需55到112毫秒,面对数十万笔触便不够快。把生成过程移入OpenGL几何着色器后,数据留在GPU上,滑块调整可实时反馈。最终工具以传统图像分析完成了真正具有笔触逻辑的数字绘画。

开发过程也暴露了失败的选择。加法混合适合由优化器补偿重叠颜色,但上千个直接取自像素颜色的泼溅叠加时,局部亮度可达22点06,产生大片纯白。改用标准透明度覆盖后,颜色上限保持为1,取样颜色与不透明度也被分开。细节层还要从边缘一侧取色,使两侧颜料在轮廓处相遇而不互相穿过。项目同时检验了Jolt编译器、Glimmer响应式界面和nREPL开发流程,并促成性能优化。它证明传统算法仍能把多个可解释技术组合成灵活的创作工具。

该项目是开源的,github地址:https://github.com/yogthos/splat-painter

原文:https://yogthos.net/posts/2026-08-03-splat-painter.html