2017-06-18 99 views
7

图像马赛克使用一组预定义的平方图像来构建一个更大的图像(示例here)。 有很多解决方案,实现这种效果相当微不足道。然而,在以下约束条件下变得更加困难:Python马赛克与抽象形马赛克

  1. 原始马赛克的形状是抽象的。任何凸多边形都可以。
  2. 每个马赛克只能使用一次。
  3. 马赛克不需要绝对包装(即占据画布的100%),但它们应该尽可能地挤满而不重叠。

我试图使自动化镶嵌的古老艺术,特别是Opus palladianum技术。

我的想法是使用模拟退火或其他启发法来优化每个不规则马赛克的位置和旋转,在每次迭代中交换两个,试图最小化反映与目标图像的相似度的一些能量函数以及“包装”的瓷砖。 我试图在Python中实现这一点,任何想法和帮助将不胜感激。

例子:

enter image description here

+2

到目前为止你有什么?模拟退火的实现?健身功能? – acdr

+2

[如果您的*模拟退火*实现有问题,请回到关于它的特定问题](https://meta.stackoverflow.com/a/334823/176769)。我相信提出如何解决问题的想法的问题太广泛而无法回答。但是[去聊天](https://chat.stackoverflow.com/)并且与人们讨论它是完全正确的。 – karlphillip

+0

而不是使用“预定义形状”,它将更容易“剪切”最终图像(如Voronoi)以创建这些形状。 – user1767754

回答

3

我希望你可以可能使用GA(遗传算法)与“非重叠”的约束做这个工作。

参数个人(每个凸多边形)是:(?大小)

  • 初始位置
  • 旋转

而且你的拟合函数将建设产生最佳音符当多边形不重叠(并且接近其他个体)时给每个个体

Y例如,您可以看到这个videothis one

Regards

+0

增加:根据多少个凸多边形将用于组成最终的马赛克,您也可以评估位置(&旋转)粗暴或莫里斯筛选测试作为替代,但也许遗传算法是最好的。 –

+0

初始化怎么样?我应该随机放置瓷砖吗?这里有什么突变?交换两个瓷砖,或改变一个人的位置/旋转? 此外,这不涉及包装问题:应该有一种方法来评估包装的增加。 – Anoyz