2017-06-18 138 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