Polygen uses a genetic algorithm to approximate an image with a small number of polygons.
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.
Usage
$ 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.
Credits
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.