+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.
%
% 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").
%
%
*/
-
static void ClipCLAHEHistogram(const double clip_limit,const size_t number_bins,
size_t *histogram)
{
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"
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));
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)
}
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)
{"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
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;
}
}
{"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
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;
}
}