Commit dc40e944d for imagemagick.org
commit dc40e944d32729603d7057ab875f194e64f9c137
Author: Cristy <urban-warrior@imagemagick.org>
Date: Sat May 31 19:38:28 2025 -0400
correct MSE metric
diff --git a/MagickCore/compare.c b/MagickCore/compare.c
index 26c52f55e..4406558f0 100644
--- a/MagickCore/compare.c
+++ b/MagickCore/compare.c
@@ -205,7 +205,6 @@ MagickExport Image *CompareImages(Image *image,const Image *reconstruct_image,
/*
Generate difference image.
*/
- status=MagickTrue;
fuzz=GetFuzzyColorDistance(image,reconstruct_image);
image_view=AcquireVirtualCacheView(image,exception);
reconstruct_view=AcquireVirtualCacheView(reconstruct_image,exception);
@@ -624,7 +623,6 @@ static MagickBooleanType GetMeanAbsoluteDistortion(const Image *image,
k,
y;
- status=MagickTrue;
(void) memset(distortion,0,(MaxPixelChannels+1)*sizeof(*distortion));
SetImageDistortionBounds(image,reconstruct_image,&columns,&rows);
image_view=AcquireVirtualCacheView(image,exception);
@@ -1524,7 +1522,7 @@ static MagickBooleanType GetStructuralSimilarityDistortion(const Image *image,
*artifact;
double
- area,
+ area = 0.0,
c1,
c2,
radius,
@@ -1570,8 +1568,6 @@ static MagickBooleanType GetStructuralSimilarityDistortion(const Image *image,
artifact=GetImageArtifact(image,"compare:ssim-k2");
if (artifact != (const char *) NULL)
c2=pow(StringToDouble(artifact,(char **) NULL)*SSIML,2.0);
- status=MagickTrue;
- area=0.0;
SetImageDistortionBounds(image,reconstruct_image,&columns,&rows);
image_view=AcquireVirtualCacheView(image,exception);
reconstruct_view=AcquireVirtualCacheView(reconstruct_image,exception);
@@ -1978,7 +1974,6 @@ MagickExport double *GetImageDistortions(Image *image,
if (distortion == (double *) NULL)
ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
(void) memset(distortion,0,length*sizeof(*distortion));
- status=MagickTrue;
switch (metric)
{
case AbsoluteErrorMetric:
@@ -3114,18 +3109,14 @@ static Image *SIMUnityImage(const Image *alpha_image,const Image *beta_image,
MagickBooleanType
status = MagickTrue;
- size_t
- columns,
- rows;
-
ssize_t
y;
/*
Create a padded unity image.
*/
- SetImageDistortionBounds(alpha_image,beta_image,&columns,&rows);
- unity_image=CloneImage(alpha_image,columns,rows,MagickTrue,exception);
+ unity_image=CloneImage(alpha_image,alpha_image->columns,alpha_image->rows,
+ MagickTrue,exception);
if (unity_image == (Image *) NULL)
return(unity_image);
if (SetImageStorageClass(unity_image,DirectClass,exception) == MagickFalse)
@@ -3133,9 +3124,9 @@ static Image *SIMUnityImage(const Image *alpha_image,const Image *beta_image,
image_view=AcquireAuthenticCacheView(unity_image,exception);
#if defined(MAGICKCORE_OPENMP_SUPPORT)
#pragma omp parallel for schedule(static) shared(status) \
- magick_number_threads(unity_image,unity_image,rows,1)
+ magick_number_threads(unity_image,unity_image,unity_image->rows,1)
#endif
- for (y=0; y < (ssize_t) rows; y++)
+ for (y=0; y < (ssize_t) unity_image->rows; y++)
{
Quantum
*magick_restrict q;
@@ -3145,13 +3136,14 @@ static Image *SIMUnityImage(const Image *alpha_image,const Image *beta_image,
if (status == MagickFalse)
continue;
- q=GetCacheViewAuthenticPixels(image_view,0,y,columns,1,exception);
+ q=GetCacheViewAuthenticPixels(image_view,0,y,unity_image->columns,1,
+ exception);
if (q == (Quantum *) NULL)
{
status=MagickFalse;
continue;
}
- for (x=0; x < (ssize_t) columns; x++)
+ for (x=0; x < (ssize_t) unity_image->columns; x++)
{
ssize_t
i;
@@ -3162,7 +3154,11 @@ static Image *SIMUnityImage(const Image *alpha_image,const Image *beta_image,
PixelTrait traits = GetPixelChannelTraits(unity_image,channel);
if ((traits & UpdatePixelTrait) == 0)
continue;
- q[i]=QuantumRange;
+ if ((x >= (ssize_t) beta_image->columns) ||
+ (y >= (ssize_t) beta_image->rows))
+ q[i]=(Quantum) 0;
+ else
+ q[i]=QuantumRange;
}
q+=(ptrdiff_t) GetPixelChannels(unity_image);
}
@@ -3613,6 +3609,7 @@ static Image *MSESimilarityImage(const Image *image,const Image *reconstruct,
Identify the minima value in the correlation image and its location.
*/
(void) ResetImagePage(mse_image,"0x0+0+0");
+ (void) ClampImage(mse_image,exception);
mse_image->depth=32;
status=SIMMinimaImage(mse_image,&minima,offset,exception);
if (status == MagickFalse)
@@ -4033,7 +4030,7 @@ MagickExport Image *SimilarityImage(const Image *image,const Image *reconstruct,
status = MagickTrue;
MagickOffsetType
- progress;
+ progress = 0;
SimilarityInfo
similarity_info = { 0 };
@@ -4132,10 +4129,8 @@ MagickExport Image *SimilarityImage(const Image *image,const Image *reconstruct,
/*
Measure similarity of reconstruction image against image.
*/
- status=MagickTrue;
similarity_info.similarity=GetSimilarityMetric(image,reconstruct,metric,
similarity_info.x,similarity_info.y,exception);
- progress=0;
similarity_view=AcquireAuthenticCacheView(similarity_image,exception);
#if defined(MAGICKCORE_OPENMP_SUPPORT)
#pragma omp parallel for schedule(static) shared(similarity_info,status) \