So one way to think about this is it’s a compression algorithm with aesthetic artifacts at high compression rates.
I wonder if you could use a multi-dimensional Hough-like transform on the primitive of choice to avoid the hill climbing step. You can do this easily with lines, but ellipses and triangles will be more difficult I’m sure. Sounds like a fun Christmas break programming project!
Thanks for sharing!
I mean, if it’s almost identical with a huge amount of shapes, I can understand that it’s reasonable to look at it as the same piece of work, but on the other hand if you make it blocky enough that it looks like an interpretation of the original image as a new work in its own right, what ownership does the original author have? None, some, complete?
In general, as long as the new work is a transformative difference from the original, a new copyright is created, although royalties might need to be paid to the author of the original work.
 see a real lawyer for actual legal advice
Even if you follow the law and get proper legal advice, you can still be sued, and what happens afterwards will depend on the specific situation, how much money you have, how competent your attorneys are and whether you decide to settle or go all the way to trial.
Hence, for it to be worth doing, you probably need to make a lot of money with your derivative work, and have very good counsel.
Anyone have any ideas / suggestions for a path to try that might require the least installation and scripting?
And can anyone tell whether it's deterministic or not as far as whether the same input generates the same output each time?
The final step is to recombine it into a single video, which I haven't done yet because I haven't yet implemented video playback in the program I'm writing. In the meantime I'm just loading each image on the fly and playing it as a sprite animation. This results in low FPS but it gets the gist across.
I'm thinking it'd still look pretty choppy even if it was a 60 FPS video though. I'm not yet sure how I'm going to smooth it out. I can share the FFMPEG command I used / script I made with you if you want, but I'd have to find it first (this was maybe a year ago). I'm sure the script is garbage.
I do not believe the go program that I am using is deterministic. You can run the same command on an image twice and it will produce a different result. It might be possible to make it deterministic, but it's not something I've wanted so I haven't looked into it.
Do you have to just call into the python script process.py primitive? Or do you call into that main.go? It's just this simple IO that I feel like would be the hard part.
Your video looks really good!
If you wanna take 2 min to see if you can find it, that might be super helpful for a VR video project I'm doing!
You’ll just need to figure out the middle bit, shouldn’t be too hard though.
As for results, the challenge might be keeping the illusion of movement from frame to frame.
It’s likely small changes to the input image result in largely different positioning of the shapes. When watched as a movie, this wouldn’t result in a fluid motion.
(From the person that wrote the webgl renderer for three.js)
Press start and you can see the algorithm at work, and how each shape is added randomly, score is computed, then the process repeats again
The challenge is making it look pretty and at same time have a small svg output and at the same time not taking forever to generate (it's perf gets exponentialy slow). Took some time to tweak it to the settings I used.
It looks nicer than blurhash.. however blurhash is way smaller and might be more practical alternative
I did try blurhash but it was just a bit too abstract? For large images. Think desktop full width.
Some of the solutions took a similar approach that used geometric primitives.
Crap quality: https://youtu.be/N4IhGlNTJEg
I’ve always puzzled of how they morphed the shapes...
If this can be done in real time (even with a delay), fade transitions could be a nice alternative to video too.