Bylo by ještě dobré zmínit způsob aplikace těch filtrů. Když mám například tu pipeline převod do ČB+negace, jestli se to provádí "po pixelech" nebo "po obrázcích". "po pixelech" mám na mysli něco jako:
for y := .... { for x := .... { r,g,b=getpixel(source, x,y) for filter := range filters .... { rnew, gnew, bnew = applyFilter(filter, r, g, b) } setpixel(destination, x, y) } }
Versus IMHO o dosti pomalejší způsob:
for filter := range filters .... { for y := .... { for x := .... { r,g,b=getpixel(source, x,y) } } }
Je to ten druhý způsob: https://github.com/disintegration/gift/blob/master/gift.go#L101
Navíc běží v gorutinách prozatím jen copyimage, takže prostor pro násobné urychlení existuje.
OpenCV toto umí a při použití GPU i rychleji.
Existuje interface https://gocv.io/ ale o něm ještě nemám připravený článek :-)
TL;DR; pokud vám stačí základní transformace celého obrázku. je Gift jednoduché a rychlé řešení (prostě se jen udělá go get). Ovšem nějaké věci ohledně computer vision bych nad tím nestavěl - viz první kapitolu.