register ssize_t
i;
- size_t
+ ssize_t
channels;
channels=0;
break;
for (x=0; x < (ssize_t) image->columns; x++)
{
- MagickRealType
- distance;
-
- distance=fabs(GetPixelRed(image,p)-(double)
- GetPixelRed(reconstruct_image,q));
- mean_error_per_pixel+=distance;
- mean_error+=distance*distance;
- if (distance > maximum_error)
- maximum_error=distance;
- area++;
- distance=fabs(GetPixelGreen(image,p)-(double)
- GetPixelGreen(reconstruct_image,q));
- mean_error_per_pixel+=distance;
- mean_error+=distance*distance;
- if (distance > maximum_error)
- maximum_error=distance;
- area++;
- distance=fabs(GetPixelBlue(image,p)-(double)
- GetPixelBlue(reconstruct_image,q));
- mean_error_per_pixel+=distance;
- mean_error+=distance*distance;
- if (distance > maximum_error)
- maximum_error=distance;
- area++;
- if (image->matte != MagickFalse)
- {
- distance=fabs(GetPixelAlpha(image,p)-(double)
- GetPixelAlpha(reconstruct_image,q));
- mean_error_per_pixel+=distance;
- mean_error+=distance*distance;
- if (distance > maximum_error)
- maximum_error=distance;
- area++;
- }
- if ((image->colorspace == CMYKColorspace) &&
- (reconstruct_image->colorspace == CMYKColorspace))
- {
- distance=fabs(GetPixelBlack(image,p)-(double)
- GetPixelBlack(reconstruct_image,q));
- mean_error_per_pixel+=distance;
- mean_error+=distance*distance;
- if (distance > maximum_error)
- maximum_error=distance;
- area++;
- }
+ register ssize_t
+ i;
+
+ for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
+ {
+ MagickRealType
+ distance;
+
+ PixelChannel
+ channel;
+
+ PixelTrait
+ reconstruct_traits,
+ traits;
+
+ traits=GetPixelChannelMapTraits(image,(PixelChannel) i);
+ channel=GetPixelChannelMapChannel(image,(PixelChannel) i);
+ reconstruct_traits=GetPixelChannelMapTraits(reconstruct_image,channel);
+ if ((traits == UndefinedPixelTrait) ||
+ (reconstruct_traits == UndefinedPixelTrait))
+ continue;
+ distance=fabs(p[i]-(double) q[channel]);
+ mean_error_per_pixel+=distance;
+ mean_error+=distance*distance;
+ if (distance > maximum_error)
+ maximum_error=distance;
+ area++;
+ }
p+=GetPixelChannels(image);
q+=GetPixelChannels(reconstruct_image);
}
ssize_t
y;
- unsigned long
- number_channels;
-
/*
Normalize to account for variation due to lighting and exposure condition.
*/
}
for (x=0; x < (ssize_t) image->columns; x++)
{
- distortion+=area*QuantumScale*(GetPixelRed(image,p)-
- image_statistics[RedChannel].mean)*(
- GetPixelRed(reconstruct_image,q)-
- reconstruct_statistics[RedChannel].mean);
- distortion+=area*QuantumScale*(GetPixelGreen(image,p)-
- image_statistics[GreenChannel].mean)*(
- GetPixelGreen(reconstruct_image,q)-
- reconstruct_statistics[GreenChannel].mean);
- distortion+=area*QuantumScale*(GetPixelBlue(image,p)-
- GetPixelBlue(reconstruct_image,q)-
- image_statistics[BlueChannel].mean)*(
- reconstruct_statistics[BlueChannel].mean);
- if ((image->colorspace == CMYKColorspace) &&
- (reconstruct_image->colorspace == CMYKColorspace))
- distortion+=area*QuantumScale*(GetPixelBlack(image,p)-
- image_statistics[BlackChannel].mean)*(
- GetPixelBlack(reconstruct_image,q)-
- reconstruct_statistics[BlackChannel].mean);
- if (image->matte != MagickFalse)
- distortion+=area*QuantumScale*(GetPixelAlpha(image,p)-
- image_statistics[OpacityChannel].mean)*(
- GetPixelAlpha(reconstruct_image,q)-
- reconstruct_statistics[OpacityChannel].mean);
+ register ssize_t
+ i;
+
+ for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
+ {
+ PixelChannel
+ channel;
+
+ PixelTrait
+ reconstruct_traits,
+ traits;
+
+ traits=GetPixelChannelMapTraits(image,(PixelChannel) i);
+ channel=GetPixelChannelMapChannel(image,(PixelChannel) i);
+ reconstruct_traits=GetPixelChannelMapTraits(reconstruct_image,channel);
+ if ((traits == UndefinedPixelTrait) ||
+ (reconstruct_traits == UndefinedPixelTrait))
+ continue;
+ distortion+=area*QuantumScale*(p[i]-image_statistics[i].mean)*
+ (q[channel]-reconstruct_statistics[channel].mean);
+ }
p+=GetPixelChannels(image);
q+=GetPixelChannels(reconstruct_image);
}
reconstruct_statistics[MaxPixelChannels].standard_deviation;
gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
distortion=QuantumRange*gamma*distortion;
- number_channels=3;
- if (image->matte != MagickFalse)
- number_channels++;
- if (image->colorspace == CMYKColorspace)
- number_channels++;
- distortion=sqrt(distortion/number_channels);
+ distortion=sqrt(distortion/GetNumberChannels(image));
/*
Free resources.
*/
image->rows-reference->rows+1,MagickTrue,exception);
if (similarity_image == (Image *) NULL)
return((Image *) NULL);
- if (SetImageStorageClass(similarity_image,DirectClass,exception) == MagickFalse)
+ status=SetImageStorageClass(similarity_image,DirectClass,exception);
+ if (status == MagickFalse)
{
similarity_image=DestroyImage(similarity_image);
return((Image *) NULL);