diff --git a/effect.c b/effect.c index aac7e7c..5fd75b4 100644 --- a/effect.c +++ b/effect.c @@ -5,3 +5,9 @@ convolveImage(Image *image, void *data, ExceptionInfo *ex) { ConvolveData *d = data; return ConvolveImage(image, d->order, d->kernel, ex); } + +Image * +unsharpMaskImage(Image *image, void *data, ExceptionInfo *ex) { + UnsharpMaskData *d = data; + return UnsharpMaskImage(image, d->radius, d->sigma, d->amount, d->threshold ,ex); +} diff --git a/effect.go b/effect.go index 3d3dcad..3d071e2 100644 --- a/effect.go +++ b/effect.go @@ -32,3 +32,17 @@ func (im *Image) Convolve(order int, kernel []float64) (*Image, error) { data.kernel = (*C.double)(unsafe.Pointer(&kernel[0])) return im.applyDataFunc("convolving", C.ImageDataFunc(C.convolveImage), &data) } + +// UnsharpMask sharpens one or more image channels. We convolve the image +// with a Gaussian operator of the given radius and standard deviation (sigma). +// For reasonable results, radius should be larger than sigma. Use a radius of 0 and +// UnsharpMaskImage selects a suitable radius for you. +func (im *Image) UnsharpMask(radius float64, sigma float64, amount float64, threshold float64) (*Image, error) { + var data C.UnsharpMaskData + data.radius = C.double(radius) + data.sigma = C.double(sigma) + data.amount = C.double(amount) + data.threshold = C.double(threshold) + + return im.applyDataFunc("unsharp_mask", C.ImageDataFunc(C.unsharpMaskImage), &data) +} diff --git a/effect.h b/effect.h index 8939bbf..e40e56b 100644 --- a/effect.h +++ b/effect.h @@ -8,6 +8,14 @@ typedef struct { double *kernel; } ConvolveData; +typedef struct { + double radius; + double sigma; + double amount; + double threshold; +} UnsharpMaskData; + Image * convolveImage(Image *image, void *data, ExceptionInfo *ex); +Image * unsharpMaskImage(Image *image, void *data, ExceptionInfo *ex); #endif