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); }