返回

文章详情

用高斯画画

Hacker News2026年8月5日 13:34

去年,我构建了一种边缘感知的像素化工具,通过变形网格,使其沿着图像边缘而不是简单地在图像上使用固定网格,从而将图像转换为像素艺术。使用弯曲的边缘适配网格来通知像素的颜色和亮度,有效地保持了边缘的清晰度并保留了细节。后来我意识到,边缘信息也可以应用于数字绘画的上下文中。一个绘画程序必须确定笔触的位置、大小以及流动方向。很多信息已经编码在边缘中,因为它们标记了区域之间的边界。这些是刷子将沿着物体区域的轮廓勾勒出的轮廓,而它们的缺失通常表示平坦区域,几个宽大的笔触就足够了。因此,我开始探索是否可以创建一个程序,以数字绘画的风格进行绘画,图像结构所衍生的标记将类似于笔触。我的目标是制作一个互动工具,让您可以拖动滑块,绘画将在您面前重新形成。这个项目也是我测试 Jolt 的绝佳机会,看看它在构建非平凡项目时的表现。在这篇文章中,我将向您展示这一切是如何结合在一起的。我们将看到哪些想法有效,哪些无效。最重要的是,我们将找到最终结果是否真的是像一幅画。我们首先需要考虑的一个问题是,计算机术语中的笔触到底是什么。油画或丙烯画的笔触是一个拉长的标记,其中心颜色向边缘逐渐淡化,它的方向是刷子在画布上拖动的结果。笔触在边缘处是半透明的,笔触互相重叠,使得画家可以先铺设宽大的颜色块,然后在上面用更小、更透明的标记进行细节处理。结果表明,二维高斯涂鸦在这个想法上出奇地适用。它的平均值是笔触落下的地方,协方差矩阵则表示它是如何被拉伸和旋转的,并且还有颜色和不透明度。协方差可以用来编码刷子的方向和延伸,主轴指向笔触,副轴与之垂直。使用标准的过度合成渲染一幅涂鸦场,将每个涂鸦以其 alpha 值遮挡其后面的内容,可以得到与自然绘画模型相似的效果,允许标记层叠和混合。当然,您无法得到实际涂料的相同保真度,因此效果更接近于使用 GIMP 或 Krita 等工具的数字绘画。目前已经有一些实现这一想法的项目,例如 DrawingWithGaussians 和 2d-gaussian-splatting-Art。然而,它们都使用一种梯度下降方法,从随机涂鸦开始,然后迭代性地调整其位置、形状和颜色,直到渲染出的场看起来像目标图像。这是一种众所周知的方法,既慢又不透明。最糟糕的是,最终结果仅仅是输入图像的有损重建,而不是看起来像任何形式的绘画。由于我已经有了解析图像边缘信息的解决方案,所以我没有看到盲目进化图像的意义。相反,提取的边缘可以用来引导绘画过程,因为它们告诉我们细节的位置以及笔触的方向。在细节密度和像素颜色之间,我拥有了所有不需要求助于梯度下降的信息。我基本上只需要跟踪现有图像。究竟有多难呢?因此,我开始跟随参考光栅化程序,该程序使用加法混合,其中:像素 = 背景 + Σ(强度 × 颜色)。结果表明,这种方法在拟合范围内工作,因为优化器会学习补偿重叠的颜色。不幸的是,从像素颜色直接为数千个涂鸦生成并以加法渲染,会造成更多的重叠。在一幅 64×64 的图像上,1200个涂鸦会导致某些像素总和达到 22.06,造成图像上出现纯白色斑点。幸运的是,这个问题可以通过使用 alpha 合成的标准过度运算符来解决,使每个涂鸦通过其 alpha 遮挡后面的内容,从而使总和颜色永远不会超过 1.0。这种方法的另一个好处是,它干净地分离了从图像中采样的颜色和不透明度。边缘告诉您在哪里绘画 本节中的每个图像都是同一照片通过相同的管道处理,只是一次关闭一个想法——相同的源,相同的笔触预算,相同的基础大小——因此,每一步都恰好显示出那个想法所带来的东西。我开始使用以下源照片,并记录我的进展,同时继续改善应用程序,以说明每个想法的收获。让我们看看随着新技巧的加入,绘画是如何演变的。我得到了一种相当令人失望的输出,看来像是一个均匀的图像。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡