private static void ProcessMiddleOddRows(RawPixel <ushort> raw, int Width, VectorPixel pix)
        {
            float maxValue = raw.MaxValue;

            // First left pixel
            pix.SetAndMoveNext(
                (raw.GetRel(1, 0) / maxValue),
                (raw.Value / maxValue),
                ((raw.GetRel(0, -1) + raw.GetRel(0, +1)) / maxValue / 2));
            raw.MoveNext();

            var lastX = Width - 1;

            for (var x = 1; x < lastX; x += 2)
            {
                var xy     = raw.Value;
                var x1y    = raw.GetRel(+1, 0);
                var x11y12 = raw.GetRel(+1, -1) + raw.GetRel(+1, +1);

                pix.SetAndMoveNext(
                    (xy / maxValue),
                    ((raw.GetRel(-1, 0) + x1y + raw.GetRel(0, -1) + raw.GetRel(0, +1)) / maxValue / 4),
                    ((raw.GetRel(-1, -1) + x11y12 + raw.GetRel(-1, +1)) / maxValue / 4));

                pix.SetAndMoveNext(
                    ((xy + raw.GetRel(+2, 0)) / maxValue / 2),
                    (x1y / maxValue),
                    (x11y12) / maxValue / 2);
                raw.MoveNext();
                raw.MoveNext();
            }

            // First right pixel
            pix.SetAndMoveNext(
                (raw.Value / maxValue),
                ((raw.GetRel(0, -1) + raw.GetRel(0, +1) + (raw.GetRel(-1, 0) << 1)) / maxValue / 4),
                ((raw.GetRel(-1, -1) + raw.GetRel(-1, +1)) / maxValue / 2));
            raw.MoveNext();
        }
        private static void ProcessMiddleOddRows(RawPixel <ushort> raw, int Width, Color <ushort> pix)
        {
            // First left pixel
            pix.SetAndMoveNext(
                (ushort)(raw.GetRel(1, 0) << 1),
                (ushort)(raw.Value << 1),
                (ushort)((raw.GetRel(0, -1) + raw.GetRel(0, +1))));
            raw.MoveNext();

            var lastX = Width - 1;

            for (var x = 1; x < lastX; x += 2)
            {
                var xy     = raw.Value;
                var x1y    = raw.GetRel(+1, 0);
                var x11y12 = raw.GetRel(+1, -1) + raw.GetRel(+1, +1);

                pix.SetAndMoveNext(
                    (ushort)(xy << 1),
                    (ushort)((raw.GetRel(-1, 0) + x1y + raw.GetRel(0, -1) + raw.GetRel(0, +1)) >> 1),
                    (ushort)((raw.GetRel(-1, -1) + x11y12 + raw.GetRel(-1, +1)) >> 1));

                pix.SetAndMoveNext(
                    (ushort)((xy + raw.GetRel(+2, 0))),
                    (ushort)(x1y << 1),
                    (ushort)(x11y12));
                raw.MoveNext();
                raw.MoveNext();
            }

            // First right pixel
            pix.SetAndMoveNext(
                (ushort)(raw.Value << 1),
                (ushort)((raw.GetRel(0, -1) + raw.GetRel(0, +1) + (raw.GetRel(-1, 0) << 1)) >> 1),
                (ushort)((raw.GetRel(-1, -1) + raw.GetRel(-1, +1))));
            raw.MoveNext();
        }
        private static void ProcessMiddleEvenRows(RawPixel <ushort> raw, int Width, VectorPixel pix)
        {
            float maxValue = raw.MaxValue;

            // Second left pixel
            pix.SetAndMoveNext(
                ((raw.GetRel(1, -1) + raw.GetRel(1, +1)) / maxValue / 2.0f),
                ((raw.GetRel(0, -1) + raw.GetRel(0, +1) + (raw.GetRel(1, 0) << 1)) / maxValue / 4.0f),
                raw.Value / maxValue);
            raw.MoveNext();

            var lastX = Width - 1;

            for (var x = 1; x < lastX; x += 2)
            {
                var xy   = raw.Value;
                var x1y  = raw.GetRel(+1, 0);
                var xy12 = raw.GetRel(0, -1) + raw.GetRel(0, +1);

                pix.SetAndMoveNext(
                    (xy12) / maxValue / 2.0f,
                    (xy) / maxValue,
                    ((raw.GetRel(-1, 0) + x1y)) / maxValue / 2.0f);

                pix.SetAndMoveNext(
                    ((xy12 + raw.GetRel(+2, -1) + raw.GetRel(+2, +1)) / maxValue / 4),
                    ((xy + raw.GetRel(+2, 0) + raw.GetRel(+1, -1) + raw.GetRel(+1, +1)) / maxValue / 4),
                    (x1y) / maxValue);
                raw.MoveNext();
                raw.MoveNext();
            }

            // Second right pixel
            pix.SetAndMoveNext(
                ((raw.GetRel(0, -1) + raw.GetRel(0, +1)) / maxValue / 2),
                (raw.Value) / maxValue,
                (raw.GetRel(-1, 0) / maxValue));
            raw.MoveNext();
        }