public Channel relativeIntensity(int radius) {
radius = Math.Max(1, radius);
Channel relint = new Channel(width, height);
float factor = 1f/((2*radius + 1)*(2*radius + 1));
float sum, avr;
for (int x = 0; x < width; x++) {
int y = 0;
sum = 0f;
for (int i = -radius; i < radius + 1; i++) {
for (int j = -radius; j < radius + 1; j++) {
sum += getPixelWrap(x + j, y + i);
}
}
for (; y < height; y++) {
if (y > 0) {
for (int j = -radius; j < radius + 1; j++) {
sum -= getPixelWrap(x + j, y - radius - 1);
sum += getPixelWrap(x + j, y + radius);
}
}
avr = sum*factor;
relint.putPixel(x, y, getPixel(x, y) - avr);
}
}
return relint.add(0.5f);
}