Сверточный фильтр C # для матрицы любого размера (1x1, 3x3, 5x5,…), примененный не полностью

Я делаю фильтр свертки для своего проекта, и мне удалось сделать его для матрицы любого размера, но когда она стала больше, я заметил, что не все биты изменены. Вот фотографии, показывающие проблему:

Первый оригиналФильтр: Blur 9x9

Фильтр: EdgeDetection 9x9:

Как вы можете видеть, есть небольшая полоса, которая никогда не изменяется, и когда матрица становится больше, полоса также увеличивается (в 3х3 ее не было видно)

Мой класс матрицы свертки:

    public class ConvMatrix
{
    public int Factor = 1;
    public int Height, Width;
    public int Offset = 0;
    public int[,] Arr;

    //later I assign functions to set these variables
    ...
}

Функция фильтра:

    Bitmap Conv3x3(Bitmap b, ConvMatrix m)
{
    if (0 == m.Factor)
        return b;

    Bitmap bSrc = (Bitmap)b.Clone();
    BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height),
                        ImageLockMode.ReadWrite,
                        PixelFormat.Format24bppRgb);
    BitmapData bmSrc = bSrc.LockBits(new Rectangle(0, 0, bSrc.Width, bSrc.Height),
                       ImageLockMode.ReadWrite,
                       PixelFormat.Format24bppRgb);
    int stride = bmData.Stride;

    System.IntPtr Scan0 = bmData.Scan0;
    System.IntPtr SrcScan0 = bmSrc.Scan0;

        unsafe
        {
            byte* p = (byte*)(void*)Scan0;
            byte* pSrc = (byte*)(void*)SrcScan0;
            int nOffset = stride - b.Width * m.Width;
            int nWidth = b.Width - (m.Size-1);
            int nHeight = b.Height - (m.Size-2);

            int nPixel = 0;

            for (int y = 0; y < nHeight; y++)
            {
                for (int x = 0; x < nWidth; x++)
                {
                    for (int r = 0; r < m.Height; r++)
                    {
                        nPixel = 0;
                        for (int i = 0; i < m.Width; i++)
                            for (int j = 0; j < m.Height; j++)
                            {
                                nPixel += (pSrc[(m.Width * (i + 1)) - 1 - r + stride * j] * m.Arr[j, i]);
                            }

                        nPixel /= m.Factor;
                        nPixel += m.Offset;

                        if (nPixel < 0) nPixel = 0;
                        if (nPixel > 255) nPixel = 255;
                        p[(m.Width * (m.Height / 2 + 1)) - 1 - r + stride * (m.Height / 2)] = (byte)nPixel;
                    }
                    p += m.Width;
                    pSrc += m.Width;
                }
                p += nOffset;
                pSrc += nOffset;
            }
        }

    b.UnlockBits(bmData);
    bSrc.UnlockBits(bmSrc);
    return b;
}

Пожалуйста помоги

Ответы на вопрос(1)

Ваш ответ на вопрос