コード例 #1
0
        private void Extrapolate(ColorMap map, int[] srcHist, int minColor, int maxColor)
        {
            var min = srcHist.TakeWhile(p => p == 0).Count();
            var max = srcHist.Length - srcHist.Reverse().TakeWhile(p => p == 0).Count() - 1;

            var first = map.First();
            var last  = map.Last();

            var sampleCount  = last - first + 1;
            var mappedColors = Enumerable.Range(first, sampleCount).Where(map.Contains);//.Where(p => srcHist[p] > 50);
            var mappedCount  = mappedColors.Count();
            var limit        = Math.Max(mappedCount / 5, Math.Min(mappedCount, 10));


            if (min < first)
            {
                var avgDiff = mappedColors.Take(limit).Sum(p => map.Average(p) - p) / limit;
                var mapped  = min + avgDiff;
                map.AddReal(min, Math.Max(minColor, mapped));
                Log(() => $"Min: {min} -> {mapped:F3}");
            }

            if (max > last)
            {
                var avgDiff = mappedColors.Reverse().Take(limit).Sum(p => map.Average(p) - p) / limit;
                var mapped  = max + avgDiff;
                map.AddReal(max, Math.Min(maxColor, mapped));
                Log(() => $"Max: {max} -> {mapped:F3}");
            }
        }
コード例 #2
0
        private IInterpolation GetInterpolator(ColorMap map, double mult)
        {
            var size   = map.FixedMap.Length;
            var points = new List <Tuple <int, double> >(map.FixedMap.Length);

            for (var oldColor = 0; oldColor < size; oldColor++)
            {
                if (map.Contains(oldColor))
                {
                    points.Add(Tuple.Create(oldColor, map.Average(oldColor)));
                }
            }
            var xValues = new double[points.Count];
            var yValues = new double[points.Count];

            for (var i = 0; i < points.Count; i++)
            {
                var point = points[i];
                xValues[i] = point.Item1;
                yValues[i] = point.Item2;
            }

            if (xValues.Length == 1)
            {
                return(GetInterpolator(Interpolation, new[] { xValues[0], xValues[0] }, new[] { yValues[0], yValues[0] }, mult));
            }
            return(GetInterpolator(Interpolation, xValues, yValues, mult));
        }