Genetic Programming and Procedural Image Filters

RichardWayne

For my S.M. degree, I developed a new kind of interactive genetic programming system for evolving procedural image filters. The main innovation was the introduction of preliminary fitness functions, which rank the filters before the results are shown to the user. The user then makes the final selection of the "breeding population" by viewing the results of the filters running on the output of a video stream in realtime.

To create these images I used the SolProgrammingLanguage, a now-dead project to develop an "ideal" language for prodecural image processing, image generation, and graphic design. Sol combines Scheme lisp with ideas from set and category theory to produce interesting results. Real-time performance for image filtering was achieved by on-the-fly translation into C++ and run-time compilation and dynamic (re)linking against the already running C++ front-end. (Do not, as they say, try this at home).

image one The source image is a somewhat low-resolution photo of my hand, strongly lit, against a dark background. This is a comparitively early image.
Another early image using a different picture of my hand as source imagery. Maybe you could call this my "radiation burn" period... image two
image four Source image is a silver goth finger ring lying in the grass.
A composition of procedural "noise" and a portrait of EbEth. image three
image five This filter plays with motion - a sequence of frames is "sliced" diagonally in time to produce this image (souce imagery is a stop-action animation of the ring crawing through the grass).
Another "time slice" filter, with more wiggle. image six
radiation burn love cemetary

Ohh... I'm so g0th! Collaboration with Cthulia (photographer) for valentine's postcard project.


On-the-fly translation, compilation, and dynamic linkage is a great pattern for high performance implementations; I used it while an undergrad to make a fractal generator that you could enter arbitrary formulas (and not just the usual "z^2 + c") into. Of course, for that project the translation part was pretty trivial — just C++ expression into C++ expression. It's a pity that this pattern isn't more standarized: when I last looked into it a decade ago, there was no machine portable way to do dynamic linking of C/C++ code. Great images, BTW. — ThomasColthurst