]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Fri, 15 Mar 2013 14:26:17 +0000 (14:26 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Fri, 15 Mar 2013 14:26:17 +0000 (14:26 +0000)
MagickCore/compare.c
MagickCore/compare.h
MagickCore/option.c
MagickWand/compare.c

index 746dc48b3ba1b114e5231adbd710c1773f4b07cb..05d934c1ba1e9e2511f2f78bd689e45e77c907ba 100644 (file)
@@ -1499,8 +1499,8 @@ MagickExport MagickBooleanType IsImagesEqual(Image *image,
 %  The format of the SimilarityImageImage method is:
 %
 %      Image *SimilarityImage(const Image *image,const Image *reference,
-%        const MetricType metric,RectangleInfo *offset,double *similarity,
-%        ExceptionInfo *exception)
+%        const MetricType metric,const double similarity_threshold,
+%        RectangleInfo *offset,double *similarity,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
@@ -1510,7 +1510,9 @@ MagickExport MagickBooleanType IsImagesEqual(Image *image,
 %
 %    o metric: the metric.
 %
-%    o the best match offset of the reference image within the image.
+%    o similarity_threshold: minimum distortion for (sub)image match.
+%
+%    o offset: the best match offset of the reference image within the image.
 %
 %    o similarity: the computed similarity between the images.
 %
@@ -1550,8 +1552,8 @@ static double GetSimilarityMetric(const Image *image,const Image *reference,
 }
 
 MagickExport Image *SimilarityImage(Image *image,const Image *reference,
-  const MetricType metric,RectangleInfo *offset,double *similarity_metric,
-  ExceptionInfo *exception)
+  const MetricType metric,const double similarity_threshold,
+  RectangleInfo *offset,double *similarity_metric,ExceptionInfo *exception)
 {
 #define SimilarityImageTag  "Similarity/Image"
 
index bc5a35d15700573c8dc322798a18b14384a9acf7..8528f6047b9e1f534f01f12c15c1cc8fd2c4d128 100644 (file)
@@ -44,8 +44,8 @@ extern MagickExport double
 extern MagickExport Image
   *CompareImages(Image *,const Image *,const MetricType,double *,
     ExceptionInfo *),
-  *SimilarityImage(Image *,const Image *,const MetricType,RectangleInfo *,
-    double *,ExceptionInfo *);
+  *SimilarityImage(Image *,const Image *,const MetricType,const double,
+    RectangleInfo *,double *,ExceptionInfo *);
 
 extern MagickExport MagickBooleanType
   GetImageDistortion(Image *,const Image *,const MetricType,double *,
index 5c1a59666920a1e239a2351b33228098d6034b39..c185270e6ef7086e8e966aa69ea2b0712b9b6702 100644 (file)
@@ -651,6 +651,8 @@ static const OptionInfo
     { "-sigmoidal-contrast", 1L, SimpleOperatorFlag, MagickFalse },
     { "+silent", 0L, NonMagickOptionFlag, MagickFalse },
     { "-silent", 1L, NonMagickOptionFlag, MagickFalse },
+    { "+similarity-threshold", 0L, NonMagickOptionFlag | ImageInfoOptionFlag, MagickFalse },
+    { "-similarity-threshold", 1L, NonMagickOptionFlag | ImageInfoOptionFlag, MagickFalse },
     { "+size", 0L, ImageInfoOptionFlag, MagickFalse },
     { "-size", 1L, ImageInfoOptionFlag, MagickFalse },
     { "+sketch", 1L, DeprecateOptionFlag, MagickTrue },
index 5f5e243bf747036eb9ece57f93be203e06c73be4..44d49fe96f03734eb325ed82bd245949bdabe547 100644 (file)
@@ -175,6 +175,7 @@ WandExport MagickBooleanType CompareImagesCommand(ImageInfo *image_info,
   int argc,char **argv,char **metadata,ExceptionInfo *exception)
 {
 #define DefaultDissimilarityThreshold  0.31830988618379067154
+#define DefaultSimilarityThreshold  0.0
 #define DestroyCompare() \
 { \
   if (similarity_image != (Image *) NULL) \
@@ -268,6 +269,7 @@ WandExport MagickBooleanType CompareImagesCommand(ImageInfo *image_info,
   difference_image=NewImageList();
   similarity_image=NewImageList();
   dissimilarity_threshold=DefaultDissimilarityThreshold;
+  similarity_threshold=DefaultSimilarityThreshold;
   distortion=0.0;
   format=(char *) NULL;
   j=1;
@@ -814,6 +816,21 @@ WandExport MagickBooleanType CompareImagesCommand(ImageInfo *image_info,
               ThrowCompareException(OptionError,"MissingArgument",option);
             break;
           }
+        if (LocaleCompare("similarity-threshold",option+1) == 0)
+          {
+            if (*option == '+')
+              break;
+            i++;
+            if (i == (ssize_t) argc)
+              ThrowCompareException(OptionError,"MissingArgument",option);
+            if (IsGeometry(argv[i]) == MagickFalse)
+              ThrowCompareInvalidArgumentException(option,argv[i]);
+            if (*option == '+')
+              similarity_threshold=DefaultSimilarityThreshold;
+            else
+              similarity_threshold=StringToDouble(argv[i],(char **) NULL);
+            break;
+          }
         if (LocaleCompare("size",option+1) == 0)
           {
             if (*option == '+')
@@ -922,8 +939,8 @@ WandExport MagickBooleanType CompareImagesCommand(ImageInfo *image_info,
   reconstruct_image=GetImageFromList(image,1);
   if (subimage_search != MagickFalse)
     {
-      similarity_image=SimilarityImage(image,reconstruct_image,metric,&offset,
-        &similarity_metric,exception);
+      similarity_image=SimilarityImage(image,reconstruct_image,metric,
+        similarity_threshold,&offset,&similarity_metric,exception);
       if (similarity_metric > dissimilarity_threshold)
         ThrowCompareException(ImageError,"ImagesTooDissimilar",image->filename);
     }