]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Thu, 28 Jan 2010 01:52:33 +0000 (01:52 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Thu, 28 Jan 2010 01:52:33 +0000 (01:52 +0000)
PerlMagick/Magick.xs
magick/feature.c
magick/identify.c

index f2f5cf06cecc4615f6636853969ab2a091205ed0..b973b83dbd488c78bd45b225c7883a86f2988837 100644 (file)
@@ -3540,13 +3540,16 @@ Features(ref,...)
     featuresimage = 3
   PPCODE:
   {
-#define ChannelFeatures(channel,angle) \
+#define ChannelFeatures(channel,direction) \
 { \
   (void) FormatMagickString(message,MaxTextExtent,"%.15g", \
-    channel_features[channel].angular_second_moment[angle]); \
+    channel_features[channel].angular_second_moment[direction]); \
   PUSHs(sv_2mortal(newSVpv(message,0))); \
   (void) FormatMagickString(message,MaxTextExtent,"%.15g", \
-    channel_features[channel].contrast[angle]); \
+    channel_features[channel].contrast[direction]); \
+  PUSHs(sv_2mortal(newSVpv(message,0))); \
+  (void) FormatMagickString(message,MaxTextExtent,"%.15g", \
+    channel_features[channel].constant[direction]); \
   PUSHs(sv_2mortal(newSVpv(message,0))); \
 }
 
index da8260358d2bcaa44385dc873a66ce2a4c5e8f8e..4ae625854756cc86a1a688562cfd1c9c57e5a0bd 100644 (file)
@@ -578,38 +578,76 @@ MagickExport ChannelFeatures *GetImageChannelFeatures(const Image *image,
           Correlation: measure of linear-dependencies in the image.
         */
         sum[y].direction[i].red+=cooccurrence[x][y].direction[i].red;
-        correlation.direction[i].red+=x*y*cooccurrence[x][y].direction[i].red;
-        mean.direction[i].red+=y*sum[y].direction[i].red;
-        sum_squares.direction[i].red+=y*y*sum[y].direction[i].red;
         sum[y].direction[i].green+=cooccurrence[x][y].direction[i].green;
+        sum[y].direction[i].blue+=cooccurrence[x][y].direction[i].blue;
+        if (image->matte != MagickFalse)
+          sum[y].direction[i].opacity+=cooccurrence[x][y].direction[i].opacity;
+        if (image->colorspace == CMYKColorspace)
+          sum[y].direction[i].index+=cooccurrence[x][y].direction[i].index;
+        correlation.direction[i].red+=x*y*cooccurrence[x][y].direction[i].red;
         correlation.direction[i].green+=x*y*
           cooccurrence[x][y].direction[i].green;
-        mean.direction[i].green+=y*sum[y].direction[i].green;
-        sum_squares.direction[i].green+=y*y*sum[y].direction[i].green;
-        sum[y].direction[i].blue+=cooccurrence[x][y].direction[i].blue;
         correlation.direction[i].blue+=x*y*
           cooccurrence[x][y].direction[i].blue;
-        mean.direction[i].blue+=y*sum[y].direction[i].blue;
-        sum_squares.direction[i].blue+=y*y*sum[y].direction[i].blue;
         if (image->matte != MagickFalse)
-          {
-            sum[y].direction[i].opacity+=
-              cooccurrence[x][y].direction[i].opacity;
-            correlation.direction[i].opacity+=x*y*
-              cooccurrence[x][y].direction[i].opacity;
-            mean.direction[i].opacity+=y*sum[y].direction[i].opacity;
-            sum_squares.direction[i].opacity+=y*y*sum[y].direction[i].opacity;
-          }
+          correlation.direction[i].opacity+=x*y*
+            cooccurrence[x][y].direction[i].opacity;
         if (image->colorspace == CMYKColorspace)
-          {
-            sum[y].direction[i].index+=cooccurrence[x][y].direction[i].index;
-            correlation.direction[i].index+=x*y*
-              cooccurrence[x][y].direction[i].index;
-            mean.direction[i].index+=y*sum[y].direction[i].index;
-            sum_squares.direction[i].index+=y*y*sum[y].direction[i].index;
-          }
+          correlation.direction[i].index+=x*y*
+            cooccurrence[x][y].direction[i].index;
       }
+      mean.direction[i].red+=y*sum[y].direction[i].red;
+      sum_squares.direction[i].red+=y*y*sum[y].direction[i].red;
+      mean.direction[i].green+=y*sum[y].direction[i].green;
+      sum_squares.direction[i].green+=y*y*sum[y].direction[i].green;
+      mean.direction[i].blue+=y*sum[y].direction[i].blue;
+      sum_squares.direction[i].blue+=y*y*sum[y].direction[i].blue;
+      if (image->matte != MagickFalse)
+        {
+          mean.direction[i].opacity+=y*sum[y].direction[i].opacity;
+          sum_squares.direction[i].opacity+=y*y*sum[y].direction[i].opacity;
+        }
+      if (image->colorspace == CMYKColorspace)
+        {
+          mean.direction[i].index+=y*sum[y].direction[i].index;
+          sum_squares.direction[i].index+=y*y*sum[y].direction[i].index;
+        }
     }
+    /*
+      Correlation: measure of linear-dependencies in the image.
+    */
+    channel_features[RedChannel].correlation[i]=
+      (correlation.direction[i].red-mean.direction[i].red*
+      mean.direction[i].red)/(sqrt(sum_squares.direction[i].red-
+      (mean.direction[i].red*mean.direction[i].red))*sqrt(
+      sum_squares.direction[i].red-(mean.direction[i].red*
+      mean.direction[i].red)));
+    channel_features[GreenChannel].correlation[i]=
+      (correlation.direction[i].green-mean.direction[i].green*
+      mean.direction[i].green)/(sqrt(sum_squares.direction[i].green-
+      (mean.direction[i].green*mean.direction[i].green))*sqrt(
+      sum_squares.direction[i].green-(mean.direction[i].green*
+      mean.direction[i].green)));
+    channel_features[BlueChannel].correlation[i]=
+      (correlation.direction[i].blue-mean.direction[i].blue*
+      mean.direction[i].blue)/(sqrt(sum_squares.direction[i].blue-
+      (mean.direction[i].blue*mean.direction[i].blue))*sqrt(
+      sum_squares.direction[i].blue-(mean.direction[i].blue*
+      mean.direction[i].blue)));
+    if (image->matte != MagickFalse)
+      channel_features[OpacityChannel].correlation[i]=
+        (correlation.direction[i].opacity-mean.direction[i].opacity*
+        mean.direction[i].opacity)/(sqrt(sum_squares.direction[i].opacity-
+        (mean.direction[i].opacity*mean.direction[i].opacity))*sqrt(
+        sum_squares.direction[i].opacity-(mean.direction[i].opacity*
+        mean.direction[i].opacity)));
+    if (image->colorspace == CMYKColorspace)
+      channel_features[IndexChannel].correlation[i]=
+        (correlation.direction[i].index-mean.direction[i].index*
+        mean.direction[i].index)/(sqrt(sum_squares.direction[i].index-
+        (mean.direction[i].index*mean.direction[i].index))*sqrt(
+        sum_squares.direction[i].index-(mean.direction[i].index*
+        mean.direction[i].index)));
   }
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
   #pragma omp parallel for schedule(dynamic,4) shared(status)
index d324948c4112693aa2b219b32002b18591ea72ea..e56a6caa90c1e6e66554ac82e449f923961fad15 100644 (file)
@@ -135,10 +135,12 @@ static int PrintChannelFeatures(FILE *file,const ChannelType channel,
   const char *name,const double scale,const ChannelFeatures *channel_features)
 {
 #define FeaturesFormat "    %s:\n" \
-  "      angular second moment:\n" \
+  "      Angular Second Moment:\n" \
+  "        %g, %g, %g, %g\n" \
+  "      Contrast:\n" \
+  "        %g, %g, %g, %g\n" \
+  "      Correlation:\n" \
   "        %g, %g, %g, %g\n" \
-  "      contrast:\n" \
-  "        %g, %g, %g, %g\n"
 
   int
     status;
@@ -151,7 +153,11 @@ static int PrintChannelFeatures(FILE *file,const ChannelType channel,
     channel_features[channel].contrast[0],
     channel_features[channel].contrast[1],
     channel_features[channel].contrast[2],
-    channel_features[channel].contrast[3]);
+    channel_features[channel].contrast[3],
+    channel_features[channel].correlation[0],
+    channel_features[channel].correlation[1],
+    channel_features[channel].correlation[2],
+    channel_features[channel].correlation[3]);
   return(status);
 }