用幾何原始素重現圖像。
提供目標圖像作為輸入。該算法試圖找到可以繪製的最佳形狀,以最大程度地減少目標圖像和繪製圖像之間的誤差。它重複此過程,一次添加一種形狀。需要大約50至200個形狀才能達到可識別但藝術和抽象的結果。
現在作為本機Mac應用程序可用!
https://primitive.lol/
在Twitter上關注@primitivePic,每30分鐘查看一次新的原始圖片!
Twitter機器人使用Flickr API尋找有趣的照片,使用隨機參數運行算法,並使用Twitter API發布圖片。
您可以向機器人發推文,它將為您處理。
用自己的圖像運行!首先,安裝去。
go get -u github.com/fogleman/primitive
primitive -i input.png -o output.png -n 100
應使用小輸入圖像(例如256x256px)。無論如何,您都不需要細節,並且代碼運行速度會更快。
旗幟 | 預設 | 描述 |
---|---|---|
i | N/A。 | 輸入文件 |
o | N/A。 | 輸出文件 |
n | N/A。 | 形狀數 |
m | 1 | 模式:0 =組合,1 =三角形,2 = rect,3 =橢圓,4 =圓,5 =旋轉式,6 = beziers,7 = rotatedellipse,8 =多邊形 |
rep | 0 | 通過減少搜索添加n個額外形狀的每次迭代(主要對beziers有益) |
nth | 1 | 保存每個n幀(僅當%d 在輸出路徑中時) |
r | 256 | 在處理之前,將大型輸入圖像調整到此大小 |
s | 1024 | 輸出圖像大小 |
a | 128 | 顏色alpha(使用0 讓算法為每種形狀選擇alpha) |
bg | avg | 開始背景顏色(十六進制) |
j | 0 | 並行工人的數量(默認使用所有內核) |
v | 離開 | 詳細輸出 |
vv | 離開 | 非常詳細的輸出 |
根據提供的輸出文件擴展名,您可以產生不同類型的輸出。
PNG
:柵格輸出JPG
:柵格輸出SVG
:向量輸出GIF
:動畫輸出顯示正在添加形狀 - 需要ImageMagick(特別是convert
命令)對於PNG和SVG輸出,您還可以在文件名中包括%d
, %03d
等。在這種情況下,每個幀將分別保存。
您可以多次使用-o
標誌。這樣,您可以同時保存PNG和SVG。
該GIF展示了算法的迭代性質,試圖通過一次添加一種形狀來最大程度地減少平方誤差。 (使用“ .gif”輸出文件自己生成一個!)
由於該算法具有隨機的組件,因此您可以多次在相同的輸入圖像上運行它,以使生命成為靜態圖像。
如果您願意涉足代碼,則可以在形狀上執行約束,以產生更有趣的結果。在這裡,在金字塔日落的這張照片中,矩形被限制為指向太陽。
下面的矩陣顯示了50、100和200迭代的三角形,橢圓和矩形。
說我們有Target Image
。這就是我們正在努力重新創建的方法。我們從空白的畫布開始,但是我們用單個純色填充它。目前,這是Target Image
的平均顏色。我們將此新的空白畫布稱為Current Image
。現在,我們開始評估形狀。為了評估形狀,我們將其繪製在Current Image
的頂部,從而產生New Image
。將此New Image
與Target Image
進行比較以計算分數。我們為分數使用根平方的錯誤。
Current Image + Shape => New Image
RMSE(New Image, Target Image) => Score
形狀是隨機生成的。我們可以生成一個隨機的形狀並為其進行評分。然後,我們可以突變形狀(通過調整三角頂點,調整橢圓半徑或中心等)並再次對其進行評分。如果突變改善了分數,我們將其保留。否則,我們回滾至先前的狀態。重複此過程稱為爬山。爬山很容易陷入當地的最小值,因此我們實際上以幾種不同的起始形狀進行了許多不同的時代。在開始爬山之前,我們還可以產生n個隨機形狀,並選擇最好的形狀。模擬退火是另一個不錯的選擇,但是在我的測試中,我發現爬山技術的速度同樣好,至少對於這個特定的問題。
一旦找到了得分良好的形狀,我們就將其添加到Current Image
中,在該圖像將保持不變。然後,我們再次開始該過程,以找到要繪製的下一個形狀。該過程根據需要重複多次。
支持以下原語:
通過實現以下接口可以添加更多形狀:
type Shape interface {
Rasterize () [] Scanline
Copy () Shape
Mutate ()
Draw ( dc * gg. Context )
SVG ( attrs string ) string
}
該項目最初是受羅傑·約翰遜(Roger Johansson)流行而出色的作品的啟發 - 遺傳編程:莫娜·麗莎(Mona Lisa)的演變。自從看到這篇文章時,我多年來就在這里和那裡都對此問題進行了修補。但是直到現在我對結果感到滿意。
應當指出的是,與羅傑的原始作品相比,我的實施情況有很大差異。我的不是遺傳算法。我的一次只能以一種形狀運行。我的速度要快得多(AFAIK),並支持許多類型的形狀。
這是Flickr上有趣的照片中的更多示例。