diff --git a/MagickCore/effect.c b/MagickCore/effect.c
index bec60a5..13a2ddf 100644
--- a/MagickCore/effect.c
+++ b/MagickCore/effect.c
@@ -136,6 +136,50 @@
   return(blur_image);
 }
 
+MagickExport MagickBooleanType AdaptiveLevelImage(Image *image,
+  const char *levels)
+{
+  double
+    black_point,
+    gamma,
+    white_point;
+
+  GeometryInfo
+    geometry_info;
+
+  MagickBooleanType
+    status;
+
+  MagickStatusType
+    flags;
+
+  /*
+    Parse levels.
+  */
+  if (levels == (char *) NULL)
+    return(MagickFalse);
+  flags=ParseGeometry(levels,&geometry_info);
+  black_point=geometry_info.rho;
+  white_point=(double) QuantumRange;
+  if ((flags & SigmaValue) != 0)
+    white_point=geometry_info.sigma;
+  gamma=1.0;
+  if ((flags & XiValue) != 0)
+    gamma=geometry_info.xi;
+  if ((flags & PercentValue) != 0)
+    {
+      black_point*=(double) image->columns*image->rows/100.0;
+      white_point*=(double) image->columns*image->rows/100.0;
+    }
+  if ((flags & SigmaValue) == 0)
+    white_point=(double) QuantumRange-black_point;
+  if ((flags & AspectValue ) == 0)
+    status=LevelImage(image,black_point,white_point,gamma);
+  else
+    status=LevelizeImage(image,black_point,white_point,gamma);
+  return(status);
+}
+
 MagickExport Image *AdaptiveBlurImageChannel(const Image *image,
   const ChannelType channel,const double radius,const double sigma,
   ExceptionInfo *exception)
@@ -205,14 +249,14 @@
       blur_image=DestroyImage(blur_image);
       return((Image *) NULL);
     }
-  (void) LevelImage(edge_image,"20%,95%");
+  (void) AdaptiveLevelImage(edge_image,"20%,95%");
   gaussian_image=GaussianBlurImage(edge_image,radius,sigma,exception);
   if (gaussian_image != (Image *) NULL)
     {
       edge_image=DestroyImage(edge_image);
       edge_image=gaussian_image;
     }
-  (void) LevelImage(edge_image,"10%,95%");
+  (void) AdaptiveLevelImage(edge_image,"10%,95%");
   /*
     Create a set of kernels from maximum (radius,sigma) to minimum.
   */
@@ -515,14 +559,14 @@
       sharp_image=DestroyImage(sharp_image);
       return((Image *) NULL);
     }
-  (void) LevelImage(edge_image,"20%,95%");
+  (void) AdaptiveLevelImage(edge_image,"20%,95%");
   gaussian_image=GaussianBlurImage(edge_image,radius,sigma,exception);
   if (gaussian_image != (Image *) NULL)
     {
       edge_image=DestroyImage(edge_image);
       edge_image=gaussian_image;
     }
-  (void) LevelImage(edge_image,"10%,95%");
+  (void) AdaptiveLevelImage(edge_image,"10%,95%");
   /*
     Create a set of kernels from maximum (radius,sigma) to minimum.
   */