public T Convert(T source, params object[] prms)
        {
            if (prms.Length > 0)
            {
                throw new Exception("Не должно быть параметров");
            }
            var    dist = new MyImage(source.Width, source.Height);
            double Ra = 0, Ba = 0, Ga = 0;
            double Avg    = 0;
            object srcimg = source;
            var    tasks  = new List <Task <double[]> >();
            var    ranges = DivRange.Divide(0, 0, source.Width, source.Height, 16);

            foreach (var range in ranges)
            {
                tasks.Add(Task <double[]> .Factory.StartNew(() => GetSumRgb((MyImage)srcimg, range[0], range[1],
                                                                            range[2], range[3])));
            }
            foreach (var ts in tasks)
            {
                Ra += ts.Result[0];
                Ba += ts.Result[1];
                Ga += ts.Result[2];
            }

            Ra = Ra / (source.Width * source.Height);
            Ba = Ba / (source.Width * source.Height);
            Ga = Ga / (source.Width * source.Height);

            Avg = (Ra + Ba + Ga) / 3;

            Parallel.For(0, source.Width, i =>
            {
                Parallel.For(0, source.Height, j =>
                {
                    Color color    = source[i, j];
                    Color newcolor =
                        Color.FromArgb(
                            Norm(color.R * Avg / Ra),
                            Norm(color.G * Avg / Ga),
                            Norm(color.B * Avg / Ba));
                    dist[i, j] = newcolor;
                });
            });
            object img = dist;

            return((T)img);
        }
        public T Convert(T source, params object[] prms)
        {
            if (prms.Length != 0)
            {
                throw new Exception("Не должно быть параметров");
            }
            var    dist   = new MyImage(source.Width, source.Height);
            object srcimg = source;
            var    tasks  = new List <Task>();
            var    ranges = DivRange.Divide(0, 0, source.Width, source.Height, 16);

            foreach (var range in ranges)
            {
                tasks.Add(Task.Run(() =>
                                   ChangeToGrayscale((MyImage)srcimg, dist, range[0], range[1], range[2], range[3])));
            }
            Task.WaitAll(tasks.ToArray());
            object img = dist;

            return((T)img);
        }