*channel_phash,
*reconstruct_phash;
+ const char
+ *artifact;
+
+ MagickBooleanType
+ normalize;
+
ssize_t
channel;
channel_phash);
return(MagickFalse);
}
+ artifact=GetImageArtifact(image,"phash:normalize");
+ normalize=(artifact == (const char *) NULL) ||
+ (IsStringTrue(artifact) == MagickFalse) ? MagickFalse : MagickTrue;
#if defined(MAGICKCORE_OPENMP_SUPPORT)
#pragma omp parallel for schedule(static,4)
#endif
{
alpha=channel_phash[channel].phash[j][i];
beta=reconstruct_phash[channel].phash[j][i];
- difference+=(beta-alpha)*(beta-alpha);
+ if (normalize == MagickFalse)
+ difference+=(beta-alpha)*(beta-alpha);
+ else
+ difference=sqrt((beta-alpha)*(beta-alpha)/
+ channel_phash[0].number_channels);
}
}
distortion[channel]+=difference;
*artifact;
MagickBooleanType
- normalize,
status;
register char
MaxPixelChannels+1UL,sizeof(*perceptual_hash));
if (perceptual_hash == (ChannelPerceptualHash *) NULL)
return((ChannelPerceptualHash *) NULL);
- artifact=GetImageArtifact(image,"phash:normalize");
- normalize=(artifact == (const char *) NULL) ||
- (IsStringTrue(artifact) == MagickFalse) ? MagickFalse : MagickTrue;
artifact=GetImageArtifact(image,"phash:colorspaces");
if (artifact != NULL)
colorspaces=AcquireString(artifact);
else
colorspaces=AcquireString("sRGB,HCLp");
+ perceptual_hash[0].number_colorspaces=0;
+ perceptual_hash[0].number_channels=0;
q=colorspaces;
for (i=0; (p=StringToken(",",&q)) != (char *) NULL; i++)
{
if (status == MagickFalse)
break;
moments=GetImageMoments(hash_image,exception);
+ perceptual_hash[0].number_colorspaces++;
+ perceptual_hash[0].number_channels+=GetImageChannels(hash_image);
hash_image=DestroyImage(hash_image);
if (moments == (ChannelMoments *) NULL)
break;
for (channel=0; channel <= MaxPixelChannels; channel++)
for (j=0; j < MaximumNumberOfImageMoments; j++)
- {
perceptual_hash[channel].phash[i][j]=
(-MagickLog10(moments[channel].invariant[j]));
- if ((normalize != MagickFalse) &&
- (fabs(perceptual_hash[channel].phash[i][j]) > MagickEpsilon))
- perceptual_hash[channel].phash[i][j]=
- sqrt(perceptual_hash[channel].phash[i][j]/3.0);
- }
moments=(ChannelMoments *) RelinquishMagickMemory(moments);
}
- perceptual_hash[0].number_colorspaces=(size_t) i;
colorspaces=DestroyString(colorspaces);
return(perceptual_hash);
}