]> granicus.if.org Git - imagemagick/commitdiff
Support -clahe clip limit with percentages (e.g. -clahe 50x50%+128+3)
authorCristy <urban-warrior@imagemagick.org>
Tue, 11 Dec 2018 21:40:25 +0000 (16:40 -0500)
committerCristy <urban-warrior@imagemagick.org>
Tue, 11 Dec 2018 21:40:25 +0000 (16:40 -0500)
ChangeLog
MagickCore/enhance.c
MagickWand/mogrify.c
MagickWand/operation.c
PerlMagick/Magick.xs
PerlMagick/quantum/quantum.xs.in

index 2a6dd3e662ba58fb9c30b2d492d9654be7a98ef8..0675d7b650545f3c6606372b435247c528e0390c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,8 +1,10 @@
+2018-12-02  7.0.8-16 Cristy  <quetzlzacatenango@image...>
+  * Support -clahe clip limit with percentages (e.g. -clahe 50x50%+128+3).
+
 2018-12-10  7.0.8-16 Cristy  <quetzlzacatenango@image...>
   * Release ImageMagick version 7.0.8-16, GIT revision 15109:9a9af88de:20181210.
 
 2018-12-02  7.0.8-16 Cristy  <quetzlzacatenango@image...>
-  * 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.
 
index 7143e36914a5ee999d1442d9d87e96ad37f4a615..82e896f717fc198421e20a36ed0bea25de808c40 100644 (file)
@@ -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));
index f51d92a7138f4db824cfd04ae2e8fde3e602be25..b6facd90fd3b9eacf416d9305d2550358b1ccf38 100644 (file)
@@ -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)
index de0250bb5e382608a1ecf256a2dacb43fe207ae5..2cffa02e0da23dcf27de1acf62307b7fd040b36d 100644 (file)
@@ -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)
index df06c0e87b9694496c6d6b361daf5db2bf0979c8..90868dd273e5472c4cb3a3d3eb610aae8aa5be7b 100644 (file)
@@ -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;
         }
       }
index 886f5b6036cb4053227fb0a3be7d009a96b9e050..3bf056866abc287645a74b254d4def944378333f 100644 (file)
@@ -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;
         }
       }