> First, a Gaussian is a low-pass filter
We create a kernel at a width that starts with a minimum of 3 pixels and
walk out until we drop below the threshold of one pixel numerical accuracy:
for (width=5; ;)
{
normalize=0.0;
for (v=(-width/2); v <= (width/2); v++)
{
for (u=(-width/2); u <= (width/2); u++)
{
alpha=exp(-((double) u*u+v*v)/(2.0*sigma*sigma));
normalize+=alpha/(2.0*MagickPI*sigma*sigma);
}
}
v=width/2;
value=exp(-((double) v*v)/(2.0*sigma*sigma))/(MagickSQ2PI*sigma)/normalize;
if ((long) (QuantumRange*value) <= 0)
break;
width+=2;
}
width-=2;
Next we compute the kernel as follows:
normalize=0.0;
for (v=(-((long) width/2)); v <= (long) (width/2); v++)
{
for (u=(-((long) width/2)); u <= (long) (width/2); u++)
{
alpha=exp(-((double) u*u+v*v)/(2.0*sigma*sigma));
kernel[i]=(double) (-alpha/(2.0*MagickPI*sigma*sigma));
if ((width < 3) || (u != 0) || (v != 0))
normalize+=kernel[i];
i++;
}
}
kernel[i/2]=(double) ((-2.0)*normalize);
and finally we convolve the kernel over each pixel of the image to generate
the sharpening effect.
_______________________________________________
Magick-users mailing list
[email protected]
http://studio.imagemagick.org/mailman/listinfo/magick-users