【问题标题】:Creating string art from image从图像创建字符串艺术
【发布时间】:2019-05-11 05:48:57
【问题描述】:

我对 python 比较陌生。我想做一些弦乐肖像。我正在看这个视频,这真的让我很感兴趣:

https://youtu.be/RSRNZaq30W0?t=56

我知道要实现这一点,我首先需要加载图像,然后进行一些边缘检测,然后使用某种形式的 Delaunay 三角剖分,但不知道从哪里开始。

我查找了一些 OpenCV 的示例代码,并弄清楚了如何进行基本的边缘检测。然后我如何将这些转换为积分?然后我需要什么样的算法来“填充”不同的渐变?

我什至不知道这是否是实现这一目标的正确方法。有人可以指点我正确的方向,也许给我一些示例代码来开始?非常感谢。

【问题讨论】:

标签: python opencv computational-geometry


【解决方案1】:

边缘检测或三角测量在此应用程序中不太重要。核心部分是看懂视频1:27的伪代码。最终产品使用一根绳子以特定方式缠绕不同的指甲,这样:原始图像中较暗的区域有较少的绳子密度,而较亮的区域有更多的绳子交叉。

初步准备是:

  • 生成图像的边缘检测版本 (A)
  • 生成图像的模糊版本 (B)

然后第一步是为指甲创建随机位置。显然,为了获得好的结果,如果随机生成的指甲足够靠近黑白图像的“边缘”,您应该将其“捕捉”到边缘,以便稍后缠绕这些边缘指甲的字符串会创建一个准确的边界,就像在原始图片中一样。在这里,您使用图像 A) 来调整您的指甲。例如,只需执行一些潜在的最小化:

  1. 为指甲添加小的随机位置变化。如果指甲现在得到 足够接近图像 A) 中的一个白点(边缘),直接更改为 那个位置。

  2. 计算潜力。确保你的潜在功能 惩罚太接近的两点。重复 1) 100 次 选择一个潜力最低的。

  3. 迭代 1) 和 2) 20 次

接下来,您决定希望绳子如何缠绕指甲。

  • 从点 A 开始,查看一些相邻点(在一定半径内)B1、B2、B3 等。想象一下,如果你将一个从 A 到 Bi 具有一定宽度的字符串连接起来,它会在视觉上改变你的字符串图像 P轻微的方式。在 P 上渲染线段 A-B1 得到 P1,在 P 上渲染 A-B2 得到 P2,等等。
  • 找到最佳 Bi 以使新图像 Pi 看起来更接近原始图像。您可以在字符串图像和原始图片之间进行逐像素比较,并使用此测量对每个 Bi 进行评分。视频作者使用模糊图像 B) 去除可能随机影响其评分算法的纹理。
  • 现在最优 Bi 成为新的 A。找到它的邻居并循环。如果添加任何新字符串只会对分数产生负面影响,算法可能会停止。

在某些情况下,照片中的明亮区域相距甚远,因此任何穿过黑暗间隙的白线只会降低分数。使用您的判断来调整算法以解决这些非凸场景。

【讨论】:

  • 当明亮区域相距较远时,临时增加搜索半径是不是一个好办法?
猜你喜欢
  • 2022-08-23
  • 2019-08-19
  • 2018-12-16
  • 2014-11-17
  • 2018-01-08
  • 1970-01-01
  • 2016-01-04
  • 2014-05-06
  • 2015-04-30
相关资源
最近更新 更多