import java.awt.image.*;public class NoiseFilter extends Filter {
public final static int IMPULSE= 0;public final static int GAUSSIAN= 1;protected int noiseType= IMPULSE;protected double stdDev= 10.0;protected double impulseRatio= 0.05;public NoiseFilter() {
}
public NoiseFilter(int noiseType) {
setNoiseType(noiseType);}
public NoiseFilter(int noiseType,double parameter) {
setNoiseType(noiseType);if (noiseType== IMPULSE) setImpulseRatio(parameter); if (noiseType == GAUSSIAN) setGaussianStdDev(parameter);}
public void setNoiseType(int noiseType) {
this.noiseType= noiseType;}
public int getNoiseType() {
return noiseType;}
public void setGaussianStdDev(double stdDev) {
this.stdDev= stdDev;}
public double getGaussianStdDev() {
return stdDev;}
public void setImpulseRatio(double impulseRatio) {
this.impulseRatio= impulseRatio;}
public double getImpulseRatio() {
return impulseRatio;}
public java.awt.image.BufferedImage filter(BufferedImage image,BufferedImage output) {
output= verifyOutput(output, image);switch (noiseType) {
default:
case IMPULSE: return impulseNoise(image, output); case GAUSSIAN: return gaussianNoise(image, output);}
}
protected BufferedImage impulseNoise(BufferedImage image,BufferedImage output) {
output.setData(image.getData());Raster source= image.getRaster(); WritableRaster out = output.getRaster();double rand; double halfImpulseRatio = impulseRatio / 2.0; int bands = out.getNumBands(); int width = image.getWidth();// width of the image
int height = image.getHeight();// height of the image
java.util.Random randGen = new java.util.Random();for (int j=0;j
for (int i=0;i
rand = randGen.nextDouble();if (rand < halfImpulseRatio) {
for (int b=0;b
} else if (rand < impulseRatio) {
for (int b=0;b
}
}
}
return output;}
protected BufferedImage gaussianNoise(BufferedImage image,BufferedImage output) {
Raster source= image.getRaster(); WritableRaster out = output.getRaster();int currVal;// the current value
double newVal;// the new "noisy" value
double gaussian;// gaussian number
int bands = out.getNumBands();// number of bands
int width = image.getWidth();// width of the image
int height = image.getHeight();// height of the image
java.util.Random randGen = new java.util.Random();for (int j=0;j
for (int i=0;i
gaussian = randGen.nextGaussian();for (int b=0;b
newVal = stdDev * gaussian; currVal = source.getSample(i, j, b); newVal = newVal + currVal; if (newVal < 0) newVal = 0.0; if (newVal > 255) newVal = 255.0;out.setSample(i, j, b, (int)(newVal));}
}
}
return output;}
}