Commit 7097486b9 for imagemagick.org
commit 7097486b919e8b80026440e66ad7bca210350eb7
Author: Cristy <urban-warrior@imagemagick.org>
Date: Wed May 21 17:46:57 2025 -0400
for DPC/Phase metrics, make image even and square
diff --git a/MagickCore/compare.c b/MagickCore/compare.c
index 22b20c229..8b9070a44 100644
--- a/MagickCore/compare.c
+++ b/MagickCore/compare.c
@@ -3315,7 +3315,7 @@ static Image *DPCSimilarityImage(const Image *image,const Image *reconstruct,
geometry;
size_t
- extent;
+ extent = MagickMax(image->columns,image->rows);
/*
Dot product correlation-based image similarity using FFT local statistics.
@@ -3325,9 +3325,9 @@ static Image *DPCSimilarityImage(const Image *image,const Image *reconstruct,
return((Image *) NULL);
GetPixelInfoRGBA(0,0,0,0,&test_image->background_color);
(void) ResetImagePage(test_image,"0x0+0+0");
- extent=MagickMax(image->columns,image->rows);
- status=SetImageExtent(test_image,2*(size_t) ceil((double) extent/2.0),
- 2*(size_t) ceil((double) extent/2.0),exception);
+ if ((extent % 2) != 0)
+ extent++;
+ status=SetImageExtent(test_image,extent,extent,exception);
if (status == MagickFalse)
ThrowDPCSimilarityException();
(void) SetImageAlphaChannel(test_image,OffAlphaChannel,exception);
@@ -3339,6 +3339,9 @@ static Image *DPCSimilarityImage(const Image *image,const Image *reconstruct,
ThrowDPCSimilarityException();
GetPixelInfoRGBA(0,0,0,0,&reconstruct_image->background_color);
(void) ResetImagePage(reconstruct_image,"0x0+0+0");
+ status=SetImageExtent(reconstruct_image,extent,extent,exception);
+ if (status == MagickFalse)
+ ThrowDPCSimilarityException();
(void) SetImageAlphaChannel(reconstruct_image,OffAlphaChannel,exception);
/*
Compute X and Y derivatives of reference image.
@@ -3468,6 +3471,8 @@ static Image *DPCSimilarityImage(const Image *image,const Image *reconstruct,
if (status == MagickFalse)
ThrowDPCSimilarityException();
*similarity_metric=QuantumScale*maxima;
+ if (IsNaN(maxima) != 0)
+ *similarity_metric=1.0;
return(dot_product_image);
}
@@ -3808,6 +3813,9 @@ static Image *PhaseSimilarityImage(const Image *image,const Image *reconstruct,
RectangleInfo
geometry;
+ size_t
+ extent = MagickMax(image->columns,image->rows);
+
/*
Phase correlation-based image similarity using FFT local statistics.
*/
@@ -3816,8 +3824,10 @@ static Image *PhaseSimilarityImage(const Image *image,const Image *reconstruct,
ThrowPhaseSimilarityException();
GetPixelInfoRGBA(0,0,0,0,&test_image->background_color);
(void) ResetImagePage(test_image,"0x0+0+0");
- status=SetImageExtent(test_image,2*(size_t) ceil((double) image->columns/2.0),
- 2*(size_t) ceil((double) image->rows/2.0),exception);
+ extent=MagickMax(image->columns,image->rows);
+ if ((extent % 2) != 0)
+ extent++;
+ status=SetImageExtent(test_image,extent,extent,exception);
if (status == MagickFalse)
ThrowPhaseSimilarityException();
(void) SetImageAlphaChannel(test_image,OffAlphaChannel,exception);
@@ -3829,8 +3839,7 @@ static Image *PhaseSimilarityImage(const Image *image,const Image *reconstruct,
ThrowPhaseSimilarityException();
GetPixelInfoRGBA(0,0,0,0,&reconstruct_image->background_color);
(void) ResetImagePage(reconstruct_image,"0x0+0+0");
- status=SetImageExtent(reconstruct_image,2*(size_t) ceil((double)
- image->columns/2.0),2*(size_t) ceil((double) image->rows/2.0),exception);
+ status=SetImageExtent(reconstruct_image,extent,extent,exception);
if (status == MagickFalse)
ThrowPhaseSimilarityException();
(void) SetImageAlphaChannel(reconstruct_image,OffAlphaChannel,exception);