]> granicus.if.org Git - imagemagick/commitdiff
Radius for local contrast is now pixels instead of a percentage.
authordirk <dirk@git.imagemagick.org>
Mon, 2 Nov 2015 12:16:40 +0000 (13:16 +0100)
committerdirk <dirk@git.imagemagick.org>
Mon, 2 Nov 2015 12:23:44 +0000 (13:23 +0100)
MagickCore/accelerate.c
MagickCore/effect.c
MagickCore/option.c

index bde5a47ba33d96a0ff4d8b72dba8d36b4d540aaf..b3ba492cc5e5ab574ffd5aaf584b174537e4d754 100644 (file)
@@ -1801,7 +1801,7 @@ static Image *ComputeLocalContrastImage(const Image *image,
     {
       imageColumns = (unsigned int) image->columns;
       imageRows = (unsigned int) image->rows;
-      iRadius = (image->rows > image->columns ? image->rows : image->columns) * 0.002f * radius; // Normalized radius, 100% gives blur radius of 20% of the largest dimension
+      iRadius = (cl_int) radius;
 
       passes = ((1.0f * imageColumns) * imageColumns * iRadius) / 4000000000.0f;
       passes = (passes < 1) ? 1: passes;
@@ -1811,7 +1811,7 @@ static Image *ComputeLocalContrastImage(const Image *image,
       clStatus=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(cl_mem),(void *)&imageBuffer);
       clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(cl_mem),(void *)&filteredImageBuffer);
       clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(cl_mem),(void *)&tempImageBuffer);
-      clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(int),(void *)&iRadius);
+      clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(cl_int),(void *)&iRadius);
       clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(unsigned int),(void *)&imageColumns);
       clStatus|=clEnv->library->clSetKernelArg(blurRowKernel,i++,sizeof(unsigned int),(void *)&imageRows);
       
@@ -7478,6 +7478,18 @@ MagickExport Image *AccelerateBlurImage(const Image *magick_unused(image),
   return NULL;
 }
 
+MagickExport Image *AccelerateLocalContrastImage(
+  const Image *magick_unused(image),const double magick_unused(radius),
+  const double magick_unused(strength),ExceptionInfo *magick_unused(exception))
+{
+  magick_unreferenced(image);
+  magick_unreferenced(radius);
+  magick_unreferenced(strength);
+  magick_unreferenced(exception);
+
+  return NULL;
+}
+
 MagickExport Image *AccelerateRotationalBlurImage(
   const Image *magick_unused(image),const ChannelType magick_unused(channel),
   const double magick_unused(angle),ExceptionInfo *magick_unused(exception))
index 0224a6cf9501399c8c60736d996461719a988e48..661a2c34cc4b3082aa3c87608f8887bd73653796 100644 (file)
@@ -1660,8 +1660,8 @@ MagickExport Image *KuwaharaImage(const Image *image,const double radius,
 %
 %    o channel: the channel type.
 %
-%    o radius: the radius of the Gaussian blur, in percentage with 100%
-%      resulting in a blur radius of 20% of largest dimension.
+%    o radius: the radius of the Gaussian, in pixels, not counting
+%      the center pixel.
 %
 %    o strength: the strength of the blur mask in percentage.
 %
@@ -1690,7 +1690,6 @@ MagickExport Image *LocalContrastImage(const Image *image,const double radius,
     *interImage_info;
 
   ssize_t
-    rad,
     scanLineSize,
     thread_count;
 
@@ -1727,8 +1726,7 @@ MagickExport Image *LocalContrastImage(const Image *image,const double radius,
   }
 #endif
   scanLineSize=(ssize_t) MagickMax(image->columns,image->rows);
-  rad=(ssize_t) scanLineSize*0.002f*radius;
-  scanLineSize+=(2*rad);
+  scanLineSize+=(2*radius);
   scanLinePixels_info=AcquireVirtualMemory(thread_count*scanLineSize,
     sizeof(*scanLinePixels));
   if (scanLinePixels_info == (MemoryInfo *) NULL)
@@ -1740,7 +1738,7 @@ MagickExport Image *LocalContrastImage(const Image *image,const double radius,
     }
   scanLinePixels=(float *) GetVirtualMemoryBlob(scanLinePixels_info);
   /* Create intermediate buffer */
-  interImage_info=AcquireVirtualMemory((image->rows+(2*rad))*image->columns,
+  interImage_info=AcquireVirtualMemory((image->rows+(2*radius))*image->columns,
     sizeof(*interImage));
   if (interImage_info == (MemoryInfo *) NULL)
     {
@@ -1751,7 +1749,7 @@ MagickExport Image *LocalContrastImage(const Image *image,const double radius,
       ThrowImageException(ResourceLimitError,"MemoryAllocationFailed");
     }
   interImage=(float *) GetVirtualMemoryBlob(interImage_info);
-  totalWeight=(rad+1)*(rad+1);
+  totalWeight=(radius+1)*(radius+1);
 
   /* Vertical Pass */
   {
@@ -1783,16 +1781,16 @@ MagickExport Image *LocalContrastImage(const Image *image,const double radius,
       pixels+=scanLineSize*omp_get_thread_num();
 #endif
       pix=pixels;
-      p=GetCacheViewVirtualPixels(image_view,x,-rad,1,image->rows+(2*rad),
-        exception);
+      p=GetCacheViewVirtualPixels(image_view,x,-radius,1,image->rows+
+        (2*radius),exception);
 
-      for (y=0; y < (ssize_t) image->rows+(2*rad); y++)
+      for (y=0; y < (ssize_t) image->rows+(2*radius); y++)
       {
         *pix++=(float)GetPixelLuma(image,p);
         p+=image->number_channels;
       }
 
-      out=interImage+x+rad;
+      out=interImage+x+(size_t) radius;
 
       for (y = 0; y < (ssize_t) image->rows; y++)
       {
@@ -1803,12 +1801,12 @@ MagickExport Image *LocalContrastImage(const Image *image,const double radius,
         weight=1.0f;
         sum=0;
         pix=pixels+y;
-        for (i=0; i < rad; i++)
+        for (i=0; i < radius; i++)
         {
           sum+=weight*(*pix++);
           weight+=1.0f;
         }
-        for (i=rad+1; i < (2*rad); i++)
+        for (i=radius+1; i < (2*radius); i++)
         {
           sum+=weight*(*pix++);
           weight-=1.0f;
@@ -1816,12 +1814,12 @@ MagickExport Image *LocalContrastImage(const Image *image,const double radius,
         /* write to output */
         *out=sum/totalWeight;
         /* mirror into padding */
-        if (x <= rad && x != 0)
+        if (x <= radius && x != 0)
           *(out-(x*2))=*out;
-        if ((x > image->columns-rad-2) && (x != (ssize_t) image->columns-1))
+        if ((x > image->columns-radius-2) && (x != (ssize_t) image->columns-1))
           *(out+((image->columns-x-1)*2))=*out;
 
-        out+=image->columns+(rad*2);
+        out+=image->columns+((size_t) radius*2);
       }
     }
   }
@@ -1861,8 +1859,8 @@ MagickExport Image *LocalContrastImage(const Image *image,const double radius,
       q=GetCacheViewAuthenticPixels(contrast_view,0,y,image->columns,1,
         exception);
 
-      memcpy(pixels,interImage+(y*(image->columns+(2*rad))),(image->columns+
-        +(2*rad))*sizeof(float));
+      memcpy(pixels,interImage+(y*(image->columns+(2*(size_t) radius))),
+        (image->columns+(2*radius))*sizeof(float));
 
       for (x=0; x < (ssize_t) image->columns; x++)
       {
@@ -1875,12 +1873,12 @@ MagickExport Image *LocalContrastImage(const Image *image,const double radius,
         weight=1.0f;
         sum=0;
         pix=pixels+x;
-        for (i=0; i < rad; i++)
+        for (i=0; i < radius; i++)
         {
           sum+=weight*(*pix++);
           weight+=1.0f;
         }
-        for (i=rad+1; i < (2*rad); i++)
+        for (i=radius+1; i < (2*radius); i++)
         {
           sum+=weight*(*pix++);
           weight-=1.0f;
index 2c6c8fb2bc7579db585abf5189b73539229b8f5a..57df9065e0de98cef75c9a121a822cd7d140dd4a 100644 (file)
@@ -555,6 +555,7 @@ static const OptionInfo
     { "-liquid-rescale", 1L, SimpleOperatorFlag, MagickFalse },
     { "+list", 0L, DeprecateOptionFlag, MagickTrue },
     { "-list", 1L, NoImageOperatorFlag, MagickFalse },
+    { "+local-contrast", 0L, DeprecateOptionFlag, MagickTrue },
     { "-local-contrast", 1L, SimpleOperatorFlag, MagickFalse },
     { "+log", 0L, DeprecateOptionFlag, MagickFalse },
     { "-log", 1L, GlobalOptionFlag, MagickFalse },