From: Cristy Date: Tue, 11 Dec 2018 21:40:25 +0000 (-0500) Subject: Support -clahe clip limit with percentages (e.g. -clahe 50x50%+128+3) X-Git-Tag: 7.0.8-17~30 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3026328a5c87ed95822136405dd1665d627ea201;p=imagemagick Support -clahe clip limit with percentages (e.g. -clahe 50x50%+128+3) --- diff --git a/ChangeLog b/ChangeLog index 2a6dd3e66..0675d7b65 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,10 @@ +2018-12-02 7.0.8-16 Cristy + * Support -clahe clip limit with percentages (e.g. -clahe 50x50%+128+3). + 2018-12-10 7.0.8-16 Cristy * Release ImageMagick version 7.0.8-16, GIT revision 15109:9a9af88de:20181210. 2018-12-02 7.0.8-16 Cristy - * Add support for -clahe clip limit with percentages (e.g. -clahe 2x2+128+3%) * Check for modulo underflow. * Change SVG default DPI to 96 from 90 to meet recommendation of SVG2 & CSS. diff --git a/MagickCore/enhance.c b/MagickCore/enhance.c index 7143e3691..82e896f71 100644 --- a/MagickCore/enhance.c +++ b/MagickCore/enhance.c @@ -271,17 +271,19 @@ MagickExport MagickBooleanType BrightnessContrastImage(Image *image, % % The format of the CLAHEImage method is: % -% MagickBooleanType CLAHEImage(Image *image,const size_t x_tiles, -% const size_t y_tiles,const size_t number_bins,const double clip_limit, -% ExceptionInfo *exception) +% MagickBooleanType CLAHEImage(Image *image,const size_t tile_width, +% const size_t tile_height,const size_t number_bins, +% const double clip_limit,ExceptionInfo *exception) % % A description of each parameter follows: % % o image: the image. % -% o x_tiles: number of tile divisions to use in horizontal direction. +% o tile_width: the width of the tile divisions to use in horizontal +% direction. % -% o y_tiles: number of tile divisions to use in vertical direction. +% o tile_height: the height of the tile divisions to use in vertical +% direction. % % o number_bins: number of bins for histogram ("dynamic range"). % @@ -292,7 +294,6 @@ MagickExport MagickBooleanType BrightnessContrastImage(Image *image, % */ - static void ClipCLAHEHistogram(const double clip_limit,const size_t number_bins, size_t *histogram) { @@ -621,8 +622,8 @@ static MagickBooleanType CLAHE(const size_t width,const size_t height, return(MagickTrue); } -MagickExport MagickBooleanType CLAHEImage(Image *image,const size_t x_tiles, - const size_t y_tiles,const size_t number_bins,const double clip_limit, +MagickExport MagickBooleanType CLAHEImage(Image *image,const size_t tile_width, + const size_t tile_height,const size_t number_bins,const double clip_limit, ExceptionInfo *exception) { #define CLAHEImageTag "CLAHE/Image" @@ -664,10 +665,12 @@ MagickExport MagickBooleanType CLAHEImage(Image *image,const size_t x_tiles, if (image->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); status=MagickTrue; - tile.x=(ssize_t) (x_tiles < 2 ? 2 : x_tiles >= MaxCLAHETiles ? - MaxCLAHETiles-1 : x_tiles); - tile.y=(ssize_t) (y_tiles < 2 ? 2 : y_tiles >= MaxCLAHETiles ? - MaxCLAHETiles-1 : y_tiles); + tile.x=(ssize_t) (PerceptibleReciprocal(tile_width)*image->columns); + tile.y=(ssize_t) (PerceptibleReciprocal(tile_height)*image->rows); + tile.x=(ssize_t) (tile.x < 2 ? 2 : tile.x >= MaxCLAHETiles ? MaxCLAHETiles-1 : + tile.x); + tile.y=(ssize_t) (tile.y < 2 ? 2 : tile.y >= MaxCLAHETiles ? MaxCLAHETiles-1 : + tile.y); width=((image->columns+tile.x-1)/tile.x)*tile.x; height=((image->rows+tile.y-1)/tile.y)*tile.y; pixel_cache=AcquireVirtualMemory(width,height*sizeof(*pixels)); diff --git a/MagickWand/mogrify.c b/MagickWand/mogrify.c index f51d92a71..b6facd90f 100644 --- a/MagickWand/mogrify.c +++ b/MagickWand/mogrify.c @@ -1086,10 +1086,9 @@ WandExport MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc, Contrast limited adaptive histogram equalization. */ (void) SyncImageSettings(mogrify_info,*image,exception); - flags=ParseGeometry(argv[i+1],&geometry_info); - (void) CLAHEImage(*image,(size_t) geometry_info.rho,(size_t) - geometry_info.sigma,(size_t) geometry_info.xi,(double) - geometry_info.psi,exception); + (void) ParseRegionGeometry(*image,argv[i+1],&geometry,exception); + (void) CLAHEImage(*image,geometry.width,geometry.height, + (size_t) geometry.x,(double) geometry.y,exception); break; } if (LocaleCompare("clip",option+1) == 0) diff --git a/MagickWand/operation.c b/MagickWand/operation.c index de0250bb5..2cffa02e0 100644 --- a/MagickWand/operation.c +++ b/MagickWand/operation.c @@ -1968,11 +1968,11 @@ static MagickBooleanType CLISimpleOperatorImage(MagickCLI *cli_wand, } if (LocaleCompare("clahe",option+1) == 0) { - flags=ParseGeometry(arg1,&geometry_info); - if ((flags & (RhoValue|SigmaValue)) == 0) + if (IsGeometry(arg1) == MagickFalse) CLIWandExceptArgBreak(OptionError,"InvalidArgument",option,arg1); - (void) CLAHEImage(_image,(size_t) geometry_info.rho,(size_t) - geometry_info.sigma,geometry_info.xi,geometry_info.psi,_exception); + (void) ParseRegionGeometry(_image,arg1,&geometry,_exception); + (void) CLAHEImage(_image,geometry.width,geometry.height, + (size_t) geometry.x,(double) geometry.y,_exception); break; } if (LocaleCompare("clamp",option+1) == 0) diff --git a/PerlMagick/Magick.xs b/PerlMagick/Magick.xs index df06c0e87..90868dd27 100644 --- a/PerlMagick/Magick.xs +++ b/PerlMagick/Magick.xs @@ -571,9 +571,9 @@ static struct {"low-black", RealReference}, {"low-white", RealReference}, {"high-white", RealReference}, {"high-black", RealReference}, {"channel", MagickChannelOptions} } }, - { "CLAHE", { {"geometry", StringReference}, - {"x-tiles", IntegerReference}, {"y-tiles", IntegerReference}, - {"number-bins", RealReference}, {"clip-limit", RealReference} } }, + { "CLAHE", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference}, {"number-bins", IntegerReference}, + {"clip-limit", IntegerReference} } }, }; static SplayTreeInfo @@ -11479,19 +11479,18 @@ Mogrify(ref,...) case 149: /* CLAHE */ { if (attribute_flag[0] != 0) - flags=ParseGeometry(argument_list[0].string_reference, - &geometry_info); + flags=ParseRegionGeometry(image,argument_list[0].string_reference, + &geometry,exception); if (attribute_flag[1] != 0) - geometry_info.rho=argument_list[1].integer_reference; + geometry.width=argument_list[1].integer_reference; if (attribute_flag[2] != 0) - geometry_info.sigma=argument_list[2].integer_reference; + geometry.height=argument_list[2].integer_reference; if (attribute_flag[3] != 0) - geometry_info.xi=argument_list[3].integer_reference;; + geometry.x=argument_list[3].integer_reference;; if (attribute_flag[4] != 0) - geometry_info.psi=argument_list[4].real_reference; - (void) CLAHEImage(image,(size_t) geometry_info.rho,(size_t) - (size_t) geometry_info.sigma,geometry_info.xi,(double) - geometry_info.psi,exception); + geometry.y=argument_list[4].integer_reference; + (void) CLAHEImage(image,geometry.width,geometry_info.height, + (size_t) geometry_info.x,(double) geometry_info.y,exception); break; } } diff --git a/PerlMagick/quantum/quantum.xs.in b/PerlMagick/quantum/quantum.xs.in index 886f5b603..3bf056866 100644 --- a/PerlMagick/quantum/quantum.xs.in +++ b/PerlMagick/quantum/quantum.xs.in @@ -571,9 +571,9 @@ static struct {"low-black", RealReference}, {"low-white", RealReference}, {"high-white", RealReference}, {"high-black", RealReference}, {"channel", MagickChannelOptions} } }, - { "CLAHE", { {"geometry", StringReference}, - {"x-tiles", IntegerReference}, {"y-tiles", IntegerReference}, - {"number-bins", RealReference}, {"clip-limit", RealReference} } }, + { "CLAHE", { {"geometry", StringReference}, {"width", IntegerReference}, + {"height", IntegerReference}, {"number-bins", IntegerReference}, + {"clip-limit", IntegerReference} } }, }; static SplayTreeInfo @@ -11485,19 +11485,18 @@ Mogrify(ref,...) case 149: /* CLAHE */ { if (attribute_flag[0] != 0) - flags=ParseGeometry(argument_list[0].string_reference, - &geometry_info); + flags=ParseRegionGeometry(image,argument_list[0].string_reference, + &geometry,exception); if (attribute_flag[1] != 0) - geometry_info.rho=argument_list[1].integer_reference; + geometry.width=argument_list[1].integer_reference; if (attribute_flag[2] != 0) - geometry_info.sigma=argument_list[2].integer_reference; + geometry.height=argument_list[2].integer_reference; if (attribute_flag[3] != 0) - geometry_info.xi=argument_list[3].integer_reference;; + geometry.x=argument_list[3].integer_reference;; if (attribute_flag[4] != 0) - geometry_info.psi=argument_list[4].real_reference;; - (void) CLAHEImage(image,(size_t) geometry_info.rho,(size_t) - (size_t) geometry_info.sigma,geometry_info.xi,(double) - geometry_info.psi,exception); + geometry.y=argument_list[4].integer_reference;; + (void) CLAHEImage(image,geometry.width,geometry.height, + (size_t) geometry_info.x,(double) geometry_info.y,exception); break; } }