package pl.wroc.pwr.imagechannel.basic; import pl.wroc.pwr.IOperator1P; import pl.wroc.pwr.imagechannel.IImageChannel; import pl.wroc.pwr.imagechannel.model.ImageChannel; public class Maximize implements IOperator1P { private boolean inPlace; private int samples; public Maximize() { this(false, 256); } public Maximize(boolean inPlace) { this(inPlace, 256); } public Maximize(int samples) { this(false, samples); } public Maximize(boolean inPlace, int samples) { this.inPlace = inPlace; if (samples < 2) samples = 2; this.samples = samples; } public IImageChannel apply(IImageChannel input) { float[] N = new float[samples]; for (int i = 0; i < samples; i++) N[i] = 0; for (int index = 0; index < input.getMaxIndex(); index++) { N[(int)(input.getValue(index) * (samples - 1))] += 1.0; } float[] L = new float[samples]; float Max = 0.0f; L[0] = 0.0f; for (int i = 1; i < samples; i++) { L[i] = L[i - 1] + N[i - 1]; if (L[i] > Max) Max = L[i]; } for (int i = 0; i < samples; i++) L[i] /= Max; IImageChannel result = this.inPlace ? input : new ImageChannel(input.getSize()); for (int index = 0; index < input.getMaxIndex(); index++) { result.setValue(index, L[(int)(input.getValue(index) * (samples - 1))]); } return result; } }