package org.jcodec.algo;
import org.jcodec.common.Assert;
/**
* A filter which applies Gaussian blur to an image. This is a subclass of
* ConvolveFilter which simply creates a kernel with a Gaussian distribution for
* blurring.
*
* @author The JCodec project
* @author Jerry Huxtable
*/
public class StreamGauss {
private int[] vect;
public StreamGauss(float radius) {
makeKernel(radius);
}
void gauss(int[] samples, int[] out) {
for (int i = 0; i < samples.length - vect.length; i++) {
int val = 0;
for (int j = 0; j < vect.length; j++) {
val += samples[i + j] * vect[j];
}
int v = val >> 10;
Assert.assertTrue(v > 0);
out[i] = v;
}
}
/**
* Make a Gaussian blur kernel. fixed point, 10 bit precision
*/
public void makeKernel(float radius) {
int r = (int) Math.ceil(radius);
int rows = r * 2 + 1;
vect = new int[rows];
float sigma = radius / 3;
float sigma22 = 2 * sigma * sigma;
float sigmaPi2 = 2 * (float) Math.PI * sigma;
float sqrtSigmaPi2 = (float) Math.sqrt(sigmaPi2);
float radius2 = radius * radius;
int total = 0;
int index = 0;
for (int row = -r; row <= r; row++) {
float distance = row * row;
if (distance > radius2)
vect[index] = 0;
else
vect[index] = (int) ((Math.exp(-(distance) / sigma22) / sqrtSigmaPi2) * 1024);
total += vect[index];
index++;
}
for (int i = 0; i < rows; i++)
vect[i] = (vect[i] << 10) / total;
}
}