Github GitHub - RH12503/triangula: Generate high-quality triangulated art from i...
source link: https://github.com/RH12503/triangula
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
An iterative algorithm to generate high quality triangulated images.
Triangula uses a modified genetic algorithm to triangulate images. It works best with images smaller than 3000px and with fewer than 3000 points, typically producing an optimal result within a couple of minutes. For a full explanation of the algorithm, see this page in the wiki.
You can try the algorithm out in your browser here, but the desktop app will typically be 20-50x faster.
Install
Install the GUI from the releases page. The GUI uses Wails for its frontend.
If the app isn't running on Linux, go to the Permissions tab in the executable's properties and tick Allow executing file as program
.
Install the CLI by running:
go get -u github.com/RH12503/Triangula-CLI/triangula
Your PATH
variable also needs to include your go/bin
directory, which is ~/go/bin
on macOS, $GOPATH/bin
on Linux, and c:\Go\bin
on Windows.
Then run it using the command:
triangula run -img <path to image> -out <path to output JSON>
and when you're happy with its fitness, render a SVG:
triangula render -in <path to outputted JSON> -img <path to image> -out <path to output SVG>
For more detailed instructions, including rendering PNGs with effects see this page.
Options
For almost all cases, only changing the number of points and leaving all other options with their default values will generate an optimal result.
Name Flag Default Usage Points--points, -p
300
The number of points to use in the triangulation
Mutations
--mutations, --mut, -m
2
The number of mutations to make
Variation
--variation, -v
0.3
The variation each mutation causes
Population
--population, --pop, --size
400
The population size in the algorithm
Cutoff
--cutoff, --cut
5
The cutoff value of the algorithm
Cache
--cache, -c
22
The cache size as a power of 2
Block
--block, -b
5
The size of the blocks used when rendering
Threads
--threads, -t
0
The number of threads to use or 0 to use all cores
Repetitions
--reps, -r
500
The number of generations before saving to the output file (CLI only)
Examples of output
Comparison to esimov/triangle
esimov/triangle seems to be a similar project to Triangula that is also written in Go. However, the two appear to generate very different styles. One big advantage of triangle is that it generates an image almost instantaneously, while Triangula needs to run many iterations.
esimov/triangle results were taken from their Github repo, and Triangula's results were generated over 1-2 minutes.
esimov/triangle Triangula
Difference from fogleman/primitive and gheshu/image_decompiler
A lot of people have commented about Triangula's similarities to these other algorithms. While all these algorithms are iterative algorithms, the main difference is that in the other algorithms triangles can overlap while Triangula generates a triangulation.
Simple example:
import imageData "github.com/RH12503/Triangula/image" func main() { // Open and decode a PNG/JPEG file, err := os.Open("image.png") if err != nil { log.Fatal(err) } image, _, err := image.Decode(file) file.Close() if err != nil { log.Fatal(err) } img := imageData.ToData(image) pointFactory := func() normgeom.NormPointGroup { return (generator.RandomGenerator{}).Generate(200) // 200 points } evaluatorFactory := func(n int) evaluator.Evaluator { // 22 for the cache size and 5 for the block size return evaluator.NewParallel(img, 22, 5, n) } var mutator mutation.Method // 1% mutation rate and 30% variation mutator = mutation.NewGaussianMethod(0.01, 0.3) // 400 population size and 5 cutoff algo := algorithm.NewSimple(pointFactory, 400, 5, evaluatorFactory, mutator) // Run the algorithm for { algo.Step() fmt.Println(algo.Stats().BestFitness) } }
Contribute
Any contributions are welcome. Currently help is needed with:
- Supporting more image types for the CLI and GUI. (eg. .tiff, .webp, .heic)
- Allowing drag and drop of images from the web for the GUI.
- More effects.
- Any optimizations.
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK