}
for (x=0; x < (ssize_t) image->columns; x++)
{
+ double
+ Da,
+ Sa;
+
MagickStatusType
difference;
continue;
}
difference=MagickFalse;
+ Sa=QuantumScale*GetPixelAlpha(image,p);
+ Da=QuantumScale*GetPixelAlpha(reconstruct_image,q);
for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
{
double
(reconstruct_traits == UndefinedPixelTrait) ||
((reconstruct_traits & UpdatePixelTrait) == 0))
continue;
- distance=p[i]-(double) GetPixelChannel(reconstruct_image,channel,q);
+ distance=Sa*p[i]-Da*GetPixelChannel(reconstruct_image,channel,q);
if (fabs((double) distance) >= MagickEpsilon)
difference=MagickTrue;
}
%
*/
+static inline double MagickMax(const double x,const double y)
+{
+ if (x > y)
+ return(x);
+ return(y);
+}
+
static MagickBooleanType GetAbsoluteDistortion(const Image *image,
const Image *reconstruct_image,double *distortion,ExceptionInfo *exception)
{
*image_view,
*reconstruct_view;
+ double
+ fuzz;
+
MagickBooleanType
status;
Compute the absolute difference in pixels between two images.
*/
status=MagickTrue;
+ if (image->fuzz == 0.0)
+ fuzz=MagickMax(reconstruct_image->fuzz,MagickSQ1_2)*
+ MagickMax(reconstruct_image->fuzz,MagickSQ1_2);
+ else
+ if (reconstruct_image->fuzz == 0.0)
+ fuzz=MagickMax(image->fuzz,MagickSQ1_2)*
+ MagickMax(image->fuzz,MagickSQ1_2);
+ else
+ fuzz=MagickMax(image->fuzz,MagickSQ1_2)*
+ MagickMax(reconstruct_image->fuzz,MagickSQ1_2);
image_view=AcquireVirtualCacheView(image,exception);
reconstruct_view=AcquireVirtualCacheView(reconstruct_image,exception);
#if defined(MAGICKCORE_OPENMP_SUPPORT)
(void) ResetMagickMemory(channel_distortion,0,sizeof(channel_distortion));
for (x=0; x < (ssize_t) image->columns; x++)
{
+ double
+ Da,
+ Sa;
+
MagickBooleanType
difference;
continue;
}
difference=MagickFalse;
+ Sa=QuantumScale*GetPixelAlpha(image,p);
+ Da=QuantumScale*GetPixelAlpha(reconstruct_image,q);
for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
{
+ double
+ distance;
+
PixelChannel channel=GetPixelChannelChannel(image,i);
PixelTrait traits=GetPixelChannelTraits(image,channel);
PixelTrait reconstruct_traits=GetPixelChannelTraits(reconstruct_image,
(reconstruct_traits == UndefinedPixelTrait) ||
((reconstruct_traits & UpdatePixelTrait) == 0))
continue;
- if (p[i] != GetPixelChannel(reconstruct_image,channel,q))
- difference=MagickTrue;
+ distance=Sa*p[i]-Da*GetPixelChannel(reconstruct_image,channel,q);
+ if ((distance*distance) > fuzz)
+ {
+ difference=MagickTrue;
+ break;
+ }
}
if (difference != MagickFalse)
{
(void) ResetMagickMemory(channel_distortion,0,sizeof(channel_distortion));
for (x=0; x < (ssize_t) image->columns; x++)
{
+ double
+ Da,
+ Sa;
+
register ssize_t
i;
q+=GetPixelChannels(reconstruct_image);
continue;
}
+ Sa=QuantumScale*GetPixelAlpha(image,p);
+ Da=QuantumScale*GetPixelAlpha(reconstruct_image,q);
for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
{
double
(reconstruct_traits == UndefinedPixelTrait) ||
((reconstruct_traits & UpdatePixelTrait) == 0))
continue;
- distance=QuantumScale*(p[i]-(double) GetPixelChannel(reconstruct_image,
+ distance=QuantumScale*(Sa*p[i]-Da*GetPixelChannel(reconstruct_image,
channel,q));
- distance*=distance;
- channel_distortion[i]+=distance;
- channel_distortion[CompositePixelChannel]+=distance;
+ channel_distortion[i]+=distance*distance;
+ channel_distortion[CompositePixelChannel]+=distance*distance;
}
p+=GetPixelChannels(image);
q+=GetPixelChannels(reconstruct_image);
(void) ResetMagickMemory(channel_distortion,0,sizeof(channel_distortion));
for (x=0; x < (ssize_t) image->columns; x++)
{
+ double
+ Da,
+ Sa;
+
register ssize_t
i;
q+=GetPixelChannels(reconstruct_image);
continue;
}
+ Sa=QuantumScale*GetPixelAlpha(image,p);
+ Da=QuantumScale*GetPixelAlpha(reconstruct_image,q);
for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
{
double
(reconstruct_traits == UndefinedPixelTrait) ||
((reconstruct_traits & UpdatePixelTrait) == 0))
continue;
- distance=QuantumScale*fabs(p[i]-(double) GetPixelChannel(
- reconstruct_image,channel,q));
+ distance=QuantumScale*fabs(Sa*p[i]-Da*GetPixelChannel(reconstruct_image,
+ channel,q));
channel_distortion[i]+=distance;
channel_distortion[CompositePixelChannel]+=distance;
}
}
for (x=0; x < (ssize_t) image->columns; x++)
{
+ double
+ Da,
+ Sa;
+
register ssize_t
i;
q+=GetPixelChannels(reconstruct_image);
continue;
}
+ Sa=QuantumScale*GetPixelAlpha(image,p);
+ Da=QuantumScale*GetPixelAlpha(reconstruct_image,q);
for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
{
double
(reconstruct_traits == UndefinedPixelTrait) ||
((reconstruct_traits & UpdatePixelTrait) == 0))
continue;
- distance=fabs((double) (alpha*p[i]-beta*GetPixelChannel(
+ distance=fabs((double) (alpha*Sa*p[i]-beta*Da*GetPixelChannel(
reconstruct_image,channel,q)));
distortion[i]+=distance;
distortion[CompositePixelChannel]+=distance;
(void) ResetMagickMemory(channel_distortion,0,sizeof(channel_distortion));
for (x=0; x < (ssize_t) image->columns; x++)
{
+ double
+ Da,
+ Sa;
+
register ssize_t
i;
q+=GetPixelChannels(reconstruct_image);
continue;
}
+ Sa=QuantumScale*GetPixelAlpha(image,p);
+ Da=QuantumScale*GetPixelAlpha(reconstruct_image,q);
for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
{
double
(reconstruct_traits == UndefinedPixelTrait) ||
((reconstruct_traits & UpdatePixelTrait) == 0))
continue;
- distance=QuantumScale*(p[i]-(double) GetPixelChannel(
- reconstruct_image,channel,q));
- distance*=distance;
- channel_distortion[i]+=distance;
- channel_distortion[CompositePixelChannel]+=distance;
+ distance=QuantumScale*(Sa*p[i]-Da*GetPixelChannel(reconstruct_image,
+ channel,q));
+ channel_distortion[i]+=distance*distance;
+ channel_distortion[CompositePixelChannel]+=distance*distance;
}
p+=GetPixelChannels(image);
q+=GetPixelChannels(reconstruct_image);
*image_statistics,
*reconstruct_statistics;
+ double
+ area;
+
MagickBooleanType
status;
MagickOffsetType
progress;
- double
- area;
-
register ssize_t
i;
}
for (x=0; x < (ssize_t) image->columns; x++)
{
+ double
+ Da,
+ Sa;
+
register ssize_t
i;
q+=GetPixelChannels(reconstruct_image);
continue;
}
+ Sa=QuantumScale*GetPixelAlpha(image,p);
+ Da=QuantumScale*GetPixelAlpha(reconstruct_image,q);
for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
{
PixelChannel channel=GetPixelChannelChannel(image,i);
(reconstruct_traits == UndefinedPixelTrait) ||
((reconstruct_traits & UpdatePixelTrait) == 0))
continue;
- distortion[i]+=area*QuantumScale*(p[i]-image_statistics[i].mean)*
- (GetPixelChannel(reconstruct_image,channel,q)-
+ distortion[i]+=area*QuantumScale*(Sa*p[i]-image_statistics[i].mean)*
+ (Da*GetPixelChannel(reconstruct_image,channel,q)-
reconstruct_statistics[channel].mean);
}
p+=GetPixelChannels(image);
(void) ResetMagickMemory(channel_distortion,0,sizeof(channel_distortion));
for (x=0; x < (ssize_t) image->columns; x++)
{
+ double
+ Da,
+ Sa;
+
register ssize_t
i;
q+=GetPixelChannels(reconstruct_image);
continue;
}
+ Sa=QuantumScale*GetPixelAlpha(image,p);
+ Da=QuantumScale*GetPixelAlpha(reconstruct_image,q);
for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
{
double
(reconstruct_traits == UndefinedPixelTrait) ||
((reconstruct_traits & UpdatePixelTrait) == 0))
continue;
- distance=QuantumScale*fabs(p[i]-(double) GetPixelChannel(
- reconstruct_image,channel,q));
+ distance=QuantumScale*fabs(Sa*p[i]-Da*GetPixelChannel(reconstruct_image,
+ channel,q));
if (distance > channel_distortion[i])
channel_distortion[i]=distance;
if (distance > channel_distortion[CompositePixelChannel])