使用Python和OpenCV创建Pointillist绘画

使用Python和OpenCV创建Pointillist绘画
最终结果

我最喜欢的绘画技术之一是点画法(pointillism),这是一种绘画技术,其中将微小的不同色点应用于图案中以形成图像。

该技术依赖于观看者的眼睛和头脑将色斑混合到更广泛的色调范围内的能力。 不同颜色的并置使它们更加生动,使整个图像更具活力。

使用Python和OpenCV创建Pointillist绘画
注意颜色的并置

点画法是一种很棒的技术,但是要制作这些类型的画,您需要采取有条不紊且漫长的方法。 更不用说,您需要成为一名熟练的画家!

作为计算机视觉开发人员,我对处理图像有很多了解,但是让我们面对现实吧,我在绘画方面很糟糕。

在我去巴黎的旅途中,我受到启发去尝试使用PythonOpenCV模仿点画专家。 在这篇文章中,我将指导您完成我开发的方法和编写的代码,以产生类似于此博客文章顶部的图像。

只是在寻找源代码? 你可以在这里找到它

模拟绘画过程

绘画过程模拟分三个步骤完成:

  1. 调色板创建
  2. 行程大小和长度计算
  3. 实际绘画

例如,我从https://unsplash.com网站上选择了一张精美的巴黎照片,您可以在这里免费获得质量惊人的照片。 我已经使用The Gimp对图像进行了预处理,以减少石像鬼上的绿色阴影,并放大Tour Eiffel,使其更引人注目。 通常,进行一些预处理,特别是增加总体饱和度,有助于获得更令人满意的结果。

使用Python和OpenCV创建Pointillist绘画
起始图片(来源: https : //unsplash.com/photos/v6Sy3kyBROE

调色板创建

首先,我们需要确定哪些颜色将出现在“虚拟艺术家”的调色板中。 我们需要选择一组与图像的颜色一致但又生动鲜明的颜色。

我们首先运行k均值以从图像中选择n = 20种主导色。 k均值的“对抗性”性质会产生不同的颜色,这些颜色集中在图像中最常见的颜色周围。

为了增加活力,我们通过添加kmeans选择的颜色的一些变化来增强调色板。 我选择添加一个更加饱和的基础调色板版本,并在颜色中添加两个小的变化(±20色),并增加一点饱和度。

下图的第一行表示kmeans计算的调色板,后续的行包含最终调色板中包含的颜色变化。

使用Python和OpenCV创建Pointillist绘画
由kmeans计算并增强了色彩的调色板

行程方向和长度计算

为了使最终结果更具动感,我们可以使用较小的不同颜色的笔触代替圆点。 这实际上是许多点画师使用的技术! 我们希望画笔笔触的方向与图像的内容保持一致,并使用更长的笔触来描绘边缘。 因此,我们使用图像渐变来确定每个绘画笔触的长度和方向。

使用Python和OpenCV创建Pointillist绘画
比较绘画风格:点(左),小笔画(右)

为了计算笔触的方向和长度,我们在x和y轴上采用Scharr图像导数,从而在图像上定义了一个矢量场。 然后,我们使用高斯模糊对场进行平滑处理,以使最终的“绘画”看起来更加连贯。

使用Python和OpenCV创建Pointillist绘画
图像梯度幅度的可视化(高斯平滑之前)

绘画过程

我们像一位真正的画家一样绘制最终结果,一次一击! 对于每个笔划,我们必须决定:

  1. 职位
  2. 每个笔触的方向和长度
  3. 使用哪种颜色的调色板

选择一个随机位置可能很诱人,但是这种方法的主要缺点是:我们不知道何时绘制了足够的笔触来填充整个图像。 因此,我们通过在图像上均匀采样来创建笔划位置的列表,为每个位置添加一点随机噪声,然后对列表进行混洗以使笔划具有随机顺序。

一旦我们使用图像梯度在图像上定义了矢量场,方向和长度就易于计算。

我们将渐变的方向旋转90度,因为我们希望笔触与图像边缘平行(图像渐变垂直于边缘)。 根据图像梯度的大小(即强度)计算长度。 这里stroke_scale是一个参数,用于指定笔划的全局比例,平方根用于使笔划更均匀。 我们不想在笔画的长度上有太大的差异。

笔触颜色的选择可能是最困难的部分。 我们希望随机获得美丽的色彩并排,但是我们希望与原始照片保持一致。 想法是从调色板中随机选择一种颜色,从而使与照片下方像素更相似的颜色被选择的可能性更大。 使用颜色之间相似度的softmax函数确定概率。

编码

您可以在此处找到源代码 它与我在这里描述的算法相对应,但性能有所提高。 该代码已注释,应该很容易理解。 如果您有任何问题,请随时在评论中提问:)

结果

其他照片的一些结果:

使用Python和OpenCV创建Pointillist绘画
使用Python和OpenCV创建Pointillist绘画
使用Python和OpenCV创建Pointillist绘画
使用Python和OpenCV创建Pointillist绘画

希望您喜欢这篇文章! 如果您有任何问题,请随时在评论中提问。 如果您制作了一些很棒的画,请在评论中发布它们,我真的很期待看到您可以使用该程序做什么!

您可以在我的网站https://matteo.ronchetti.xyz上找到有关我的更多信息。

我写的有关计算机视觉的其他文章:

From: https://hackernoon.com/https-medium-com-matteoronchetti-pointillism-with-python-and-opencv-f4274e6bbb7b