From 84b9f16bfdeadbaeb7e0773b87c38c7201e1fbdc Mon Sep 17 00:00:00 2001 From: homm Date: Sun, 12 Oct 2014 03:29:20 +0400 Subject: [PATCH] add effective_scale to all APIs --- PIL/ImageFilter.py | 5 +++-- PIL/ImageOps.py | 9 ++++++--- _imaging.c | 5 +++-- libImaging/Imaging.h | 3 ++- libImaging/UnsharpMask.c | 11 ++++++----- 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/PIL/ImageFilter.py b/PIL/ImageFilter.py index 1e0154d12..fed165831 100644 --- a/PIL/ImageFilter.py +++ b/PIL/ImageFilter.py @@ -149,11 +149,12 @@ class GaussianBlur(Filter): """ name = "GaussianBlur" - def __init__(self, radius=2): + def __init__(self, radius=2, effective_scale=None): self.radius = radius + self.effective_scale = effective_scale def filter(self, image): - return image.gaussian_blur(self.radius) + return image.gaussian_blur(self.radius, self.effective_scale) class UnsharpMask(Filter): diff --git a/PIL/ImageOps.py b/PIL/ImageOps.py index b3afd9e95..9a83687c1 100644 --- a/PIL/ImageOps.py +++ b/PIL/ImageOps.py @@ -413,15 +413,18 @@ def solarize(image, threshold=128): # -------------------------------------------------------------------- # PIL USM components, from Kevin Cazabon. -def gaussian_blur(im, radius=None): - """ PIL_usm.gblur(im, [radius])""" +def gaussian_blur(im, radius=None, effective_scale=None): + """ PIL_usm.gblur(im, [radius], [effective_scale])""" if radius is None: radius = 5.0 + if effective_scale is None: + effective_scale = 2.6 + im.load() - return im.im.gaussian_blur(radius) + return im.im.gaussian_blur(radius, effective_scale) gblur = gaussian_blur diff --git a/_imaging.c b/_imaging.c index 1759d4c8d..d7ec1747e 100644 --- a/_imaging.c +++ b/_imaging.c @@ -863,7 +863,8 @@ _gaussian_blur(ImagingObject* self, PyObject* args) Imaging imOut; float radius = 0; - if (!PyArg_ParseTuple(args, "f", &radius)) + float effectiveScale = 2.6; + if (!PyArg_ParseTuple(args, "f|f", &radius, &effectiveScale)) return NULL; imIn = self->image; @@ -871,7 +872,7 @@ _gaussian_blur(ImagingObject* self, PyObject* args) if (!imOut) return NULL; - if (!ImagingGaussianBlur(imIn, imOut, radius)) + if (!ImagingGaussianBlur(imIn, imOut, radius, effectiveScale)) return NULL; return PyImagingNew(imOut); diff --git a/libImaging/Imaging.h b/libImaging/Imaging.h index d958387c9..8c3bea475 100644 --- a/libImaging/Imaging.h +++ b/libImaging/Imaging.h @@ -263,7 +263,8 @@ extern Imaging ImagingFilter( FLOAT32 offset, FLOAT32 divisor); extern Imaging ImagingFlipLeftRight(Imaging imOut, Imaging imIn); extern Imaging ImagingFlipTopBottom(Imaging imOut, Imaging imIn); -extern Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius); +extern Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius, + float effectiveScale); extern Imaging ImagingGetBand(Imaging im, int band); extern int ImagingGetBBox(Imaging im, int bbox[4]); typedef struct { int x, y; INT32 count; INT32 pixel; } ImagingColorItem; diff --git a/libImaging/UnsharpMask.c b/libImaging/UnsharpMask.c index 52379a21c..8c75b600d 100644 --- a/libImaging/UnsharpMask.c +++ b/libImaging/UnsharpMask.c @@ -20,7 +20,7 @@ static inline UINT8 clip(double in) } static Imaging -gblur(Imaging im, Imaging imOut, float radius, int channels) +gblur(Imaging im, Imaging imOut, float radius, float effectiveScale, int channels) { ImagingSectionCookie cookie; @@ -55,7 +55,7 @@ gblur(Imaging im, Imaging imOut, float radius, int channels) /* Only pixels in effective radius from source pixel are accounted. The Gaussian values outside 3 x radius is near zero. */ - effectiveRadius = (int) ceil(radius * 2.57); + effectiveRadius = (int) ceil(radius * effectiveScale); /* Window is number of pixels forming the result pixel on one axis. It is source pixel and effective radius in both directions. */ window = effectiveRadius * 2 + 1; @@ -197,7 +197,8 @@ gblur(Imaging im, Imaging imOut, float radius, int channels) return imOut; } -Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius) +Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius, + float effectiveScale) { int channels = 0; @@ -214,7 +215,7 @@ Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius) } else return ImagingError_ModeError(); - return gblur(im, imOut, radius, channels); + return gblur(im, imOut, radius, effectiveScale, channels); } Imaging @@ -255,7 +256,7 @@ ImagingUnsharpMask(Imaging im, Imaging imOut, float radius, int percent, /* first, do a gaussian blur on the image, putting results in imOut temporarily */ - result = gblur(im, imOut, radius, channels); + result = gblur(im, imOut, radius, 2.6, channels); if (!result) return NULL;