You can generate a fairly good approximation with surprisingly few polygons. Here's a sample that has only 50 polygons (~380K generations):
This one is 100 polygons:
A more challenging image- 500 polygons & 680,850 generations:
The algorithm is pretty simple:
-
Create an initial string of candidate "DNA" consisting of a set of polygons (a color and a set of points) via random number generation.
-
Render the DNA to an image (the "phenotype"). Compute its fitness by comparing to the reference image.
-
Apply random mutations to the candidate (change color, move polygon points, juggle the z-order) to create a population of offspring.
-
Evaluate the offspring, and if their fitness is better, replace the parent.
-
Repeat for N generations.
$ go get github.com/armhold/polygen/...
$ cd $GOPATH/src/github.com/armhold/polygen
polygen -source images/mona_lisa.jpg -poly 50
- Let it run until you are happy with the output (in
output.png
), or until you notice that there is not much change between generations.
Polygen includes a built-in web server, so you can watch the image evolve in more or less realtime. Just point your browser to http://localhost:8080.
This code is my own, but credit goes to Roger Johansson for the original idea, which he documented here.
The file "mona_lisa.jpg" contains a low-resolution portion of the painting Mona Lisa, by Leonardo da Vinci. It is in the Public Domain.
The file "starry.jpg" contains a low-resolution copy of the painting The Stary Night by Vincent van Gogh. It is in the Public Domain.
The file "Revolver.jpg" contains a low-resolution copy of the cover art for the album Revolver by the artist The Beatles. The cover art copyright is believed to belong to the label, Parlophone/EMI, or the graphic artist(s), Klaus Voormann. It is included under Fair Use.