diff --git a/MagickCore/effect.c b/MagickCore/effect.c
index ef43755..f266b58 100644
--- a/MagickCore/effect.c
+++ b/MagickCore/effect.c
@@ -1420,6 +1420,17 @@
% o exception: return any errors or warnings in this structure.
%
*/
+
+static inline MagickRealType GetMeanLuma(const Image *restrict image,
+ const double *restrict pixel)
+{
+ if (image->colorspace == GRAYColorspace)
+ return((MagickRealType) pixel[image->channel_map[GrayPixelChannel].offset]);
+ return(0.212656f*pixel[image->channel_map[RedPixelChannel].offset]+
+ 0.715158f*pixel[image->channel_map[GreenPixelChannel].offset]+
+ 0.072186f*pixel[image->channel_map[BluePixelChannel].offset]); /* Rec709 */
+}
+
MagickExport Image *KuwaharaImage(const Image *image,const double radius,
const double sigma,ExceptionInfo *exception)
{
@@ -1564,36 +1575,39 @@
pixel[j]=0.0;
for (i=0; i < 4; i++)
{
+ const Quantum
+ *restrict k;
+
double
- max,
mean[MaxPixelChannels],
- min,
variance;
ssize_t
z;
- max=GetPixelLuma(image,p[0]);
- min=GetPixelLuma(image,p[0]);
for (j=0; j < (ssize_t) GetPixelChannels(image); j++)
mean[j]=0.0;
+ k=p[i];
+ for (z=0; z < (ssize_t) ((width/2L)*(width/2L)); z++)
+ {
+ for (j=0; j < (ssize_t) GetPixelChannels(image); j++)
+ mean[j]+=(double) k[j];
+ k+=GetPixelChannels(image);
+ }
+ for (j=0; j < (ssize_t) GetPixelChannels(image); j++)
+ mean[j]/=(double) ((width/2L)*(width/2L));
+ k=p[i];
+ variance=0.0;
for (z=0; z < (ssize_t) ((width/2L)*(width/2L)); z++)
{
double
luma;
- luma=GetPixelLuma(image,p[i]);
- if (luma > max)
- max=luma;
- if (luma < min)
- min=luma;
- for (j=0; j < (ssize_t) GetPixelChannels(image); j++)
- mean[j]+=(double) p[i][j];
- p[i]+=GetPixelChannels(image);
+ luma=GetPixelLuma(image,k);
+ variance+=(luma-GetMeanLuma(gaussian_image,mean))*
+ (luma-GetMeanLuma(gaussian_image,mean));
+ k+=GetPixelChannels(image);
}
- for (j=0; j < (ssize_t) GetPixelChannels(image); j++)
- mean[j]/=(double) ((width/2L)*(width/2L));
- variance=max-min;
if (variance < min_variance)
{
min_variance=variance;