/// <summary> /// Applies the box filter kernel around one pixel. /// </summary> /// <param name="original">The original image to blur</param> /// <param name="target">The result</param> /// <param name="centerRow">Vertical coordinate of the result pixel</param> /// <param name="centerCol">Horizontal coordinate of the result pixel</param> protected virtual void Kernel(ImageBase original, ImageBase target, int centerRow, int centerCol) { int top = Math.Max(0, centerRow - radius); int bottom = Math.Min(original.Height - 1, centerRow + radius); int left = Math.Max(0, centerCol - radius); int right = Math.Min(original.Width - 1, centerCol + radius); int area = (bottom - top + 1) * (right - left + 1); float normalization = 1.0f / area; for (int chan = 0; chan < original.NumChannels; ++chan) { float result = 0; for (int row = top; row <= bottom; ++row) { for (int col = left; col <= right; ++col) { result += original.GetPixelChannel(col, row, chan) * normalization; } } target.SetPixelChannel(centerCol, centerRow, chan, result); } }