]> granicus.if.org Git - imagemagick/commitdiff
...
authorCristy <urban-warrior@imagemagick.org>
Sat, 26 Aug 2017 00:36:45 +0000 (20:36 -0400)
committerCristy <urban-warrior@imagemagick.org>
Sat, 26 Aug 2017 00:36:45 +0000 (20:36 -0400)
MagickCore/compare.c

index 33018fa316a38be8f4032dd14abbc04cfa0ba809..a1a84df79ca3885afadca880155de032d7f92c52 100644 (file)
@@ -1451,6 +1451,10 @@ static MagickBooleanType GetStructuralSimilarityDistortion(const Image *image,
 
           for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
           {
+            double
+              pixel_p,
+              pixel_q;
+
             PixelChannel channel = GetPixelChannelChannel(image,i);
             PixelTrait traits = GetPixelChannelTraits(image,channel);
             PixelTrait reconstruct_traits = GetPixelChannelTraits(
@@ -1459,14 +1463,13 @@ static MagickBooleanType GetStructuralSimilarityDistortion(const Image *image,
                 (reconstruct_traits == UndefinedPixelTrait) ||
                 ((reconstruct_traits & UpdatePixelTrait) == 0))
               continue;
-            image_sum[i]+=(*k)*p[i];
-            image_sum_squared[i]+=((*k)*p[i]*(*k)*p[i]);
-            reconstruct_sum[i]+=(*k)*GetPixelChannel(reconstruct_image,channel,
-              q);
-            reconstruct_sum_squared[i]+=((*k)*GetPixelChannel(reconstruct_image,
-              channel,q)*(*k)*GetPixelChannel(reconstruct_image,channel,q));
-            sum[i]+=((*k)*p[i]*(*k)*GetPixelChannel(reconstruct_image,channel,
-              q));
+            pixel_p=(*k)*p[i];
+            pixel_q=(*k)*GetPixelChannel(reconstruct_image,channel,q);
+            image_sum[i]+=pixel_p;
+            image_sum_squared[i]+=pixel_p*pixel_p;
+            reconstruct_sum[i]+=pixel_q;
+            reconstruct_sum_squared[i]+=pixel_q*pixel_q;
+            sum[i]+=pixel_p*pixel_q;
           }
           p+=GetPixelChannels(image);
           q+=GetPixelChannels(reconstruct_image);
@@ -1481,17 +1484,12 @@ static MagickBooleanType GetStructuralSimilarityDistortion(const Image *image,
             reconstruct_mean,
             reconstruct_variance;
 
-          size_t
-            number_samples;
-
-          number_samples=kernel_info->width*kernel_info->height;
-          image_mean=image_sum[i]/number_samples;
-          image_variance=image_sum_squared[i]/number_samples-(image_mean*
-            image_mean);
-          reconstruct_mean=reconstruct_sum[i]/number_samples;
-          reconstruct_variance=reconstruct_sum_squared[i]/number_samples-
-            (reconstruct_mean*reconstruct_mean);
-          covarience=sum[i]/number_samples-(image_mean*reconstruct_mean);
+          image_mean=image_sum[i];
+          image_variance=image_sum_squared[i]-(image_mean*image_mean);
+          reconstruct_mean=reconstruct_sum[i];
+          reconstruct_variance=reconstruct_sum_squared[i]-(reconstruct_mean*
+            reconstruct_mean);
+          covarience=sum[i]-(image_mean*reconstruct_mean);
           channel_distortion[i]+=((2.0*image_mean*reconstruct_mean+c1)*(2.0*
             covarience+c2))/((image_mean*image_mean+reconstruct_mean*
             reconstruct_mean+c1)*(image_variance+reconstruct_variance+c2));