]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Fri, 18 Mar 2011 22:39:51 +0000 (22:39 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Fri, 18 Mar 2011 22:39:51 +0000 (22:39 +0000)
14 files changed:
Magick++/lib/Image.cpp
PerlMagick/Magick.xs
coders/msl.c
magick/deprecate.c
magick/display.c
magick/effect.c
magick/effect.h
magick/shear.c
utilities/convert.1.in
utilities/mogrify.1.in
wand/convert.c
wand/magick-image.c
wand/magick-image.h
wand/mogrify.c

index b27545ba9c4eac044d570d03c50f33016215a55e..d4ccc77245d953a3d0eae648e14a73a3d21ab931 100644 (file)
@@ -1318,7 +1318,8 @@ void Magick::Image::medianFilter ( const double radius_ )
   ExceptionInfo exceptionInfo;
   GetExceptionInfo( &exceptionInfo );
   MagickCore::Image* newImage =
-    StatisticImage ( image(), MedianStatistic, radius_, &exceptionInfo );
+    StatisticImage ( image(), MedianStatistic, (size_t) radius_, (size_t)
+    radius_,&exceptionInfo );
   replaceImage( newImage );
   throwException( exceptionInfo );
   (void) DestroyExceptionInfo( &exceptionInfo );
@@ -1709,7 +1710,8 @@ void Magick::Image::reduceNoise ( const double order_ )
   ExceptionInfo exceptionInfo;
   GetExceptionInfo( &exceptionInfo );
   MagickCore::Image* newImage =
-    StatisticImage( image(), NonpeakStatistic, order_, &exceptionInfo );
+    StatisticImage( image(), NonpeakStatistic, (size_t) order_, (size_t) order_,
+    &exceptionInfo );
   replaceImage( newImage );
   throwException( exceptionInfo );
   (void) DestroyExceptionInfo( &exceptionInfo );
index ebf3598df52ff17e3f6a8de87f7b3bedcbd07b19..ea03e1fa58a31f736e101da147d7f22cba6b3593 100644 (file)
@@ -241,11 +241,13 @@ static struct
     { "Implode", { {"amount", RealReference},
       {"interpolate", MagickInterpolateOptions} } },
     { "Magnify", },
-    { "MedianFilter", { {"radius", RealReference}
-       {"channel", MagickChannelOptions} } },
+    { "MedianFilter", { {"geometry", StringReference},
+      {"width", IntegerReference},{"height", IntegerReference},
+      {"channel", MagickChannelOptions} } },
     { "Minify", },
     { "OilPaint", { {"radius", RealReference} } },
-    { "ReduceNoise", { {"radius", RealReference},
+    { "ReduceNoise", { {"geometry", StringReference},
+      {"width", IntegerReference},{"height", IntegerReference},
       {"channel", MagickChannelOptions} } },
     { "Roll", { {"geometry", StringReference}, {"x", IntegerReference},
       {"y", IntegerReference} } },
@@ -534,9 +536,11 @@ static struct
       {"iterations", IntegerReference} } },
     { "ColorMatrix", { {"matrix", ArrayReference} } },
     { "Color", { {"color", StringReference} } },
-    { "Mode", { {"radius", RealReference},
+    { "Mode", { {"geometry", StringReference},
+      {"width", IntegerReference},{"height", IntegerReference},
       {"channel", MagickChannelOptions} } },
-    { "Statistic", { {"radius", RealReference},
+    { "Statistic", { {"geometry", StringReference},
+      {"width", IntegerReference},{"height", IntegerReference},
       {"channel", MagickChannelOptions}, {"type", MagickStatisticOptions} } }
   };
 
@@ -7794,12 +7798,21 @@ Mogrify(ref,...)
         }
         case 18:  /* MedianFilter */
         {
-          if (attribute_flag[0] == 0)
-            argument_list[0].real_reference=0.0;
+          if (attribute_flag[0] != 0)
+            {
+              flags=ParseGeometry(argument_list[0].string_reference,
+                &geometry_info);
+              if ((flags & SigmaValue) == 0)
+                geometry_info.sigma=1.0;
+            }
           if (attribute_flag[1] != 0)
-            channel=(ChannelType) argument_list[1].integer_reference;
-          image=StatisticImage(image,channel,MedianStatistics,
-            argument_list[0].real_reference,exception);
+            geometry_info.rho=argument_list[1].real_reference;
+          if (attribute_flag[2] != 0)
+            geometry_info.sigma=argument_list[2].real_reference;
+          if (attribute_flag[3] != 0)
+            channel=(ChannelType) argument_list[3].integer_reference;
+          image=StatisticImage(image,channel,MedianStatistic,
+            (size_t) geometry_info.rho,(size_t) geometry_info.sigma,exception);
           break;
         }
         case 19:  /* Minify */
@@ -7817,14 +7830,21 @@ Mogrify(ref,...)
         }
         case 21:  /* ReduceNoise */
         {
-          if (attribute_flag[0] == 0)
-            argument_list[0].real_reference=0.0;
-          image=ReduceNoiseImage(image,argument_list[0].real_reference,
-            exception);
+          if (attribute_flag[0] != 0)
+            {
+              flags=ParseGeometry(argument_list[0].string_reference,
+                &geometry_info);
+              if ((flags & SigmaValue) == 0)
+                geometry_info.sigma=1.0;
+            }
           if (attribute_flag[1] != 0)
-            channel=(ChannelType) argument_list[1].integer_reference;
+            geometry_info.rho=argument_list[1].real_reference;
+          if (attribute_flag[2] != 0)
+            geometry_info.sigma=argument_list[2].real_reference;
+          if (attribute_flag[3] != 0)
+            channel=(ChannelType) argument_list[3].integer_reference;
           image=StatisticImage(image,channel,NonpeakStatistic,
-            argument_list[0].real_reference,exception);
+            (size_t) geometry_info.rho,(size_t) geometry_info.sigma,exception);
           break;
         }
         case 22:  /* Roll */
@@ -10629,12 +10649,21 @@ Mogrify(ref,...)
         }
         case 136:  /* Mode */
         {
-          if (attribute_flag[0] == 0)
-            argument_list[0].real_reference=0.0;
+          if (attribute_flag[0] != 0)
+            {
+              flags=ParseGeometry(argument_list[0].string_reference,
+                &geometry_info);
+              if ((flags & SigmaValue) == 0)
+                geometry_info.sigma=1.0;
+            }
           if (attribute_flag[1] != 0)
-            channel=(ChannelType) argument_list[1].integer_reference;
+            geometry_info.rho=argument_list[1].real_reference;
+          if (attribute_flag[2] != 0)
+            geometry_info.sigma=argument_list[2].real_reference;
+          if (attribute_flag[3] != 0)
+            channel=(ChannelType) argument_list[3].integer_reference;
           image=StatisticImage(image,channel,ModeStatistic,
-            argument_list[0].real_reference,exception);
+            (size_t) geometry_info.rho,(size_t) geometry_info.sigma,exception);
           break;
         }
         case 137:  /* Statistic */
@@ -10643,14 +10672,23 @@ Mogrify(ref,...)
             statistic;
 
           statistic=UndefinedStatistic;
-          if (attribute_flag[0] == 0)
-            argument_list[0].real_reference=0.0;
+          if (attribute_flag[0] != 0)
+            {
+              flags=ParseGeometry(argument_list[0].string_reference,
+                &geometry_info);
+              if ((flags & SigmaValue) == 0)
+                geometry_info.sigma=1.0;
+            }
           if (attribute_flag[1] != 0)
-            channel=(ChannelType) argument_list[1].integer_reference;
+            geometry_info.rho=argument_list[1].real_reference;
           if (attribute_flag[2] != 0)
-            statistic=(StatisticType) argument_list[2].integer_reference;
+            geometry_info.sigma=argument_list[2].real_reference;
+          if (attribute_flag[3] != 0)
+            channel=(ChannelType) argument_list[3].integer_reference;
+          if (attribute_flag[4] != 0)
+            statistic=(StatisticType) argument_list[4].integer_reference;
           image=StatisicImageChannel(image,channel,statistic,
-            argument_list[0].real_reference,exception);
+            (size_t) geometry_info.rho,(size_t) geometry_info.sigma,exception);
           break;
         }
       }
index 9eeca016b23af1a7cf653137bd3cf0c320c72095..addf6447c9f6c2fc23aff1b92b0bcc058f115e98 100644 (file)
@@ -3816,7 +3816,8 @@ static void MSLStartElement(void *context,const xmlChar *tag,
               }
             }
           median_image=StatisticImage(msl_info->image[n],MedianStatistic,
-            geometry_info.rho,&msl_info->image[n]->exception);
+            (size_t) geometry_info.rho,(size_t) geometry_info.sigma,
+            &msl_info->image[n]->exception);
           if (median_image == (Image *) NULL)
             break;
           msl_info->image[n]=DestroyImage(msl_info->image[n]);
@@ -5040,7 +5041,8 @@ static void MSLStartElement(void *context,const xmlChar *tag,
               }
             }
           paint_image=StatisticImage(msl_info->image[n],NonpeakStatistic,
-            geometry_info.rho,&msl_info->image[n]->exception);
+            (size_t) geometry_info.rho,(size_t) geometry_info.sigma,
+            &msl_info->image[n]->exception);
           if (paint_image == (Image *) NULL)
             break;
           msl_info->image[n]=DestroyImage(msl_info->image[n]);
index 9d30a58e671bcd119c8868833110e8d915c580f8..9506e3ccface0f9a4a1355024d8d0d05d84c0589 100644 (file)
@@ -4602,7 +4602,8 @@ MagickExport Image *MedianFilterImage(const Image *image,const double radius,
   Image
     *median_image;
 
-  median_image=StatisticImage(image,MedianStatistic,radius,exception);
+  median_image=StatisticImage(image,MedianStatistic,(size_t) radius,(size_t)
+    radius,exception);
   return(median_image);
 }
 \f
@@ -4640,7 +4641,8 @@ MagickExport Image *ModeImage(const Image *image,const double radius,
   Image
     *mode_image;
 
-  mode_image=StatisticImage(image,ModeStatistic,radius,exception);
+  mode_image=StatisticImage(image,ModeStatistic,(size_t) radius,(size_t) radius,
+    exception);
   return(mode_image);
 }
 \f
@@ -5685,7 +5687,8 @@ MagickExport Image *ReduceNoiseImage(const Image *image,const double radius,
   Image
     *reduce_image;
 
-  reduce_image=StatisticImage(image,NonpeakStatistic,radius,exception);
+  reduce_image=StatisticImage(image,NonpeakStatistic,(size_t) radius,(size_t)
+    radius,exception);
   return(reduce_image);
 }
 \f
index 221cf05b55c52ee8e5d21328f88d249dd593e50f..527d3e5e3ea028c6efda081b005721931c9fd9ff 100644 (file)
@@ -8073,8 +8073,8 @@ static Image *XMagickCommand(Display *display,XResourceInfo *resource_info,
       XSetCursorState(display,windows,MagickTrue);
       XCheckRefreshWindows(display,windows);
       flags=ParseGeometry(radius,&geometry_info);
-      noise_image=StatisticImage(*image,NonpeakStatistic,geometry_info.rho,
-        &(*image)->exception);
+      noise_image=StatisticImage(*image,NonpeakStatistic,(size_t)
+        geometry_info.rho,(size_t) geometry_info.rho,&(*image)->exception);
       if (noise_image != (Image *) NULL)
         {
           *image=DestroyImage(*image);
index 0bde3c2194b716533cd8c62f18f3686a25a7ce44..80ff9df7eef281449259b59d5a732cb3aebbdac6 100644 (file)
@@ -3079,8 +3079,8 @@ MagickExport Image *PreviewImage(const Image *image,const PreviewType preview,
       }
       case ReduceNoisePreview:
       {
-        preview_image=StatisticImage(thumbnail,NonpeakStatistic,radius,
-          exception);
+        preview_image=StatisticImage(thumbnail,NonpeakStatistic,(size_t) radius,
+          (size_t) radius,exception);
         (void) FormatMagickString(label,MaxTextExtent,"noise %g",radius);
         break;
       }
@@ -3124,7 +3124,7 @@ MagickExport Image *PreviewImage(const Image *image,const PreviewType preview,
             break;
           }
         }
-        preview_image=StatisticImage(thumbnail,NonpeakStatistic,(double) i,
+        preview_image=StatisticImage(thumbnail,NonpeakStatistic,i,i,
           exception);
         (void) FormatMagickString(label,MaxTextExtent,"+noise %s",factor);
         break;
@@ -4534,10 +4534,10 @@ MagickExport Image *SpreadImage(const Image *image,const double radius,
 %  The format of the StatisticImage method is:
 %
 %      Image *StatisticImage(const Image *image,const StatisticType type,
-%        const double radius,ExceptionInfo *exception)
+%        const size_t width,const size_t height,ExceptionInfo *exception)
 %      Image *StatisticImageChannel(const Image *image,
 %        const ChannelType channel,const StatisticType type,
-%        const double radius,ExceptionInfo *exception)
+%        const size_t width,const size_t height,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
@@ -4547,7 +4547,9 @@ MagickExport Image *SpreadImage(const Image *image,const double radius,
 %
 %    o type: the statistic type (median, mode, etc.).
 %
-%    o radius: the radius of the pixel neighborhood.
+%    o width: the width of the pixel neighborhood.
+%
+%    o height: the height of the pixel neighborhood.
 %
 %    o exception: return any errors or warnings in this structure.
 %
@@ -4949,14 +4951,19 @@ static void ResetPixelList(PixelList *pixel_list)
 }
 
 MagickExport Image *StatisticImage(const Image *image,const StatisticType type,
-  const double radius,ExceptionInfo *exception)
+  const size_t width,const size_t height,ExceptionInfo *exception)
 {
-  return(StatisticImageChannel(image,DefaultChannels,type,radius,exception));
+  Image
+    *statistic_image;
+
+  statistic_image=StatisticImageChannel(image,DefaultChannels,type,width,
+    height,exception);
+  return(statistic_image);
 }
 
 MagickExport Image *StatisticImageChannel(const Image *image,
-  const ChannelType channel,const StatisticType type,const double radius,
-  ExceptionInfo *exception)
+  const ChannelType channel,const StatisticType type,const size_t width,
+  const size_t height,ExceptionInfo *exception)
 {
 #define StatisticImageTag  "Statistic/Image"
 
@@ -4976,9 +4983,6 @@ MagickExport Image *StatisticImageChannel(const Image *image,
   PixelList
     **restrict pixel_list;
 
-  size_t
-    width;
-
   ssize_t
     y;
 
@@ -4991,7 +4995,6 @@ MagickExport Image *StatisticImageChannel(const Image *image,
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
-  width=GetOptimalKernelWidth2D(radius,0.5);
   statistic_image=CloneImage(image,image->columns,image->rows,MagickTrue,
     exception);
   if (statistic_image == (Image *) NULL)
@@ -5041,7 +5044,7 @@ MagickExport Image *StatisticImageChannel(const Image *image,
     if (status == MagickFalse)
       continue;
     p=GetCacheViewVirtualPixels(image_view,-((ssize_t) width/2L),y-(ssize_t)
-      (width/2L),image->columns+width,width,exception);
+      (height/2L),image->columns+width,height,exception);
     q=QueueCacheViewAuthenticPixels(statistic_view,0,y,
       statistic_image->columns,1,exception);
     if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL))
@@ -5071,7 +5074,7 @@ MagickExport Image *StatisticImageChannel(const Image *image,
       ResetPixelList(pixel_list[id]);
       for (v=0; v < (ssize_t) width; v++)
       {
-        for (u=0; u < (ssize_t) width; u++)
+        for (u=0; u < (ssize_t) height; u++)
           InsertPixelList(image,r+u,s+u,pixel_list[id]);
         r+=image->columns+width;
         s+=image->columns+width;
index 0c5f8f227a4230188b136729f102331f63d7e3b8..437eab57ce776afe91755ff97265884a0aff9076 100644 (file)
@@ -110,9 +110,10 @@ extern MagickExport Image
   *SharpenImageChannel(const Image *,const ChannelType,const double,
     const double,ExceptionInfo *),
   *SpreadImage(const Image *,const double,ExceptionInfo *),
-  *StatisticImage(const Image *,const StatisticType,const double,ExceptionInfo *),
+  *StatisticImage(const Image *,const StatisticType,const size_t,const size_t,
+    ExceptionInfo *),
   *StatisticImageChannel(const Image *,const ChannelType,const StatisticType,
-    const double,ExceptionInfo *),
+    const size_t,const size_t,ExceptionInfo *),
   *UnsharpMaskImage(const Image *,const double,const double,const double,
     const double,ExceptionInfo *),
   *UnsharpMaskImageChannel(const Image *,const ChannelType,const double,
index abfe231ac8dc5cf521bc25f347f6c684e3457e3e..d5d96a19906aa6e84ed07ea37e43a6bb0583b6d4 100644 (file)
@@ -968,7 +968,7 @@ MagickExport Image *DeskewImage(const Image *image,const double threshold,
   clone_image=DestroyImage(clone_image);
   if (deskew_image == (Image *) NULL)
     return((Image *) NULL);
-  median_image=StatisticImage(deskew_image,MedianStatistic,0.0,exception);
+  median_image=StatisticImage(deskew_image,MedianStatistic,3,3,exception);
   if (median_image == (Image *) NULL)
     {
       deskew_image=DestroyImage(deskew_image);
index 045b8c30467c55c3a77bc3de50e44675e14a755a..574aa74aa7911247af236623c8fabcf3ef10cf04 100644 (file)
@@ -76,7 +76,7 @@ Image Settings:
   \-scene value         image scene number
   \-seed value          seed a new sequence of pseudo-random numbers
   \-size geometry       width and height of image
-  \-statistic type radius
+  \-statistic type geometry
                        replace each pixel with corresponding statistic from the neighborhood
   \-stretch type        render text with this font stretch
   \-stroke color        graphic primitive stroke color
index cbdba4d0894d87187428d0551d897186b65c5f05..418135e405dd42709f40285a88a3cbd4f472f60d 100644 (file)
@@ -206,7 +206,7 @@ Image Operators:
   \-solarize threshold  negate all pixels above the threshold level
   \-splice geometry     splice the background color into the image
   \-spread amount       displace image pixels by a random amount
-  \-statistic type radius
+  \-statistic type geometry
                        replace each pixel with corresponding statistic from the neighborhood
   \-strip               strip image of all profiles and comments
   \-swirl degrees       swirl image pixels about the center
index 32f68152e9dfcfbc43dc35ffababb1f7eb119576..de9d74eed7f14936b29be3e560987340a6ed9cde 100644 (file)
@@ -269,7 +269,7 @@ static MagickBooleanType ConvertUsage(void)
       "                     fill in a image based on a few color points",
       "-splice geometry     splice the background color into the image",
       "-spread radius       displace image pixels by a random amount",
-      "-statistic type radius",
+      "-statistic type geometry",
       "                     replace each pixel with corresponding statistic from the neighborhood",
       "-strip               strip image of all profiles and comments",
       "-swirl degrees       swirl image pixels about the center",
index 6053f795dc22539a698bfb18c395502a26fa0538..70bda096faf16595e2a9af43ad167d3ba4fefa53 100644 (file)
@@ -11694,9 +11694,10 @@ WandExport MagickBooleanType MagickSpreadImage(MagickWand *wand,
 %  The format of the MagickStatisticImage method is:
 %
 %      MagickBooleanType MagickStatisticImage(MagickWand *wand,
-%        const StatisticType type,const double radius)
+%        const StatisticType type,const double width,const size_t height)
 %      MagickBooleanType MagickStatisticImageChannel(MagickWand *wand,
-%        const ChannelType channel,const StatisticType type,const double radius)
+%        const ChannelType channel,const StatisticType type,const double width,
+%        const size_t height)
 %
 %  A description of each parameter follows:
 %
@@ -11710,7 +11711,8 @@ WandExport MagickBooleanType MagickSpreadImage(MagickWand *wand,
 %
 */
 WandExport MagickBooleanType MagickStatisticImage(MagickWand *wand,
-  const ChannelType channel,const StatisticType type,const double radius)
+  const ChannelType channel,const StatisticType type,const size_t width,
+  const size_t height)
 {
   Image
     *statistic_image;
@@ -11721,7 +11723,7 @@ WandExport MagickBooleanType MagickStatisticImage(MagickWand *wand,
     (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
   if (wand->images == (Image *) NULL)
     ThrowWandException(WandError,"ContainsNoImages",wand->name);
-  statistic_image=StatisticImageChannel(wand->images,channel,type,radius,
+  statistic_image=StatisticImageChannel(wand->images,channel,type,width,height,
     wand->exception);
   if (statistic_image == (Image *) NULL)
     return(MagickFalse);
index 25eb0833acc44151bcf15af0f448675baf281aed..0678844b7d57bde7fce3a79047381cee83089ac4 100644 (file)
@@ -339,8 +339,9 @@ extern WandExport MagickBooleanType
     const ssize_t),
   MagickSpreadImage(MagickWand *,const double),
   MagickStatisticImage(MagickWand *,const ChannelType,const StatisticType,
-    const double),
-  MagickStatisticImageChannel(MagickWand *,const StatisticType,const double),
+    const size_t,const size_t),
+  MagickStatisticImageChannel(MagickWand *,const StatisticType,const size_t,
+    const size_t),
   MagickStripImage(MagickWand *),
   MagickSwirlImage(MagickWand *,const double),
   MagickTintImage(MagickWand *,const PixelWand *,const PixelWand *),
index dbad01e058241d482adfbbf66e993f94b3b24243..4e7e33ce94b3556602f5e457f00a2002bc2fbe64 100644 (file)
@@ -2191,7 +2191,7 @@ WandExport MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc,
             (void) SyncImageSettings(mogrify_info,*image);
             (void) ParseGeometry(argv[i+1],&geometry_info);
             median_image=StatisticImageChannel(*image,channel,MedianStatistic,
-              geometry_info.rho,exception);
+              (size_t) geometry_info.rho,(size_t) geometry_info.rho,exception);
             if (median_image == (Image *) NULL)
               break;
             *image=DestroyImage(*image);
@@ -2209,7 +2209,7 @@ WandExport MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc,
             (void) SyncImageSettings(mogrify_info,*image);
             (void) ParseGeometry(argv[i+1],&geometry_info);
             mode_image=StatisticImageChannel(*image,channel,ModeStatistic,
-              geometry_info.rho,exception);
+              (size_t) geometry_info.rho,(size_t) geometry_info.rho,exception);
             if (mode_image == (Image *) NULL)
               break;
             *image=DestroyImage(*image);
@@ -2335,7 +2335,8 @@ WandExport MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc,
               {
                 (void) ParseGeometry(argv[i+1],&geometry_info);
                 noisy_image=StatisticImageChannel(*image,channel,
-                  NonpeakStatistic,geometry_info.rho,exception);
+                  NonpeakStatistic,(size_t) geometry_info.rho,(size_t)
+                  geometry_info.rho,exception);
               }
             else
               {
@@ -3171,7 +3172,8 @@ WandExport MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc,
               MagickFalse,argv[i+1]);
             (void) ParseGeometry(argv[i+2],&geometry_info);
             statistic_image=StatisticImageChannel(*image,channel,type,
-              geometry_info.rho,exception);
+              (size_t) geometry_info.rho,(size_t) geometry_info.sigma,
+              exception);
             if (statistic_image == (Image *) NULL)
               break;
             *image=DestroyImage(*image);