去年我做了一个边缘感知的像素化工具,通过让网格变形来跟随图像边缘,而不是简单地在图片上套用固定网格,从而把图像转成像素画。这种让边缘适配的网格弯曲来影响像素颜色和亮度的做法,在保持边缘锐利和保留细节方面效果不错。
后来我意识到,同样的边缘信息也能用在数字绘画的语境里。绘画程序需要决定笔触该放在哪儿、画多大、朝哪个方向走。而这些信息大部分已经编码在边缘里了,因为边缘标记了不同区域之间的边界。这些是物体区域周围的轮廓线,一支画笔会沿着它们游走,而没有边缘的地方则通常意味着平坦区域,几笔宽阔的笔触就够了。
![]()
于是我开始尝试,看看能不能做出一个程序,以数字绘画的风格去作画,让从图像结构衍生出来的印记看起来像笔触。我的目标是做一个交互式工具,你拖动滑块,画面就会在你眼前重新生成。这个项目也是我测试 Jolt 的一个好机会,想看看它在构建一个有点复杂的项目时表现如何。
![]()
在这篇文章里,我会带你走一遍整个过程。我们会看看哪些思路奏效了,哪些没走通。最重要的是,我们会搞清楚最终结果到底有没有真的像一幅画。
首先要考虑的问题是,从计算的角度看,一个笔触到底是什么。一笔油画或丙烯画是一个拉长的印记,中间的颜色浓郁,向边缘逐渐变淡,它的走向是画笔在画布上拖拽的结果。笔触的边缘是半透明的,笔触之间相互叠加,这让画家可以先铺下大块的颜色,再在上面用更小、更透明的痕迹构建细节。
![]()
我发现,二维的高斯溅射跟这个想法意外地吻合。它有一个均值,也就是笔触落下的位置;一个协方差矩阵,代表了它如何被拉伸和旋转;还有颜色和透明度。协方差可以用来编码笔触的方向和它的伸长程度,主轴沿着笔触走,短轴则横跨它。用标准的叠加合成去渲染一片溅射场,每个溅射都通过自己的透明度遮挡身后的东西,效果就跟自然的绘画模型很像,允许笔触层层堆叠、相互融合。当然,你达不到真实颜料的那种保真度,所以效果更接近用 GIMP 或 Krita 这类工具画的数字绘画。
已经有一些人在实践这个想法了,比如 DrawingWithGaussians 和 2d-gaussian-splatting-Art。不过,它们采用的都是梯度下降的方法,先随机撒下一些溅射点,然后反复微调它们的位置、形状和颜色,直到渲染出的画面看起来像目标图像。这个过程很慢。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.