从图像创建艺术作品

时间:2019-05-05 18:39:30

标签: python opencv computational-geometry

我对python比较陌生。我想做一些弦乐艺术照。我正在观看这部影片,这真的很吸引我:

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

enter image description here

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

我查看了一些OpenCV的示例代码,并弄清楚了如何进行基本的边缘检测。然后如何将其转换为点?然后我需要哪种算法来“填充”不同的梯度?

我什至不知道这是否是实现此目标的正确方法。有人可以指出正确的方向,或者给我一些示例代码以开始使用吗?我真的非常感谢。

1 个答案:

答案 0 :(得分:0)

在此应用中,边缘检测或三角测量不太重要。核心部分是了解视频的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。找到其邻居并遍历。如果添加任何新字符串只会对分数产生负面影响,则算法可能会停止。

在某些情况下,照片中的明亮区域会被广泛分开,因此任何穿过暗间隙的白色字符串只会降低得分。使用您的判断来调整算法,以解决那些非凸的情况。