]> granicus.if.org Git - imagemagick/commitdiff
Support phash:normalize define
authorCristy <urban-warrior@imagemagick.org>
Sat, 10 Sep 2016 18:37:47 +0000 (14:37 -0400)
committerCristy <urban-warrior@imagemagick.org>
Sat, 10 Sep 2016 18:37:47 +0000 (14:37 -0400)
MagickCore/compare.c
MagickCore/statistic.c
MagickCore/statistic.h

index 7ca7487e794aab62ff6e51fe06bf0323c59ba381..d3349dbdecf4535985faa1de3f30fdcea9f352fc 100644 (file)
@@ -1156,6 +1156,12 @@ static MagickBooleanType GetPerceptualHashDistortion(const Image *image,
     *channel_phash,
     *reconstruct_phash;
 
+  const char
+    *artifact;
+
+  MagickBooleanType
+    normalize;
+
   ssize_t
     channel;
 
@@ -1172,6 +1178,9 @@ static MagickBooleanType GetPerceptualHashDistortion(const Image *image,
         channel_phash);
       return(MagickFalse);
     }
+  artifact=GetImageArtifact(image,"phash:normalize");
+  normalize=(artifact == (const char *) NULL) ||
+    (IsStringTrue(artifact) == MagickFalse) ? MagickFalse : MagickTrue;
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
   #pragma omp parallel for schedule(static,4)
 #endif
@@ -1197,7 +1206,11 @@ static MagickBooleanType GetPerceptualHashDistortion(const Image *image,
       {
         alpha=channel_phash[channel].phash[j][i];
         beta=reconstruct_phash[channel].phash[j][i];
-        difference+=(beta-alpha)*(beta-alpha);
+        if (normalize == MagickFalse)
+          difference+=(beta-alpha)*(beta-alpha);
+        else
+          difference=sqrt((beta-alpha)*(beta-alpha)/
+            channel_phash[0].number_channels);
       }
     }
     distortion[channel]+=difference;
index d412119a4767d235aa8a3b4d09d45fb710fafcf4..20558747fb5736ca1d554ffdfcbc87a380649cff 100644 (file)
@@ -1792,7 +1792,6 @@ MagickExport ChannelPerceptualHash *GetImagePerceptualHash(const Image *image,
     *artifact;
 
   MagickBooleanType
-    normalize,
     status;
 
   register char
@@ -1805,14 +1804,13 @@ MagickExport ChannelPerceptualHash *GetImagePerceptualHash(const Image *image,
     MaxPixelChannels+1UL,sizeof(*perceptual_hash));
   if (perceptual_hash == (ChannelPerceptualHash *) NULL)
     return((ChannelPerceptualHash *) NULL);
-  artifact=GetImageArtifact(image,"phash:normalize");
-  normalize=(artifact == (const char *) NULL) ||
-    (IsStringTrue(artifact) == MagickFalse) ? MagickFalse : MagickTrue;
   artifact=GetImageArtifact(image,"phash:colorspaces");
   if (artifact != NULL)
     colorspaces=AcquireString(artifact);
   else
     colorspaces=AcquireString("sRGB,HCLp");
+  perceptual_hash[0].number_colorspaces=0;
+  perceptual_hash[0].number_channels=0;
   q=colorspaces;
   for (i=0; (p=StringToken(",",&q)) != (char *) NULL; i++)
   {
@@ -1845,22 +1843,17 @@ MagickExport ChannelPerceptualHash *GetImagePerceptualHash(const Image *image,
     if (status == MagickFalse)
       break;
     moments=GetImageMoments(hash_image,exception);
+    perceptual_hash[0].number_colorspaces++;
+    perceptual_hash[0].number_channels+=GetImageChannels(hash_image);
     hash_image=DestroyImage(hash_image);
     if (moments == (ChannelMoments *) NULL)
       break;
     for (channel=0; channel <= MaxPixelChannels; channel++)
       for (j=0; j < MaximumNumberOfImageMoments; j++)
-      {
         perceptual_hash[channel].phash[i][j]=
           (-MagickLog10(moments[channel].invariant[j]));
-        if ((normalize != MagickFalse) &&
-            (fabs(perceptual_hash[channel].phash[i][j]) > MagickEpsilon))
-          perceptual_hash[channel].phash[i][j]=
-            sqrt(perceptual_hash[channel].phash[i][j]/3.0);
-      }
     moments=(ChannelMoments *) RelinquishMagickMemory(moments);
   }
-  perceptual_hash[0].number_colorspaces=(size_t) i;
   colorspaces=DestroyString(colorspaces);
   return(perceptual_hash);
 }
index 23fa9457155346d96813ab4da9ce787b1fe57293..ebc4806d015fb5e66ecd0042d9c1e059d01dd182 100644 (file)
@@ -76,6 +76,9 @@ typedef struct _ChannelPerceptualHash
 
   double
     phash[MaximumNumberOfPerceptualColorspaces+1][MaximumNumberOfImageMoments+1];
+
+  size_t
+    number_channels;
 } ChannelPerceptualHash;
 
 typedef enum