]> granicus.if.org Git - imagemagick/blobdiff - filters/analyze.c
(no commit message)
[imagemagick] / filters / analyze.c
index 30a38002482ddf0d9dbd74787d5212c37fbca10a..1e4a785808dd3e5e9e17aa89da213954319d18c7 100644 (file)
@@ -15,7 +15,7 @@
 %                              December 1998                                  %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization      %
 %  dedicated to making software imaging solutions freely available.           %
 %                                                                             %
 %  You may not use this file except in compliance with the License.  You may  %
@@ -42,7 +42,7 @@
 #include <time.h>
 #include <assert.h>
 #include <math.h>
-#include "magick/MagickCore.h"
+#include "MagickCore/MagickCore.h"
 \f
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -145,11 +145,11 @@ ModuleExport size_t analyzeImage(Image **images,const int argc,
     status=MagickTrue;
     image_view=AcquireCacheView(image);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-    #pragma omp parallel for schedule(dynamic,4) shared(status)
+    #pragma omp parallel for schedule(static,4) shared(status)
 #endif
     for (y=0; y < (ssize_t) image->rows; y++)
     {
-      register const PixelPacket
+      register const Quantum
         *p;
 
       register ssize_t
@@ -158,14 +158,15 @@ ModuleExport size_t analyzeImage(Image **images,const int argc,
       if (status == MagickFalse)
         continue;
       p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
-      if (p == (const PixelPacket *) NULL)
+      if (p == (const Quantum *) NULL)
         {
           status=MagickFalse;
           continue;
         }
       for (x=0; x < (ssize_t) image->columns; x++)
       {
-        ConvertRGBToHSB(p->red,p->green,p->blue,&hue,&saturation,&brightness);
+        ConvertRGBToHSL(GetPixelRed(image,p),GetPixelGreen(image,p),
+          GetPixelBlue(image,p),&hue,&saturation,&brightness);
         brightness*=QuantumRange;
         brightness_sum_x+=brightness;
         brightness_sum_x2+=brightness*brightness;
@@ -177,60 +178,68 @@ ModuleExport size_t analyzeImage(Image **images,const int argc,
         saturation_sum_x3+=saturation*saturation*saturation;
         saturation_sum_x4+=saturation*saturation*saturation*saturation;
         area++;
-        p++;
+        p+=GetPixelChannels(image);
       }
     }
     image_view=DestroyCacheView(image_view);
     if (area <= 0.0)
       break;
     brightness_mean=brightness_sum_x/area;
-    (void) FormatMagickString(text,MaxTextExtent,"%g",brightness_mean);
-    (void) SetImageProperty(image,"filter:brightness:mean",text);
+    (void) FormatLocaleString(text,MaxTextExtent,"%g",brightness_mean);
+    (void) SetImageProperty(image,"filter:brightness:mean",text,
+      exception);
     brightness_standard_deviation=sqrt(brightness_sum_x2/area-(brightness_sum_x/
       area*brightness_sum_x/area));
-    (void) FormatMagickString(text,MaxTextExtent,"%g",
+    (void) FormatLocaleString(text,MaxTextExtent,"%g",
       brightness_standard_deviation);
-    (void) SetImageProperty(image,"filter:brightness:standard-deviation",text);
-    if (brightness_standard_deviation != 0)
+    (void) SetImageProperty(image,"filter:brightness:standard-deviation",text,
+      exception);
+    if (fabs(brightness_standard_deviation) >= MagickEpsilon)
       brightness_kurtosis=(brightness_sum_x4/area-4.0*brightness_mean*
         brightness_sum_x3/area+6.0*brightness_mean*brightness_mean*
         brightness_sum_x2/area-3.0*brightness_mean*brightness_mean*
         brightness_mean*brightness_mean)/(brightness_standard_deviation*
         brightness_standard_deviation*brightness_standard_deviation*
         brightness_standard_deviation)-3.0;
-    (void) FormatMagickString(text,MaxTextExtent,"%g",brightness_kurtosis);
-    (void) SetImageProperty(image,"filter:brightness:kurtosis",text);
+    (void) FormatLocaleString(text,MaxTextExtent,"%g",brightness_kurtosis);
+    (void) SetImageProperty(image,"filter:brightness:kurtosis",text,
+      exception);
     if (brightness_standard_deviation != 0)
       brightness_skewness=(brightness_sum_x3/area-3.0*brightness_mean*
         brightness_sum_x2/area+2.0*brightness_mean*brightness_mean*
         brightness_mean)/(brightness_standard_deviation*
         brightness_standard_deviation*brightness_standard_deviation);
-    (void) FormatMagickString(text,MaxTextExtent,"%g",brightness_skewness);
-    (void) SetImageProperty(image,"filter:brightness:skewness",text);
+    (void) FormatLocaleString(text,MaxTextExtent,"%g",brightness_skewness);
+    (void) SetImageProperty(image,"filter:brightness:skewness",text,
+      exception);
     saturation_mean=saturation_sum_x/area;
-    (void) FormatMagickString(text,MaxTextExtent,"%g",saturation_mean);
-    (void) SetImageProperty(image,"filter:saturation:mean",text);
+    (void) FormatLocaleString(text,MaxTextExtent,"%g",saturation_mean);
+    (void) SetImageProperty(image,"filter:saturation:mean",text,
+      exception);
     saturation_standard_deviation=sqrt(saturation_sum_x2/area-(saturation_sum_x/
       area*saturation_sum_x/area));
-    (void) FormatMagickString(text,MaxTextExtent,"%g",
+    (void) FormatLocaleString(text,MaxTextExtent,"%g",
       saturation_standard_deviation);
-    (void) SetImageProperty(image,"filter:saturation:standard-deviation",text);
-    if (saturation_standard_deviation != 0)
+    (void) SetImageProperty(image,"filter:saturation:standard-deviation",text,
+      exception);
+    if (fabs(saturation_standard_deviation) >= MagickEpsilon)
       saturation_kurtosis=(saturation_sum_x4/area-4.0*saturation_mean*
         saturation_sum_x3/area+6.0*saturation_mean*saturation_mean*
         saturation_sum_x2/area-3.0*saturation_mean*saturation_mean*
         saturation_mean*saturation_mean)/(saturation_standard_deviation*
         saturation_standard_deviation*saturation_standard_deviation*
         saturation_standard_deviation)-3.0;
-    (void) FormatMagickString(text,MaxTextExtent,"%g",saturation_kurtosis);
-    (void) SetImageProperty(image,"filter:saturation:kurtosis",text);
-    if (saturation_standard_deviation != 0)
+    (void) FormatLocaleString(text,MaxTextExtent,"%g",saturation_kurtosis);
+    (void) SetImageProperty(image,"filter:saturation:kurtosis",text,
+      exception);
+    if (fabs(saturation_standard_deviation) >= MagickEpsilon)
       saturation_skewness=(saturation_sum_x3/area-3.0*saturation_mean*
         saturation_sum_x2/area+2.0*saturation_mean*saturation_mean*
         saturation_mean)/(saturation_standard_deviation*
         saturation_standard_deviation*saturation_standard_deviation);
-    (void) FormatMagickString(text,MaxTextExtent,"%g",saturation_skewness);
-    (void) SetImageProperty(image,"filter:saturation:skewness",text);
+    (void) FormatLocaleString(text,MaxTextExtent,"%g",saturation_skewness);
+    (void) SetImageProperty(image,"filter:saturation:skewness",text,
+      exception);
   }
   return(MagickImageFilterSignature);
 }